From 121d7aa8eb102bd0b2425f0f1754fdadaa1611b2 Mon Sep 17 00:00:00 2001 From: jsboige Date: Sun, 13 Sep 2026 01:34:48 +0200 Subject: [PATCH] fix(guards,#15833): le mot de portee se teste en mot entier au site d'extraction aussi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _extract_line_candidates cherchait le mot de portee en sous-chaine, alors que _has_strong_scope() fait le meme test en mot entier depuis #11800 (frontiere \b, pour « inchanges ») et #12718 (lookbehind, pour « out-of-scope »). Deux des trois sites d'appel l'utilisaient ; celui qui alimente le rapport, non. Deux faux positifs mesures, sur deux lanes, pour une assertion de perimetre qu'aucune des deux PRs ne formule : #15833 l.45 -- 'scope' dans « loadscope » (marqueur « uniquement ») #15846 l.44 -- 'change' dans « changer » (marqueur « seulement ») Apres correctif : 0 et 0, et #15846 conserve sa vraie declaration de perimetre (l.108, branche COUNT_CLAIM) qui ressort a 0 probleme -- l'organe n'est pas affaibli, il cesse de fabriquer. #15870 est le controle negatif : 0 avant comme apres. 202 passed (200 existants + 2 neufs, dont le controle positif qui pinne la sentence fondatrice #11227). See #15833, #15846. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/check_pr_perimeter.py | 19 ++++++++- scripts/tests/test_check_pr_perimeter.py | 51 ++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/scripts/check_pr_perimeter.py b/scripts/check_pr_perimeter.py index ccfa04f6e8..1f3a29f117 100644 --- a/scripts/check_pr_perimeter.py +++ b/scripts/check_pr_perimeter.py @@ -1572,7 +1572,24 @@ def _extract_line_candidates(text: str) -> list[tuple[int, str]]: continue candidates.append((idx, line)) continue - if _has_exclusivity(low) and any(w in low for w in STRONG_SCOPE_WORDS): + # #15833/#15846: the scope-word test goes through `_has_strong_scope`, + # NOT a plain substring scan. The whole-word guard already exists and is + # already used by the two other call sites (l.~1168, l.~1257); this one + # was never migrated, so it kept matching scope words INSIDE longer + # words. Two measured misfires, both on a line whose subject is not the + # PR perimeter at all: + # #15833 l.45 "`--dist loadscope`, jamais `load` [...] il est sur + # **uniquement** grace a ce groupement" -- 'scope' inside + # "loadscope". #12718 added the `(?