Skip to content

ci(prev_guard): un bloc de code fencé citant un trailer prev: défectueux déclenche le garde — masquer le contenu fencé, symétrique du #14780 inline #15932

Description

@jsboige

Le fait

Sur la PR #15925, prev_guard a rougi sur prev-abandoned -> [15832] alors que le trailer réel du body pointait #15924 (OPEN) : le numéro fautif venait d'un bloc de code fencé de reproduction, qui citait verbatim le trailer défectueux fondateur (prev: MED/lean #NNNN, PR #15832 CLOSED non-mergée).

Le masque de citations posé par #14780 couvre le backtick inline (\prev: ... #N`), pas le contenu des blocs fencés. find_prev_target_pr_numbersextrait donc les numéros cités dans un bloc de reproduction comme s'ils étaient des ciblesprev:` réelles.

Reproduction

  1. Rédiger un body PR dont un bloc fencé contient verbatim prev: MED/lean #<PR-CLOSED-UNMERGED>, avec un trailer Grain réel valide ;
  2. Laisser tourner prev_guard → FAIL prev-abandoned -> [<PR>] sur une cible qui n'est pas celle du trailer.

Contre-vérification locale (recette validée sur #15925) :

import sys; sys.path.insert(0, "scripts/ci")
import variation_prev_guard as vpg
vpg.find_prev_target_pr_numbers(body)  # ne doit extraire QUE le trailer réel

Correctif demandé

Étendre le masque de citations de find_prev_target_pr_numbers (et/ou de check) au contenu des blocs fencés, symétriquement au backtick inline #14780 — une citation dans un bloc de reproduction n'est pas un claim de parenté.

Acceptance

Contexte

Activity

  1. jsboige commented on Sep 13, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] #15932 — myia-po-2023:CoursIA 2026-09-13T08:04Z

    paths: scripts/ci/variation_prev_guard.py, scripts/ci/test_variation_prev_guard.py (ou le fichier de test existant de la famille).

    Fix : etendre le masque de citations de find_prev_target_pr_numbers au contenu des blocs fencés, symetriquement au masque backtick inline de #14780, + test pinant le cas (bloc fencé citant une cible CLOSED + trailer reel OPEN/MERGED).

  2. jsboige commented on Sep 13, 2026

    @jsboige
    OwnerAuthor

    [DELIVERED] #15932 — myia-po-2023:CoursIA 2026-09-13T08:20Z

    PR #15937 (OPEN, MERGEABLE, base main) — 3 fichiers, +166/-1.

    Cause mesurée : _first_grain_line retournait la première ligne contenant Grain: sans
    masquer les fences. Un bloc de reproduction citant un tag défectueux au-dessus du vrai
    trailer gagnait la course ; _declared_prev_pr lisait la cible de la citation.

    Vérifié sur le body RÉEL de #15925 (citation prev: MED/lean #15832 CLOSED restaurée) :

    _declared_prev_pr cibles verdict
    avant 15832 (la citation) [15924, 15832] prev-abandoned -> [15832]
    après 15924 (le trailer) [15924] guard_pass: true, CLI EXIT=0

    Contrôle négatif : la même citation sortie du fence rougit toujours
    (prev-abandoned -> [15832], EXIT=1) — ce n'est donc pas une amnistie, c'est bien la
    fence qui a fait passer le cas.

    Surface étroite, pas mask_code_spans : le masque large blanke aussi le backtick inline,
    or une ligne de tag entièrement backtickée DOIT rester lisible (parse_prev retire les
    backticks) — c'est le BLIND-SPOT CONTROL de test_fully_backticked_tag_is_still_evaluated.
    Masquer plus large offrirait un contournement silencieux de tous les invariants prev:.
    D'où gt.mask_fenced_blocks, balayage ligne-à-ligne (les deux caractères de fence, fence non
    refermée masquée jusqu'à la fin — ce que GitHub rend, longueur et fins de ligne préservées).

    Tests : 4 ajoutés (le cas, la moitié prev-self, le contrôle négatif sur l'ORDRE, la forme
    du masque étroit). 56 prev-guard + 102 grain_tag + 349/135 des suites adjacentes, tous verts
    — le masque inline #14780 reste couvert par ses tests existants.

    Acceptance : les 3 cases cochées.

    Signalé, non traité : scripts/check_lane_claim.py:215 porte sa propre
    _mask_fenced_blocks (même algorithme, même portée). Deux copies existent désormais ;
    l'unification (importer la canonique depuis grain_tag) est hors périmètre de #15932 et
    toucherait une garde à fort trafic de 2000+ lignes — à faire dans un grain dédié, pas en
    rider.

    Note de suivi : le gate de #15937 est pending au moment du post (checks en cours), pas
    rouge.

  3. added a commit that references this issue on Sep 15, 2026
  4. added a commit that references this issue on Sep 16, 2026
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