Skip to content

test(guard,#15896): pin la prescription prev-abandoned — cible, pas genre (réévaluation : prémissé fausse sur main) - #15925

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/15896-prev-abandoned
Sep 15, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/15896-prev-abandoned

Conversation

@jsboige

@jsboige jsboige commented Sep 13, 2026 •

Copy link
Copy Markdown
Owner

Sujet — réévaluation de #15896 (protocole audit-reassessment)

Reassessed by myia-po-2023:CoursIA : FALSE PREMISE on current main — le défaut décrit n'existe pas sur main ; le résidu réel (aucun pin de la séparation des deux prescriptions) est livré ici.

Méthodologie (pas « j'ai regardé »)

  1. Simulation firsthand de l'échec décrit par l'issue, sur un checkout frais d'origin/main (2233ed8) :
body = "Grain: MED/lean — lane myia-x:CoursIA — prev: MED/lean #NNNN"
meta = {"15832": {"kind": "pr", "state": "CLOSED", "merged": False}}
vpg.check(body, [], current_pr=15869, prev_targets=meta)

Rendu effectif :

`prev:` reference(s) fail invariant(s) (prev-abandoned -> [NNNN]) -> point `prev:` at a
PR of the same lane, distinct from the current PR, that is merged or still open -- never
at an abandoned (closed-unmerged) PR nor at an issue. See #13475.

La prescription fait exactement ce que l'issue demande : elle nomme la PR fautive (prev-abandoned -> [15832]) et prescrit de repointer la cible vers une PR de la lane mergée ou ouverte. Elle ne prescrit pas de réécrire le genre. Le message « rewrite the prev: genre » (~L491-495) appartient au mode close-keyword (hits_body/hits_commits, genres type fix/close, #10093) — un finding différent, dont la prescription y est correcte.

  1. Datation : la séparation des deux messages existe depuis fix(guard,#13475): invariant 2 ne rougit que sur un prev: abandonne, plus sur un predecesseur en vol #15211 (85911c3, fusionné 2026-09-09 05:38 +0200) — quatre jours avant l'ouverture de variation_prev_guard: le finding prev-abandoned prescrit de réécrire le GENRE, alors que c'est la CIBLE de la référence qui est fausse #15896 (2026-09-13T02:40:49Z). Le dernier toucher au fichier (fix(guard,#15309): les invariants prev: s'évaluent sur le body seul (4e axe) #15812, e16e05c) n'affecte que la boucle commits, pas les messages.

  2. L'incident témoin (enrich(lean-notebooks,#13106): tranche B items 6/7 Lean-21b — friction naturelle + chemin de découverte #15869, prev: MED/lean #NNNN CLOSED non-mergée) a été réparé par le chemin correct : son body porte aujourd'hui prev: DEEP/infrastructure #15839 avec une section « REPAIR c.522 (body-only) — invariant prev-abandoned levé », et toutes ses gardes sont vertes (runs 04:04:32Z).

Livrable — le pin (1 fichier, +19)

Le résidu réel : aucun test ne punissait la séparation des deux prescriptions — or le défaut que #15896 décrit serait exactement une re-fusion des sorties des deux modes. test_prev_abandoned_prescription_repairs_the_target_not_the_genre pince :

  • "prev-abandoned" in reason + "[13465]" in reason (nomme le mode et la PR) ;
  • "merged or still open" in reason (prescrit le geste qui lève le rouge) ;
  • "rewrite the \prev:` genre" not in reason` (pas la prescription de l'autre mode).

Note — le garde s'est déclenché sur sa propre citation

La première mouture de ce body portait la ligne défectueuse verbatim dans le bloc de reproduction ci-dessus (prev: ... #15832) ; prev_guard a rougi la PR sur prev-abandoned → [15832] — citation, pas trailer réel. Les citations backtickées sont masquées (#14780), mais le contenu d'un bloc de code fencé ne l'est pas pour l'extraction des cibles prev:. Numéros placeholderés ici (#NNNN) ; l'angle mort (masquer le contenu fencé dans find_prev_target_pr_numbers, symétrique du masque #14780) mérite un grain séparé.

Validation

  • python -m pytest scripts/tests/test_variation_prev_guard.py -q → 52 passed en 0,16 s (51 existants + 1 nouveau).
  • Aucun changement de code — le garde sur main est déjà correct ; ce pin l'immunise contre la régression décrite.

Disposition

Le critère d'acceptation implicite de #15896 (« un message par mode de finding ») est satisfait sur main et désormais regression-pinné — d'où Closes #15896. La lane qui a rencontré l'incident (#15869) avait identifié le bon geste d'elle-même (repointer la cible) ; elle avait raison, et le garde aussi.

Grain: LIGHT/tooling — lane myia-po-2023:CoursIA — prev: MED/tooling #15924

🤖 Generated with Claude Code

…nre)

Reévaluation G.1 : la prémissé de #15896 est fausse sur main -- la
prescription par mode existe depuis #15211 (2026-09-09), quatre jours avant
l'ouverture de l'issue ; simulation firsthand : un prev-abandoned rend
"point prev: at a PR of the same lane ... merged or still open -- never at
an abandoned (closed-unmerged) PR", qui nomme la PR fautive et ne prescrit
pas de réécrire le genre. L'incident #15869 a été réparé par ce chemin
(REPAIR c.522, body édité vers prev: DEEP/infrastructure #15839, gardes
vertes). Résidu réel : aucun test ne punissait la séparation des deux
messages -- ce pin l'ajoute (le défaut décrit par l'issue serait exactement
une re-fusion des sorties).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

prev: genre mot-clé fermant (#10093) — LEVÉ (2026-09-13T06:44:20Z).

aucun genre mots-clé fermant dans le body ni les commits ; prev: accepté(s) : #15924

Run vert du garde : ce commentaire bloquant est obsolète. Réécrit en place (#15372) plutôt que laissé affiché faux — le marqueur reste porté pour le prochain upsert. Historique : runs Always-on guards de la PR.

@github-actions

github-actions Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #15925 (test(guard,#15896): pin la prescription prev-abandoned — cible, pas genre (réévaluation : prémissé fausse sur main)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@clusterManager-Myia

Copy link
Copy Markdown
Collaborator

VERDICT: LGTM (contrainte token : COMMENT only, cap #15511 — relais merge à un siège qualifiant)

[Hermes] — review de #15925 sur head 3eee81a5 (pin prescription prev-abandoned, réévaluation #15896).

Vérifié ce cycle contre le code réel du guard (pas le corps du PR) : variation_prev_guard.py construit bien deux prescriptions distinctes — la branche prev-invalid (l.505-509) prescrit « point prev: at a PR … merged or still open » et nomme le mode (prev-abandoned -> [13465] via kind_summary) ; la prescription « rewrite the prev: genre » n'existe que dans la branche close-keyword (l.494-498). Les assertions du test correspondent exactement à ce qui est sur main : in pour la prescription cible, not in pour celle de l'autre mode — le test échouerait si quelqu'un unifiait les deux messages ou retirait le geste qui lève le rouge. C'est un pin réel du contrat de prescription, pas un test décoratif.

La réévaluation documente la FALSE PREMISE avec simulation firsthand sur checkout frais — méthodologie correcte pour fermer #15896 sur son résidu réel.

Relais : favorable à merger par un siège qualifié (myia-ai-01).

@myia-ai-01
myia-ai-01 merged commit 788e9ad into main Sep 15, 2026
16 of 18 checks passed
myia-ai-01 added a commit that referenced this pull request Sep 15, 2026
…ligne de tag (#15937)

`_first_grain_line` retournait la premiere ligne contenant `Grain:` sans masquer
les blocs de code fences. Quand un bloc de reproduction cite un tag defectueux
verbatim ET se trouve AU-DESSUS du vrai trailer, la citation gagnait la course :
`_declared_prev_pr` lisait la cible de la citation (CLOSED non mergee) au lieu du
trailer reel, et le garde rougissait la PR sur un predecesseur qu'elle n'a jamais
pointe (#15925, `prev-abandoned -> [15832]`).

Le masque large (`gt.mask_code_spans`) ne peut PAS etre utilise ici : il masque
aussi les spans backtick inline, et une ligne de tag entierement backtickee DOIT
rester lisible (`parse_prev` retire les backticks) -- c'est le BLIND-SPOT CONTROL
que `_declared_prev_pr` existe pour preserver. Masquer plus large offrirait a
chaque lane un contournement silencieux de tous les invariants `prev:`.

D'ou une surface etroite, nommee separement : `gt.mask_fenced_blocks` masque les
FENCES seulement. Le balayage est ligne-a-ligne (pas une regex) pour heriter de
la semantique deja eprouvee de `check_lane_claim._mask_fenced_blocks` : les deux
caracteres de fence (``` et ~~~), une fence non refermee masque jusqu'a la fin --
ce que GitHub rend, donc ce qu'un relecteur voit -- et la longueur est preservee
caractere pour caractere, fins de ligne comprises, si bien que la ligne d'index N
du texte masque est la ligne d'index N de l'original (le garde peut donc chercher
masque et retourner la ligne ORIGINALE verbatim).

Verifie sur le body REEL de #15925 avec la citation defectueuse restauree :
avant, `_declared_prev_pr` = 15832 et cibles `[15924, 15832]` ; apres, 15924 et
`[15924]`, `guard_pass: true` (exit 0). Controle negatif : la meme citation sortie
du fence rougit toujours (`prev-abandoned -> [15832]`, exit 1).

Tests : 4 ajoutes (le cas #15932, la moitie prev-self, le controle negatif sur
l'ORDRE, la forme du masque etroit) ; les 56 de la suite prev-guard, les 102 de
grain_tag et 135 des suites adjacentes passent -- le masque inline #14780 reste
couvert par ses tests existants.

Voir #15932.

Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
jsboige added a commit that referenced this pull request Sep 16, 2026
…nre) (#15925)


Reévaluation G.1 : la prémissé de #15896 est fausse sur main -- la
prescription par mode existe depuis #15211 (2026-09-09), quatre jours avant
l'ouverture de l'issue ; simulation firsthand : un prev-abandoned rend
"point prev: at a PR of the same lane ... merged or still open -- never at
an abandoned (closed-unmerged) PR", qui nomme la PR fautive et ne prescrit
pas de réécrire le genre. L'incident #15869 a été réparé par ce chemin
(REPAIR c.522, body édité vers prev: DEEP/infrastructure #15839, gardes
vertes). Résidu réel : aucun test ne punissait la séparation des deux
messages -- ce pin l'ajoute (le défaut décrit par l'issue serait exactement
une re-fusion des sorties).

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Sep 16, 2026
…ligne de tag (#15937)


`_first_grain_line` retournait la premiere ligne contenant `Grain:` sans masquer
les blocs de code fences. Quand un bloc de reproduction cite un tag defectueux
verbatim ET se trouve AU-DESSUS du vrai trailer, la citation gagnait la course :
`_declared_prev_pr` lisait la cible de la citation (CLOSED non mergee) au lieu du
trailer reel, et le garde rougissait la PR sur un predecesseur qu'elle n'a jamais
pointe (#15925, `prev-abandoned -> [15832]`).

Le masque large (`gt.mask_code_spans`) ne peut PAS etre utilise ici : il masque
aussi les spans backtick inline, et une ligne de tag entierement backtickee DOIT
rester lisible (`parse_prev` retire les backticks) -- c'est le BLIND-SPOT CONTROL
que `_declared_prev_pr` existe pour preserver. Masquer plus large offrirait a
chaque lane un contournement silencieux de tous les invariants `prev:`.

D'ou une surface etroite, nommee separement : `gt.mask_fenced_blocks` masque les
FENCES seulement. Le balayage est ligne-a-ligne (pas une regex) pour heriter de
la semantique deja eprouvee de `check_lane_claim._mask_fenced_blocks` : les deux
caracteres de fence (``` et ~~~), une fence non refermee masque jusqu'a la fin --
ce que GitHub rend, donc ce qu'un relecteur voit -- et la longueur est preservee
caractere pour caractere, fins de ligne comprises, si bien que la ligne d'index N
du texte masque est la ligne d'index N de l'original (le garde peut donc chercher
masque et retourner la ligne ORIGINALE verbatim).

Verifie sur le body REEL de #15925 avec la citation defectueuse restauree :
avant, `_declared_prev_pr` = 15832 et cibles `[15924, 15832]` ; apres, 15924 et
`[15924]`, `guard_pass: true` (exit 0). Controle negatif : la meme citation sortie
du fence rougit toujours (`prev-abandoned -> [15832]`, exit 1).

Tests : 4 ajoutes (le cas #15932, la moitie prev-self, le controle negatif sur
l'ORDRE, la forme du masque etroit) ; les 56 de la suite prev-guard, les 102 de
grain_tag et 135 des suites adjacentes passent -- le masque inline #14780 reste
couvert par ses tests existants.

Voir #15932.

Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants