Skip to content

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

@myia-ai-01

scripts/check_pr_perimeter.py porte 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 que scope ne compte qu'en mot autonome — (?<![-\w])scope(?![-\w]) — precisement pour que in-scope / out-of-scope restent de la prose incidente. L'extracteur de candidats, lui, est reste au test syntaxique :

# l.1575, _extract_line_candidates
if _has_exclusivity(low) and any(w in low for w in STRONG_SCOPE_WORDS):

any(w in low ...) est une sous-chaine. Toute ligne portant un marqueur d'exclusivite et le mot loadscope devient 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 :

--- ligne 44 ---
  exclusivite: True
  scope NAIF (l.1575, `w in low`) : ['scope']     <- via « loadscope »
  scope DURCI (_has_strong_scope) : False
  >>> DIVERGENCE

Verdict rendu, identique a celui de la CI :

!! assertion d'exclusivite sans nommer le workflow touche .github/workflows/scripts-tests.yml
   (critere #11268-2 : tout .github/workflows/** doit etre enumere nommement)

La phrase incriminee — « loadscope groupe 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).

if _has_exclusivity(low) and _has_strong_scope(low):

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 :

Ligne de controle NAIF DURCI
Aucune autre modification. fire fire
Perimetre : uniquement 3 fichiers modifies. fire fire
Le scope est uniquement ce fichier. fire fire
**Perimetre** : aucune autre modification que celles listees. fire fire
Only the workflow changed -- no other modification. fire fire
--dist loadscope … sur uniquement grace a ce groupement fire silencieux
permissions read-only inchangees, uniquement … fire silencieux
Ce point est out-of-scope, traite uniquement dans l'issue fille. fire silencieux

0 faux negatif introduit, 3 faux positifs eteints.

Acceptance

  1. L. 1575 appelle _has_strong_scope(low).
  2. Un test couvre les 8 lignes du tableau ci-dessus (5 doivent firer, 3 doivent se taire).
  3. python scripts/check_pr_perimeter.py <PR> --scan-thread reste 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, de out-of-scope ou de read-only en presence d'un marqueur rougira de la meme facon.

See #11800 · See #12718 · See #11654 · See #12547 · See #15833

Activity

  1. jsboige commented on Sep 13, 2026

    @jsboige
    Owner

    [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.)

  2. jsboige commented on Sep 13, 2026

    @jsboige
    Owner

    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) :

    1. Critère 1 ✅ — le site d'extraction appelle le prédicat durci : scripts/check_pr_perimeter.py l.1592 if _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).
    2. Critère 2 ✅ en substance — scripts/tests/test_check_pr_perimeter.py couvre les contrôles du corpus : loadscope silencieux (l.254-264, extract_perimeter_assertions(loadscope) == []), composé read-only (l.220-230), lookbehind out-of-scope check_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).
    3. 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

  3. added
    vibe-targetFile d'attente de la lane Vibe (idle-picker start-vibe-worker.ps1)
    on Sep 14, 2026
  4. jsboige commented on Sep 15, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2027:CoursIA-2 -- paths: scripts/check_pr_perimeter.py

  5. jsboige commented on Sep 15, 2026

    @jsboige
    Owner

    [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) :

    1. Acceptance criterion 1 : scripts/check_pr_perimeter.py ligne 1592 appelle maintenant _has_strong_scope(low) (et non any(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.
    2. Acceptance criterion 2 : tests couvrant les 8 lignes du tableau — scripts/tests/test_check_pr_perimeter.py lignes 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).
    3. 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.

  6. jsboige commented on Sep 15, 2026

    @jsboige
    Owner

    [RELEASED] lane myia-po-2027:CoursIA-2 — candidate-delivered (cf. [INFO] ci-dessus, livraison par PR #15873). Pas de reimplementation.

  7. added a commit that references this issue on Sep 20, 2026
  8. jsboige commented on Sep 23, 2026

    @jsboige
    Owner

    Nettoyage de supersession (shepherd po-2025, 23/09) : la branche locale wt/vibe-idle-15950 (commit 6a707364a6, 476 commits derrière main) est supersédée — son test test_issue_15950_strong_scope_word_boundary_control vit 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.

  9. jsboige commented on Sep 23, 2026

    @jsboige
    Owner

    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 :

    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.

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

    vibe-targetFile d'attente de la lane Vibe (idle-picker start-vibe-worker.ps1)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions