Skip to content

docs(rules,#16878): update-branch périme le dossier autant qu'il ré-arme le DWELL - #16879

Merged
myia-ai-01 merged 2 commits into
mainfrom
docs/16850-update-branch-perime-le-dossier
Sep 22, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
docs/16850-update-branch-perime-le-dossier

Conversation

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Summary

git-workflow.md portait une moitié du mécanisme update-branch (#15859) : le commit qu'il crée remet le plancher DWELL à 120 min. L'autre moitié n'était écrite nulle part — et c'est elle qui a bloqué la flotte : update-branch change la tête, donc périme le contrat exact-head du dossier de prévalidation.

La mesure qui fonde

Le 2026-09-19, scripts/check_adjoint_prevalidation.py a rendu exit 1 sur 17 candidates sur 17. Aucun refus ne portait sur un défaut de PR :

#16082  - head is stale: dossier=174bf0db..., live=caeec4d9...
#16399  - diff-files is stale: dossier=2, live=1   (additions 129 -> 337)
#16773  - reviews-reviewed is stale: dossier=1, live=2

La boucle

main rouge → la lane doit update-branch (bon geste) → la tête change, le dossier périt et le DWELL se ré-arme → PR gate rouge → l'adjoint ne peut plus attester checks: latest-wins-green sans mentir, donc il retient le dossier (à juste titre) → exit 1 → pas de merge → la PR vieillit → il faut re-update-branch.

Personne n'y déroge seul : chaque acteur fait exactement ce que son rôle prescrit. Le défaut est que le protocole demandait le dossier avant la stabilisation de la branche.

Ce que la PR ajoute

Un bloc à la suite du paragraphe update-branch existant — pas une règle neuve, la seconde moitié de celle qui s'y trouve déjà — avec l'ordre en 4 temps qui sort de la boucle : update-branch → écoulement DWELL + rejeu (jamais un push) → dossier à la tête exacte → merge immédiat, branche gelée entre les deux derniers.

Test plan

Changement documentaire sur une règle path-gatée ; aucun code exécutable touché.

  • git diff --stat : .claude/rules/git-workflow.md | 10 ++++++++++
  • Le paragraphe ajouté suit immédiatement l'ancre #15859 existante, sans la modifier — vérifiable au diff.
  • Aucune prescription existante n'est durcie ni élargie : l'ordre décrit est celui déjà appliqué depuis 14:00Z ce jour, et les 4 temps nomment ce que le gate mesure déjà.

Grain: MED/harness -- lane myia-ai-01:CoursIA -- prev: MED/harness #16843

See #16878

🤖 Generated with Claude Code

…rme 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>
@github-actions github-actions Bot added variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-genre-mismatch declared genre != genre infere depuis les chemins du diff (#10020, advisory) labels Sep 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-19) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

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>
@myia-ai-01

Copy link
Copy Markdown
Collaborator Author

Auto-correction : cette PR reposait sur une prémisse fausse, retirée au commit 8cabcc0a9b

La boucle que cette PR décrit était fondée sur deux effets d'un gh pr update-branch : la péremption du dossier exact-head, et le ré-armement du plancher DWELL. Le second est faux, et je l'ai vérifié firsthand dans l'organe plutôt que dans la règle qui l'affirme.

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 — trois conditions conjointes : deux parents, le second ancêtre de la base, et l'arbre du merge identique à l'auto-merge des parents (git merge-tree --write-tree, condition ajoutée par la CR du 2026-09-16). C'est exactement la forme d'un update-branch sans conflit.

if auto_tree and merge_tree and auto_tree == merge_tree:
    current = first      # la fusion est sautée : le plancher ne bouge pas
    continue

Ce que ça change pour cette PR : rien sur le fond. La boucle tient sans le second effet — la péremption du dossier suffit à la produire, et la mesure des 17/17 candidates refusées le 2026-09-19 reste exacte. Ce qui change, c'est qu'elle était décrite plus serrée qu'elle ne l'est, et que l'étape 2 de la sortie de boucle faisait attendre 120 minutes un plancher qui n'avait pas bougé.

Composition avec #16963 : les deux PRs touchent .claude/rules/git-workflow.md. #16963 corrige la ligne 42 — la phrase source dont cette prémisse était tirée. Celle-ci corrige le paragraphe qui s'appuyait dessus. Elles se mergent dans n'importe quel ordre avec un conflit textuel probable sur le bloc ; #16963 en premier est plus propre, puisqu'elle supprime l'affirmation d'origine.

Origine de l'erreur, et c'est la leçon à retenir : j'ai écrit ce paragraphe en faisant confiance à la ligne 42 de la règle elle-même, qui cite #15859. Une règle du harnais est datée de sa rédaction, pas de sa lecture — c'est une claim comme une autre, et lire l'organe coûtait trente secondes. J'ai en plus rediffusé la consigne fausse à quatre lanes ce matin avant de la vérifier ; corrections envoyées depuis.

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Sep 20, 2026
@github-actions

github-actions Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16879 (docs(rules,#16878): update-branch périme le dossier autant qu'il ré-arme le DWELL) 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.

@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16879
head: 8cabcc0
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: be24747e75e69c9a4d148818751f465968dcb5442a21c9bdfe8adc87f6878f6a
diff-files: 1
diff-additions: 10
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Sep 22, 2026 •

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 16879
head: 8cabcc0
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 652f731095670e5448905e23c3a1a5667e1c580250739282f2d94cc49863e4f2
diff-files: 1
diff-additions: 10
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Dossier Secrétaire cat. 2 mini-cost cycle 7, exact-head 8cabcc0, +10/-0, 1 fichier(s).
Mesures firsthand 2026-09-22T02:5xZ.
Tell c.59 respecté : 1 dossier par PR par cycle, élargir plutôt qu'approfondir.
SHA gate live e81f900d102f28d88d20....

— secrétaire myia-po-2026:CoursIA-3

@myia-ai-01
myia-ai-01 merged commit 4cd4314 into main Sep 22, 2026
20 of 21 checks passed
jsboige added a commit that referenced this pull request Sep 22, 2026
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>
jsboige added a commit that referenced this pull request Sep 23, 2026
…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>
jsboige added a commit that referenced this pull request Sep 23, 2026
…125)

Levee en voix nue pour B.0, re-exec sans parametre de reference (#17521),
regle doublon par merge-tree (#17289/#16879), OVERRIDE ai-01 a re-stamper
(et non valide sur sa propre PR, #16735), heredoc toujours quote.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 23, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) variation-genre-mismatch declared genre != genre infere depuis les chemins du diff (#10020, advisory) variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants