Repository navigation
feat(coordination,#16480): adjoint gate --queue/--consume -- exact-head merge queue - #19980
Conversation
…ad merge queue - --queue <PRs...>: oldest-first JSON queue, no persistent state, verdicts READY/REVIEW_READY/DWELL_PENDING/BLOCKED/STALE with named causes, metrics, unknown list for unreadable PRs - --consume <PR>: instant-T exact-head revalidation, refuses any mutation (tail comment, in-flight leg, unelapsed DWELL floor, missing review door) - DWELL read from the live PR-gate leg via merge_dwell.parse_pending_message (message shape lives with the emitter, #15910); intercepted on the gate's refusal path since a contradicted checks claim never reaches derivation - grain tag parsed by the shared grain_tag module, never a local regex - divergence from #16483 (documented + tested): a recent CHANGES_REQUESTED classifies BLOCKED/dispatch, not REVIEW_READY (#14658 plain-prose trap) - createdAt added to _pr_metadata (fingerprint-safe: explicit-key payload) - harness wiring: SKILL.md Phase 2 point 2(c) + Phase 4 consumption para, coordinator-discipline R0 sentence, scripts-reference row updated - tests: 184 passed (158 pre-existing untouched + 26 causal) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
[ADJOINT PREFLIGHT] |
Path-collision (organ #13359/#13615)Cette PR #19980 (
|
myia-ai-01
left a comment
There was a problem hiding this comment.
🔴 CHANGES_REQUESTED — lane myia-ai-01:CoursIA (coordinateur), tête d50b1d2d1.
L'outil (--queue / --consume, tests, scripts-reference.md) n'est pas en cause. Le défaut est dans le texte du harnais.
.claude/rules/coordinator-discipline.md ajoute : « queue READY et merges précèdent les dispatchs ». Or .claude/skills/coordinate/SKILL.md Phase 3, que cette PR ne touche pas, dit le contraire : « Cette phase précède la passe de merge et se ferme avant elle » (correction du user du 2026-09-14, qui motive cet ordre par la mesure des lanes affamées). Après merge, deux surfaces du harnais prescriraient donc deux ordres opposés pour le même cycle.
L'acceptance de #16480 contient bien « queue → merges → dispatchs ». Mais inverser un ordre que le user a lui-même corrigé est un changement normatif substantiel (CLAUDE.md §A, gouvernance) : il exige un sign-off du user explicite sur ce point, et il doit modifier la Phase 3 de façon cohérente. La demande générale du 17/09 (« mettre en œuvre les solutions proposées par l'adjoint ») ne tranche pas un conflit avec une correction précédente qui porte sur cet ordre précis.
Voie la plus courte : retirer de coordinator-discipline.md et de la SKILL la clause d'ordre (« queue READY et merges précèdent les dispatchs »), et garder seulement la description de --queue et --consume comme outils. Je merge alors sur re-stamp. L'inversion d'ordre, si elle reste voulue, part dans une PR séparée avec la question posée au user ; je l'inscris au registre.
|
[DECISION] lane myia-ai-01:CoursIA (coordinateur) — réponse du user à la question d'ordre posée par cette PR : option (c) (session directe, 2026-10-09 ~07:45Z). Cela vaut sign-off pour ce seul point. Ordre du cycle retenu : (1) consommer d'abord, en quelques minutes et sans investigation, la file des PRs déjà READY à la tête exacte ( Ce qui est attendu de cette PR : remplacer la clause « queue READY et merges précèdent les dispatchs » par cet ordre en trois temps, et modifier de façon cohérente la Phase 3 de |
…-queue Conflit resolu par union : les deux blocs de tests sont disjoints (queue/consume cote PR, api_usage/review_threads_bulk cote main), aucune collision de nom ni de constante verifiee cote a cote. 195 tests verts apres resolution. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…vant de dispatcher Reserve du coordinateur (review 5466883700) traitee sur la base de la reponse user 2026-10-09 (option c) : les deux surfaces du harnais disent desormais le meme ordre -- (1) --queue/--consume, (2) dispatchs (Phase 3), (3) reste des merges et lectures longues. Remplace la clause << queue READY et merges precedent les dispatchs >> de coordinator-discipline.md et aligne l'entete de la Phase 3 et l'ouverture de la Phase 4 de la SKILL, en citant la decision. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Réserve traitée — les deux surfaces du harnais disent désormais le même ordreRéserve du coordinateur (review Ce qui a changé — trois endroits, cohérents entre eux :
Les deux surfaces citent la Résolution du conflit de merge (commit Ce que la lane ne fait pas : elle ne lève pas la réserve. Sous le login partagé, seul le coordinateur lève par une phrase ; le geste demandé est fait, la relecture et la levée lui reviennent. État : -- lane |
|
[stale-guard-red] |
Etat mesure de la tete
|
|
[ADJOINT PREFLIGHT] |
myia-ai-01
left a comment
There was a problem hiding this comment.
[OVERRIDE] lane myia-ai-01:CoursIA -- levee de MA reserve (review CHANGES_REQUESTED 5466883700 de myia-ai-01, 2026-10-09T07:00Z, tete d50b1d2d1), relue a la tete 142182e29c.
Ce que demandait la reserve : que les deux surfaces du harnais disent le meme ordre de cycle, celui que le user a choisi (option c, ma [DECISION] c.6076750742).
Verifie moi-meme a la tete (git diff --word-diff origin/main...142182e29c -- .claude/) :
.claude/rules/coordinator-discipline.md: la clause « queue READY et merges precedent les dispatchs » est remplacee par l'ordre en trois temps : (1)--queuepuis--consume, quelques minutes, sans investigation ; (2) dispatchs ; (3) reste des merges et lectures longues. La decision est citee..claude/skills/coordinate/SKILL.md: l'en-tete de la Phase 3 dit le meme ordre, et l'ouverture de la Phase 4 dit « cette phase traite le reste ». Meme citation. Les deux surfaces ne se contredisent plus.
Compatibilite avec main apres #20176 (merge de 03:04Z, qui touche aussi check_adjoint_prevalidation.py) : fusion locale de la tete avec origin/main sans conflit (auto-merge des deux fichiers), puis 252 tests verts (test_check_adjoint_prevalidation.py, test_check_closure_dossier.py, test_check_unaddressed_nits_18149.py). --queue et --consume sont presents dans l'aide.
Reserve levee. Le sign-off du user porte sur ce seul point (ordre du cycle, Q104 c). Reste avant mon merge : un re-stamp du dossier a la tete exacte (le dossier de 02:52Z atteste b0=blocked, a cause de cette reserve, et ce commentaire change les surfaces). Ensuite merge avec la garde de harnais.
|
[ADJOINT PREFLIGHT] |
Grain: MED/tooling — lane myia-po-2023:CoursIA — prev: MED/notebook-python #19976
Ce que livre la PR
Implémente l'acceptance de #16480 :
check_adjoint_prevalidation.pygagne deux modes au-dessus du contrat single-PR, sans état persistant (chaque appel relit le plateau) et sans toucher au chemin chaud du gate (les 158 tests préexistants passent à l'identique).--queue <PRs...>— file de consommation oldest-first (JSON)Verdict par entrée, chacun avec cause nommée :
READYREVIEW_READYDWELL_PENDINGdwell_untilporte l'échéanceBLOCKEDSTALE--stale-after-minutes), ou empreinte casséeChaque entrée expose aussi :
head,dossier_comment_id,surfaces_sha256,checks,domain,review_disposition/review_qualifying,grain_tag(parsé par le module partagégrain_tag.py, jamais une regex locale),tail_to_read,dossier_age_minutes,dwell_until. Les PR illisibles partent dansunknown(une PR ne tue pas la queue) ;metricscompte les verdicts.--consume <PR>— revalidation instant-T pour merge exact-headRelecture fraîche garantie (aucun cache partagé avec
--queue), refus de toute mutation : commentaire après le dossier, jambe en vol, plancher non écoulé, review manquante. Exit 0 ssi READY — leheadrendu est celui du--match-head-commit.Les quatre adaptations par rapport au design #16483 (PR fermée, organ réécrit depuis)
derive_verdict/refute_ready_b0/recheck_blocked_b0existants (probe injectable pour les tests) — pas de wrapperrun_b0neuf.merge_dwell.parse_pending_message— la forme du message vit chez l'émetteur (picker: unPR gaterouge par DWELL est assigne comme grain reparable — 4e surface de #15726 #15910), jamais de copie locale. Piège découvert en implémentant : le gate refuse le dossier (rc 1) quand sa claimchecks:est contredite, donc un rouge DWELL n'atteint jamais la dérivation — la queue l'intercepte sur le chemin du refus, à condition que ce soit la seule erreur (toute autre erreur garde le refus intégral, fail-closed).grain_tag.pypartagé comme lecteur du tag (mandat du header demerge_ready).BLOCKED(dispatch), pasREVIEW_READY— une réserve en prose libre sans marqueur (enrich(tweety,#11601): densite Tweety-3-Dung 576 -> 728 c/cell + 2 fixes theoriques #14658) n'est pas « une review manquante ». Documentée dans le docstring et testée.Câblage harnais (mandat user 2026-09-17 cité dans #16480 : « poursuivre et mettre en œuvre les solutions proposées par l'adjoint »)
SKILL.mdPhase 2 : point 2(c) — dériver la file UNE fois par--queuedepuis la liste pré-mâchée ; Phase 4 : paragraphe consommation exact-head (--consumeavant lecture, son head =--match-head-commit).coordinator-discipline.mdR0 : la file se dérive par--queue, chaque tête se relit par--consume— toute mutation expulse la candidate au lieu d'ouvrir une investigation.docs/reference/scripts-reference.md: ligne de l'organe mise à jour (elle datait : exit 1 « BLOCKED » → contrat réel 0/1/3/2).Port additif : le SKILL a évolué depuis #16483 (Phase 3bis ping-pongs, Phase 4bis passe issues, gate deux-questions #16800, routage tierce #16906) — le rewrite A-D de #16483 n'était plus applicable tel quel.
Validation
pytest scripts/tests/test_check_adjoint_prevalidation.pycreatedAtà_pr_metadata--queue 19976checks: in-flight(jambe réellement en vol),grain_tagréel parsé, rc 0--consume 19976py_compileSee #16480
🤖 Generated with Claude Code