Skip to content

fix(guard): le perimeter organ lit toute prose descriptive « N fichiers » comme une assertion de perimetre #20086

Description

@jsboige

Sans parent : l'organe perimeter est ne de #11268 (CLOSED) et vit dans .github/workflows/always-on-guards.yml (step perimeter) ; aucun tracker ouvert ne le porte aujourd'hui.

Constat mesure

scripts/check_pr_perimeter.py selectionne \b(\d+)\s*(?:fichiers?|files?)\b (COUNT_CLAIM, l.107) dans le body et confronte le nombre a la liste effective des fichiers de la PR.

Toute phrase descriptive qui compte des fichiers lus ou attestes -- forme frequente dans les PR de carnets -- est donc lue comme une revendication de perimetre.

Reproducteur (mesure, 2026-10-09)

PR #20076, body avant correction, python scripts/check_pr_perimeter.py 20076 --scan-thread :

VERDICT: FAIL
  !! [PR body / jsboige] l'assertion pretend 4 fichier(s), la liste effective en compte 7 : ...
  !! [PR body / jsboige] l'assertion pretend 80 fichier(s), la liste effective en compte 7 : ...

Les deux phrases en cause ne revendiquent rien sur le perimetre de la PR (7 fichiers) :

  • « life-lean-stats (exec 12) atteste 4 fichiers (Life.lean 253, …) » -- les sources que la cellule lit ;
  • « phase1-files-list (exec 18) atteste ~80 fichiers .lean » -- idem.

Ce que l'organe exempte deja, et ce qui manque

Exemption Reference
fences (transcription, pas une revendication) #11670/#11695
citations (« … » et … inline) #12201
plage compacte de noms rendus (a.png-b.png) #12273
annotation hors-scope ((hors scope PR), previsionnels, tranche ulterieure) #13946
quantificateur restrictif (« un seul fichier ») commentaire l.133-139

Manque la prose descriptive chiffree : un compte precede d'un verbe de constat.

Pistes

  1. Exemption de forme -- le compte dont le verbe de la meme ligne est descriptif (atteste, lit, compte, enumere, recense) n'est pas une revendication de perimetre.
  2. Ou forme declaree par l'auteur, sur le modele de check_pr_perimeter : un compte cite POUR ETRE REFUTE est lu comme une assertion de perimetre (FP mesure sur #13856) #13946.

Les deux demandent un test : le controle positif (une vraie assertion N fichiers : a, b, c) doit continuer de rougir -- c'est ce qui separe l'exemption du blanc-seing.

Contournement applique en attendant

Sur #20076, les deux phrases ont ete reformulees (« sources » / « modules »), l'organe rend rc=0. C'est un contournement par le vocabulaire, pas un correctif de l'organe : la classe reste ouverte pour les PRs suivantes.

Activity

  1. jsboige commented on Oct 9, 2026

    @jsboige
    OwnerAuthor

    [DELIVERED] lane myia-po-2024:CoursIA-2 -- paths: scripts/check_pr_perimeter.py, scripts/tests/test_check_pr_perimeter.py -- PR #20125.

    Forme 7 des exemptions par-compte : un compte ouvert, sur la meme ligne et dans les 80 caracteres qui precedent, par un verbe de constatation (liste fermee : atteste, constate, lit, enumere, recense, denombre, couvre + equivalents EN) n'est pas une revendication de perimetre.

    L'exemption est au niveau du COMPTE, pas de la selection -- conformement a #12201 : la ligne reste extraite, confrontee et imprimee en SIGNAL ; seul le blocage tombe (propriete Candidate.blocking). C'est la ou #20076 rougissait, et c'est la que les tests le mesurent.

    Garde anti-blanc-seing : le deux-points immediat apres le compte est la forme canonique de declaration (N fichiers : a, b, c) et l'emporte sur le verbe -- « j'atteste 7 fichiers : a.py, b.py » reste bloquant. C'est le controle positif que le cadrage de l'issue demandait.

    Tests : six ajoutes, dont le controle positif bout en bout. Suite du fichier : 238 passed, 1 skipped.

    Perimetre : deux fichiers, +111 lignes, 0 suppression.

    (lane myia-po-2024:CoursIA-2)

  2. added a commit that references this issue on Oct 10, 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