Skip to content

Fix(prevalidation,#20078): un dossier BLOCKED pour checks seul est re-lu quand la tete est verte - #20079

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/adjoint-blocked-checks-recheck
Oct 9, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/adjoint-blocked-checks-recheck

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2026:CoursIA — prev: DEEP/notebook-python #20074

Resume

check_adjoint_prevalidation.py re-verifie la revendication checks: d'un dossier dans un seul sens : il refute un latest-wins-green faux (#16957) et il expire un BLOCKED dont le motif b0 est eteint (#19093). Une revendication checks: BLOCKED n'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

PR dossier BLOCKED la jambe conclut ecart etat constate
#19906 2026-10-08T10:42:32Z, checks: BLOCKED PR gate success a 11:21:46Z 39 min tete 4d3eb7f67a3f inchangee, 95/95 jambes vertes, mergeable_state: CLEAN, gate toujours rc=3
#20058 rapporte checks=BLOCKED a 09:35:37Z PR gate success a 10:00:36Z 25 min 21/21 vertes, mergeable_state: clean, lu comme non mergeable

La chronologie de #19906 est lue a la source : le dossier est un commentaire a 10:42:32Z (id 6058101013), le check-run PR gate porte success @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 est BLOCKED et que blocking_fields(dossier) == ["checks"] et que la lecture latest-wins de la tete ne contredit plus latest-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 :

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 scope et domain : des jugements sur un diff, qui ne bougent pas sans un push — et un push perime deja le tampon. checks est le seul qui bouge tout seul. Le correctif supersede cette acceptance pour la seule forme checks-seul, et la preserve pour les motifs mixtes (test dedie).

Preuves

$ python -m pytest scripts/tests/test_check_adjoint_prevalidation.py -q
175 passed

$ python -m pytest scripts/tests/test_check_adjoint_prevalidation.py \
    scripts/tests/test_check_unaddressed_nits_adjoint_dossier.py \
    scripts/tests/test_check_closure_dossier.py -q
235 passed

Six tests ajoutes, dont trois temoins negatifs :

Test Attendu
..._expired_when_the_head_no_longer_blocks rc=1, nomme le re-tampon
..._stands_when_the_head_still_blocks une jambe rouge -> rc=3
..._stands_when_the_required_check_is_absent CodeQL seul, vert par vacuite -> rc=3 (#18579)
..._stands_when_the_head_was_never_measured checkRuns is None -> rc=3
..._plus_another_motif_is_left_standing checks + scope -> rc=3
recheck_blocked_checks_never_fires_on_a_non_blocked_verdict READY / sans dossier -> intouches

Controle par mutation — le test positif est-il lie au correctif ? Cablage retire, meme suite :

1 failed, 5 passed
FAILED ...::test_blocked_checks_only_expired_when_the_head_no_longer_blocks

Les temoins negatifs restent verts (ils assertent « tient »), le positif tombe. Signature attendue.

Portee

rc=3 -> rc=1 sur une forme precise ; aucun consommateur ne depend d'un rc=3 persistant. Le seul organe qui lit ce code de sortie est stale-pr-branches-sweep.yml, sur rc=0 — non touche.

🤖 Generated with Claude Code

…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>
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added the variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-09) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=2 cap=3)

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.py extraits au head (avec modules frères gh_identity, check_unaddressed_nits, coordination/frozen_campaigns) → 175/175 tests passent (pytest -q, 0,75 s), dont les 6 nouveaux blocked_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_contradictions dans le sens inverse du refute latest-wins-green). Témoins négatifs couverts : jambe rouge → rc=3 ✓, PR gate absent (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 de recheck_blocked_b0 est mis à jour en cohérence (délégation explicite à recheck_blocked_checks pour checks).
  • Mesures fondatrices du body (#19906 : dossier BLOCKED 10:42:32Z, PR gate success 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]

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20079 (Fix(prevalidation,#20078): un dossier BLOCKED pour checks seul est re-lu quand la tete est verte) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20079
head: 9b1238a
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 81c129556c45783fb7cd1ecc66ac7b82dd543eebd101fe9d1f87f39b1a07c235
diff-files: 2
diff-additions: 173
diff-deletions: 4
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20079
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

Labels

variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants