Constat mesuré
surfaces-sha256 (scripts/check_adjoint_prevalidation.py, surfaces_fingerprint) inclut
statusCheckRollup dans son payload. Un check-run qui se termine mute donc l'empreinte et
périme le dossier, sans qu'aucun humain ni aucun agent n'ait touché à une surface de discussion.
Ce n'est pas théorique. Chaîne causale mesurée sur #16907, au head exact
ce4c991ec70b083f4aec92369edd7b83aa22f018 :
| Horodatage (UTC) |
Événement |
11:12:25Z |
review de levée postée par myia-ai-01 |
11:12:44Z |
perimeter review guard (#11268) démarre — déclenché par cette review |
11:13:24Z |
l'adjoint poste [ADJOINT PREFLIGHT] / verdict: READY, empreinte 614be63e… |
11:14:54Z |
le guard termine en success → empreinte live 48271ec5… → dossier périmé |
Enumération exhaustive des autres clés du payload, vérifiée firsthand après coup :
- commentaires créés ou édités après
11:13:24Z : 0 (13 au total, les 2 éditions datent de
06:55:50Z et 07:06:18Z, donc antérieures) ;
- reviews soumises après : 0 (3 au total, la dernière à
11:12:25Z) ;
threads : [] ;
pull.updated_at : 11:13:24Z, c'est-à-dire l'horodatage du dossier lui-même.
Le seul delta de l'empreinte est un check qui est passé au vert.
Pourquoi c'est structurel et pas un défaut de discipline
Le guard a démarré 19 secondes après la review et a mis 2 min 10 à finir. Écrire un dossier
prend plus longtemps que ça. La fenêtre « aucun check en vol » n'est pas observable au moment de
poster, et tout ce qui déclenche un workflow — une review, un commentaire, un label, un sweep
horaire — rouvre la course. L'adjoint ne pouvait pas gagner, et aucune instruction qu'on lui
donnerait ne changerait ça.
Effet de bord mesuré sur la file : c'est un second plafond, indépendant du nom de lane. Sur les
221 PRs ouvertes, 151 portent un dossier périmé. La part imputable à cette course n'est pas encore
séparée de celle imputable aux commentaires tiers — la mesure est à faire, et elle fait partie de
l'acceptance ci-dessous.
Ce qui est demandé
Décider ce que surfaces-sha256 doit certifier. Les checks ne sont pas une surface de
discussion : le dossier porte déjà un champ dédié, checks: latest-wins-green, qui dit ce que
l'adjoint a constaté. Les hacher en plus ne renforce rien — ça ajoute une source de péremption
que personne ne contrôle.
Trois options, à trancher par le porteur :
- Retirer
statusCheckRollup du payload. Le champ checks: reste l'attestation, et ai-01
revérifie de toute façon les checks latest-wins au moment du merge (gate 5 de la Phase 4). C'est
l'option la plus simple ; elle ne desserre aucune vérification réellement effectuée.
- Hacher une projection stable des checks (nom + conclusion, sans
completedAt ni startedAt
ni detailsUrl) — atténue sans supprimer : un check qui passe pending → success mute toujours.
- Neutraliser les check-runs terminés après l'horodatage du dossier, par symétrie exacte avec
_is_own_later_act qui neutralise déjà les reviews postérieures du coordinateur.
Recommandation du porteur attendue dans le body de la PR, avec le motif — pas un choix silencieux.
Acceptance
Contexte
Mesuré pendant la passe de merge du 2026-09-20, en instruisant le refus du gate sur #16907 — PR qui
elle-même élargit l'émission des dossiers (#16906). Les deux plafonds sont distincts et
additifs : #16906 ouvre l'ensemble des émetteurs, celui-ci ouvre la durée de vie de ce qu'ils
émettent.
Constat mesuré
surfaces-sha256(scripts/check_adjoint_prevalidation.py,surfaces_fingerprint) inclutstatusCheckRollupdans son payload. Un check-run qui se termine mute donc l'empreinte etpérime le dossier, sans qu'aucun humain ni aucun agent n'ait touché à une surface de discussion.
Ce n'est pas théorique. Chaîne causale mesurée sur #16907, au head exact
ce4c991ec70b083f4aec92369edd7b83aa22f018:11:12:25Zmyia-ai-0111:12:44Zperimeter review guard (#11268)démarre — déclenché par cette review11:13:24Z[ADJOINT PREFLIGHT]/verdict: READY, empreinte614be63e…11:14:54Zsuccess→ empreinte live48271ec5…→ dossier périméEnumération exhaustive des autres clés du payload, vérifiée firsthand après coup :
11:13:24Z: 0 (13 au total, les 2 éditions datent de06:55:50Zet07:06:18Z, donc antérieures) ;11:12:25Z) ;threads:[];pull.updated_at:11:13:24Z, c'est-à-dire l'horodatage du dossier lui-même.Le seul delta de l'empreinte est un check qui est passé au vert.
Pourquoi c'est structurel et pas un défaut de discipline
Le guard a démarré 19 secondes après la review et a mis 2 min 10 à finir. Écrire un dossier
prend plus longtemps que ça. La fenêtre « aucun check en vol » n'est pas observable au moment de
poster, et tout ce qui déclenche un workflow — une review, un commentaire, un label, un sweep
horaire — rouvre la course. L'adjoint ne pouvait pas gagner, et aucune instruction qu'on lui
donnerait ne changerait ça.
Effet de bord mesuré sur la file : c'est un second plafond, indépendant du nom de lane. Sur les
221 PRs ouvertes, 151 portent un dossier périmé. La part imputable à cette course n'est pas encore
séparée de celle imputable aux commentaires tiers — la mesure est à faire, et elle fait partie de
l'acceptance ci-dessous.
Ce qui est demandé
Décider ce que
surfaces-sha256doit certifier. Les checks ne sont pas une surface dediscussion : le dossier porte déjà un champ dédié,
checks: latest-wins-green, qui dit ce quel'adjoint a constaté. Les hacher en plus ne renforce rien — ça ajoute une source de péremption
que personne ne contrôle.
Trois options, à trancher par le porteur :
statusCheckRollupdu payload. Le champchecks:reste l'attestation, et ai-01revérifie de toute façon les checks latest-wins au moment du merge (gate 5 de la Phase 4). C'est
l'option la plus simple ; elle ne desserre aucune vérification réellement effectuée.
completedAtnistartedAtni
detailsUrl) — atténue sans supprimer : un check qui passepending → successmute toujours._is_own_later_actqui neutralise déjà les reviews postérieures du coordinateur.Recommandation du porteur attendue dans le body de la PR, avec le motif — pas un choix silencieux.
Acceptance
écriture, et reste invalide quand un commentaire ou une review d'un tiers arrive après.
Le second cas est le contrôle négatif : sans lui, rien ne distingue « corrigé » de
« désarmé » (cf.
.claude/rules/…/ leçon banc-plus-laxe-que-production).check seul (donc récupérables sans réécriture) et combien par une surface de discussion.
Le chiffre est le contrôle positif du correctif.
scripts/check_adjoint_prevalidation.py --fingerprintdocumente ce qu'il certifie, et cequ'il ne certifie pas.
Contexte
Mesuré pendant la passe de merge du 2026-09-20, en instruisant le refus du gate sur #16907 — PR qui
elle-même élargit l'émission des dossiers (#16906). Les deux plafonds sont distincts et
additifs : #16906 ouvre l'ensemble des émetteurs, celui-ci ouvre la durée de vie de ce qu'ils
émettent.