Skip to content

fix(harness): /coordinate dispatche avant de merger, et merge par la queue - #16197

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/coordinate-regime-queue-first
Sep 14, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/coordinate-regime-queue-first

Conversation

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Le défaut est structurel, pas comportemental

/coordinate prescrivait « Production avant digestion (HARD) » en tête de sa Phase 3, puis plaçait sept étapes de merge avant la Phase 4 — celle où les lanes reçoivent leur travail. Comme la passe de merge ne termine jamais (pool non borné, trois surfaces B.0 par PR, 109 PRs ouvertes au moment de la mesure), la Phase 4 recevait le temps restant, c'est-à-dire aucun. Les lanes étaient affamées par construction du fichier.

Symptôme mesuré : un cycle de plus de 4 h pour une cadence de 4 h, dont l'essentiel passé à rejouer un audit déjà produit par l'adjoint et par Hermès/NanoClaw.

Ce que la PR change

Avant Après
Phase 3 Production et digestion (sweep, dossiers, B.0, gates, merge) Dispatchs, relances de nits, mémoire — budget 30 min
Phase 4 Steers et design-gates Merge PAR LA QUEUE, sur dossiers prémâchés
Ordre de merge non prescrit en pratique du plus ancien au plus récent, sans exception
Investigations non bornées une seule par cycle, en fin de session

Pourquoi la queue et pas la tête. Sélectionner les PRs CLEAN / vertes / rc=0 sélectionne les PRs neuves par construction : une PR est verte parce qu'elle est récente, et vieille parce qu'elle est bloquée. Le tri par état trie donc par date sans le dire. Et merger la tête dégrade activement la queue : le merge de #15627 a rendu #15799 et #15915 DIRTY.

La relance des nits devient une étape à part entière. Une réserve non levée qui n'est pas renvoyée nommément à la lane de l'auteur devient un grain qu'aucune lane ne sait qu'elle doit exécuter — et celles posées par ai-01 ne peuvent être levées par personne d'autre.

La non-répétition est écrite noir sur blanc. Les verdicts [Hermes] COMMENT_WITH_CONCERNS, EXEC_PROVED / STRUCTURAL_ONLY / SUSPECT_REGRESSION et les décision packs de l'adjoint se lisent, ils ne se rejouent pas. Seuls sont revérifiés : le delta depuis la dernière review, les réserves non levées, la preuve décisive du claim central.

Ce que la PR ne change PAS

Aucune règle de fond n'est supprimée. B.0 (lecture personnelle non délégable, organe check_unaddressed_nits.py, « une levée porte un auteur et une heure »), les gates H.4 / catalogue byte-identique / scope-vs-titre, la mécanique de merge (--squash, --merge pour une base de stack, jamais --delete-branch), le garde du rouge sans lane (GRAIN-ORPHANS-SWEEP #13086) et la délégation à modèle explicite sont préservés mot pour mot — déplacés dans la phase qui les exerce, pas réécrits.

Le diff est un déplacement de blocs plus trois ajouts (budget, ordre de queue, relance nominative). La ligne 8 sur gh auth switch n'est pas touchée : elle relève d'une PR séparée.

Validation

  • Édition scriptée avec assertions sur les deux ancres de phase — le script refuse d'écrire si le fichier a bougé.
  • Structure relue après écriture : Phases 1, 2, 3, 4, 5 dans l'ordre, aucune section orpheline.
  • Régime déjà appliqué dans le cycle courant avant l'ouverture de cette PR : 5 dispatchs de queue envoyés (po-2023:CoursIA, po-2023:CoursIA-2, po-2024:CoursIA-2, po-2026:CoursIA, po-2027:CoursIA) sur les 22 PRs ouvertes les plus anciennes, groupées par lane.

See #16194

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

🤖 Generated with Claude Code

…queue

Le skill encodait l'ordre inverse de celui qu'il prescrit. Sa Phase 3
« Production et digestion » ouvrait sur « Production avant digestion (HARD) »
puis plaçait sept étapes de merge avant la Phase 4, où vivent les dispatchs.
Or la passe de merge ne termine jamais — le pool est non borné et chaque PR
ouvre trois surfaces B.0 à lire — donc les lanes étaient affamées par
construction du cycle, et le coordinateur passait son temps à rejouer l'audit
déjà produit par l'adjoint et les bots. Symptôme mesuré : un cycle de plus de
4 h pour une cadence de 4 h.

Trois changements, sur correction user du 2026-09-14 :

1. Inversion. La Phase 3 devient dispatchs / relances de nits / mémoire, avec
   un budget explicite de 30 minutes ; la Phase 4 devient la passe de merge.
   Le sweep trié par ancienneté est capturé une seule fois et sert les deux.
2. Merge PAR LA QUEUE. Sélectionner les PRs CLEAN sélectionne les PRs neuves
   par construction : une PR est verte parce qu'elle est récente et vieille
   parce qu'elle est bloquée. Merger la tête dégrade en outre la queue — le
   merge de #15627 a rendu #15799 et #15915 DIRTY.
3. Non-répétition explicite. Les verdicts Hermès / NanoClaw / adjoint se
   lisent, ils ne se rejouent pas : seuls le delta depuis la dernière review,
   les réserves non levées et la preuve décisive sont revérifiés.

La relance nominative des nits bloquants devient une étape à part entière :
une réserve posée par ai-01 et non relancée ne peut être levée par personne.
Une seule investigation par cycle, en fin de session et plafonnée.

Aucune règle de fond n'est supprimée : B.0, les gates H.4/catalogue, la
mécanique de merge et le garde du rouge sans lane sont préservés mot pour mot,
déplacés dans la phase qui les exerce.

See #16194

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-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) labels Sep 14, 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-14) :

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.

…t precedent

Le commit precedent et le body de la PR annoncaient tous deux « une seule
investigation par cycle, en fin de session et plafonnee ». Le diff ne le
contenait pas : Phases 3 et 4 avaient ete reecrites, Phase 5 laissee
intacte. Body qui ne correspond pas au diff — le defaut exact que la
review refuse aux autres.

Corrige en ajoutant la clause plutot qu'en abaissant la prose : c'est la
moitie de la correction user qui aurait autrement disparu en silence.

Phase 5.5 : toute question ouverte qui n'est pas un bloqueur de merge se
note et attend. Si l'objet est reellement urgent, il devient un grain
dispatche, pas une enquete du coordinateur.

See #16194

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16197 (fix(harness): /coordinate dispatche avant de merger, et merge par la queue) 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.

@myia-ai-01
myia-ai-01 merged commit 6d35e22 into main Sep 14, 2026
19 of 20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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.

2 participants