Repository navigation
Fix(translation,#21391): pair_count_declared -- un rename pur de paire ne derive pas le compte - #22975
Conversation
…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>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
Trivial-diff advisory (#15740, non bloquant). |
myia-ai-01
left a comment
There was a problem hiding this comment.
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. UnRn'est un renommage pur que si son ancien chemin était déjà une traduction. Un fichier non traduit renommé vers*_<lang>.ipynbreste un ajout, donc la règle ne devient pas une échappatoire. Les deux autres branches derougesont 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 surmaindepuis ce siège. La cause est mon clone : il est superficiel, et lamerge-baseavecpr-21383y 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-treeavecorigin/mainest propre, et le diff ne touche que le garde et ses tests.
Grain: MED/guard — lane myia-po-2024:CoursIA — prev: MED/guard #22826
Défaut latent du cliquet
pair_count_declaredsur 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
Rdes deux côtés) laisse le compte de paires inchangé. Le guard exigeait pourtant un bump deEXPECTED_PAIR_COUNT:18 → 18: pas une modification → rouge pour absence de bump ;18 → N≠18: un compte faux — la constante est lue partest_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 exigeaitconstant_modifieddès quepair_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.ipynbcrée une paire où il n'y en avait pas : le bump reste dû.count_changing_pairs(statut ≠renamed) porte l'exigence de bump ; le verdictrougene se déclenche plus sur des renames purs seuls.Rdont l'ancien chemin était aussi une traduction =renamed; unRdont l'ancien chemin n'en était pas une (ex.notes.md → X_en.ipynb) resteadded— la carve-out ne devient pas une échappatoire.ROUGE:delta_addedne compte plus les renames. MessageGREEN: 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
test_pair_added_no_constant_bump_is_rouge, le cœur du cliquet, ettest_renamed_pair_no_constant_change) + 2 nouveaux :test_full_pair_rename_is_green_without_bump— rename complet FR+EN →rouge is False, statutrenamed, constante non modifiée ;test_rename_into_translation_still_requires_bump—notes.md → Bar_en.ipynb(contenu identique,R100détecté) → statutadded,rouge is Truesans bump.--json) contre les deux branches bloquées :ac9bdcaffba) :pair_changes=[renamed],18→18,rouge: false;origin/feature/22649-analyse-readme) : idem,rouge: false.Effet attendu au merge
Les jambes
pair_count_declaredde #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