Skip to content

fix(lane-claim,#12740): surfacer dead_scope_globs dans le JSON — fail-open du scope mort sémantique - #12801

Merged
jsboige merged 1 commit into
mainfrom
fix/lane-claim-dead-scope
Aug 25, 2026
Merged

jsboige merged 1 commit into
mainfrom
fix/lane-claim-dead-scope

Conversation

@jsboige

@jsboige jsboige commented Aug 24, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2023:CoursIA — prev: MED/notebook-python #12791

Closes #12740

Le défaut

Une clause paths: syntaxiquement valide qui nomme un chemin inexistant
(incident #12620 : paths: scripts/notebook_tools/check_code_in_markdown.py
alors que le fichier réel est detect_code_in_markdown_cells.py) produit un
claim qui ne bloque personne, et l'organe le rapporte comme sain :
malformed_markers: 0, blocking_lanes: [], active_claims: {}.

Le WARN glob sans correspondance existe mais va sur stderr — le seul
canal que le gate CI, pick_idle_grain et les scripts de lane ne consomment
pas
. Dans le JSON, la condition n'apparaît que sous active_claims.<lane> .empty_scope (claims actifs seuls) : dès qu'un claim à scope mort est relâché,
son typo disparaît complètement du JSON.

Correctif (bullets 1 + 3 de l'issue)

  1. Champ JSON dead_scope_globs lane-keyed, agrégé sur TOUS les événements
    de claim (open, override, close), pas seulement les actifs. Un typo de scope
    relâché reste visible à un sweep — le cas exact de Le predicat d'assignation du detecteur code-in-markdown accuse la prose francaise (4 des 6 entrees de baseline) #12620. Le champ est
    additif et non-bloquant : il ne change aucun verdict.
  2. Politique option (b), signaler sans re-bloquer (documenté dans
    .claude/rules/lane-claim-protocol.md) : le fail-closed check_lane_claim : un [CLAIMED] scope ET horodate produit un glob qui ne matche rien — le claim ne bloque personne #10958 (un scope
    entièrement mort est porté epic-wide) n'est pas rouvert — un claim cassé
    n'est pas permissif, et le rouvert recréerait le false-CLEAR style [ICT] Proxys sensibilite satures sur S1 malgre le correctif ICT-15c : mean == max == k-1 sur 15/15 (graine, k) #9764.
  3. Tests de non-régression avec contrôle positif :

Preuve d'exécution (locale, worktree D:/Dev/CoursIA-12740-laneclaim)

$ python -m pytest scripts/tests/test_check_lane_claim.py scripts/tests/test_lane_claim_required.py -q
= 263 passed in 14.87s

Les 2 nouveaux tests (dédiés) :

test_run_check_dead_scope_surfaces_even_when_released  PASSED
test_run_check_dead_scope_aggregate_empty_for_live_scope  PASSED

Smoke-test CLI réel (--from-json, payload #12620) — le champ apparaît bien
dans le JSON alors que le claim est relâché :

"dead_scope_globs": {
  "myia-po-2023:CoursIA": [ "scripts/notebook_tools/check_code_in_markdown.py" ]
}

Périmètre

scripts/check_lane_claim.py, scripts/tests/test_check_lane_claim.py,
.claude/rules/lane-claim-protocol.md (politique). Aucun changement de
sémantique de blocage. 3 fichiers, +103/−0.

Refs #10958 (fail-closed du scope mort) · #12656 (intersection d'override) ·
#12719 (extract_lane lane fantôme)

…-open du scope mort sémantique

Un claim `paths:` bien formé mais qui nomme un chemin inexistant (ex.
`check_code_in_markdown.py` au lieu de `detect_code_in_markdown_cells.py`,
incident #12620) rendait `active_claims: {}` / `blocking_lanes: []` sans
traces, le WARN "glob sans correspondance" n'allant que sur stderr (canal
non consommé par le gate CI, pick_idle_grain et les scripts de lane).

Ajoute un champ JSON `dead_scope_globs` lane-keyed, agrégé sur TOUS les
événements de claim (open/override/close) — un typo de scope relâché reste
visible à un sweep, contrairement à `empty_scope` (claims actifs seuls).
Politique choisie (option b) : signaler sans re-bloquer — le faile-closed
#10958 (scope entièrement mort porté epic-wide) n'est pas rouvert.

Tests : 236 côté check_lane_claim + 27 côté lane_claim_required = 263 pass.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223)

Projects

None yet

1 participant