Symptôme
Sur une issue-parapluie, un [CLAIMED] ... paths: <chemin>/** dont le chemin
n'existe pas encore ne réserve pas ce chemin : il bloque toute la
parapluie, pour toutes les lanes, y compris celles dont le scope est
vivant et disjoint.
Reproduction mesurée (#12844, 2026-08-25)
Deux claims scopés, globs disjoints :
| lane |
scope |
fichiers suivis sous ce scope |
| A |
MyIA.AI.Notebooks/GameTheory/GameTheory-17b-*.ipynb |
1 |
| B |
MyIA.AI.Notebooks/GameTheory/asymmetric_information_lean/** |
0 |
Sortie de check_lane_claim.py 12844 --lane <L> --paths <P> depuis un worktree
à jour :
lane A query_scope=PATH_SCOPED blocking=[B]
lane B query_scope=EPIC_WIDE_NO_PATHS_DECLARED blocking=[A]
La lane A est bloquée alors que son scope est vivant, prouvable et disjoint de
celui de B.
Cause
#12345 v2, délibérée et documentée dans le code : « a call whose declared
scope is ENTIRELY dead (every glob matches zero tracked files) is structurally
indistinguishable from the no-scope case ». Le fail-closed est le bon défaut —
un scope mort ne doit pas déverrouiller. Mais il a un effet de bord non
documenté côté règle : il transforme silencieusement une réservation de
travail à venir en verrou epic-wide.
Or réserver un chemin qu'on s'apprête à créer est le cas nominal quand une
lane annonce un nouveau lake / un nouveau répertoire. lane-claim-protocol.md
encourage même le partitionnement paths: sans dire que le partitionnement
cesse de fonctionner tant que la cible est vide.
Ce qui manque
Le signal existe déjà dans le JSON (query_scope,
epic_wide_on_umbrella, plus un WARN: glob sans correspondance sur stderr),
mais rien ne relie ces trois indices à la conséquence pratique. Un
coordinateur qui lit WARN: glob sans correspondance pense « mon worktree est
en retard » (c'était vrai pour un des deux globs) et pas « ce claim verrouille
toute l'issue ».
Pistes (à arbitrer, pas prescrites)
- Message explicite : quand un claim BLOQUANT a un scope entièrement mort,
nommer la conséquence dans le texte de blocage — « le claim de la lane X
déclare un scope qui ne matche aucun fichier suivi ; il est donc traité
comme epic-wide et bloque cette issue ». Le moins invasif, sans doute
suffisant.
- Marqueur de réservation distinct — un
[RESERVED] non bloquant, qui
écrit la priorité sans verrouiller, à convertir en [CLAIMED] quand le
chemin existe.
- Ne rien changer au réducteur et documenter le piège dans
lane-claim-protocol.md § forme canonique de la clause paths: —
cinquième règle de syntaxe : un glob doit matcher au moins un fichier
suivi pour que la clause borne quoi que ce soit.
Contournement appliqué le jour même sur #12844 : [RELEASED] du claim au scope
mort + priorité écrite en prose, à reposer en [CLAIMED] dès que le lake porte
son premier fichier.
Symptôme
Sur une issue-parapluie, un
[CLAIMED] ... paths: <chemin>/**dont le cheminn'existe pas encore ne réserve pas ce chemin : il bloque toute la
parapluie, pour toutes les lanes, y compris celles dont le scope est
vivant et disjoint.
Reproduction mesurée (#12844, 2026-08-25)
Deux claims scopés, globs disjoints :
MyIA.AI.Notebooks/GameTheory/GameTheory-17b-*.ipynbMyIA.AI.Notebooks/GameTheory/asymmetric_information_lean/**Sortie de
check_lane_claim.py 12844 --lane <L> --paths <P>depuis un worktreeà jour :
La lane A est bloquée alors que son scope est vivant, prouvable et disjoint de
celui de B.
Cause
#12345 v2, délibérée et documentée dans le code : « a call whose declaredscope is ENTIRELY dead (every glob matches zero tracked files) is structurally
indistinguishable from the no-scope case ». Le fail-closed est le bon défaut —
un scope mort ne doit pas déverrouiller. Mais il a un effet de bord non
documenté côté règle : il transforme silencieusement une réservation de
travail à venir en verrou epic-wide.
Or réserver un chemin qu'on s'apprête à créer est le cas nominal quand une
lane annonce un nouveau lake / un nouveau répertoire.
lane-claim-protocol.mdencourage même le partitionnement
paths:sans dire que le partitionnementcesse de fonctionner tant que la cible est vide.
Ce qui manque
Le signal existe déjà dans le JSON (
query_scope,epic_wide_on_umbrella, plus unWARN: glob sans correspondancesur stderr),mais rien ne relie ces trois indices à la conséquence pratique. Un
coordinateur qui lit
WARN: glob sans correspondancepense « mon worktree esten retard » (c'était vrai pour un des deux globs) et pas « ce claim verrouille
toute l'issue ».
Pistes (à arbitrer, pas prescrites)
nommer la conséquence dans le texte de blocage — « le claim de la lane X
déclare un scope qui ne matche aucun fichier suivi ; il est donc traité
comme epic-wide et bloque cette issue ». Le moins invasif, sans doute
suffisant.
[RESERVED]non bloquant, quiécrit la priorité sans verrouiller, à convertir en
[CLAIMED]quand lechemin existe.
lane-claim-protocol.md§ forme canonique de la clausepaths:—cinquième règle de syntaxe : un glob doit matcher au moins un fichier
suivi pour que la clause borne quoi que ce soit.
Contournement appliqué le jour même sur #12844 :
[RELEASED]du claim au scopemort + priorité écrite en prose, à reposer en
[CLAIMED]dès que le lake porteson premier fichier.