Skip to content

perimeter-review-guard : la forme 1 de #11985 tient a la ponctuation — connecteur additif en prose et cardinal ecrit bloquent une enumeration juste #14384

Closed

Description

@jsboige

Mesuré aujourd'hui sur #14351 (rouge perimeter, corps réparé depuis). La forme 1 de #11985 — « composante d'une énumération » — est fermée pour la tournure exacte que cette issue avait épinglée, et seulement pour elle. Deux chemins voisins bloquent encore une énumération juste.

Ce qui se mesure

import sys; sys.path.insert(0, "scripts")
import check_pr_perimeter as m
for L in [
    "check_twin_parity.py (_shas_match) + 2 fichiers de tests",
    "variation_light_cap.py (+100/-0) + 1 fichier de tests",
    "variation_light_cap.py (+100/-0), plus un fichier de tests neuf.",
    "1 fichier modifie, 1 fichier de tests neuf.",
    "1 fichier modifie, plus un fichier de tests neuf.",
]:
    print(m._additive_line_sum(L), m._word_form_count(L), m._count_is_incidental(L), "|", L)
ligne _additive_line_sum _word_form_count _count_is_incidental périmètre réel
check_twin_parity.py (_shas_match) + 2 fichiers de tests 2 — True 3
variation_light_cap.py (+100/-0) + 1 fichier de tests 1 — False 2
variation_light_cap.py (+100/-0), plus un fichier de tests neuf. 0 1 False 2
1 fichier modifie, 1 fichier de tests neuf. 2 — False 2
1 fichier modifie, plus un fichier de tests neuf. 1 1 False 2

Les deux lignes en gras sont des énumérations exactes que le garde refuse.

Deux mécanismes, à ne pas confondre

(A) Un fichier nommé n'est pas un terme sommable. La forme 1 n'est rescapée que par l'adjacence serrée <nom de fichier> + N fichier(s) de tests dans _count_is_incidental. Changez le connecteur — , plus …, , et …, , ainsi que … — et la même énumération redevient bloquante : _additive_line_sum ne somme que des nombres, et le premier terme est un nom. L'exemption tient à la ponctuation, pas à la sémantique.

(B) La somme additive est aveugle aux cardinaux écrits en toutes lettres. 1 fichier modifie, plus un fichier de tests neuf somme à 1, pas 2 — alors que _word_form_count voit parfaitement le « un ». C'est une divergence entre deux moitiés de l'organe, là où la docstring de _word_form_count affirme le contraire :

« Reuses the exact trigger list of extract_perimeter_assertions so both halves of the organ agree on what a word count is. »

Elles s'accordent sur l'extraction ; elles divergent sur la somme. Le pavage de #12024 a porté la forme-mot au niveau corps (règle 1 de #11985) sans la porter au niveau ligne (#12103). (B) est donc un écart entre l'intention écrite et le code, pas une tournure oubliée.

Pourquoi ça compte

Le remède que le rouge suggère à l'auteur est de remplacer l'énumération par un compte nu — c'est-à-dire par la forme même que le garde existe pour attraper. Sur mon cas, le remède m'a rendu le corps meilleur (nommer les deux fichiers avec leurs diffs) parce qu'il n'y avait que deux termes ; à trois ou quatre, écrire « 4 fichiers » redevient la sortie la plus courte. Le garde pousse alors vers l'assertion opaque.

C'est la même mécanique que #11985 décrivait — « le garde pénalise les bodies les plus informatifs et récompense le silence » — sur un chemin qu'elle n'avait pas épinglé.

Correction demandée : la conséquence, jamais la détection

Comme pour #11985 et conformément à l'en-tête de perimeter-review-guard.yml (« Do not "fix" a future false-positive by narrowing the detection »), les comptes restent extraits, confrontés et imprimés sous SIGNAL ; seul le code de sortie bouge.

Ordre de sûreté :

  1. (B) d'abord — faire entrer les termes forme-mot dans _additive_line_sum, en réutilisant le même WORD_FORM_TRIGGERS que _word_form_count. C'est le cas où le code contredit sa propre docstring, et le plus petit changement.
  2. (A) ensuite — élargir l'adjacence de _count_is_incidental du seul + à un jeu fermé de connecteurs additifs (+, , plus, , et, , ainsi que), en gardant l'exigence d'un nom de fichier comme premier terme. Ne pas généraliser au-delà : sans l'ancre du nom de fichier, l'exemption avalerait des sous-sommes qui n'énumèrent rien.

