Skip to content

fix(gate): le gate d'entrée réfute une claim b0: clear que l'organe B.0 dément - #17698

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/gate-refutes-b0-claim
Sep 24, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/gate-refutes-b0-claim

Conversation

@myia-ai-01

@myia-ai-01 myia-ai-01 commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

Grain: LIGHT/guard -- lane myia-ai-01:CoursIA -- prev: LIGHT/guard #17686

Problème

Le gate d'entrée check_adjoint_prevalidation.py vérifie la claim checks: d'un dossier contre les jambes latest-wins depuis #16957. Il ne vérifiait pas la claim b0:.

Mesure du 2026-09-24 : deux dossiers READY, sur #16955 et #16987, déclaraient b0: clear. Au même moment, check_unaddressed_nits.py rendait exit 1 sur les deux, à cause d'une réserve Hermes non levée. Le gate rendait exit 0 sur 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

  • Nouvelle vérification. Quand un dossier déclare READY et 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 claim checks: démentie.
  • Coût. La sonde ne tourne que pour un READY. Un dossier BLOCKED ou absent ne coûte aucun appel de plus.
  • Échec de mesure. Si la sonde ne peut pas mesurer, le gate est fail-closed (exit 2, UNKNOWN).
  • Import paresseux. L'organe B.0 n'est chargé que pour un dossier READY : un dossier BLOCKED ou absent ne paie rien. Un échec d'import compte comme un échec de mesure : RuntimeError, donc UNKNOWN (exit 2), jamais une traceback (commit 1334c7a6cc, suite à l'audit tiers de l'adjoint). Correction : la version précédente de ce body affirmait que check_unaddressed_nits importe 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.
    • claim démentie : READY rétrogradé, remarque nommée ;
    • claim confirmée : READY conservé ;
    • aucune sonde pour un dossier BLOCKED ou absent ;
    • claim non clear ignorée, liste plafonnée à 5 ;
    • échec de sonde : RuntimeError, donc exit 2 ;
    • main() : exit 1 si l'organe dément, exit 0 s'il confirme.
  • Suites dépendantes : 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.
  • Intégration sur l'organe réel à 17:35Z. probe_b0(17438) rend blocked=True, avec deux BOT-CONCERN by jsboige via review:CHANGES_REQUESTED/COMMENTED correctement nommés dans l'erreur. probe_b0(17629) rend blocked=False, sans erreur.

Hors périmètre, suivi

Le gel des parapluies #13410/#11601 et des branches wt/vibe-* n'est encodé que dans merge_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

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

github-actions Bot commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17698 (fix(gate): le gate d'entrée réfute une claim b0: clear que l'organe B.0 dément) 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.

@github-actions

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-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Sep 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA a deja consomme son budget LIGHT du jour (#17398 (merge a 2026-09-24T07:02:19Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) label Sep 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=5 genre=5 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.

… 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>
@jsboige

jsboige commented Sep 24, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17698
head: 1334c7a
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 81faa1d75e09ce3a31cab12f8c584529ffef8784c09e6c87afc7249d05a9faba
diff-files: 3
diff-additions: 217
diff-deletions: 3
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Vérification tierce à cette tête : les 19 noms de checks sont verts, dont PR gate à 22:11:45Z ; mergeable: MERGEABLE, 0 thread inline, B.0 rc=0. Le diff se limite à la sonde B.0 du gate, à la docstring de merge_ready et aux tests. L'import impossible mène à UNKNOWN/exit 2 ; une réserve encore ouverte rétrograde READY en NO-DOSSIER. Suites vérifiées sur la tête : 81/81, 59/59 et 13/13 tests ; probe_b0(17438) bloque et probe_b0(17629) ne bloque pas. Correction mineure du body : « 79/79 dont 7 nouveaux » date du commit précédent ; la tête porte 81 tests dont 9 nouveaux. Pas de défaut fonctionnel relevé. La lecture finale B.0, l'arbitrage G-VAR et le merge restent à ai-01.

@myia-ai-01
myia-ai-01 merged commit f8fcb06 into main Sep 24, 2026
19 of 25 checks passed
jsboige added a commit that referenced this pull request Sep 24, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants