You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
guard(coord): une review de LEVÉE d'ai-01 périme le dossier qu'elle est censée débloquer #17039
Grain: MED/guard — lane myia-ai-01:CoursIA — prev: MED/tooling #17038
Le défaut, mesuré ce soir
Le gate de Phase 4 exempte les surfaces écrites par myia-ai-01après le dossier (_is_own_later_act). Le motif de cette exemption est écrit dans le skill :
« Sans ça, le geste que le gate autorise — lire la PR, puis lever sa propre réserve — périme le dossier que le gate exige, et une PR bloquée par la seule réserve du coordinateur ne peut jamais se merger sans un aller-retour complet. »
L'exemption ne couvre pas une review. Mesure directe, 2026-09-20 :
Instant
Fait
17:54:27Z
[ADJOINT PREFLIGHT] posé sur #16804 par myia-po-2023:CoursIA, dossier intègre
20:09:55Z
myia-ai-01 poste une reviewCOMMENT portant [OVERRIDE] lane myia-ai-01:CoursIA + phrase de levée
20:10Z
check_unaddressed_nits.py → rc=0, la réserve est levée
20:10Z
check_adjoint_prevalidation.py → rc=1, discussion surfaces changed or were not fully attested
Le dossier de 17:54Z a été périmé par l'acte même que le gate autorise.
Pourquoi c'est un plafond de débit, pas un détail
La levée d'une réserve tierce (Hermes / clusterManager-Myia) exige la forme canonique [OVERRIDE] lane <machine:workspace>, réservée à LIFT_OVERRIDE_LOGINS = {"myia-ai-01"}. Et cette forme n'est reconnue que si elle est postée comme review ou commentaire par ai-01.
Conséquence mécanique : toute PR dont le seul bloqueur est une réserve Hermes exige un aller-retour complet — ai-01 lève, le dossier meurt, une lane tierce doit en réémettre un, et seulement au cycle suivant la PR peut merger. Le coordinateur ne peut pas débloquer et merger dans la même passe, structurellement.
C'est le plafond suivant celui que #16967 vient de lever (course d'empreinte sur statusCheckRollup) et celui que #16907 avait levé avant (monopole de lane). Les trois sont en série : lever le visible mesure le suivant.
Ce qu'on ne veut PAS faire
Ne pas élargir LIFT_OVERRIDE_LOGINS. La décision « override monopole ai-01 » est délibérée : n'importe quelle lane pourrait sinon poser un [OVERRIDE] sous le login partagé jsboige sur sa propre PR. Le monopole n'est pas le défaut.
Ne pas exempter toutes les reviews d'ai-01 sans condition non plus : une review d'ai-01 qui pose une réserve neuve doit périmer le dossier — c'est précisément son travail.
Acceptance proposée
_is_own_later_act couvre les reviews de myia-ai-01 au même titre que ses commentaires, quand la review ne fait que lever (elle porte un marqueur de levée reconnu et aucun marqueur de réserve — CONCERN_MARKERS vide).
Une review d'ai-01 portant un marqueur de réserve (CHANGES_REQUESTED, 🔴, 🟡, préfixe de verdict) continue de périmer — pas d'exemption en bloc.
Contrôle positif et contrôle négatif, les deux sont requis :
positif : dossier intègre + review de levée pure d'ai-01 → le gate reste rc=0 ;
négatif : dossier intègre + review d'ai-01 posant une réserve neuve → le gate passe rc=1.
Note de forme découverte au passage (à citer dans la doc du gate)
Trois essais ont été nécessaires pour qu'une levée de réserve tierce soit vue par check_unaddressed_nits.py. Les deux premières formes étaient exactes en substance et invisibles à l'organe :
## [OVERRIDE ai-01] Réserve **Hermes** … — **LEVÉE** → invisible : _OPENING_LIFT_RE est ancrée ^ sans MULTILINE sur la forme réserve levée / levée de la réserve / je lève la réserveen tête, et le mot en fin de titre n'y est pas ; de plus le préfixe crochet est lu par _CROSS_LANE_LIFT_RE comme un préfixe de rôle, qui scope la levée à la seule voix de l'émetteur (garde feat(gametheory,#14442): strate-7 marchandage asymetrique en GT-04d autonome (tranche D1) #14795) — donc incapable de lever la réserve d'un tiers.
## Réserve levée — … seule → toujours invisible : lever une réserve tierce exige en plus le marqueur [OVERRIDE] lane <machine:workspace> en tête de ligne (_OVERRIDE_LANE), et un OVERRIDE nu ne lève rien sans phrase de levée.
[OVERRIDE] lane myia-ai-01:CoursIA en première ligne + « Je lève la réserve de … » → rc=0 sur les deux PRs.
Cette séquence mérite d'être dans la docstring du module : un arbitrage juste qui ne porte pas la bonne forme est indiscernable d'une absence d'arbitrage.
Instances
#16804 (réserve Hermes levée 20:09:55Z, dossier po-2023 de 17:54Z périmé dans la foulée) · #16274 (même classe, rc=0 en B.0, aucun dossier à périmer).
Fix livre : PR #17693 — fix(guards,#17039): review-emits-reserve perime le dossier, pas la levee.
Ce qui change
_is_own_later_act (scripts/check_adjoint_prevalidation.py) neutralisait
TOUTE action du coordinateur posterieure au dossier — y compris les reviews
qui EMETTENT une reserve neuve (verdict CHANGES_REQUESTED, glyphe 🟡/🔴,
verdict BLOCKED). C'etait l'inverse du contrat attendu : une levee
detruit le besoin d'un dossier ; une reserve neuve le RE-ARME.
Correctif
Nouveau sous-ensemble canonique _REVIEW_RESERVE_MARKERS duplique depuis scripts/check_unaddressed_nits.py (CONCERN_MARKERS + SEVERITY_GLYPHS +
BLOCK_VERDICTS), restreint aux emissions formelles stables :
CHANGES_REQUESTED, REQUEST_CHANGES, COMMENT_WITH_CONCERNS, BLOCKED,
BLOCKED PR, 🟡, 🔴.
Helper _review_body_has_reserve_marker(body) detecte la presence d'un
marqueur canonique.
"review" : neutralise UNIQUEMENT si le body ne porte aucun marqueur
de reserve — une review qui pose une reserve neuve perime le dossier.
_attested_reviews passe row_kind="review".
Tests
74 passed, 0 failed (3 nouveaux : controle negatif sur 7 marqueurs canoniques,
controle positif sur 3 leves pures, mise a jour du test historique pour
utiliser un body de levee pure sans marqueur).
Cas mixte
Traite cote EMISSION (consigne #16731 : ai-01 ne melange jamais levee et
emission dans une meme surface) — le gate traite le mixte comme perime,
fail-CLOSED.
Gitleaks PASSED, H.3 non applicable (aucun notebook).
PR body 3161 chars, structure OK (Tell c.1148 ★★★ strict post-POST).
Refactor de centralisation (module tiers pour CONCERN_MARKERS + _REVIEW_RESERVE_MARKERS) hors scope — ouverture possible via issue de
suivi si plusieurs PRs de maintenance commencent a cumuler des duplications
analogues.
Grain: MED/guard — lane myia-ai-01:CoursIA — prev: MED/tooling #17038
Le défaut, mesuré ce soir
Le gate de Phase 4 exempte les surfaces écrites par
myia-ai-01après le dossier (_is_own_later_act). Le motif de cette exemption est écrit dans le skill :L'exemption ne couvre pas une
review. Mesure directe, 2026-09-20 :[ADJOINT PREFLIGHT]posé sur #16804 parmyia-po-2023:CoursIA, dossier intègremyia-ai-01poste une reviewCOMMENTportant[OVERRIDE] lane myia-ai-01:CoursIA+ phrase de levéecheck_unaddressed_nits.py→rc=0, la réserve est levéecheck_adjoint_prevalidation.py→rc=1,discussion surfaces changed or were not fully attestedLe dossier de 17:54Z a été périmé par l'acte même que le gate autorise.
Pourquoi c'est un plafond de débit, pas un détail
La levée d'une réserve tierce (Hermes /
clusterManager-Myia) exige la forme canonique[OVERRIDE] lane <machine:workspace>, réservée àLIFT_OVERRIDE_LOGINS = {"myia-ai-01"}. Et cette forme n'est reconnue que si elle est postée comme review ou commentaire par ai-01.Conséquence mécanique : toute PR dont le seul bloqueur est une réserve Hermes exige un aller-retour complet — ai-01 lève, le dossier meurt, une lane tierce doit en réémettre un, et seulement au cycle suivant la PR peut merger. Le coordinateur ne peut pas débloquer et merger dans la même passe, structurellement.
C'est le plafond suivant celui que #16967 vient de lever (course d'empreinte sur
statusCheckRollup) et celui que #16907 avait levé avant (monopole de lane). Les trois sont en série : lever le visible mesure le suivant.Ce qu'on ne veut PAS faire
Ne pas élargir
LIFT_OVERRIDE_LOGINS. La décision « override monopole ai-01 » est délibérée : n'importe quelle lane pourrait sinon poser un[OVERRIDE]sous le login partagéjsboigesur sa propre PR. Le monopole n'est pas le défaut.Ne pas exempter toutes les reviews d'ai-01 sans condition non plus : une review d'ai-01 qui pose une réserve neuve doit périmer le dossier — c'est précisément son travail.
Acceptance proposée
_is_own_later_actcouvre les reviews demyia-ai-01au même titre que ses commentaires, quand la review ne fait que lever (elle porte un marqueur de levée reconnu et aucun marqueur de réserve —CONCERN_MARKERSvide).CHANGES_REQUESTED, 🔴, 🟡, préfixe de verdict) continue de périmer — pas d'exemption en bloc.rc=0;rc=1.Note de forme découverte au passage (à citer dans la doc du gate)
Trois essais ont été nécessaires pour qu'une levée de réserve tierce soit vue par
check_unaddressed_nits.py. Les deux premières formes étaient exactes en substance et invisibles à l'organe :## [OVERRIDE ai-01] Réserve **Hermes** … — **LEVÉE**→ invisible :_OPENING_LIFT_REest ancrée^sansMULTILINEsur la formeréserve levée/levée de la réserve/je lève la réserveen tête, et le mot en fin de titre n'y est pas ; de plus le préfixe crochet est lu par_CROSS_LANE_LIFT_REcomme un préfixe de rôle, qui scope la levée à la seule voix de l'émetteur (garde feat(gametheory,#14442): strate-7 marchandage asymetrique en GT-04d autonome (tranche D1) #14795) — donc incapable de lever la réserve d'un tiers.## Réserve levée — …seule → toujours invisible : lever une réserve tierce exige en plus le marqueur[OVERRIDE] lane <machine:workspace>en tête de ligne (_OVERRIDE_LANE), et un OVERRIDE nu ne lève rien sans phrase de levée.[OVERRIDE] lane myia-ai-01:CoursIAen première ligne + « Je lève la réserve de … » →rc=0sur les deux PRs.Cette séquence mérite d'être dans la docstring du module : un arbitrage juste qui ne porte pas la bonne forme est indiscernable d'une absence d'arbitrage.
Instances
#16804 (réserve Hermes levée 20:09:55Z, dossier po-2023 de 17:54Z périmé dans la foulée) · #16274 (même classe,
rc=0en B.0, aucun dossier à périmer).