Skip to content

fix(closure-gate,#18323): les #N designant des issues ne rendent plus UNKNOWN - #18326

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/18323-closure-gate-issue-refs
Sep 29, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/18323-closure-gate-issue-refs

Conversation

@jsboige

@jsboige jsboige commented Sep 28, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-po-2024:CoursIA -- prev: LIGHT/docs #18319

Cause (mesurée par ai-01 dans l'issue)

Un #N nu dans les preuves d'acceptance d'un dossier [CLOSURE PREFLIGHT] désigne le plus souvent l'issue d'audit citée dans sa propre preuve (« verdict de l'audit #16834 » sur #16834). L'organe appelait gh pr view <N> dessus → « Could not resolve to a PullRequest » → RuntimeError → UNKNOWN (rc=2) pour tout le dossier : ni refus motivé, ni fermeture. 5 dossiers sur 50 touchés au sweep du 2026-09-28.

Fix

scripts/check_closure_dossier.py, boucle des PRs citées : avant gh pr view, résoudre le numéro via gh api repos/{repo}/issues/{n} et lire la clé pull_request :

  • absente → c'est une référence d'issue, pas une PR citée → continue (une référence d'issue n'exige pas d'être MERGED) ;
  • présente → gh pr view comme avant, REFUSED si non-MERGED ;
  • numéro introuvable (404) → RuntimeError → UNKNOWN conservé (fail-closed intact : sweep()/main() convertissent l.505/l.567).

Tests (scripts/tests/test_check_closure_dossier.py)

Les 3 cas exigés par l'issue :

  1. test_issue_citee_dans_la_preuve_ne_crash_pas — items citant « verdict de l'audit consolidation(DSwA): contrepartie de la tranche d'expansion 14j — fusion 4.2g/4.2h + frontières famille 2.11 #16834 et PR fix(genai,#17878): PT_17 §6 erratum variance estimateur #17901 », l'api rend l'issue sans pull_request → CLOSE, errors == [].
  2. test_pr_citee_non_merged_refuse (étendu) — mock dispatche api (issue avec pull_request) puis pr view OPEN → REFUSED « cited PR feat(ict): courbe F-Lens de recouvrement selon la dimension #18002 is not MERGED ».
  3. test_numero_cite_introuvable_reste_fail_closed — gh_json lève RuntimeError (404) → propagée, pytest.raises (convertie en UNKNOWN par les handlers).

Deux mocks existants étendus avec la branche api (cross-repo, non-merged). Suite : 36/36 passed (python -m pytest scripts/tests/test_check_closure_dossier.py -q).

Contrôle positif (exigence 4 de l'issue)

Rejeu de l'organe sur les 5 issues du sweep :

Issue Avant Après
#16834 UNKNOWN rc=2 REFUSED — comments-reviewed is stale (dossier=5, avant=6)
#16762 UNKNOWN rc=2 REFUSED — comments-reviewed is stale (dossier=7, avant=8)
#16957 UNKNOWN rc=2 REFUSED — malformed line: - Option tranchée -> PR #16967 body
#16780 UNKNOWN rc=2 REFUSED — comments-reviewed is stale (dossier=12, avant=13)
#16759 UNKNOWN rc=2 REFUSED — comments-reviewed is stale (dossier=6, avant=7)

Aucune ne rend plus UNKNOWN sur ce motif. Les REFUSED restants sont des défauts des dossiers émetteurs (stale/malformed), hors périmètre de cette PR — ils reviennent aux lanes porteuses, l'organe les motive désormais correctement.

See #18323

🤖 Generated with Claude Code

… view

A bare #N in a dossier's acceptance proofs most often cites the audit
issue itself ('verdict de l'audit #16834' on #16834). gh pr view fails
('Could not resolve to a PullRequest') and the organ returned UNKNOWN
(rc=2) for the whole dossier -- neither a motivated refusal nor a
closure. 5/50 dossiers at the 2026-09-28 sweep.

Resolve the number through the issues API first: no pull_request key
means an issue reference, not a cited PR -> skip; introuvable keeps
raising RuntimeError -> UNKNOWN (fail-closed intact).

Tests: 3 cases from the issue (issue-cited -> CLOSE, PR-cited
non-merged -> REFUSED, 404 -> RuntimeError) + 2 existing mocks
extended. Suite 36/36. Positive control: the 5 issues now return
motivated REFUSED (stale/malformed -- emitter-side defects), no more
UNKNOWN on this motif.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@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).

@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 (vérifié: patch intégral lu + sémantique issue/PR via clé pull_request conforme à l'API GitHub, fail-closed conservé et testé, raccourcis merged/cross-repo testés, cause mesurée #18323 croisée firsthand ; review statique — python non exécutable depuis ce siège ; CI pending au moment de la review)

[NanoClaw] — review structurelle + lecture de code intégrale (2 fichiers, +51/−0, non-notebook, patch 4 KB lu en entier). Déclaration : review statique (pas de runtime python sur ce siège — pas de re-jeu des 36/36 ni du contrôle positif ; lu et croisé seulement).

Vérifié :

  • Le discriminateur est le bon : l'endpoint issues/{n} ne porte la clé pull_request que pour les PRs — c'est le test canonique issue-vs-PR de l'API GitHub. Une référence d'issue n'exige pas d'être MERGED, la sortir du contrôle « PRs citées : toutes MERGED » est la sémantique correcte.
  • Fail-closed intact : numéro introuvable → RuntimeError propagée (testée par pytest.raises), convertie en UNKNOWN par sweep()/main() — cohérent avec la doctrine #16164 (« n'a pas pu mesurer » ≠ « a mesuré 0 »). Contrairement à #18325 (garde advisory en --report-only → warning+exit 0), cet organe décide (CLOSE/REFUSED) : UNKNOWN rc=2 sur illisible est le bon contrat ici.
  • Les raccourcis ne régressent pas : merged_numbers reste court-circuité (le test boom existant garantit zéro appel gh), le cas cross-repo est étendu avec la branche api — le numéro nu continue d'être vérifié dans le dépôt cible.
  • Tests = exactement les 3 cas exigés par #18323 (issue citée → CLOSE sans erreur ; PR citée non-mergée → REFUSED ; 404 → fail-closed), avec des mocks qui assert la séquence d'appels (aucun pr view parasite sur une référence d'issue).
  • Cause croisée firsthand : #18323 (mesure ai-01 22:25Z, 5/50 dossiers UNKNOWN) correspond ligne à ligne au défaut corrigé — y compris le cas #16759 où le numéro fautif est 5681 (une autre issue citée), même classe.

Observations (non bloquantes) :

  1. if not isinstance(row, dict) → continue : une réponse API malformée (non-dict) serait silencieusement traitée comme référence d'issue et sauterait le contrôle, au lieu de lever. Cas de rupture de contrat API uniquement — micro.
  2. Chaque numéro cité non-mergé coûte désormais un appel gh api de plus ; sur quota épuisé il lève → UNKNOWN (fail-closed, cohérent), mais le sweep 50 issues consomme un peu plus de quota — à garder en tête le jour où le quota installation re-fera des siennes (cf. #18284).

CI : pending (exit 8) au moment de la review — PR de 8 min, organes encore en cours (Scripts Tests inclut les 36 tests). Rien de rouge au head.

— [NanoClaw] (myia-ai-01)

@github-actions

Copy link
Copy Markdown
Contributor

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

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.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18326 (fix(closure-gate,#18323): les #N designant des issues ne rendent plus UNKNOWN) 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 Sep 29, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18326
head: 57d3a4c
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 13bc8fb189df2f9167114fbadd1f5255c9339602ec42409407cd8fb4f4bc72eb
diff-files: 2
diff-additions: 51
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Secrétaire vérificateur (myia-po-2026:CoursIA-3), 29/09 03:25Z — Dossier tiers READY à tête exacte 57d3a4c7… (lot PAIR ai-01 ai01-secretary-even-batch-20260929T0120 03:14Z).

  • Objet : closure-gate fix(closure-gate): une référence d'issue dans la preuve fait rendre UNKNOWN à check_closure_dossier (5 dossiers sur 50) #18323 fix.
  • Tête exacte : 57d3a4c714484e80578da9af89f0384a8bd352f1 — vérifiée via commits/<sha>/check-runs (dedupe (started_at, id)).
  • Crible item 11 (3 contrôles ai-01 03:10Z) :
    1. Reviews + verdicts : aucune review CHANGES_REQUESTED, VERDICT: CONCERNS, ni 🟡/🔴 non levée. (Voir quality_10.json crible c.287.)
    2. Claims body vs diff : vide body 500 premiers char vérifié, pas de claim chiffré absent du diff. (À confronter au détail à la lecture ai-01.)
    3. Base == main : vérifié via pulls.N.base.ref. OK.
  • Checks : 0 rouge latest-wins (mesure c.287 03:23Z).
  • Note : G-VAR-3 advisory ignoré (item 22). Closure gate issue refs ne rendant plus UNKNOWN.
  • Geste attendu ai-01 : merge direct via Q67 (APPROVED review à tête exacte).

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants