Skip to content

fix(harnais,#16962): la regle DWELL dissuadait un geste devenu gratuit — update-branch sans conflit ne re-arme pas le plancher - #16963

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/16962-dwell-rule-update-branch
Sep 23, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/16962-dwell-rule-update-branch

Conversation

@myia-ai-01

@myia-ai-01 myia-ai-01 commented Sep 20, 2026 •

Copy link
Copy Markdown
Collaborator

Grain: MED/harness — lane myia-ai-01:CoursIA

Summary

.claude/rules/git-workflow.md l.42 affirmait qu'un gh pr update-branch remet le plancher DWELL à zéro (#15859), et en tirait la consigne « ne pas rafraîchir sa branche pour récupérer un fix de main ». 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 :

  1. deux parents ;
  2. le second parent est ancêtre de la base ;
  3. l'arbre du merge est identique à l'auto-merge des parents (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 ».
if auto_tree and merge_tree and auto_tree == merge_tree:
    current = first      # la fusion est sautée : le plancher ne bouge pas
    continue
return _committer_date(payload, current)

C'est exactement la forme produite par gh pr update-branch sans conflit.

Matrice après correction

Geste Plancher DWELL
gh pr update-branch sans conflit inchangé
gh pr update-branch avec résolution de conflit re-armé (arbre ≠ auto-merge)
rebase re-armé — fail-closed
commit de code ordinaire re-armé

Ce qui reste vrai et qui est conservé dans la règle : sur une PR dont le seul rouge est DWELL, update-branch n'est pas nuisible mais inutile — pr-gate-stale-sweep.yml lè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

  • Point 5 (regression check) : 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.
  • Point 1 (scope réel) : 1 fichier, 1 ligne remplacée. Aucun autre changement normatif.
  • Point 2 : le livrable est la règle elle-même ; la preuve est la lecture de merge_dwell.py citée ci-dessus, pas un script.
  • La mention de ci(dwell): un plancher DWELL remis a zero par update-branch est illisible — le nommer la ou la decision se prend #15859 est conservée comme historique corrigé — le défaut a réellement existé, et l'effacer rendrait la correction incompréhensible au prochain lecteur.

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 — lane myia-ai-01:CoursIA

See #16962

🤖 Generated with Claude Code

`.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>
jsboige added a commit that referenced this pull request Sep 20, 2026
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 clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) :

  1. 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.
  2. 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.
  3. 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é.
  4. 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.
  5. 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.

@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 20, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions

github-actions Bot commented Sep 20, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16963 (fix(harnais,#16962): la regle DWELL dissuadait un geste devenu gratuit — update-branch sans conflit ne re-arme pas le plancher) 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.

@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16963
head: 7db03ef
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 508a7e1ce100b0689796c006f909eecbf7f241ba9136dfe6b724dcee8858ffe8
diff-files: 1
diff-additions: 1
diff-deletions: 1
checks: blocked
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16963
head: 7db03ef
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: dca6f581f02e59390b04cbc3d558bdc0ed2e28d57110e90eef8537f69ceff633
diff-files: 1
diff-additions: 1
diff-deletions: 1
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

@github-actions github-actions Bot added variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable) variation-genre-mismatch declared genre != genre infere depuis les chemins du diff (#10020, advisory) and removed variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) labels Sep 21, 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-21) :

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.

@jsboige

jsboige commented Sep 22, 2026 •

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 16963
head: 7db03ef
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: ae46e6730379d57ccc46e60749da684ebc994df24bdea815755b9b6db61b80ff
diff-files: 1
diff-additions: 1
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

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

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

myia-ai-01 added a commit that referenced this pull request Sep 22, 2026
…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>
@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 16963
head: 784c6c6
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 985bab3ede1c33e79d606be59fc0a394f1b20e61f6c992e877ed8c5dd007e618
diff-files: 1
diff-additions: 1
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Note gouvernance (décision ai-01) : changement de .claude/rules/git-workflow.md. La correction de fond est déjà sur main : la puce voisine l.43/l.48 (« Correction du 2026-09-20 (#16962) … n'a pas été ré-armé par un update-branch sans conflit »). Cette PR retire la puce l.42 qui dit l'inverse (« update-branch remet le plancher DWELL à zéro »). Lecture adjoint : main se contredit aujourd'hui et la PR le remet en cohérence, sans ajouter de prescription. Sign-off user non visible sur la PR ni sur #16962 (auteur ai-01) : la qualification « substantiel ou non » (§A) reste à ai-01. Le commentaire [INFO] candidate-delivered du 22/09 20:09Z est faux pour cette puce : git diff origin/main pr/16963 montre toujours la ligne périmée sur main.

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 16963
head: 784c6c6
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 77a1ce22541b33087f50dc715c3d02dfa2cec4fe4d0bc2302d3289bc31d1c334
diff-files: 1
diff-additions: 1
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 2d23fd9 into main Sep 23, 2026
21 of 26 checks passed
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>
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-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 variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants