Skip to content

check_lane_claim : un claim scopé sur un chemin inexistant verrouille toute l'issue-parapluie (fail-closed non documenté côté règle) #12905

Description

@jsboige

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)

  1. 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.
  2. Marqueur de réservation distinct — un [RESERVED] non bloquant, qui
    écrit la priorité sans verrouiller, à convertir en [CLAIMED] quand le
    chemin existe.
  3. 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.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions