Skip to content

guard(pr_close_keyword): les citations backtiquées fixes/closes #N déclenchent le garde (4e axe #14550) #14780

Description

@jsboige

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

  • find_close_keyword_pr_refs masque les spans inline + fenced avant le scan (réutiliser _mask_code_spans ou l'extraire en commun dans grain_tag) en préservant les offsets (le verdict cite les lignes).
  • Test : citation backtiquée mono-ligne ET repliée → aucun hit ; contrôle de mordant : la même clause sans backticks → hit.
  • Non-régression : tests grain_tag + pr_close_keyword_guard verts.
  • Vérifier les consommateurs du finder (grep find_close_keyword_pr_refs) pour aucun autre chemin non masqué.

Provenance

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions