Skip to content

check_lane_claim: --paths est inatteignable en mode issue — la garde de collision PR-ouverte rend un all-clear silencieux dans la forme que L898 prescrit #16570

Description

@jsboige

Le defaut

check_lane_claim.py <issue> --paths <glob> — la forme exacte que prescrit L898 — ne fait jamais tourner la jambe « PR ouverte ». La garde de collision cross-lane n'est atteignable que si aucun numero d'issue n'est fourni.

scripts/check_lane_claim.py:3612 :

if args.paths is not None and args.issue is None:
    return _run_check_paths(args.paths, args.lane)

Quand issue et --paths sont presents, le flux retombe sur le mode issue-claim, ou my_paths ne sert qu'a scoper les marqueurs [OVERRIDE] (commentaire l. 3610-3611) — jamais a intersecter files[] des PRs ouvertes. Le garde existant est donc rendu inatteignable par la forme d'appel que les regles imposent.

Mesure A/B — seule difference : la presence du numero d'issue

Chemin temoin : scripts/notebook_tools/wsl_papermill.py + scripts/notebook_tools/check_lean4_wsl_repl.py, tous deux dans les files[] de la PR #16280 (OPEN, lane myia-po-2023:CoursIA). Lane appelante : myia-po-2024:CoursIA.

# Commande Verdict rc
A check_lane_claim.py --lane myia-po-2024:CoursIA --paths P1 --paths P2 collision #16280 nommee, lane + 2 fichiers 2
B check_lane_claim.py **16176** --lane myia-po-2024:CoursIA --paths P1 --paths P2 CLEAR ; free_paths: [P1, P2] ; "0 fichiers bloques / 2 libres dans le scope" 0

Le controle positif A est le mode --paths lui-meme : il est correct, il voit la PR, il rougit. B est la meme commande avec un numero d'issue en tete — et il rend un all-clear silencieux.

Cout mesure, ce cycle

La lane myia-po-2024:CoursIA a claimé #16176 sur la foi du CLEAR de B, implemente les deux findings sur les 4 memes fichiers que #16280, ecrit les tests et valide — avant de decouvrir que #16280 est OUVERTE depuis la lane voisine. Travail integralement jeté. Le picker, lui, l'avait signale (TRAVAIL EN COURS : PR #16280 OUVERTE couvre cette issue) ; c'est l'organe de claim qui a rassure a tort.

Pourquoi c'est le defaut a corriger plutot que « mal lance »

Le commentaire ai-01 du 2026-09-14 sur #14300 conclut : « Le pont que #14300 appelle existe deja — personne ne l'a lance », et reframe le remede de l'issue sur --paths. Cette mesure falsifie la premisse : lance dans la forme prescrite, le pont ne repond pas. Les lanes qui « ne l'ont pas lance » peuvent aussi l'avoir lance et lu un CLEAR — la conclusion « aucune lane n'a fauté » reste vraie, mais la cause n'est pas l'omission.

Le piege est dans le rapport lui-meme : free_paths et "N fichiers bloques / M libres dans le scope" portent sur le scope du claim, pas sur l'espace des PRs ouvertes. Rien dans la sortie B ne dit que la jambe PR n'a pas tourne.

Ce qui le repare

Faire tourner la jambe --paths aussi quand un numero d'issue est fourni, sans casser ce pour quoi la branche existe (scoper les [OVERRIDE] par my_paths, #10342) :

  1. extraire le calcul de collision de _run_check_paths en une fonction pure partagee (un seul lecteur, variation-tag-guard: le tag en forme de titre ## Grain est illisible par l'organe (38% des merges non attribués) #9485) ;
  2. en mode issue + --paths, ajouter la collision a la meme sortie JSON (open_pr_collisions) plutot qu'un second document sur stdout ;
  3. router le verdict vers exit 2 sur collision cross-lane, contrat deja porte par _run_check_paths ;
  4. controle positif obligatoire dans les tests : issue + --paths intersectant une PR ouverte d'une autre lane -> rc 2, PR nommee. Et un controle negatif : PR de sa propre lane -> rc 0 (self_overlap, on reprend son propre travail).

Hors scope

Ni la semantique du verdict IMPLICIT demandee par #14300 (livrable distinct, candidate-delivered), ni la peremption --stale-threshold (#12751), ni la forme canonique paths: (#12740). Uniquement l'atteignabilite de la jambe PR-ouverte en mode issue.

Lane : libre. Genre : tooling.

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)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions