fix(gate): le gate d'entrée réfute une claim b0: clear que l'organe B.0 dément - #17698
Conversation
… B.0 dement Le gate re-verifiait deja la claim `checks:` contre les jambes latest-wins (#16957), mais prenait `b0: clear` sur parole. Mesure du 2026-09-24 : deux dossiers READY (#16955, #16987) declaraient `b0: clear` alors que check_unaddressed_nits.py rendait 1 sur une reserve Hermes non levee ; le gate rendait 0 sur les deux. Un dossier READY qui declare `b0: clear` fait maintenant tourner l'organe B.0 ; s'il trouve une remarque non levee, le dossier est refuse (exit 1) et chaque remarque est nommee. La sonde ne tourne que pour un READY (aucun cout sur BLOCKED ou absent) ; un echec de mesure est fail-closed (exit 2). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Path-collision (organ #13359/#13615)Cette PR #17698 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
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 |
… traceback Audit tiers de l'adjoint sur #17698 (tete 4effe21) : - l'import de check_unaddressed_nits est desormais dans le try qui convertit tout echec de mesure en RuntimeError, donc main rend UNKNOWN (exit 2) et non une traceback exit 1 ; - le docstring disait a tort que check_unaddressed_nits importe le gate ; la raison reelle du lazy import est le cout (sonde READY seulement) ; - le commentaire du bracket de snapshot distingue la sonde B.0, posterieure. Deux tests : echec d'import -> RuntimeError ; main -> EXIT_UNKNOWN. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
[ADJOINT PREFLIGHT] Vérification tierce à cette tête : les 19 noms de checks sont verts, dont PR gate à 22:11:45Z ; |
Resolve the test-file conflict with #17698 by keeping both test blocks. The frozen-campaign tests drive main() on a READY dossier, which now re-measures b0: clear against the B.0 organ: pin probe_b0 to agreement there so they stay offline. 158 passed (gate, merge_ready, frozen suites). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Grain: LIGHT/guard -- lane myia-ai-01:CoursIA -- prev: LIGHT/guard #17686
Problème
Le gate d'entrée
check_adjoint_prevalidation.pyvérifie la claimchecks:d'un dossier contre les jambes latest-wins depuis #16957. Il ne vérifiait pas la claimb0:.Mesure du 2026-09-24 : deux dossiers READY, sur #16955 et #16987, déclaraient
b0: clear. Au même moment,check_unaddressed_nits.pyrendaitexit 1sur les deux, à cause d'une réserve Hermes non levée. Le gate rendaitexit 0sur les deux. Seul le passage séparé de B.0 par le coordinateur a arrêté ces merges. Or toutes les voies de merge passent par le gate, pas toutes par une lecture B.0 séparée.Changement
b0: clear, le gate lance l'organe B.0 (check_unaddressed_nits.analyse_pr). Si l'organe trouve une remarque non levée, le dossier est refusé (exit 1, NO-DOSSIER) et chaque remarque est nommée (type, auteur, surface). C'est le même traitement qu'une claimchecks:démentie.exit 2, UNKNOWN).RuntimeError, donc UNKNOWN (exit 2), jamais une traceback (commit1334c7a6cc, suite à l'audit tiers de l'adjoint). Correction : la version précédente de ce body affirmait quecheck_unaddressed_nitsimporte le gate. C'est faux : il ne le cite qu'en commentaire.merge_ready.py. Seule la docstring de l'étape 4 change : elle disait « le gate ne re-vérifie pas b0 ». L'étape 5 (B.0 explicite) reste le filet.Ce que le changement ne fait pas : le vert du gate ne dispense toujours pas de la lecture B.0 manuelle. L'organe ne lit que ses marqueurs, et les questions « qui a levé, quand, sur quelle substance » restent à la main (CLAUDE.md §B.0). La docstring du module le dit.
Validation
scripts/tests/test_check_adjoint_prevalidation.py: 79/79, dont 7 nouveaux tests.clearignorée, liste plafonnée à 5 ;exit 2;main():exit 1si l'organe dément,exit 0s'il confirme.test_merge_ready.py,test_check_unaddressed_nits_adjoint_dossier.py,test_detect_shared_login.pyà 59/59,test_prevalidation_order_rule.pyà 13/13.probe_b0(17438)rendblocked=True, avec deuxBOT-CONCERN by jsboige via review:CHANGES_REQUESTED/COMMENTEDcorrectement nommés dans l'erreur.probe_b0(17629)rendblocked=False, sans erreur.Hors périmètre, suivi
Le gel des parapluies #13410/#11601 et des branches
wt/vibe-*n'est encodé que dansmerge_ready.py(FROZEN_UMBRELLAS). Une passe manuelle ne le traverse pas : c'est l'incident #16518. L'encoder dans le gate demande une porte de sortie explicite pour les PRs de redressement, qui citent le parapluie qu'elles réparent (faux positif mesuré sur #17069). Ce sera une PR séparée.🤖 Generated with Claude Code