fix(harnais,#16962): la regle DWELL dissuadait un geste devenu gratuit — update-branch sans conflit ne re-arme pas le plancher - #16963
Conversation
`.claude/rules/git-workflow.md` l.42 affirmait qu'un `gh pr update-branch` remet le plancher DWELL a zero (#15859). Faux depuis #16149 : `last_authoritative_committed_at` (merge_dwell.py l.475) remonte la chaine first-parent au-dela des fusions de rafraichissement de base prouvees content-free -- deux parents, second ancetre de la base, et arbre identique a l'auto-merge (`git merge-tree --write-tree`, condition ajoutee par la CR du 2026-09-16). C'est la forme exacte d'un update-branch sans conflit. La regle envoyait donc les lanes attendre 120 min plutot que de recuperer un fix de `main`. Remplacee par le predicat reel et sa matrice fail-closed (conflit resolu / rebase / preuve indisponible re-arment ; commit de code re-arme). Mention de #15859 conservee comme historique corrige. See #16962 Co-Authored-By: Claude-Code <noreply@anthropic.com>
La boucle decrite par cette PR reposait sur DEUX effets d'un `gh pr update-branch` : la peremption du dossier exact-head, et le re-armement du plancher DWELL. Le second est faux depuis #16149 : `last_authoritative_committed_at` (merge_dwell.py l.475) remonte la chaine first-parent au-dela des fusions de base prouvees content-free -- deux parents, second ancetre de la base, et arbre identique a l'auto-merge (`git merge-tree --write-tree`). C'est la forme d'un update-branch sans conflit. La boucle TIENT sans lui : la peremption du dossier suffit a la produire. L'etape 2 de la sortie de boucle est corrigee en consequence -- on attend la re-agregation des checks, pas un plancher qui n'a pas bouge. Le cas fail-closed (resolution manuelle de conflit) est nomme explicitement. Se compose avec #16963, qui corrige la ligne 42 dont cette premisse etait tiree. See #16878 See #16962 Co-Authored-By: Claude-Code <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié: prédicat conforme au code)
[NanoClaw] structural review — PR +1/−1, 1 fichier (.claude/rules/git-workflow.md) : lecture du fichier au head + confrontation au code implementant (pas de diff complet, budget structurel).
Vérifications (firsthand, head 7db03ef) :
- Prédicat conforme au code — la nouvelle règle énonce exactement les 3 conditions conjointes de
last_authoritative_committed_at(scripts/ci/merge_dwell.py:475-487) : deux parents, second ancêtre de la base, arbre du merge identique à l'auto-merge (git merge-tree --write-tree). Le durcissement « CR ai-01 2026-09-16 » est cité dans les DEUX (docstring du code + règle) — aucune divergence règle/code. - Chaîne de citations intacte — #15859 conservé comme historique corrigé (choix défendu dans le body, juste) ; #16149 existe (issue open, la logique est en main et citée en docstring) ; #16962 (issue motrice) existe, open, titre = la correction apportée.
- Unicité de l'affirmation corrigée — code search : 16 fichiers portent « update-branch » ; spot-check de
catalog-pr-hygiene.md(seul autre fichier de règles concerné) : mention dans un autre contexte (chore re-root), zéro co-occurrence DWELL/plancher ⇒ l'affirmation normative ne vivait que dans git-workflow.md, le grep régression du body tient sur l'échantillon vérifié. - Cohérence interne — la table fail-closed du body (résolution de conflit / rebase / commit ordinaire = re-armé) correspond à la sémantique du code : date de committer du dernier commit modifiant le côté PR, fusions content-free traversées.
- Sécurité : ligne de doc seule, rien d'exécutable, 0 secret.
Nits (non bloquants) :
- #16149 est encore OPEN alors que sa logique est en main et servie de référence — fermeture à considérer côté lane (bookkeeping).
- Densité : le paragraphe de remplacement est long pour un fichier de règles — précis mais exigeant ; la table du body aurait mérité de vivre dans la règle elle-même.
Review COMMENT ; décision de merge = Emerjesse/lane.
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
Path-collision (organ #13359/#13615)Cette PR #16963 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
[ADJOINT PREFLIGHT] |
|
[ADJOINT PREFLIGHT] |
|
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 |
|
[ADJOINT PREFLIGHT] Dossier Secrétaire cat. 2 mini-cost cycle 9, exact-head 7db03ef, +1/-1, 1 fichier(s). — secrétaire myia-po-2026:CoursIA-3 |
…rme le DWELL (#16879) * docs(rules,#16878): update-branch perime le dossier autant qu'il re-arme le DWELL git-workflow.md portait deja la moitie DWELL du mecanisme (#15859). L'autre moitie n'etait ecrite nulle part : update-branch change la tete, donc perime le contrat exact-head du dossier de prevalidation. Les deux se composent en boucle fermee, mesuree le 2026-09-19 : 17 candidates sur 17 refusees par le gate, aucune pour un defaut de PR. Ajoute l'ordre en 4 temps qui en sort -- le dossier vient APRES la stabilisation de la branche -- et nomme le gel de branche entre dossier et merge comme sa condition. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(rules,#16878): retire la premisse fausse « et le DWELL se re-arme » La boucle decrite par cette PR reposait sur DEUX effets d'un `gh pr update-branch` : la peremption du dossier exact-head, et le re-armement du plancher DWELL. Le second est faux depuis #16149 : `last_authoritative_committed_at` (merge_dwell.py l.475) remonte la chaine first-parent au-dela des fusions de base prouvees content-free -- deux parents, second ancetre de la base, et arbre identique a l'auto-merge (`git merge-tree --write-tree`). C'est la forme d'un update-branch sans conflit. La boucle TIENT sans lui : la peremption du dossier suffit a la produire. L'etape 2 de la sortie de boucle est corrigee en consequence -- on attend la re-agregation des checks, pas un plancher qui n'a pas bouge. Le cas fail-closed (resolution manuelle de conflit) est nomme explicitement. Se compose avec #16963, qui corrige la ligne 42 dont cette premisse etait tiree. See #16878 See #16962 Co-Authored-By: Claude-Code <noreply@anthropic.com> --------- Co-authored-by: jsboige <jsboige@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Conflict in .claude/rules/git-workflow.md resolved deliberately: - kept this branch's first bullet (update-branch without conflict does NOT reset the DWELL floor, #16149) in place of main's stale "remet le plancher DWELL a zero" bullet; - kept main's second bullet from #16879 (update-branch perishes the prevalidation dossier) and its ordered exit-from-loop list, unchanged. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
[ADJOINT PREFLIGHT] Note gouvernance (décision ai-01) : changement de |
|
[ADJOINT PREFLIGHT] |
…dre (#17289) Reserve jaune de la lane secretaire (5796479941) : #16879 puis #16963 avaient deja mis sur `main`, dans la puce « update-branch tue AUSSI le dossier de prevalidation », l'ordre en 4 temps, le gel, la mesure fondatrice 17/17 **et** la correction #16962 du claim DWELL. Ma section ajoutee redonnait tout cela — et son etape 2 redonnait la claim DWELL *corrigee*. La duplication ne pese pas qu'en lignes : elle re-derive. - `.claude/rules/git-workflow.md` : section supprimee ; la puce reste la surface UNIQUE. Ajout minimal (+2 lignes) : le renvoi operationnel vers `coordinate/SKILL.md` et le lien vers le detail deporte — c'est la correction de premisse 2 (« l'autre moitie n'est ecrite nulle part » est inexact), que la regle pouvait porter sans redire l'ordre. - `docs/.../prevalidation-dossier-order-detail.md` : « la regle fait foi » ; l'ordre n'y est plus recopie (pas de seconde copie qui derive) ; l'etape DWELL perimee disparait ; le §5 explique desormais le POURQUOI (pourquoi le gel est la piece non derivable). - `scripts/tests/test_prevalidation_order_rule.py` : re-pointe sur la puce l.43-52 (ancrage sur le debut de puce, borne a la puce suivante), plus une epingle NEUVE — aucune seconde sous-section ne doit rouvrir la regle. Falsification (6 mutations, arbre jetable, sha256 du fichier de regle identique avant/apres) : 5 mutations tombent chacune sur le BON test, seul ; 1 controle de sur-portee (retrait du lien du detail) reste vert — l'epingle ne mesure pas autre chose que ce qu'elle annonce. 13 passed. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…ion (seconde moitie d'update-branch) (#17289) * docs(harness,#16878): la regle porte l'ordre du dossier de prevalidation (seconde moitie d'update-branch) La regle ne decrivait qu'UNE moitie du mecanisme `update-branch` (l'effet sur le plancher DWELL). La seconde -- `update-branch` change la TETE, donc perime le dossier de prevalidation exact-head -- n'y figurait pas, et surtout l'ORDRE qui debloque la boucle n'etait nulle part. Fondateur : le 2026-09-19, le gate d'entree de la passe de merge a rendu exit 1 sur 17 candidates sur 17, AUCUNE pour un defaut de PR. Ce que cette PR ajoute (addition pure, 21 lignes, aucune suppression) : - une sous-section `### update-branch et le dossier de prevalidation` : le fait que le dossier atteste une TETE, l'ordre en 4 temps, et le GEL DE BRANCHE nomme comme la condition qui manquait ; - le renvoi (lien) a `coordinate/SKILL.md`, qui portait DEJA le fait de peremption, plutot qu'une redescription -- deux surfaces qui redécrivent la meme regle finissent par diverger (#16962) ; - un detail deporte `docs/reference/prevalidation-dossier-order-detail.md` avec le verbatim de l'organe prouvant le mecanisme. CORRECTION DU PREMISSE DE L'ISSUE, verifiee a la source : #16878 motivait la boucle par « update-branch re-arme le plancher DWELL pour 120 min ». FAUX dans le cas courant depuis #16149 (rafraichissement content-free = plancher INCHANGE, cf. #16962/#17286). La boucle ne se referme donc PAS par le DWELL : elle se referme par la peremption du dossier -- moitie intacte. L'issue affirmait aussi que « l'autre moitie n'est ecrite nulle part » : inexact, `coordinate/SKILL.md` la porte. Les deux corrections sont ecrites dans la regle et dans le detail, pour qu'un futur lecteur ne reimporte pas l'erreur. Verifications : - mecanisme verifie a la source (`scripts/check_adjoint_prevalidation.py` l.552-554 `{key} is stale`, l.556-558 `head is stale`, l.534 surfaces, l.548-550 diff-files/additions/deletions) ; - epingle `scripts/tests/test_prevalidation_order_rule.py` : 10 tests, avec controle negatif en corps de test ; - FALSIFICATION, l'epingle doit distinguer les etats (mesure : 3 mutations, 3 fois le BON test tombe) : claim DWELL reintroduite -> 1 failed (le test de la claim) ; etape « rejoue la jambe » retiree -> 1 failed (le test de l'ordre) ; mesure 17/17 retiree -> 1 failed (le test de la mesure). Restauration byte-identique verifiee par sha256 apres chaque mutation ; - citation du skill verifiee VERBATIM (« le perime », sans accent chez la source). Voir #16878. * test(harness,#16878): ancrer l'epingle sur le TITRE de sous-section, pas sur la phrase nue `_order_section()` faisait `text.find("dossier de prevalidation")` : la premiere occurrence du TEXTE. Une mention de la phrase dans une section anterieure deplacait la borne, et l'epingle aurait teste un voisinage sans rapport en le declarant vert -- un faux vert silencieux, precisement la classe que cette PR ferme par ailleurs. Ancrage desormais sur `\n### ... dossier de prevalidation` (le titre), qui est unique. Verification du bornage : la section extraite fait 2501 caracteres, sa 1re ligne est le titre et sa derniere la ligne de renvoi -- ni debordement sur la section voisine, ni troncature. Falsification rejouee apres durcissement : claim DWELL reintroduite -> 1 failed (le test de la claim) ; etape « rejoue la jambe » retiree -> 1 failed (le test de l'ordre). Restauration byte-identique verifiee par sha256. * fix(harness,#16878): reduire a l'epingle — la regle portait deja l'ordre (#17289) Reserve jaune de la lane secretaire (5796479941) : #16879 puis #16963 avaient deja mis sur `main`, dans la puce « update-branch tue AUSSI le dossier de prevalidation », l'ordre en 4 temps, le gel, la mesure fondatrice 17/17 **et** la correction #16962 du claim DWELL. Ma section ajoutee redonnait tout cela — et son etape 2 redonnait la claim DWELL *corrigee*. La duplication ne pese pas qu'en lignes : elle re-derive. - `.claude/rules/git-workflow.md` : section supprimee ; la puce reste la surface UNIQUE. Ajout minimal (+2 lignes) : le renvoi operationnel vers `coordinate/SKILL.md` et le lien vers le detail deporte — c'est la correction de premisse 2 (« l'autre moitie n'est ecrite nulle part » est inexact), que la regle pouvait porter sans redire l'ordre. - `docs/.../prevalidation-dossier-order-detail.md` : « la regle fait foi » ; l'ordre n'y est plus recopie (pas de seconde copie qui derive) ; l'etape DWELL perimee disparait ; le §5 explique desormais le POURQUOI (pourquoi le gel est la piece non derivable). - `scripts/tests/test_prevalidation_order_rule.py` : re-pointe sur la puce l.43-52 (ancrage sur le debut de puce, borne a la puce suivante), plus une epingle NEUVE — aucune seconde sous-section ne doit rouvrir la regle. Falsification (6 mutations, arbre jetable, sha256 du fichier de regle identique avant/apres) : 5 mutations tombent chacune sur le BON test, seul ; 1 controle de sur-portee (retrait du lien du detail) reste vert — l'epingle ne mesure pas autre chose que ce qu'elle annonce. 13 passed. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Grain: MED/harness — lane myia-ai-01:CoursIA
Summary
.claude/rules/git-workflow.mdl.42 affirmait qu'ungh pr update-branchremet le plancher DWELL à zéro (#15859), et en tirait la consigne « ne pas rafraîchir sa branche pour récupérer un fix demain». C'est faux depuis #16149.Un seul paragraphe changé, remplacé par le prédicat réellement implémenté.
La mesure
scripts/ci/merge_dwell.py,last_authoritative_committed_at(l.475) — remonte la chaîne first-parent au-delà des fusions de rafraîchissement de base prouvées content-free, sous trois conditions conjointes :git merge-tree --write-tree) — condition ajoutée par la CR ai-01 du 2026-09-16, dont le commentaire de code dit explicitement « la forme des parents ne prouve pas l'absence de contenu ».C'est exactement la forme produite par
gh pr update-branchsans conflit.Matrice après correction
gh pr update-branchsans conflitgh pr update-branchavec résolution de conflitCe qui reste vrai et qui est conservé dans la règle : sur une PR dont le seul rouge est
DWELL,update-branchn'est pas nuisible mais inutile —pr-gate-stale-sweep.ymllève seul, et la rafale CI déclenchée pèse sur un pool de runners partagé.Pourquoi ce n'est pas cosmétique
La règle dissuadait un geste gratuit, dans le sens coûteux : elle envoyait les lanes attendre 120 minutes. Je l'ai moi-même rediffusée à quatre lanes ce matin (po-2023, po-2026, po-2027, po-2025:CoursIA-2) avant de lire l'organe — correction envoyée depuis à chacune. Une règle du harnais est datée de sa rédaction, pas de sa lecture.
Vérifications
git grep -n -iE "update-branch.{0,80}(plancher|DWELL|zero|zéro)|(plancher|DWELL).{0,80}update-branch" -- '*.md'→ 0 autre occurrence dans le dépôt. L'affirmation ne vivait qu'ici.merge_dwell.pycitée ci-dessus, pas un script.Gouvernance
Changement normatif du harnais (CLAUDE.md §A) : il retire une interdiction plutôt que d'en ajouter une, mais il change une prescription — donc PR + review obligatoires, et je ne me le merge pas.
Grain:
LIGHT/harnais— lanemyia-ai-01:CoursIASee #16962
🤖 Generated with Claude Code