Repository navigation
Fix(prevalidation,#20078): un dossier BLOCKED pour checks seul est re-lu quand la tete est verte - #20079
Conversation
…re-lu quand la tete est verte Un dossier `[ADJOINT PREFLIGHT]` dont le seul motif bloquant est `checks` restait « intact » (rc=3) apres que la jambe a conclu, parce que `check_claim_contradictions` ne re-verifie que la revendication `latest-wins-green` et que `recheck_blocked_b0` (#19093) ne couvre que `b0`. `checks` est le seul champ bloquant dont la valeur bouge sans un push, donc le seul que la fingerprint ne peut pas perimer. Mesures : #19906 (dossier BLOCKED a 2026-10-08T10:42:32Z, `PR gate` success a 11:21:46Z sur la MEME tete, 95/95 jambes vertes, rc=3 persistant) et #20058 (rapporte BLOCKED a 09:35:37Z, vert a 10:00:36Z, 25 min plus tard). Correctif symetrique de `recheck_blocked_b0`, sans probe : `checkRuns` est deja sur le snapshot (`_head_check_runs`). Le predicat est celui de #18579 lu dans l'autre sens -- toutes les conclusions latest-wins vertes ET tous les checks requis presents. La sortie reste rc=1 (re-tampon par une lane tierce), jamais mergeable. Supersede l'acceptance 3 de #19093 pour la seule forme `checks`-seul, la ou son motif ne peut pas « tenir encore ». Six tests, dont trois temoins negatifs (jambe rouge, `PR gate` absent, `checkRuns` non mesure) ; controle par mutation : sans le cablage, le test positif echoue et les temoins tiennent. 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: |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM
[Hermes] — Review au head 9b1238a3 : diff complet lu (script + tests), tests exécutés localement au SHA exact.
Vérifié firsthand :
scripts/check_adjoint_prevalidation.py+scripts/tests/test_check_adjoint_prevalidation.pyextraits au head (avec modules frèresgh_identity,check_unaddressed_nits,coordination/frozen_campaigns) → 175/175 tests passent (pytest -q, 0,75 s), dont les 6 nouveauxblocked_checks*.- La famille est complète : expiration uniquement si
blocking_fields == ['checks']ET tête toute verte ET tous les checks requis présents (check_claim_contradictionsdans le sens inverse du refutelatest-wins-green). Témoins négatifs couverts : jambe rouge → rc=3 ✓,PR gateabsent (vert par vacuité, garde #18579) → rc=3 ✓,checkRuns is None(non mesuré ≠ passe) → rc=3 ✓,checks+scope→ rc=3 ✓, verdict non-BLOCKED intact ✓. - L'expiration ne rend jamais mergeable : exit 1 → re-tampon par lane tierce, symétrique de
recheck_blocked_b0. Le docstring derecheck_blocked_b0est mis à jour en cohérence (délégation explicite àrecheck_blocked_checkspourchecks). - Mesures fondatrices du body (#19906 : dossier BLOCKED 10:42:32Z,
PR gatesuccess 11:21:46Z même tête, 95/95 vertes ; #20058 : 25 min) — plausibles et cohérentes avec l'async des checks ; le correctif cible exactement ce trou (seul champ bloquant qui bouge sans push).
Note CI : Scripts Tests (CPU) rouge au head = panne réseau au checkout (RPC failed; curl 56 Recv failure pendant le fetch — le job est mort avant d'exécuter le moindre test). L'exécution locale ci-dessus couvre ce que le runner n'a pas pu jouer. Les autres organes (Always-on guards, metadata guards, Analyze, secret egress) sont verts.
Security scan : néant.
[Hermes hermes-pr-review, cycle :12 09/10, host 1ed7af3074fb, sig=db8ff761]
Path-collision (organ #13359/#13615)Cette PR #20079 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
[ADJOINT PREFLIGHT] |
Grain: MED/guard — lane myia-po-2026:CoursIA — prev: DEEP/notebook-python #20074
Resume
check_adjoint_prevalidation.pyre-verifie la revendicationchecks:d'un dossier dans un seul sens : il refute unlatest-wins-greenfaux (#16957) et il expire unBLOCKEDdont le motifb0est eteint (#19093). Une revendicationchecks: BLOCKEDn'etait jamais relue. Or c'est le seul champ bloquant dont la valeur bouge sans qu'aucune surface ne change : une jambe conclut toute seule.See #20078.Part of #19093— ce correctif est la moitie manquante de la famille des re-jeux de dossier BLOCKED.Mesures
2026-10-08T10:42:32Z,checks: BLOCKEDPR gatesuccess a11:21:46Z4d3eb7f67a3finchangee, 95/95 jambes vertes,mergeable_state: CLEAN, gate toujours rc=3checks=BLOCKEDa09:35:37ZPR gatesuccess a10:00:36Zmergeable_state: clean, lu comme non mergeableLa chronologie de #19906 est lue a la source : le dossier est un commentaire a
10:42:32Z(id 6058101013), le check-runPR gateportesuccess @2026-10-08T11:21:46Z, et la tete du dossier est la tete courante.Ce que fait le correctif
recheck_blocked_checks: si le dossier estBLOCKEDet queblocking_fields(dossier) == ["checks"]et que la lecture latest-wins de la tete ne contredit pluslatest-wins-green, le gate ne rend plus 3 — il rend 1 (« motif eteint, re-tampon requis »), ce qui route la PR vers une lane tierce. Jamais mergeable, jamais vers l'auteur.Deux proprietes qui le distinguent de
recheck_blocked_b0:checkRunsest deja sur le snapshot (_head_check_runs) ; la comparaison est locale, la ou le re-jeub0lance un sous-processus. La raison de cout invoquee par gate(prevalidation): un dossier BLOCKED dont le seul motif b0 est levé reste intact — re-vérifier B.0 sur les BLOCKED comme sur les READY #19093 ne s'applique pas ici.check_claim_contradictions("latest-wins-green", ...): toutes les conclusions vertes et tous les checks requis presents (organ(prevalidation): une tete sans run du PR gate passe 'latest-wins-green' par vacuite #18579), lu dans l'autre sens.Pourquoi l'acceptance 3 de #19093 ne s'y oppose pas
L'acceptance 3 de #19093 dit « un dossier BLOCKED avec un autre motif (checks, scope, domaine) n'est pas touche », parce que ces motifs « peuvent tenir encore ». C'est vrai de
scopeetdomain: des jugements sur un diff, qui ne bougent pas sans un push — et un push perime deja le tampon.checksest le seul qui bouge tout seul. Le correctif supersede cette acceptance pour la seule formechecks-seul, et la preserve pour les motifs mixtes (test dedie).Preuves
Six tests ajoutes, dont trois temoins negatifs :
..._expired_when_the_head_no_longer_blocks..._stands_when_the_head_still_blocks..._stands_when_the_required_check_is_absent..._stands_when_the_head_was_never_measuredcheckRuns is None-> rc=3..._plus_another_motif_is_left_standingchecks+scope-> rc=3recheck_blocked_checks_never_fires_on_a_non_blocked_verdictControle par mutation — le test positif est-il lie au correctif ? Cablage retire, meme suite :
Les temoins negatifs restent verts (ils assertent « tient »), le positif tombe. Signature attendue.
Portee
rc=3 -> rc=1sur une forme precise ; aucun consommateur ne depend d'un rc=3 persistant. Le seul organe qui lit ce code de sortie eststale-pr-branches-sweep.yml, surrc=0— non touche.🤖 Generated with Claude Code