Recette (ne pas fermer sans)

  1. Les cinq lignes du tableau ci-dessus, littéralement, dans scripts/tests/test_check_pr_perimeter.py — pas des paraphrases : ce sont le connecteur et le cardinal écrit qui portent le défaut.
  2. Contrôle négatif obligatoire, dans les deux sens — pour chaque ligne devenue incidente, une mutation qui ne change que le compte et exige que le garde reparle : variation_light_cap.py (+100/-0), plus deux fichiers de tests neufs. sur un périmètre de 2 doit rester BLOQUANT. Une exemption qui ne sait pas se refermer n'est pas une exemption, c'est une désactivation.
  3. Le contrôle positif de perimeter-review-guard : 7 faux positifs sur 9 rouges — 6 formes de compte hors-perimetre, et 3 bodies qui declarent JUSTE et rougissent quand meme #11985 (<=15 fichiers, scan sur 73 fichiers, 22 fichiers MP3) reste incident, et les six formes de perimeter-review-guard : 7 faux positifs sur 9 rouges — 6 formes de compte hors-perimetre, et 3 bodies qui declarent JUSTE et rougissent quand meme #11985 restent incidentes.
  4. Aucun consommateur régressé : perimeter-review-guard.yml et always-on-guards.yml sur une PR à corps volontairement faux doivent toujours rougir.

Ce que ce n'est pas

Ce n'est pas une réouverture de #11985 : son acceptance est épinglée sur des lignes précises, et les six passent (vérifié first-hand, voir #11985 commentaire du 2026-09-02). C'est la forme voisine, sur un chemin distinct.

See #11985, #12103, #12024, #11268, #11712.

Activity

  1. jsboige commented on Sep 3, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2026:CoursIA — fix (B) puis (A) selon l'ordre de sûreté de l'issue : termes forme-mot dans _additive_line_sum (WORD_FORM_TRIGGERS partagé), puis adjacence élargie aux connecteurs fermés (+ , plus , et , ainsi que) avec ancre nom de fichier. Recette intégrale : 5 lignes littérales + mutations bidirectionnelles + régression #11985 + consommateurs. -- paths: scripts/check_pr_perimeter.py, scripts/tests/test_check_pr_perimeter.py

  2. jsboige commented on Sep 3, 2026

    @jsboige
    OwnerAuthor

    PR de livraison : #14511 (fix/14384-perimeter-word-form-sum, commit f214357, 2 fichiers +129/-3).

    Interaction #14438/#14454 mesurée firsthand à HEAD (décision plus récente que le constat, mergée ce jour) : « un/une » étant redevenus des articles (reproducteur #14430), L3 n'extrait plus rien (bénigne par construction, épinglé) et L5 reste bloquant — rendre « un » sommable réouvrirait le FP #14430. Les deux mécanismes nommés par l'issue restent intégralement réparés ; la mutation de re-fermeture de la recette est réexprimée en « trois » (forme-mot non exemptée, 4 ≠ 2 → rouge), satisfaite dans les deux sens.

    193 tests (186 existants verts inchangés + 7 nouvelles). Acceptance : recette 1-4 couverte,voir tableau dans le body PR. L'arbitrage de fermeture (le « See » vs « Closes » au vu de la suppression L3/L5 par #14438) revient à ai-01.

  3. added a commit that references this issue on Sep 3, 2026
  4. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 4, 2026
  5. jsboige commented on Sep 6, 2026

    @jsboige
    OwnerAuthor

    Triage candidate-delivered (#10466) — vérifié firsthand à HEAD (750ba5818), recette de l'issue rejouée :

    Ligne _additive_line_sum _word_form_count incidental Attendu
    L1 ...(_shas_match) + 2 fichiers de tests 2 — True incidental ✔ (mécanisme A, connecteur +)
    L2 ...(+100/-0) + 1 fichier de tests 1 — True incidental ✔
    L3 ..., plus un fichier de tests neuf. 0 None False bénigne par construction ✔
    L4 1 fichier modifie, 1 fichier de tests neuf. 2 — False 2 ✔ (énumération juste reconnue)
    L5 ..., plus un fichier de tests neuf. 1 None False supplantée par #14454/#14438 (« un » article ≠ cardinal, reproducteur #14430) — déviation littérale assumée et documentée dans le body de #14511
    Recette reformulée , plus trois fichiers de tests neufs. 4 3 False ✔ la somme voit le cardinal en toutes lettres (mécanisme B) — 4 ≠ 2 reste bloquant

    Les deux mécanismes nommés par l'issue sont réparés à HEAD par #14511 (MERGED, +129/−3 avec 7 tests neufs, 193 passed) : (A) l'exemption d'énumération tient aux connecteurs additifs (+, , plus, , et, , ainsi que) avec ancre nom de fichier ; (B) _additive_line_sum somme le terme forme-mot via WORD_FORM_TRIGGERS — la promesse « both halves of the organ agree » tient au niveau ligne.

    Closes #14384

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

    bugSomething isn't workingcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions