Mesure firsthand 2026-09-05 pendant la vérification de l'acceptance #14703 (item 4 : « vérifier que le même repli ne casse pas le masquage de pr_close_keyword_guard.py, qui partage la logique de spans »).
La prémisse est fausse — et c'est le défaut
pr_close_keyword_guard.py ne partage aucune logique de spans : il délègue à grain_tag.find_close_keyword_pr_refs (scripts/grain_tag.py:379), qui scanne le texte brut sans aucun masquage backtick — CLOSE_KW_REF_RE.finditer(text) direct.
Contrôle isolé (mesuré sur main da13579)
gt.find_close_keyword_pr_refs("documents the guard firing on ``fixes #10094`` in prose")
# -> [{'keyword': 'fixes', 'number': 10094, ...}] FALSE POSITIF
gt.find_close_keyword_pr_refs("we ``closes\n#1234`` wrapped citation")
# -> [{'keyword': 'closes', 'number': 1234, ...}] idem avec repli de ligne
Une PR qui documente en prose le comportement du close-keyword guard (citation backtiquée de fixes #10094, comme le fait le docstring même du finder, grain_tag.py:385-387 qui cite CLOSED <PR-number>) déclenche le garde sur son propre texte explicatif. Même piège auto-referentiel que #14550/#14703, déplacé sur le garde sœur.
Asymétrie
variation_prev_guard masque les spans backtiqués depuis #14560 (multi-lignes depuis #14700) précisément parce qu'une citation ≠ une déclaration. find_close_keyword_pr_refs n'a jamais reçu l'équivalent.
Acceptance proposée
Provenance
Mesure firsthand 2026-09-05 pendant la vérification de l'acceptance #14703 (item 4 : « vérifier que le même repli ne casse pas le masquage de pr_close_keyword_guard.py, qui partage la logique de spans »).
La prémisse est fausse — et c'est le défaut
pr_close_keyword_guard.pyne partage aucune logique de spans : il délègue àgrain_tag.find_close_keyword_pr_refs(scripts/grain_tag.py:379), qui scanne le texte brut sans aucun masquage backtick —CLOSE_KW_REF_RE.finditer(text)direct.Contrôle isolé (mesuré sur main da13579)
Une PR qui documente en prose le comportement du close-keyword guard (citation backtiquée de
fixes #10094, comme le fait le docstring même du finder, grain_tag.py:385-387 qui citeCLOSED <PR-number>) déclenche le garde sur son propre texte explicatif. Même piège auto-referentiel que #14550/#14703, déplacé sur le garde sœur.Asymétrie
variation_prev_guardmasque les spans backtiqués depuis #14560 (multi-lignes depuis #14700) précisément parce qu'une citation ≠ une déclaration.find_close_keyword_pr_refsn'a jamais reçu l'équivalent.Acceptance proposée
find_close_keyword_pr_refsmasque les spans inline + fenced avant le scan (réutiliser_mask_code_spansou l'extraire en commun dans grain_tag) en préservant les offsets (le verdict cite les lignes).find_close_keyword_pr_refs) pour aucun autre chemin non masqué.Provenance
prev:en prose CREE une declaration — 3 PRs gelees sur une phrase de documentation correcte #14550 (racine CLOSED) : « citer un tag en prose crée une déclaration ».