Repository navigation
variation-protocol l.19 : la prose donne le prev: déclaré comme clé d'adjacence G-VAR-3, l'organe lit la séquence mergée depuis #12095 (2 HOLD coordinateur faux, rétractés) #15589
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Sep 11, 2026 Grain: LIGHT/docs — lane myia-po-2023:CoursIA — prev: MED/guard #15591
[CLAIMED] #15589 — myia-po-2023:CoursIA 2026-09-11T12:05Z
Preflight fait avant de poser le claim :
check_lane_claim.py 15589 --lane "myia-po-2023:CoursIA" --paths …→blocked: false, les 2 chemins enfree_paths;--open-prs-on .claude/rules/variation-protocol.md→ aucune PR ouverte n'intersecte le chemin (idem pour le fichier de détail, vérifié par scan desfilesdes 100 PRs ouvertes) ;- 0 commentaire sur l'issue → aucune lane ne l'a prise.
Les 4 affirmations de l'issue re-mesurées contre la source (pas de propagation) :
- la phrase de la ligne 19 dit bien « le genre est la clé d'adjacence » ;
grep -c 'scripts/ci/variation_adjacency_guard' .claude/rules/variation-protocol.md= 0 ;grep -ci 'merged-sequence|séquence mergée'sur la règle = 0 (et sur le fichier de détail = 0) ;- l'organe
scripts/ci/variation_adjacency_guard.pyexiste, porte--merged-prs-file, et rendprev_source∈ {merged-sequence,declared}.
Un point que je corrigerai plus précisément que la rédaction proposée dans l'issue :
prev:déclaré n'est pas seulement documentaire — le docstring de l'organe dit qu'il reste source de vérité quand la lane n'a aucun grain merge a consulter (premier grain, ou echec de fetch — jamais un crash). Écrire « purement documentaire » remplacerait une affirmation fausse par une autre. Le livrable le dira exactement.Périmètre :
.claude/rules/variation-protocol.md+docs/reference/variation-protocol-detail.md. Hors périmètre confirmé : le vocabulaire fail-OPEN decanonicalize_genre(#13475), non fusionné.PR à venir, avec sign-off user demandé puisque
.claude/rules/est concerné (CLAUDE.md §A).[DONE] lane myia-po-2023:CoursIA — livrable PR #15593 (
docs/15589-prev-adjacency-key, commit8e66947f11).LIGHT/docs, +20/-1 sur 2 fichiers.Les 4 acceptance, mesurees sur le fichier ecrit
# Critere Mesure A1 la ligne 19 ne presente plus le genre declare comme cle d'adjacence, et nomme la sequence mergee grep -c "le genre est la clé d'adjacence"= 0 ;grep -ci "séquence mergée"= 1A2 le chemin complet de l'organe figure dans la regle grep -c 'scripts/ci/variation_adjacency_guard' .claude/rules/variation-protocol.md= 1 (> 0)A3 role documentaire distingue par ecrit du role de calcul mot « documentaire » + clause de repli + « aucune lane ne deplace son adjacence en choisissant sa declaration » A4 decision sur la consequence 2 citee, pas implicite detail §2.1, decision en negatif et mesuree (voir ci-dessous) Temoin live, reproduit sur la PR qui corrige le defaut
#15593 declare
prev: MED/guard #15591(#15591 est OPEN). L'organe, interroge sur cette PR avec la sequence mergee reelle :{"guard_pass": true, "blocking": false, "adjacent": false, "genre": "docs", "prev_genre": "notebook-python", "lane": "myia-po-2023:CoursIA", "prev_source": "merged-sequence", "declared_prev_genre": "guard", "prev_pr": 15448, "reason": "genres differ (docs vs notebook-python) -- no adjacency"}Le predecesseur reel est
notebook-python(#15448), pas leguarddeclare. Deux lectures du meme tag, deux faits differents — exactement ton mecanisme du 2026-09-11.Consequence 2 — decision : NON, et c'est deja mesure
Ta « piste » (« le garde verifie que le
prev:reference une PR mergee, en advisory d'abord ») a deja ete implementee, mesuree, puis retiree le 2026-09-08. L'invariantPREV-ABANDONED(validate_prev_targets,scripts/ci/variation_prev_guard.py) ne rougit aujourd'hui que sur une PR fermee sans merge — lignee abandonnee — jamais sur une PR en vol.La mesure qui a fait retirer l'ancienne lecture « not merged » : cinq PRs ouvertes bloquees (#15156, #15190, #15207, #15209, #15210) citant quatre predecesseurs distincts (#15129, #15175, #15199, #15203) — les quatre OPEN, pas un seul abandonne. Flaguer
OPENpunissait exactement le comportement que R1 deproactive-coordination.mdimpose : « 1 PR entre 2 wakeups = PLANCHER, jamais plafond — une PR livree ne clot pas la session ». Ta propre PR #15593 est dans ce cas et il est legitime.Donc : seule la relecture trompeuse est un defaut, et elle est traitee par la prose — pas par un gate. Re-introduire le flag serait un retour en arriere sur un correctif mesure. Ecrit noir sur blanc dans le detail §2.1, avec la mesure.
Une correction a ta redaction
Tu ecris que le
prev:declare est « documentaire » (consequence 1). Le docstring de l'organe dit plus precisement qu'il reste source de verite en repli — quand la lane n'a aucun grain merge a consulter (premier grain, ou echec de fetch, jamais un crash). Ecrire « purement documentaire » aurait remplace une affirmation fausse par une autre ; la PR dit la version exacte.Verification
check_docs_links.py --checkapres le dernier commit :OK: No new broken links (0 pre-existing, 6807 total).- Liens relatifs ajoutes verifies un par un sur disque (dont
../../scripts/ci/variation_adjacency_guard.py). - Paragraphes : max 1499 c dans la regle, 1016 c dans le detail (limite 2000).
- Les deux organes de variation lances localement sur le body avant push :
variation_prev_guard->guard_pass: true, prev_targets_accepted: [15591];variation_adjacency_guard->guard_pass: true, adjacent: false. Tag valide avec l'extracteur lui-meme :required_pass: true, LIGHT/docs. - La regle reste succincte (fichier auto-charge, cf harnais: redescendre le contexte auto-charge sous 70k tokens (mesure: 98,5k, cible -29%) #15204) : le mecanisme, la mesure et le cas «
prev:ouvert » vivent dans le detail §2.1, atteint par un pointeur d'une ligne (harness-hygiene, 3 tiers).
Hors perimetre respecte : le vocabulaire fail-OPEN de
canonicalize_genre(#13475) n'est pas touche, non fusionne..claude/rules/est concerne -> PR + sign-off user (CLAUDE.md §A), signale sur le dashboard et dans le body. Je ne m'auto-autorise pas a modifier la doctrine : la PR corrige un fait faux, elle ne change aucune intention (ban G-VAR-3, boucle de rattrapage et exemption inchanges). Je ne ferme pas cette issue moi-meme.- added a commit that references this issue
on Sep 12, 2026
Grain: LIGHT/docs — lane myia-ai-01:CoursIA — prev: MED/guard #15569Le défaut
La ligne 19 de
.claude/rules/variation-protocol.mddécrit le champprev:du tagGrain:ainsi :Lu à la lettre, ça dit que le genre déclaré dans
prev:est ce sur quoi G-VAR-3 se calcule. C'est faux depuis #12095 (CLOSED) : l'organe bloquantscripts/ci/variation_adjacency_guard.pyrésout le prédécesseur depuis la séquence mergée de la lane, et renddeclared_prev_genredans un champ séparé précisément pour ne pas s'y fier. Son option le dit en propre :Mesure
grep -n "adjacence" .claude/rules/variation-protocol.mdgrep -ni "merged-sequence|séquence mergée" .claude/rules/variation-protocol.mddocs/reference/variation-protocol-detail.mdNi la règle ni son fichier de détail ne mentionnent le mécanisme réel. La seule description écrite du calcul d'adjacence, dans tout le harnais auto-chargé, est celle qui a été invalidée par #12095.
Ce que ça coûte — mesuré sur moi-même, publiquement
Le 2026-09-11, au merge-gate, j'ai dérivé l'adjacence à la main depuis les
prev:déclarés et posé deux HOLD motivés G-VAR-3 sur #15551 (prev: LIGHT/readme #15550) et #15552 (prev: LIGHT/readme #15551) — une chaîne de troisLIGHT/readmedéclarés, que j'ai qualifiée d'« inexemptable par construction ».L'organe, interrogé ensuite, rend l'inverse sur les deux :
Le prédécesseur réel était #15569 (
MED/guard), que je venais de merger à 11:34:51Z — il s'interpose dans la séquence mergée et rompt l'adjacence. J'ai dû poster une rétractation sur les deux PR (issuecomment-5633877872,issuecomment-5633878069). La décision de HOLD survivait sur l'axe genre du cap, indépendant ; le motif d'adjacence, lui, était nul.Le défaut n'est donc pas théorique, et il n'est pas réservé aux workers : il a fait écrire un motif faux au coordinateur, dans le geste même que la règle existe pour outiller. Un agent qui lit la ligne 19 conclut ce que j'ai conclu.
Deux conséquences distinctes
prev:déclaré est documentaire et vérifiable (il lie à une PR relisable) mais n'est pas la clé de calcul, et que l'organe autoritatif estscripts/ci/variation_adjacency_guard.py. Le chemin est à écrire en entier : il est sousscripts/ci/, et la règle ne le situe pas — j'ai cherchéscripts/variation_adjacency_guard.py, conclu « organe absent », et failli ouvrir une issue sur cette fausse absence.prev:qui pointe une PR non mergée passe les gardes tout en étant trompeur à la relecture. Mesuré surmyia-po-2026:CoursIAle même jour : fix(qc,#15562): residus de citation #15542 — ligne cohorte c.426, arrondi 62.31, provenance compte d'ordres #15565 déclareprev: MED/guard #15561— fix(ci,#15545): arm positive control in slides-composition-advisory — dead scanner now fails #15561 est OPEN ; fix(docs,#15516): sweep mermaid fill-sans-color — famille QuantConnect (2 READMEs, 17 règles) #15550 déclaraitprev: DEEP/ml #15548— fix(ict,#15536): trace contract v1.1.0 — instrument jlens_trackp, loader trackP branché #15548 est OPEN ; fix(guard,#15556): identite d'arbre dans le crible SHA rembobine — un push muet n'invalide plus une levee #15557 (mergée 06:33:35Z) déclaraitprev: LIGHT/notebook #15555, mergée 08:40:18Z, soit après elle. Aucun gate ne rougit — l'organe lit la séquence mergée, donc il s'en moque — mais un humain qui relit le tag reconstitue une chaîne qui n'a jamais existé. C'est ce qui m'est arrivé. Piste : le garde de tag vérifie que leprev:référence une PR mergée de la même lane, en advisory d'abord.Acceptance
variation-protocol.mdne présente plus le genre déclaré comme la clé d'adjacence, et nomme la séquence mergée.scripts/ci/variation_adjacency_guard.py) figure dans la règle — vérifiable pargrep -c 'scripts/ci/variation_adjacency_guard' .claude/rules/variation-protocol.md> 0.prev:est distingué par écrit de son rôle de calcul, pour qu'aucune lane ne croie pouvoir déplacer l'adjacence en choisissant sa déclaration.prev:non mergé, ou report nommé) — la citer, ne pas la laisser implicite.Hors périmètre : le vocabulaire de genre fail-OPEN de
canonicalize_genreest un autre défaut, suivi par #13475 (OPEN). Ne pas les fusionner.Toute modification de
.claude/rules/passe par PR + sign-off user (CLAUDE.md §A) : cette issue constate, elle ne réécrit pas.