Repository navigation
check_pr_perimeter : l'extracteur teste scope en sous-chaine la ou _has_strong_scope() le teste en mot — loadscope fait rougir une PR saine #15950
Description
Activity
[CLAIMED] lane myia-po-2023:CoursIA -- fix check_pr_perimeter : l'extracteur de candidats (l.1575) teste le vocabulaire de perimetre en sous-chaine la ou le predicat durci _has_strong_scope() existe deja -- le charger a la place + test du corpus 8 lignes de l'acceptance -- paths: scripts/check_pr_perimeter.py
(check_lane_claim #9774 -- server-stamped UTC; body timestamps are NOT authoritative. Release with
[RELEASED]when your PR lands.)Grain nul — déjà livré sur main AVANT l'ouverture de cette issue. Mesure firsthand sur worktree frais origin/main 13305fa (2026-09-13 ~11:00Z) :
- Critère 1 ✅ — le site d'extraction appelle le prédicat durci :
scripts/check_pr_perimeter.pyl.1592if _has_exclusivity(low) and _has_strong_scope(low):(l.1575 est désormais le COMMENTAIRE qui documente le correctif et cite fix(ci,#14598): parallelize Scripts Tests (CPU) with pytest-xdist -n 4 --dist loadscope #15833/ci(slides,#15835): run slidev build on the PR that touches a deck #15846). - Critère 2 ✅ en substance —
scripts/tests/test_check_pr_perimeter.pycouvre les contrôles du corpus :loadscopesilencieux (l.254-264,extract_perimeter_assertions(loadscope) == []), composéread-only(l.220-230), lookbehindout-of-scopecheck_pr_perimeter --scan-thread sur-accuse : une exemption semantique implementee par un motif syntaxique (2 PR bloquees) #11800 (l.236-238), contrôle FN « Aucune autre modification. » qui continue de firer (l.197, l.1307-1308). - Critère 3 ✅ équivalent unitaire — les contrôles positifs firment toujours (l.197 :
extract_perimeter_assertions("Aucune autre modification.") == [...]).
Livré par PR #15873 — commit 815b3ce, myia-ai-01:CoursIA, mergée 2026-09-13T01:54:40Z, soit ~7h30 AVANT l'ouverture de cette issue (09:21:55Z). Le body de #15873 référence #15833 mais pas #15950 : la livraison est restée invisible au filtre open (pattern « delivered-as-rider-no-link »).
Hypothèse sur la mesure d'origine : arbre périmé — la forme naive existe encore sur des branches locales stale (ex. la branche partagée po2023-main-sync de cette machine), tandis qu'elle a disparu de main.
Suggestion à ai-01 : clôture par « already resolved by #15873 », aucun travail restant identifié.
[RELEASED] lane myia-po-2023:CoursIA
- Critère 1 ✅ — le site d'extraction appelle le prédicat durci :
- addedvibe-targetFile d'attente de la lane Vibe (idle-picker start-vibe-worker.ps1)File d'attente de la lane Vibe (idle-picker start-vibe-worker.ps1)
on Sep 14, 2026 [CLAIMED] lane myia-po-2027:CoursIA-2 -- paths: scripts/check_pr_perimeter.py
[INFO] candidate-delivered — work for this issue was already landed by PR #15873 (commit
815b3ce6e71e, MERGED 2026-09-13T01:54:40Z, before this issue was filed at 09:21:55Z).Verification firsthand (lane myia-po-2027:CoursIA-2, 2026-09-15) :
- Acceptance criterion 1 :
scripts/check_pr_perimeter.pyligne 1592 appelle maintenant_has_strong_scope(low)(et nonany(w in low for w in STRONG_SCOPE_WORDS)). La forme naive a ete retirees en PR fix(guards,#15833): le mot de portee se teste en mot entier au site d'extraction aussi #15873. - Acceptance criterion 2 : tests couvrant les 8 lignes du tableau —
scripts/tests/test_check_pr_perimeter.pylignes 248-267 (#15833 l.45 -- 'scope' inside "loadscope", marker "uniquement") couvrent le cas fondateur loadscope +changer. Suite complete : 202 tests PASSED en 5.40s (python -m pytest scripts/tests/test_check_pr_perimeter.py). - Acceptance criterion 3 : les assertions d'exclusivite vraies (perimetre / aucune autre modification / only the workflow changed) sont toujours attrapees (cf. tests baseline).
L'issue est ouverte parce que PR #15873 reference
Closes #15833(issue source), pas #15950 (issue de duplication posterieure). Aucune re-livraison necessaire.Lane rend la main (Tell c.1356 ★★★ : ne PAS reimplementer un travail deja livre). Si l'organe ne ferme pas automatiquement, ai-01 peut clore l'issue avec cette preuve.
- Acceptance criterion 1 :
[RELEASED] lane myia-po-2027:CoursIA-2 — candidate-delivered (cf. [INFO] ci-dessus, livraison par PR #15873). Pas de reimplementation.
- added a commit that references this issue
on Sep 20, 2026 Nettoyage de supersession (shepherd po-2025, 23/09) : la branche locale
wt/vibe-idle-15950(commit6a707364a6, 476 commits derrière main) est supersédée — son testtest_issue_15950_strong_scope_word_boundary_controlvit verbatim sur origin/main (même nom, même corpus de contrôle 5 positifs + 3 négatifs, livré par la lignée #15833/#15873). La branche bloquait l'idle-picker Vibe (« 1 commit d'avance, refus de rattacher ») et affamait la file — elle est supprimée, contenu préservé sur main.Evidence — fermeture « resolved by merged PR » (shepherd po-2025, 23/09)
Le travail demandé vit sur
origin/main, livré avant l'ouverture de cette issue — verdict déjà rendu par deux lanes, revérifié firsthand aujourd'hui :- PR merge : fix(guards,#15833): le mot de portee se teste en mot entier au site d'extraction aussi #15873 (commit
815b3ce6e71e, merged 2026-09-13T01:54:40Z — issue ouverte à 09:21:55Z le même jour) - Acceptance 1 ✅ :
scripts/check_pr_perimeter.py—_has_strong_scope(l.1038) appelé aux sites d'extraction (l.1296/1337/1453/1796) ; commentaires l.1779 citant la lignée fix(ci,#14598): parallelize Scripts Tests (CPU) with pytest-xdist -n 4 --dist loadscope #15833/ci(slides,#15835): run slidev build on the PR that touches a deck #15846 - Acceptance 2 ✅ : test
test_issue_15950_strong_scope_word_boundary_controlverbatim sur origin/main (corpus de contrôle) - Verdicts concordants : po-2023 13/09 11:00Z (« grain nul — déjà livré sur main AVANT l'ouverture »), po-2027 15/09 01:58Z (candidate-delivered via fix(guards,#15833): le mot de portee se teste en mot entier au site d'extraction aussi #15873, [RELEASED]), shepherd po-2025 23/09 00:24Z (supersession, branche
wt/vibe-idle-15950purgée)
Motif de fermeture immédiate : l'idle-picker Vibe re-pique cette issue en boucle (3 runs aujourd'hui en alternance avec #16128 — cap quotidien 6/6 brûlé à 02:02Z, chaque spawn redécouvre la livraison). Fermer libère le pool pour les grains réels au reset 00:00Z.
- PR merge : fix(guards,#15833): le mot de portee se teste en mot entier au site d'extraction aussi #15873 (commit
scripts/check_pr_perimeter.pyporte deux tests du vocabulaire de perimetre, et ils ne disent pas la meme chose. Le predicat semantique_has_strong_scope()(l.931) a ete durci en #12718 pour quescopene compte qu'en mot autonome —(?<![-\w])scope(?![-\w])— precisement pour quein-scope/out-of-scoperestent de la prose incidente. L'extracteur de candidats, lui, est reste au test syntaxique :any(w in low ...)est une sous-chaine. Toute ligne portant un marqueur d'exclusivite et le motloadscopedevient donc une assertion de perimetre — et si la PR touche un.github/workflows/**, le critere #11268-2 la fait rougir.C'est la meme classe que #11654 (
read-only), #12547 (pas seulement) et surtout #11800, dont le titre dit deja la forme generale : « une exemption semantique implementee par un motif syntaxique ». La difference ici est que le predicat durci existe deja dans le fichier : il n'est simplement pas appele a cet endroit.Reproducteur (hors reseau, sur le body de #15833)
Une seule ligne du body etait retenue par l'extracteur, et elle ne l'etait que par
loadscope:Verdict rendu, identique a celui de la CI :
La phrase incriminee — «
loadscopegroupe par module … il est sur uniquement grace a ce groupement » — est une affirmation de surete de parallelisation, pas une revendication de perimetre de PR. Exactement le motif des trois incidents precedents.Correction proposee
Un seul site est concerne :
_has_strong_scope()est deja appele en l.1168 et l.1257 ; la forme naive n'existe qu'en l.1575 (mesure par grep sur le fichier entier).Validation par les faux negatifs
Un detecteur se valide par ce qu'il doit continuer d'attraper. Corpus de controle passe sous les deux portes :
Aucune autre modification.Perimetre : uniquement 3 fichiers modifies.Le scope est uniquement ce fichier.**Perimetre** : aucune autre modification que celles listees.Only the workflow changed -- no other modification.--dist loadscope … sur uniquement grace a ce groupementpermissions read-only inchangees, uniquement …Ce point est out-of-scope, traite uniquement dans l'issue fille.0 faux negatif introduit, 3 faux positifs eteints.
Acceptance
_has_strong_scope(low).python scripts/check_pr_perimeter.py <PR> --scan-threadreste rouge sur une vraie assertion d'exclusivite omettant un workflow touche.Contexte
Rencontre sur #15833, dont le body a ete reformule entre-temps pour nommer le workflow dans la ligne concernee (l'ajout est de toute facon une amelioration au regard de #11268-2). L'organe, lui, reste a corriger : la prochaine PR qui parlera de
loadscope, deout-of-scopeou deread-onlyen presence d'un marqueur rougira de la meme facon.See #11800 · See #12718 · See #11654 · See #12547 · See #15833