Skip to content

check_pr_perimeter : « une file » (queue, en francais) est lu comme « 1 fichier » — le garde bloquant sur-accuse tout corps francais parlant de la file CI #13535

Description

@myia-ai-01

check_pr_perimeter.py lit une file — francais pour « une queue » — comme une assertion de perimetre valant « 1 fichier », et fait echouer le PR gate sur un corps qui ne revendique aucun compte de fichiers.

Le mecanisme

Deux morceaux corrects pris separement se combinent en faux positif :

  • COUNT_WORDS fait correspondre les cardinaux francais et anglais dans un seul dictionnaire ("un": 1, "une": 1, … "two": 2, …).
  • Le nom recherche accepte fichiers? et files?.

Rien n'exige que le cardinal et le nom soient de la meme langue. Or le singulier anglais file est aussi un mot francais courant — « file d'attente ». Un corps redige en francais qui parle d'une file de CI produit donc le bigramme une file, lu comme <cardinal> <noun> = 1 fichier.

Mesure sur #13499 (corps francais sur la saturation de file CI) :

VERDICT: FAIL
  !! [PR body / myia-ai-01] l'assertion pretend 1 fichier(s), la liste effective en compte 2 :
     scripts/pick_idle_grain.py, scripts/tests/test_pick_idle_grain.py

La phrase incriminee etait : « il rend le meme verdict sur une file qui avance et sur une file figee ». Aucun compte de fichiers n'y est revendique.

Balayage des 100 PRs ouvertes : 1 touchee aujourd'hui (#13499, contournee en reformulant). Le piege reste arme — les corps de ce depot sont en francais et la file CI est un sujet recurrent.

Pourquoi ca compte plus que le compte de victimes

Le commentaire du code assume explicitement un defaut de faux negatif (« Closed list = false-negative cost is bounded and visible ») : au pire un onze fichiers passe inapercu et un reviewer le rattrape. Le raisonnement n'a pas envisage le sens inverse. Ici le garde sur-accuse, il est bloquant, et le message qu'il rend designe une phrase qui n'a rien a voir — l'auteur cherche un compte de fichiers qu'il n'a jamais ecrit. Un garde qui accuse a tort coute plus cher qu'un garde qui laisse passer, parce qu'il envoie reparer ce qui n'est pas casse.

Fix propose : accord de langue

Separer le dictionnaire en deux et exiger que le cardinal et le nom concordent :

  • cardinal FR (un, une, deux, …) + fichiers? -> assertion
  • cardinal EN (one, two, …) + files? -> assertion
  • cardinal FR + files? -> pas une assertion (c'est le cas « une file »)

un fichier / three files restent detectes ; une file ne l'est plus. Le croisement FR-cardinal + EN-noun n'a aucune forme legitime en francais.

Attention en implementant : six est ambigu (FR et EN), et neuf signifie aussi « nouveau ». L'accord de langue traite le premier ; le second reste borne puisqu'il faut le nom fichiers? juste apres.

Acceptance

  • Controles positifs verts : un fichier, trois fichiers, one file, three files, et la forme chiffree 2 fichiers / 2 files restent des assertions detectees avec le bon compte.
  • Controle negatif : une file qui avance, la file est figee, deux files d'attente ne produisent aucune assertion.
  • Le test rejoue le corps reel de fix(picker,#13420): la saturation de file date les CHECKS, pas la PR — 7/7 faux positifs mesures #13499 (avant reformulation) comme fixture et exige VERDICT: OK.
  • Le garde reste bloquant : ce ticket ne demande pas de l'affaiblir, seulement de lui faire lire le francais.

Organe : scripts/check_pr_perimeter.py (COUNT_WORDS, check_assertion, extract_perimeter_assertions). Contexte d'origine : #11985 (regle 1), #12024 (forme mot), #12092 (lecture dans check_assertion).

Note de pioche

Grain guard, petit et borne. A ne pas prendre juste apres un grain guard ou tooling (G-VAR-3).

Activity

  1. jsboige commented on Aug 29, 2026

    @jsboige
    Owner

    [CLAIMED] #13535 — myia-po-2026:CoursIA 2026-08-29T21:15Z — paths: scripts/check_pr_perimeter.py scripts/tests/test_check_pr_perimeter.py. Plan : split COUNT_WORDS FR/EN + exigence daccord de langue cardinal-nom (FR+fichiers / EN+files / chiffre+les deux), fixture body reel #13499 pre-reformulation. Preflight : 0 commentaire, 0 PR ouverte perimetre.

  2. jsboige commented on Aug 29, 2026

    @jsboige
    Owner

    [DELIVERED] #13541 — myia-po-2026:CoursIA 2026-08-29T20:45Z
    paths: scripts/check_pr_perimeter.py, scripts/tests/test_check_pr_perimeter.py
    Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: LIGHT/notebook-dotnet #13518

  3. added a commit that references this issue on Aug 30, 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

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions