Skip to content

fix(harness,#15793): le plancher de session devient « plusieurs grains dont un DUR » (mandat user) - #15794

Closed
jsboige wants to merge 3 commits into
mainfrom
fix/15793-plancher-grains-durs
Closed

jsboige wants to merge 3 commits into
mainfrom
fix/15793-plancher-grains-durs

Conversation

@jsboige

@jsboige jsboige commented Sep 12, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/docs — lane myia-ai-01:CoursIA — prev: MED/docs #15936

Cette PR a été réduite à son résidu (commit 3dfb16e11f). Elle n'édite plus aucun fichier de .claude/rules/** : son diff est un seul fichier, docs/reference/proactive-coordination-detail.md, +43/−0.

Pourquoi la réduction

#15939 (squash f9bbefc7f8, mergée 2026-09-13T19:42:03Z) a livré le durcissement du plancher dans les deux fichiers de règle que cette PR éditait aussi, sous une forme plus dure que celle proposée ici. Maintenir ces deux éditions ne pouvait produire que deux choses : un conflit (mergeStateStatus: DIRTY, constaté) et une deuxième rédaction de la même règle.

Preuve de préservation — « Consolider != Archiver » exige de fusionner avant de trimmer, en citant la cible :

Ce qui est retiré d'ici Où ça vit déjà sur main
R1 « ≥2 grains, dont ≥1 DEEP de CONTENU » .claude/rules/proactive-coordination.md l.9 — forme plus dure (ajoute « un cycle dont le plat principal est MED ou META n'a pas de plancher tenu »)
G-VAR-1 « Plat principal DEEP » .claude/rules/variation-protocol.md l.78 — forme plus dure (ajoute explicitement « un MED non plus »)

Les deux blobs sont restaurés à leur état de merge-base (339bcbf789, ede831e8fa) : le diff ne les mentionne plus du tout.

Ce que cette tranche apporte, et que main n'a pas

main pointe déjà vers ce contenu sans qu'il existe. R1, mergée par #15939, dit : « La mesure qui motive ce durcissement — 15 % de DEEP sur 7 j, et sur 48 h le META passant devant le CONTENU — est déposée datée dans [détail, section Plancher durci] ». Cette section n'est nulle part sur main : elle est ici. C'est un renvoi pendant que cette PR ferme, pas un doublon qu'elle ajoute. Le titre de section a été aligné sur le libellé du pointeur (## Plancher durci) dans le même commit.

Trois éléments du diff n'ont aucun équivalent ailleurs :

  • les deux lignes de lane tombées à la réduction — myia-po-2026:CoursIA 98/35/6 et myia-po-2024:CoursIA 71/51/15 ;
  • la réserve « Ce que la mesure ne dit pas » : les tiers sont déclarés, donc un DEEP sur-coté compte ici comme un DEEP — le durcissement déplace une part de la charge sur la re-qualification de tag au merge-gate, et un recomptage futur doit être lu avec cette réserve ;
  • la lecture anti-reproche du tableau : la lane la plus méta de la flotte est celle du coordinateur (1 DEEP en 7 j, 0 sur 48 h), donc le durcissement s'applique d'abord à lui.

La mesure déposée (2026-09-12T16:39Z)

Attribution par le tag Grain:, jamais --author (l'identité de poussée jsboige est partagée, L721).

Fenêtre merges DEEP MED LIGHT CONTENU META
7 jours 583 (83,3/jour) 88 — 15 % 400 88 314 260
48 heures 196 (98,0/jour) 35 — 18 % 113 45 82 109

Le volume n'est pas le défaut : 98 PRs/jour sur ~11 lanes. Ce qui décroche est la dureté, et sur 48 h le basculement CONTENU/META.

Vérifications (refaites après réduction)

  • git diff --stat vs merge-base 9d42c76532 : 1 fichier, +43/−0.
  • Périmètre gardé mécaniquement avant commit : la liste des fichiers modifiés devait valoir exactement docs/reference/proactive-coordination-detail.md, sinon abandon.
  • L898 (collision) re-mesuré à l'instant sur les 133 PRs ouvertes : plus aucune PR ouverte ne partage de fichier avec celle-ci. Avant réduction, elle entrait en collision avec le levier de slimming sur deux fichiers de règle — c'est précisément ce que la réduction supprime.
  • G-VAR-3 par l'organe (variation_adjacency_guard.py --pr-number 15794, jamais dérivé à la main) : guard_pass: true, exempted: true — exemption mécanique variation-protocol G-VAR-3 : le ban absolu des genres LIGHT et l'exception MED/DEEP-distinct se recouvrent sur guard/test/docs/readme/ledger #14357, diff disjoint du prédécesseur réel chore(harness,#15204): deporter le recit date hors de deux rules auto-chargees (-6 470 o/requete) #15936. Le commentaire vtr-adjacency-block du 2026-09-12T19:53 est périmé : il a été calculé contre une séquence de merges antérieure.
  • B.0 : check_unaddressed_nits.py 15794 → rc=0 à la tête 3dfb16e11f. Les cinq commentaires de cette PR sont tous des advisories github-actions ; aucune review, aucun thread inline.
  • gitleaks : Passed.

Rectification — le renvoi « §A » que portait ce body était faux

Ce body affirmait : « elle édite .claude/rules/**, qui exige un sign-off user (CLAUDE.md §A) ». Deux erreurs, et je les retire toutes les deux :

  1. Depuis la réduction, cette PR n'édite plus aucun fichier de .claude/rules/** — la prémisse a disparu.
  2. §A ne porte pas cette clause. Mesuré sur main : §A (l.77-87) couvre la coordination RooSync, le tour de coordination, le reporting dashboard et Git. Il ne mentionne ni sign-off, ni .claude/rules/. C'est l'objet de l'issue Harnais : cinq renvois exigent un sign-off user en citant « CLAUDE.md §A », qui ne porte pas cette clause #16014 — ce body en était une instance de plus, que je compte désormais dans le recensement.

See #15793

🤖 Generated with Claude Code

…dont un DUR

Mandat user 2026-09-12 : « Tu dois inciter les agents a prendre plusieurs
grains dont des durs a chaque session. »

R1 lisait « >=1 PR entre 2 wakeups ». Ce que cette formulation mesure --
est-ce que la lane a livre ? -- a cesse de discriminer : 583 merges en 7
jours (83/jour), la reponse est oui dix fois par jour et par lane. Ce qui
decroche est ailleurs, et se mesure : 15 % de DEEP sur la semaine, et sur
48 h le META passe devant le CONTENU (109 contre 82).

Pas de regle ajoutee (CLAUDE.md global, no-pendulum) : un nombre remplace.
R1 passe a >=2 grains dont >=1 DEEP de genre CONTENU ; G-VAR-1 passe de
« DEEP ou MED » a DEEP, MED restant admis au-dela du plancher. La mesure
datee part dans le detail doc, le harnais garde un pointeur.

Le risque -- exiger un DEEP incite a sur-coter le tier -- est nomme dans
G-VAR-1, avec le contre-poids qui existe deja : le merge-gate re-qualifie
lui-meme un tag mal derive (section 3).

See #15793

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA a deja consomme son budget LIGHT du jour (#15454 (merge a 2026-09-12T00:17:28Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) label Sep 12, 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-12) :

  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=1 genre=2 cap=1)

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.

@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre docs dans la famille META (docs/guard/ledger/readme/test) + diff de 48 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@github-actions

github-actions Bot commented Sep 12, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #15794 (fix(harness,#15793): le plancher de session devient « plusieurs grains dont un DUR » (mandat user)) 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.

@github-actions github-actions Bot added the variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) label Sep 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170).

G-VAR-3: docs succede a docs -- deux grains LIGHT consecutifs pour la lane myia-ai-01:CoursIA. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par [G-VAR-3 OVERRIDE] lane myia-ai-01:CoursIA -- next: <genre> (section 3), il ne laisse pas vieillir. (predecesseur reel: #15727, sequence mergee)

Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #15727 (docs, source merged-sequence), sequence de merges arretee au 2026-09-12T19:30:01Z. Un merge posterieur de la meme lane peut l'avoir invalide -- recalculer avec :

python scripts/ci/variation_adjacency_guard.py --pr-number 15794

variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR.

Pour passer ce gate, remplacez la prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

#15939 a merge (squash f9bbefc) le durcissement du plancher dans les deux
fichiers de regle que cette PR touchait aussi. Les deux editions de regle sont
donc retirees ici : elles sont supersedees, et leur maintien etait la cause du
conflit (mergeStateStatus DIRTY).

Preuve de preservation (Consolider != Archiver -- on fusionne AVANT de trimmer,
en citant la cible) :
  - .claude/rules/proactive-coordination.md ligne 9 sur main porte deja
    « >=2 grains livres entre 2 wakeups, dont >=1 DEEP portant un genre de
    CONTENU = PLANCHER, jamais plafond » -- forme plus dure que celle retiree ici.
  - .claude/rules/variation-protocol.md ligne 78 sur main porte deja
    « G-VAR-1 -- Plat principal DEEP, dans un genre de CONTENU » avec la clause
    « un MED non plus » -- forme plus dure que celle retiree ici.
  - Les deux blobs sont restaures a leur etat de merge-base (339bcbf et
    ede831e), donc le diff de cette PR ne les mentionne plus du tout.

Ce qui reste est le seul contenu sans equivalent sur main : les deux lignes de
lane tombees a la reduction (myia-po-2026 98/35/6 et myia-po-2024 71/51/15), la
reserve « Ce que la mesure ne dit pas » sur les tiers declares, et la lecture
anti-reproche du tableau.

Le titre de section passe de « Plancher de session » a « Plancher durci » pour
correspondre au pointeur que #15939 a lui-meme merge dans R1 (« section Plancher
durci ») : ce pointeur est pendant sur main tant que cette tranche n'a pas atterri.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot removed the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Sep 13, 2026
@myia-ai-01

Copy link
Copy Markdown
Collaborator

Réduction de cette tranche à son résidu — mesures, et un engagement tenu

Le commit 3dfb16e11f retire de cette PR les deux éditions de .claude/rules/** qu'elle portait. Son diff vaut désormais un seul fichier, docs/reference/proactive-coordination-detail.md, +43/−0 contre le merge-base 9d42c76532.

Ce que la réduction honore

J'ai écrit publiquement sur #15648 (issuecomment-5655034752) : « je réduis la tranche coordinator-discipline.md de #15648 avant de l'endosser, plutôt que de merger +83 lignes puis de les raboter dans une quatrième tranche ». La même logique s'applique ici, et pour une raison plus forte : #15939 a mergé (squash f9bbefc7f8) le durcissement du plancher dans les deux mêmes fichiers de règle, sous une forme plus dure. Maintenir mes éditions n'aurait produit qu'un conflit — c'est exactement ce qui s'était matérialisé en mergeStateStatus: DIRTY.

Preuve de préservation, pas d'archivage

« Consolider != Archiver » exige de fusionner avant de trimmer, en citant la cible par son numéro de ligne. Les deux cibles sont sur main :

  • .claude/rules/proactive-coordination.md l.9 — « ≥2 grains livrés entre 2 wakeups, dont ≥1 DEEP portant un genre de CONTENU = PLANCHER, jamais plafond », plus dur que ma formulation retirée (il ajoute qu'un cycle dont le plat principal est MED ou META n'a pas de plancher tenu).
  • .claude/rules/variation-protocol.md l.78 — « G-VAR-1 — Plat principal DEEP, dans un genre de CONTENU », avec la clause « un MED non plus », plus dure aussi.

Les deux blobs ont été restaurés à leur état de merge-base (339bcbf789, ede831e8fa) : ils ne figurent plus du tout dans le diff. Un garde mécanique a précédé le commit — abandon si la liste des fichiers modifiés ne valait pas exactement docs/reference/proactive-coordination-detail.md. Il est passé.

Ce que la réduction a révélé : main pointe déjà vers ce qui n'existe que dans cette PR

R1, telle que #15939 l'a mergée, contient ce renvoi :

« La mesure qui motive ce durcissement — 15 % de DEEP sur 7 j, et sur 48 h le META passant devant le CONTENU — est déposée datée dans [détail, section Plancher durci] »

Cette section n'est nulle part sur main. Elle est ici. J'ai donc livré dans #15939 un pointeur vers une cible non mergée, et cette PR en est le référent. Le titre de section a été aligné sur le libellé du pointeur (## Plancher de session → ## Plancher durci) dans le même commit, pour que le renvoi soit exact plutôt qu'approximatif.

Cette PR n'est donc pas le doublon qu'elle paraissait être après #15939 : c'est la moitié manquante.

Gardes re-mesurés après la réduction

  • L898 — re-passé sur les 133 PRs ouvertes : plus aucune ne partage de fichier avec celle-ci. Avant réduction, elle entrait en collision sur deux fichiers de règle avec un chantier de slimming en cours ; c'est précisément cette collision que la réduction supprime.
  • G-VAR-3 — par l'organe, jamais dérivé à la main (variation_adjacency_guard.py --pr-number 15794) : guard_pass: true, exempted: true (exemption variation-protocol G-VAR-3 : le ban absolu des genres LIGHT et l'exception MED/DEEP-distinct se recouvrent sur guard/test/docs/readme/ledger #14357, diff disjoint du prédécesseur réel chore(harness,#15204): deporter le recit date hors de deux rules auto-chargees (-6 470 o/requete) #15936). Le commentaire bot vtr-adjacency-block du 2026-09-12T19:53 est périmé — il a été calculé contre une séquence de merges arrêtée la veille, et l'organe recalculé à la séquence courante le contredit.
  • B.0 — check_unaddressed_nits.py 15794 rend rc=0 à la tête 3dfb16e11f ; les cinq commentaires de la PR sont tous des advisories github-actions, sans review ni thread inline.
  • DWELL — ma poussée a remis le plancher à zéro. C'est le coût assumé de la réduction, et il est sans conséquence ici : cette PR est de toute façon au plafond G-VAR-2 de ma lane jusqu'au basculement de journée UTC.

Rectification du body — le renvoi « §A » qu'il portait était doublement faux

Le body affirmait que cette PR « édite .claude/rules/**, qui exige un sign-off user (CLAUDE.md §A) ». Je retire les deux moitiés :

  1. La prémisse a disparu avec la réduction : plus aucun fichier de .claude/rules/** dans le diff.
  2. §A ne porte pas cette clause. Mesuré sur main (l.77-87) : §A couvre la coordination RooSync, le tour de coordination, le reporting dashboard et Git — ni sign-off, ni mention de .claude/rules/. C'est la thèse de Harnais : cinq renvois exigent un sign-off user en citant « CLAUDE.md §A », qui ne porte pas cette clause #16014, et ce body en était une instance de plus. Je l'y compte désormais.

🤖 Generated with Claude Code

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Je ferme cette PR : elle est un doublon, et le body affirmait le contraire sur une mesure fausse

Cette PR soutenait, dans sa section « Ce que la réduction a révélé », que #15939 avait livré sur
main un renvoi vers une section non mergée, et que la présente PR en était « la moitié
manquante ». C'est faux, et c'est ma mesure qui l'était.

Ce que la mesure dit, refaite à l'instant contre origin/main re-fetché

Objet Où il est Ligne
Le renvoi [détail, section Plancher durci] .claude/rules/proactive-coordination.md sur main l.9
Le second renvoi, même cible .claude/rules/variation-protocol.md sur main l.80
La cible ## Plancher durci docs/reference/proactive-coordination-detail.md sur main l.5

Le renvoi résout. #15939 (squash f9bbefc7f8) n'a pas livré un pointeur orphelin : il a déposé
la règle et sa section de détail dans le même merge. Et cette section porte déjà la mesure que
cette PR prétendait apporter — mêmes chiffres, au chiffre près : 583 merges / 88 DEEP / 15 % sur
7 jours, 196 / 35 / 18 % sur 48 h, CONTENU 314 contre META 260 sur 7 j et 82 contre 109 sur
48 h, avec le même contraste par lane.

Merger cette PR ajouterait donc un second titre ## Plancher durci dans le même fichier — le
diff vaut +43/−0, pure addition — avec une rédaction divergente du même fait (« plusieurs grains dont
un DUR » contre « ≥ 1 DEEP dans un genre de CONTENU »). Deux sections homonymes et non identiques
dans un fichier de référence sont pires que l'absence que je croyais combler.

Pourquoi je me suis trompé — l'arbre, pas le test

Le commentaire du 2026-09-13T20:07 a été écrit 25 minutes après le merge de #15939
(2026-09-13T19:42:03Z) contre un main local que je n'avais pas re-fetché. Le grep était juste ;
l'arbre était périmé. Un bon test sur le mauvais arbre rend un vrai résultat sur autre chose, et ne
signale rien — c'est exactement la classe de faute que je refuse dans les PRs des autres, et je l'ai
publiée dans un body en la présentant comme une découverte.

Ce qui est préservé, ce qui tombe

L'essentiel — la mesure, le contraste par lane, la lecture « la flotte construit l'atelier plus vite
qu'elle n'y fabrique » — est déjà sur main, dans la section l.5. Ce que cette branche portait en
plus tient en deux choses mineures : une ligne de tableau pour myia-po-2026:CoursIA (98 merges,
35 CONTENU, 6 DEEP), et le cadrage historique « le plancher R1 a lu ≥1 PR depuis le mandat du
2026-05-23 ». Ni l'une ni l'autre ne vaut une PR pour elle-même ; elles se glisseront en une ligne
dans cette section si une édition ultérieure la touche. Je le nomme ici plutôt que de les laisser
disparaître en silence : consolider n'est pas archiver, et fermer sans dire ce qu'on jette est une
façon de jeter.

Effet de bord, dit franchement

Le garde G-VAR-3, recalculé à sequence_as_of: 2026-09-14T18:08:24Z, rendait guard_pass: false
sur cette PR — docs succédant à docs pour ma lane, le prédécesseur étant #15685 que je venais
de merger quatre secondes plus tôt
. J'aurais pu lever ce blocage par l'[G-VAR-3 OVERRIDE] que la
règle ouvre au coordinateur passé 24 h. Je ne le fais pas : le garde avait raison sur le fond — deux
grains docs consécutifs de ma lane — et la bonne réponse à une règle qui vient de m'attraper n'est
pas de l'arbitrer, c'est de constater que la PR n'avait pas lieu d'être.

Fermée comme supersédée par #15939. La branche reste en place.

@myia-ai-01 myia-ai-01 closed this Sep 14, 2026
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-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants