Repository navigation
test(guard): ratchet output-failure -- verrouiller _in_fallback (#19697) et sa borne - #19701
Conversation
… a la tete (FP mesure sur #19697) L'exemption DECLARED_FALLBACK (#19038) rejetait un hit des que la cellule base portait une sortie substantielle, sans verifier que la tete l'avait perdue : une cellule byte-identique entre base et tete etait classee DECLARED_FALLBACK au scan de base (sans contexte) et TOOL_FAILURE au scan de tete -- tout PR touchant le carnet sans toucher la cellule declenchait un faux 0 -> 1. La condition mesure desormais le remplacement des deux cotes : base substantielle ET tete non substantielle. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
Trivial-diff advisory (#15740, non bloquant). |
Rouge
|
| entrée | ajoutée par | date de commit |
|---|---|---|
0019-...-myia-po-2026-CoursIA.yaml |
db6c79beeb5d |
2026-10-05T23:09:40+02:00 |
0019-...-myia-po-2023-CoursIA-2.yaml |
2f309d0dcfbb |
2026-10-07T12:14:22+02:00 |
Le second écrivain a pris un index déjà occupé. Le même commit a aussi ajouté 0020-...-myia-po-2023-CoursIA-2.yaml, donc le renommage naturel 0019 → 0020 n'est pas libre ; et 0021 est déjà porté par la PR ouverte #19244. L'index libre est 0022.
Pourquoi cette lane ne répare pas
Le fichier appartient à deux autres lanes, et une PR ouverte (#19244, myia-po-2026:CoursIA-2) écrit dans le même dossier — édition concurrente interdite (L898). Le défaut est signalé au coordinateur avec le correctif nommé ; il est aussi le blocage amont de #19697 (fastlane → Output-failure ratchet, que cette PR corrige).
Verdict
BASE-INHERITED — mesuré, pas invoqué. La PR reste saine sur son périmètre ; elle ne peut pas devenir verte avant la réparation du registre, qui est hors de son périmètre.
|
[ADJOINT PREFLIGHT] |
Path-collision (organ #13359/#13615)Cette PR #19701 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
PR gate absent du rollup (advisory, #10928)
Un remede au hasard coute un commit sans effet (issue #14477 : la prescription est fonction de la cause). Signaler ce cas sur le dashboard de coordination pour investigation manuelle -- c'est le cas non identifie #10902 qui reste en suspens. Cause mesuree : mergeable_state=unknown, pas de base_ref_changed, sujet sans [skip ci], auteur jsboige |
|
[ADJOINT PREFLIGHT] |
Conflit dans scripts/notebook_tools/check_output_failure_text.py : la meme condition de base de _declared_fallback avait ete affinee des deux cotes pour le meme faux positif (#19697), par deux mecanismes differents. - main (arrive via #19697) : `and not _in_fallback(base_cell)` -- la decision se prend sur la BASE. Un repli execute son chemin normal avant d'echouer, donc ses lignes d'echo rendent sa sortie `substantial` au sens textuel sans etre un rendu remplace. - branche : `and not _substantial_output(cell)` -- la decision se prend sur la TETE (elle doit avoir perdu sa substance). Resolution : version de main, la branche est ecartee. La condition de branche laisse passer une perte reelle -- base qui rendait, tete qui n'imprime plus que ses lignes d'echo puis la banniere : l'echo suffit a faire passer la tete pour `substantial`, donc plus rien ne gate. Mesure : avec cette condition, le test discriminant ajoute ici rend `assert 0 == 1` (le rendu perdu ne gate plus). La PR se reduit a ses deux tests, qui verrouillent le mecanisme de main. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…) et sa borne Le fix de code de cette branche est abandonne au profit de celui de main (#19697, _in_fallback) : voir le commit de fusion. Ce qui reste est ce que main ne couvre pas -- deux tests. - test_declared_fallback_kept_when_base_output_echoes_before_failing : SEUL cas qui atteint _in_fallback avec un verdict True. Le test voisin (base_was_already_in_fallback, base = banniere seule) sort par _substantial_output des la premiere condition et ne lit jamais _in_fallback : sans ce test, le mecanisme qui vient d'etre retenu sur main n'est pas couvert. - test_declared_banner_over_an_echoing_head_still_fires_when_base_rendered : la borne. Base qui rendait, tete reduite a ses lignes d'echo + banniere. Verifie par faux negatif : sous la condition ecartee (not _substantial_output(cell)), ce test rend assert 0 == 1 -- le rendu perdu ne gate plus. C'est la mesure qui a tranche l'arbitrage du merge. 37 passed (suite complete du fichier). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
_in_fallback (#19697) et sa borne
|
[ADJOINT PREFLIGHT] |
|
[ADJOINT PREFLIGHT] Derivation live READY a la tete vive : le dossier BLOCKED anterieur attestait des jambes alors en cours ; jambes latest-wins vertes, B.0 clear, aucun thread non resolu. |
Grain: MED/guard — lane myia-po-2027:CoursIA — prev: DEEP/genai #19697
test(guard): ratchet output-failure -- verrouiller
_in_fallback(#19697) et sa borneSee #19697 (instance mesurée du faux positif). See #19038 (condition d'origine, intention préservée).
Ce que cette PR est devenue — à lire avant de merger
Elle a été ouverte pour porter un fix de code ; ce fix n'a pas été retenu. Pendant qu'elle était ouverte, la même condition de base de
_declared_fallbacka été affinée surmainpar #19697, avec un autre mécanisme. La fusion demaina produit un conflit sur cette seule condition, résolu en faveur demain.Conséquence : la PR ne porte plus aucun changement de l'organe. Le fichier de l'organe est byte-identique à
main— la liste de fichiers de la PR ne contient que le fichier de tests. Elle est donc une PR de tests, pas de correctif, et son titre a été corrigé en conséquence.Les deux mécanismes, et pourquoi celui de
maina été retenumain(#19697)_substantial_output(base_cell) and not _in_fallback(base_cell)_substantial_output(base_cell) and not _substantial_output(cell)Les deux couvrent le faux positif mesuré sur #19697 (
01-5b, cellule inchangée entre base et tête, sortie = lignes d'écho pré-échec + bannière). Elles divergent sur un cas que la seconde laisse passer :Sous la condition de la branche,
_substantial_output(cell)est vrai — les lignes d'écho suffisent à faire passer la tête pour substantielle — donc plus rien ne gate et le rendu perdu n'est plus signalé.Mesure, pas argument : le test discriminant ajouté ici rend
assert 0 == 1sous la condition écartée (TOOL_FAILUREvide, le rendu perdu ne gate plus) et1sous celle demain. C'est cette mesure qui a tranché la résolution du conflit.Ce que la PR apporte
Deux tests, dans le fichier de tests de l'organe :
test_declared_fallback_kept_when_base_output_echoes_before_failing— le seul cas qui atteint_in_fallbackavec un verdictTrue. Le test voisin (..._kept_when_base_was_already_in_fallback, base = bannière seule) sort par_substantial_outputdès la première condition et ne lit jamais_in_fallback: sans ce test, le mécanisme retenu surmainn'est couvert par aucun test.test_declared_banner_over_an_echoing_head_still_fires_when_base_rendered— la borne de ce mécanisme : base qui rendait, tête réduite à l'écho + bannière, le gate est maintenu.Validation (relancée après le dernier commit)
python -m pytest scripts/notebook_tools/tests/test_check_output_failure_text.py -q→ 37 passed.1 failed, 36 passed, l'échec nommé étant bien le test discriminant (assert 0 == 1). Un test qui passe ne prouve rien s'il passe pour la mauvaise raison ; celui-ci est validé par ce qu'il refuse.Grain:est conservé tel quel (genreguard: le sujet du grain est la sémantique de l'organe, non la famille des fichiers touchés). Aucun changement de gate n'en dépend, les deux genres étant META.Périmètre
🤖 Generated with Claude Code