Skip to content

fix(ci,#16143): frontiere de mot explicite — un marqueur SNAKE_CASE est reconnu - #16161

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/16143-trivial-diff-snake-case
Sep 14, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/16143-trivial-diff-snake-case

Conversation

@jsboige

@jsboige jsboige commented Sep 14, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2026:CoursIA — prev: DEEP/notebook-python #16123

Closes #16143.

Le defaut

\b ne franchit pas le tiret bas. _ est un caractere de mot en re Python, donc dans final_residual il n'y a de frontiere ni avant final, ni avant residu : le marqueur SNAKE_CASE etait inerte aux deux motifs, et l'organe rendait verdict: trivial + written_exception: null — exactement ce qu'il rend quand rien n'est invoque, donc faux dans le sens qui accuse l'auteur.

Correctif applique, identique a celui propose par l'issue (le correctif SOTA, pas une variante degradee) :

_EXCEPTION_LEXICAL = re.compile(r"(?<![a-z0-9])(?:exception|residu|justification)")
_EXCEPTION_SCOPE   = re.compile(r"(?<![a-z0-9])(?:final|dernier|seul)(?![a-z0-9])"
                                r"|(?<![a-z0-9])(?:mesur|restant)")

Ne pas simplement retirer les \b : final sans frontiere droite mordrait finalement, finaliser, seulement — la sur-accusation symetrique, et moins visible. [a-z0-9] suffit des deux cotes, l'entree etant deja accent-strippee et minusculisee par _strip_accents_lower.

Mesure avant / apres, sur l'instance reelle #15849

Rejoue sur le corps de #15849 prive de la ligne de contournement en prose que la lane myia-po-2023 y avait ajoutee sur place (--stats 11,5,5, meme entree) :

organe verdict written_exception
avant (tete 635f95abd) trivial null
apres (cette PR) ok la ligne du marqueur : titre FINAL_RESIDUAL, fixed_count 5 < plancher 10

Une precision d'honnetete sur la lecture de ce tableau. Sur le corps live de #15849, l'ancien organe rendait deja ok — mais pas grace au marqueur : grace aux mots de prose exception / residu final mesure de la ligne de contournement. Ce que la comparaison montre est donc un basculement de verdict (trivial -> ok) et un changement de ligne citee : le verdict ok porte desormais sur le marqueur, la ou il portait sur la prose. Le defaut etait reel et masque ; il fallait retirer le contournement pour le voir.

Le controle : deux colonnes

test_table_des_deux_colonnes_de_la_frontiere fige les deux colonnes de la table de l'issue. La colonne de droite compte autant que celle de gauche : un test qui ne verifierait que la gauche repasserait au vert avec les \b simplement retires, en rouvrant la sur-accusation.

Un troisieme test (test_sans_frontiere_droite_final_mordrait_finalement) controle le raisonnement lui-meme : il verifie que la forme naive — celle qu'on obtiendrait en retirant les \b — mord bien finalement, alors que la forme livree non. Sans lui, rien ne prouve que c'est la frontiere droite qui protege, et pas autre chose.

Passe « meme erreur » sur le fichier : terminee

L'issue demandait de relire toutes les expressions du fichier dans la meme passe. Fait par grep, pas a l'oeil : scripts/check_trivial_diff.py porte exactement 2 re.compile (_EXCEPTION_LEXICAL l.102, _EXCEPTION_SCOPE l.104). 2 sur 2 corrigees. Aucune troisieme expression ne reste a auditer dans ce fichier.

Au-dela de la demande de l'issue : le CLI a ete execute de bout en bout sur une instance reelle (les deux modes, --body-file et le contrat de sortie JSON), pas seulement les deux expressions isolees en python -c.

Ce que cette PR ne fait pas

Verification

🤖 Generated with Claude Code

…est reconnu

`\b` ne franchit pas l'underscore : `_` est un caractere de mot dans `re`, donc
`FINAL_RESIDUAL` n'offrait de frontiere ni avant `final`, ni avant `residu`,
et restait INERT aux deux motifs de `find_written_exception`. Mesure sur #15849
(rejoue sur le corps prive de la ligne de contournement en prose) :
`verdict: trivial` + `written_exception: null` -- exactement ce que l'organe
rend quand rien n'est invoque, donc faux dans le sens qui ACCUSE l'auteur.

Le corps live de #15849 masquait le defaut : la lane y avait ajoute la phrase
de prose #15719, qui passait par les MOTS et non par le marqueur. C'est ce
contournement, pas l'organe, qui rendait `ok`.

Fix = frontiere explicite, pas retrait de `\b` : `final` sans frontiere droite
mordrait `finalement`, `finaliser`, `seulement` -- la sur-accusation symetrique,
moins visible. `[a-z0-9]` suffit des deux cotes (l'entree est deja
accent-strippee et minusculisee par `_strip_accents_lower`).

Test de contrat a DEUX colonnes : la colonne de droite compte autant que celle
de gauche (un test qui ne verifierait que la gauche repasserait au vert avec les
`\b` simplement retires, en rouvrant la sur-accusation).

Passe "meme erreur" terminee pour ce fichier : 2 regex compilees, 2 corrigees.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-14) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(ci): check_trivial_diff — \b ne franchit pas le tiret bas, un marqueur SNAKE_CASE est invisible a l organe

2 participants