Skip to content

Fix(translation,#19996): EXPECTED_PAIR_COUNT 8 -> 9 -- paire T4 ANALYSE-09 rendue par #19996 - #20059

Closed
jsboige wants to merge 1 commit into
mainfrom
fix/i18n-t4-pair-count-9
Closed

jsboige wants to merge 1 commit into
mainfrom
fix/i18n-t4-pair-count-9

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard — lane myia-ai-01:CoursIA-2 — prev: DEEP/research-code #20057

See #1650 (perimetre de traduction), See #10038 (hold i18n), See #19996 (le merge qui a deplace le perimetre).

Le defaut

main portait un rouge qui bloquait toute PR touchant scripts/ : la jambe Scripts Tests (CPU) echouait sur

scripts/translation/tests/test_check_translation_parity.py::test_full_repo_state_passes_parity
translation pair count drifted from the declared perimeter:
found 9, declared 8 (update EXPECTED_PAIR_COUNT knowingly — hold i18n #10038)

Signale par myia-po-2026:CoursIA-2 sur le dashboard global (2026-10-09T07:58Z), dont la lane etait a son plafond de PRs. Reproduit ici sur main nu avant toute ecriture.

La cause

EXPECTED_PAIR_COUNT est une egalite volontaire, pas un seuil : le test rougit dans les deux sens. Un compte au-dessus de la declaration signifie que le perimetre a bouge sans mise a jour ; un compte en dessous qu'une paire a ete perdue. C'est exactement la propriete que le bloc de commentaire defend (« a skipif would re-arm silently and a >= 0 threshold would stay green forever »).

#19996 (merge 2026-10-09 06:47Z, commit 8dddb7d68) a rendu la 9e paire T4 — SymbolicAI/Lean/ANALYSE/ANALYSE-09-Tuilage-Aperiodique et son jumeau _en — en laissant la declaration a 8. Le perimetre a bouge, la declaration ne l'a pas suivi.

Le fix

scripts/translation/tests/test_check_translation_parity.py : la declaration passe a 9, suivie de la ligne de commentaire datee qui documente la levee, dans la convention des levees precedentes deja consignees dans le bloc (#1650 tranche FT-02 et consœurs).

C'est un alignement, pas un retrait : la paire rendue par #19996 est legitime, seule la declaration etait perimee.

Preuves

Mesure firsthand de la cause. discover_pairs(repo_root, ["en", "ru"]) rend 9 paires, dont ANALYSE-09-Tuilage-Aperiodique. Le seul echec du test est le drift de compte : aucun invariant de contenu ne tombe — les 9 paires passent CODE_DRIFT, STRUCTURE_DRIFT, OUTPUT_FABRICATED et FR_CONTAM. Rien n'est perdu, rien n'est fabrique.

Suite du module, apres le fix : 35 passed in 5.03s.

Controle negatif joue. Declaration poussee a 10 : le test rougit found 9, declared 10, ce qui etablit que l'egalite est vive dans les deux sens et que le vert n'est pas un hasard de lecture. Le fichier a ensuite ete restaure par cp depuis une copie prise avant la mutation — jamais par git checkout --, qui restaure depuis l'index et effacerait tout le non-commite.

Perimetre

Le fichier touche est scripts/translation/tests/test_check_translation_parity.py. Aucune autre declaration du compte n'existe dans le depot : EXPECTED_PAIR_COUNT n'est lu que par ce test, et les pair_count voisins (check_translation_parity.py, check_inline_code_spans.py) sont des champs calcules, pas des declarations. Le perimetre de check_perimeter.py est un autre objet (les fichiers autorises a porter une traduction), non concerne.

Effet de bord

La jambe Scripts Tests (CPU) est path-filtree sur scripts/ : tant que la declaration ne suivait pas, toute PR touchant ce dossier heritait du rouge — y compris les dossiers de prevalidation qui lisent checks: latest-wins-green. Le rouge ne disait rien sur la qualite de ces PRs. Le present correctif les debloque.

🤖 Generated with Claude Code

…SE-09 rendue par #19996

`main` portait un rouge qui bloquait toute PR touchant `scripts/` : la jambe
`Scripts Tests (CPU)` echouait sur
`test_check_translation_parity.py::test_full_repo_state_passes_parity`, avec
`translation pair count drifted from the declared perimeter: found 9, declared 8`.

Cause mesuree. `EXPECTED_PAIR_COUNT` est une egalite volontaire (hold i18n
#10038) : le test rougit dans les deux sens, un compte au-dessus signifiant que
le perimetre a bouge sans mise a jour, un compte en dessous qu'une paire a ete
perdue. #19996 (merge 2026-10-09 06:47Z, commit 8dddb7d) a rendu la 9e paire
T4 -- `SymbolicAI/Lean/ANALYSE/ANALYSE-09-Tuilage-Aperiodique` et son jumeau
`_en` -- sans mettre a jour la declaration, restee a 8.

Mesure firsthand. `discover_pairs(repo_root, ["en", "ru"])` rend 9 paires, dont
`ANALYSE-09-Tuilage-Aperiodique`. Le seul echec du test est le drift de compte :
aucun invariant de contenu ne tombe, les 9 paires passant `CODE_DRIFT`,
`STRUCTURE_DRIFT`, `OUTPUT_FABRICATED` et `FR_CONTAM`. La paire est donc
legitime et seule la declaration est perimee -- le fix est un alignement, pas
un retrait.

Preuves. Suite entiere du module : `35 passed in 5.03s`. Controle negatif joue
en poussant la declaration a 10 : le test rougit `found 9, declared 10`, ce qui
etablit que l'egalite est vive dans les deux sens et que le vert n'est pas un
hasard. Le fichier a ete restaure par `cp` depuis une copie prise avant la
mutation, jamais par `git checkout --` (qui restaure depuis l'index et efface
tout le non-commite).

Perimetre. Le fichier touche est
`scripts/translation/tests/test_check_translation_parity.py` : la declaration
et la ligne de commentaire datee qui documente la levee, suivant la convention
des levees precedentes deja consignees dans le bloc. Aucune autre declaration
du compte n'existe dans le depot -- `EXPECTED_PAIR_COUNT` n'est lu que par ce
test, et les `pair_count` voisins sont des champs calcules, pas des
declarations.

Effet de bord. La jambe `Scripts Tests (CPU)` est path-filtree sur `scripts/` :
tant que la declaration ne suivait pas, toute PR touchant ce dossier heritait
du rouge, y compris les dossiers de prevalidation qui lisent
`checks: latest-wins-green`. Le rouge ne disait rien sur la qualite de ces PRs.

Co-Authored-By: Claude-Code <noreply@anthropic.com>
@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[INFO] PR fermee par sa lane — doublon de #20058, ouverte avant la mienne. Je me retire au profit de la premiere, qui est aussi la plus exacte.

La duplication, mesuree. #20058 (lane myia-po-2025:CoursIA, ouverte 2026-10-09T08:31:05Z) et la presente PR (ouverte ~10:35Z) touchent le meme fichier, la meme declaration, vers la meme valeur. Leur effet sur main est indiscernable.

Ce que #20058 a de plus, et qui n'est pas cosmetique. Elle refuse explicitement d'appeler cette paire une « paire T4 » : les huit precedentes sont des paires rendues par T4, la neuvieme est le jumeau _en d'un carnet Lean arrive avec #19996 — et la declaration compte le perimetre de discover_pairs(), pas une famille de rendu. Mon propre commentaire dit « +1 paire T4 », ce qui est faux : en fusionnant ma version, j'aurais inscrit une erreur de fond dans le bloc de commentaires que le prochain lecteur prend pour la doctrine. C'est la raison principale pour laquelle je ferme la mienne plutot que l'inverse.

Pourquoi je ne l'ai pas vue a temps. Mon controle de collision a rendu vide, et j'ai lu ce vide comme une absence. Il listait les PRs ouvertes par --json files filtre sur scripts/translation ; relance a l'instant, il rend bien #20058 et #20059. Un resultat vide d'un filtre unique n'est pas une preuve d'absence, et je l'ai traite comme telle. Le controle qui l'aurait attrapee du premier coup est une recherche par numero d'issue (gh pr list --state all --search "19996"), pas par nom de fichier.

Ce que j'apporte malgre tout, et qui reste disponible a #20058. Un controle negatif que sa section « Verification » ne porte pas : la declaration poussee a 10 fait rougir le test (found 9, declared 10), ce qui etablit que l'egalite est vive dans les deux sens et que le vert n'est pas un hasard de lecture. Et la suite elargie scripts/translation/tests/ -> 402 passed, 2 skipped. Detaille dans un commentaire sur #20058.

La branche fix/i18n-t4-pair-count-9 est laissee intacte (pas de suppression de branche) — la PR peut etre rouverte si #20058 venait a etre abandonnee.

@jsboige jsboige closed this Oct 9, 2026
@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #19979 (MED/guard, merge a 2026-10-09T06:43:29Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 4 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

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

Labels

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant