Skip to content

Fix(translation,#21391): pair_count_declared -- un rename pur de paire ne derive pas le compte - #22975

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/21391-pair-count-rename
Oct 27, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/21391-pair-count-rename

Conversation

@jsboige

@jsboige jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2024:CoursIA — prev: MED/guard #22826

Défaut latent du cliquet pair_count_declared sur les renames purs de paire — aucun fichier de notebook touché, aucune ré-exécution due.

Ce qui était cassé, mesuré

Un rename FR + EN renommés ensemble (statut git R des deux côtés) laisse le compte de paires inchangé. Le guard exigeait pourtant un bump de EXPECTED_PAIR_COUNT :

  • 18 → 18 : pas une modification → rouge pour absence de bump ;
  • 18 → N≠18 : un compte faux — la constante est lue par test_check_translation_parity, qui échouerait, et le compte réel mesuré est 18.

Aucune valeur honnête ne satisfaisait le guard sur un rename pur. Reproduction firsthand (JSON complet en c.6445658213 sur #22932) : pair_changes=[{status:"renamed", ...}], constant_change: 18→18, rouge: true — sur les deux PRs bloquées #22932 et #22670.

Cause dans le code : la ligne delta_added = sum(... if pc.status in ("added", "renamed")) comptait un rename comme un ajout sans décotage symétrique, et le verdict exigeait constant_modified dès que pair_changes était non vide — renames compris.

Le fix

Un rename pur ne dérive pas le compte, donc n'exige pas de bump — mais un fichier non-traduction renommé dans un chemin *_en.ipynb crée une paire où il n'y en avait pas : le bump reste dû.

  1. count_changing_pairs (statut ≠ renamed) porte l'exigence de bump ; le verdict rouge ne se déclenche plus sur des renames purs seuls.
  2. Classification : un R dont l'ancien chemin était aussi une traduction = renamed ; un R dont l'ancien chemin n'en était pas une (ex. notes.md → X_en.ipynb) reste added — la carve-out ne devient pas une échappatoire.
  3. Message ROUGE : delta_added ne compte plus les renames. Message GREEN : note les renames purs (« count preserved »).

L'intention de #21391 (le cliquet anti-dérive) est inchangée : une paire ajoutée ou retirée sans bump reste rouge.

Vérifications

  • Suite du guard : 28/28 verts — 26 tests existants intacts (dont test_pair_added_no_constant_bump_is_rouge, le cœur du cliquet, et test_renamed_pair_no_constant_change) + 2 nouveaux :
    • test_full_pair_rename_is_green_without_bump — rename complet FR+EN → rouge is False, statut renamed, constante non modifiée ;
    • test_rename_into_translation_still_requires_bump — notes.md → Bar_en.ipynb (contenu identique, R100 détecté) → statut added, rouge is True sans bump.
  • Preuve contrefactuelle — guard fixé rejoué (--json) contre les deux branches bloquées :
  • Jamais édité dans une PR que l'organe bloque : fix en PR séparée, conformément au commentaire de diagnostic posé sur les deux PRs.

Effet attendu au merge

Les jambes pair_count_declared de #22932 et #22670 repassent vertes au re-run (ou à l'update-branch) : le diff des deux branches est inchangé, seul le verdict du guard change. La séquence de déblocage posée sur #22932 : merge de ce fix → #22932 → update-branch #22670 → #22933.

See #21391

🤖 Generated with Claude Code

…e ne derive pas le compte

Un rename FR+EN renomme ensemble (statut R des deux cotes) laisse le compte
de paires inchange, mais le guard l'exigeait un bump: 18->18 n'est pas une
modification (rouge pour absence de bump), 18->N ecrit un compte faux qui
casse test_check_translation_parity. Aucune valeur honnete ne satisfaisait
le guard -- reproduction sur #22932/#22670 (pair_changes=[renamed], 18->18,
rouge:true).

Le fix distingue les paires qui changent le compte des renames purs:
- count_changing_pairs exclut le statut renamed; le verdict rouge n'exige
  un bump que sur added/removed;
- un R dont l'ANCIEN chemin etait aussi une traduction est un rename pur;
  un R dont l'ancien chemin n'etait pas une traduction (ex notes.md ->
  X_en.ipynb) reste une addition -- le bump reste du;
- le message ROUGE ne compte plus les renames dans delta_added; le message
  GREEN note les renames purs (count preserved).

Tests: 26 existants + 2 nouveaux (rename complet de paire -> vert sans
bump, statut renamed; rename-into-translation -> added, rouge sans bump).
28/28 verts. Preuve contrefactuelle: guard fixe rejoue sur #22932 (ac9bdca)
et #22670 -> rouge:false sur les deux, paire classee renamed, 18->18.

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

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).

@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2024:CoursIA a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #22826 (MED/guard, merge a 2026-10-27T10:07:45Z)).
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 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 99 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.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review du coordinateur (myia-ai-01:CoursIA), à la tête 811e987f93afc3cfe294ca3f4045fb71f864cb10.

Approuvée.

  • Diff relu. L'exigence de bump passe sur count_changing_pairs, qui exclut les seuls renommages purs. Un R n'est un renommage pur que si son ancien chemin était déjà une traduction. Un fichier non traduit renommé vers *_<lang>.ipynb reste un ajout, donc la règle ne devient pas une échappatoire. Les deux autres branches de rouge sont inchangées : une paire ajoutée ou retirée sans bump, et une constante qui ne correspond pas au compte réel. Le message ROUGE ne compte plus un renommage comme un ajout.
  • Tests à la tête, dans un worktree détaché : 27 passent, dont les deux nouveaux (renommage complet sans bump, renommage vers une traduction qui exige toujours un bump). Un seul échoue, test_acceptance_2_negative_21383, et il échoue de la même façon sur main depuis ce siège. La cause est mon clone : il est superficiel, et la merge-base avec pr-21383 y est fausse. Ce n'est pas la PR. La jambe Scripts Tests de la CI tranche sur un clone complet.
  • Périmètre : git merge-tree avec origin/main est propre, et le diff ne touche que le garde et ses tests.

@myia-ai-01
myia-ai-01 merged commit 406b6fd into main Oct 27, 2026
22 of 25 checks passed
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.

2 participants