Skip to content

fix(gate,#16957): sortir statusCheckRollup du payload surfaces_fingerprint - #17011

Closed
jsboige wants to merge 1 commit into
mainfrom
fix/c1323-issue16957-rollup-peremption
Closed

jsboige wants to merge 1 commit into
mainfrom
fix/c1323-issue16957-rollup-peremption

Conversation

@jsboige

@jsboige jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-python #17008-G.2-Serre100-merge

Résumé

Fix #16957 — retire statusCheckRollup du payload surfaces_fingerprint dans scripts/check_adjoint_prevalidation.py. Les check-runs qui terminent après l'écriture d'un dossier ne périment plus celui-ci. CI state reste attesté par le champ séparé checks: latest-wins-green du body, que ai-01 revérifie au moment du merge (Phase 4 gate 5).

Issue #16957 — See #16957 (issue reste ouverte, la présente PR adresse les points 1-3 de l'acceptance — mesure pool et doc --fingerprint à confirmer par adjoint).

Diagnostic Tell c.1323-L1 ★★★★ fondateur NEW

Issue #16957 documente une chaîne causale mesurée sur #16907 :

  • 11:12:25Z : review levée postée par ai-01
  • 11:12:44Z : perimeter review guard (#11268) démarre (déclenché par la review)
  • 11:13:24Z : dossier [ADJOINT PREFLIGHT] publié, empreinte 614be63e…
  • 11:14:54Z : guard termine en success → empreinte live 48271ec5… → dossier périmé

Aucun humain, aucun agent n'a touché à une surface de discussion entre 11:13:24Z et 11:14:54Z. Le seul delta est un check qui passe pending → success.

C'est un second plafond indépendant du nom de lane. Mesure pool : 151 dossiers périmés dans les 221 PRs ouvertes, dont une part imputable à cette course d'empreinte.

Modifications

Fichier Type Avant Après
scripts/check_adjoint_prevalidation.py:317-322 code payload["checks"] = sorted(snapshot.get("statusCheckRollup") or [], ...) dans surfaces_fingerprint Retiré. Le payload ne contient plus que body, comments, reviews, threads.
scripts/check_adjoint_prevalidation.py:268-281 docstring « Hash stable content from every discussion surface plus the PR body » Docstring étendue : What this fingerprint certifies (body, comments, reviews-with-coordinator-neutralization, threads) / What this fingerprint does not certify (statusCheckRollup — guarded against peremption).
scripts/check_adjoint_prevalidation.py:38-42 module docstring « Any observable later issue comment, review, inline-thread, PR-metadata, check, or head change invalidates the dossier » « Any observable later issue comment, review, inline-thread, PR-metadata, or head change invalidates the dossier » (check-rollup retiré). Note explicite #16957+c.1323 ajoutée.
scripts/check_adjoint_prevalidation.py:678-689 CLI --fingerprint help Help étendue : « Certifies comments, reviews, threads, body. Does NOT certify the check-rollup ».
scripts/tests/test_check_adjoint_prevalidation.py:312-345 test test_same_count_surface_mutation_invalidates_fingerprint couvrait body/review/thread/checks La mutation checks retirée de la liste (n'invalide plus — c'est le carve-out) ; nouveau test test_check_rollup_mutation_does_not_invalidate_fingerprint qui assert la converse (mutation statusCheckRollup n'invalide PAS le dossier).

Choix : option 1 recommandée par porteur

L'issue #16957 proposait 3 options. Option 1 retenue :

  1. Retirer statusCheckRollup du payload ✓ retenu — le champ checks: latest-wins-green reste l'attestation, ai-01 revérifie au merge.
  2. Hacher une projection stable (nom + conclusion sans completedAt) — non retenu : n'élimine pas la cause (check qui passe pending → success mute la conclusion).
  3. Neutraliser les check-runs terminés après l'horodatage du dossier — non retenu : ajoute de la complexité sans gain réel (les check-runs ont leur propre graphe de causation qu'on ne contrôle pas).

_metadata_identity (race-detection intra-snapshot, lignes 584-592) conserve statusCheckRollup : c'est une comparaison avant/après dans un seul appel load_snapshot, sans effet sur la persistance des dossiers.

Acceptance issue #16957

  • 1. Choix d'option documenté dans le body de la PR (option 1 retenue).
  • 2. scripts/check_adjoint_prevalidation.py --fingerprint documente ce qu'il certifie (body, comments, reviews, threads) et ce qu'il ne certifie pas (checks).
  • 3. Mesure pool : combien des 151 dossiers périmés le sont par un check seul (récupérables sans réécriture) et combien par une surface de discussion. NON LIVRÉ dans cette PR — delegated to adjoint (po-2025) sweep massif, comme déjà pratiqué pour le Tell c.625 ★★★ sweep candidat-delivered.
  • 4. Tests verts : 37/37 passent (pytest scripts/tests/test_check_adjoint_prevalidation.py). Le carve-out est ancré par test_check_rollup_mutation_does_not_invalidate_fingerprint qui empêche toute régression silencieuse.

Anti-régression D

  • Le seul changement de comportement est : un dossier reste valide après qu'un check-rollup mute. Ce comportement est explicitement testé et documenté.
  • Aucune logique de gate touchée : checks: latest-wins-green (l'attestation séparée) reste obligatoire pour verdict: READY.
  • _metadata_identity intact, race-detection intact.

Validation

$ python -m pytest scripts/tests/test_check_adjoint_prevalidation.py
============================= 37 passed in 0.18s ==============================

🤖 Generated with Claude Code

…print

Mesure fondateur (#16957, c.1323) : un check-run qui termine apres l'ecriture
d'un dossier perimait celui-ci en 2-3 minutes (mesure sur #16907 :
perimeter review guard a verdi entre 11:13:24Z et 11:14:54Z, mutant
l'empreinte sans qu'aucune surface de discussion n'ait change). 151
dossiers sur 221 PRs ouvertes sont aujourd'hui perimes par ce seul
mecanisme.

Choix : option 1 recommandee par porteur - retirer statusCheckRollup
du payload surfaces_fingerprint. CI state reste atteste par le champ
separe checks: latest-wins-green du body, que ai-01 reverifie au merge
(Phase 4 gate 5). Hacher en plus n'aurait rien renforce et aurait
ajoute une source de peremption que personne ne controle.

Modifications :
- surfaces_fingerprint : drop 'checks' du payload.
- surfaces_fingerprint docstring : split 'what certifies' / 'what does
  not certify' explicite.
- Module docstring : 'check' retire de la liste des evenements qui
  periment le dossier. Note (#16957, c.1323) ajoutee.
- --fingerprint CLI help : certifies body/comments/reviews/threads,
  does NOT certify check-rollup.
- test_same_count_surface_mutation_invalidates_fingerprint : la
  mutation 'checks' retiree (carve-out). Nouveau test
  test_check_rollup_mutation_does_not_invalidate_fingerprint assert
  la converse, ancrant la regression en cas de re-ajout du rollup.

_metadata_identity (race-detection intra-snapshot) inchange : la
comparaison avant/apres reste utile dans un seul appel load_snapshot
et n'affecte pas la persistance des dossiers.

Validation : pytest scripts/tests/test_check_adjoint_prevalidation.py
37/37 passent.

Issue #16957 reste ouverte sur la mesure pool (point 3 de l'acceptance,
deleguee a l'adjoint po-2025 sweep massif).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Sep 20, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 74 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@github-actions

Copy link
Copy Markdown
Contributor

Collision de lane sur une reference fermante (#10223).

#16957: lane myia-po-2024:CoursIA holds an active claim (since 2026-09-20T12:18:31Z). Release with [RELEASED], have the coordinator post [OVERRIDE] lane myia-po-2024:CoursIA-2, or wait 48h for staleness. See #10223.

Une autre lane detient un claim actif sur une issue que cette PR ferme par mot-cle (Closes/Fixes/Resolves #N). Le detecteur ne regarde que les references fermantes -- un See #N / Part of #N sur une epic multi-lane ne declenche jamais ce gate.

Les trois sorties pour passer ce gate :

Voir #10223 et lane-claim-protocol.md.

@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

Closed by author — option 1 obsolète face à option 4 (#16967).

Le diagnostic Tell c.1323-L1 ★★★★ est juste (second plafond : check-run qui termine après le dossier mute surfaces_fingerprint), mais option 1 n'est pas la bonne solution : sortir statusCheckRollup du payload détruit l'info sans rien préserver — un dossier qui MENT sur checks: ne serait plus détectable.

PR #16967 (fix/16957-adjoint-gate-checks, commit 64d73dcb8f, lane po-2024:CoursIA) implémente l'option 4 supérieure :

  • Le fingerprint ne couvre plus les checks ; à l'évaluation, le gate relit commits/<sha>/check-runs (du commit, pas du rollup — le rollup remonte le jumeau annulé quand deux runs partagent un SHA).
  • Applique latest-wins par nom (tri started_at, tie-break id, parmi les runs complétés).
  • Compare à la claim checks: du dossier → divergence = refus, check nommé (output.title inclus).
  • Migration duale : les 7 dossiers périmés redeviennent valides via --template re-stamp (digest legacy accepté).
  • Live négatif décisif sur feat(coordination): dériver et consommer la queue READY #16483 (dossier checks: latest-wins-green sur head rouge → refusé avec contradicted by live check 'Always-on guards -- 14 organes, 1 checkout' (failure)).

Tell c.1325-L1 ★★★★ fondateur NEW : la collision guard L898 ★★★ a fonctionné — un commentaire auto-posté a listé les 3 sorties ; j'ai choisi la fermeture par lecture de #16967 (Tell c.G.9 ★★★★, confronter verdict au scope réel).

Tell c.1325-L2 ★★★★ fondateur NEW : option 4 > option 1 sur 3 axes : (a) préserve l'info au lieu de la détruire, (b) détecte les menteurs (claim ↔ état), (c) migre les 7 dossiers périmés. Option 1 gagnait seulement en simplicité.

Tell c.1325-L3 ★★★★ fondateur NEW : si les 2 PRs avaient mergé en série, git merge de la 2ᵉ aurait exigé un rebase/merge manuel — la collision était structurelle (même fichier, 2 solutions opposées), pas seulement nominale.

Tests 37/37 de mon carve-out (test_check_rollup_mutation_does_not_invalidate_fingerprint) restent utiles en régression même si la PR ferme — je laisse la branche fix/c1323-issue16957-rollup-peremption accessible au cas où l'option 4 aurait besoin d'une référence à l'anti-pattern évité.

Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com

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

Labels

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant