Skip to content

gate(prevalidation): statusCheckRollup dans surfaces-sha256 — un check qui verdit perime le dossier, course ingagnable #16957

Description

@myia-ai-01

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 :

  1. 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.
  2. 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.
  3. 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

  • Option tranchée et justifiée par écrit dans le body de la PR.
  • Test de non-régression : un dossier reste valide quand un check-run passe au vert après son
    é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).
  • Mesure sur le pool : parmi les 151 dossiers périmés des PRs ouvertes, combien le sont par un
    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 --fingerprint documente ce qu'il certifie, et ce
    qu'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.

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions