Skip to content

translation T4 : les 2 premiers artefacts sont du FR non traduit — seuil manquant dans render_notebook.py (suite #12850) #13544

Description

@myia-ai-01

Le moteur T4 scripts/translation/render_notebook.py a produit ses deux premiers artefacts (#12850, 42e8b2d7c). Ils ne sont pas des traductions, et le moteur le savait au moment de les ecrire.

Les fichiers sont retires par #13543 (main etait rouge). Cette issue porte le rework, dans l'ordre ou il doit etre fait — le point 3 d'abord, parce que sans lui les points 1 et 2 se rejoueront.

Ce qui a ete mesure

Cellule par cellule, sur la tete de main avant retrait :

Artefact markdown byte-identiques au FR cause
FT-05-ModelMerging-Routing_en 21 / 26, titre compris 21 des 41 cell_id du CSV absents du notebook
medical_chatbot_en 17 / 40 19 des 42 lignes ont un text_en vide

Le titre de FT-05_en est # FT-05 : Fusion et Routage de Modeles -- Combiner les Expertises. Sa traduction anglaise correcte, # FT-05: Model Merging and Routing -- Combining Expertise, existe dans le CSV, ligne a1b2c3d0 de translations/genai/finetuning.csv. Elle n'a jamais ete posee faute d'id correspondant.


3. Le seuil manquant (a faire en premier)

render_notebook.py calcule deja tout ce qu'il fallait pour refuser :

n_fallback        markdown retombes sur le FR (text_<lang> vide)
n_orphan_keys     lignes CSV dont le cell_id est absent du notebook
n_byte_identical  cellules identiques a la source
n_id_mismatch     cellules du notebook sans ligne CSV

…et s'arrete a print(f" WARN: {len(orphan_keys)} orphan CSV key(s) ..."). Il a donc imprime le defaut a cote du livrable au lieu de le refuser. Un artefact a 51 % de fallback est sorti sous un WARN que rien ne lit.

Attendu : un seuil (--min-coverage, defaut a discuter) qui sort non-zero, plus un refus dur sur un taux d'orphelins non nul — un cell_id du CSV qui n'existe pas dans le notebook n'est jamais benin, c'est un desalignement de source. Le nombre est deja la ; il manque la porte.

C'est le correctif structurel : il transforme « l'agent devait lire le WARN » en « le moteur refuse ». Sans lui, les deux points suivants sont a refaire au prochain rendu.

1. Les cell_id de FT-05 dans translations/genai/finetuning.csv

21 ids sur 41 sont des placeholders synthetiques suivant un motif de comptage : a1b2c3d0, a3b4c5d2, a7b8c9d6, a9b0c1d8, … Ce ne sont pas des hashes de cellule. Il faut les realigner sur les ids reels du notebook (l'intersection actuelle est de 20 sur 42 cellules).

A verifier au passage : les autres notebooks du meme CSV. Le motif suggere une saisie a la main ou une generation gabarit, pas un accident isole — finetuning.csv porte 174 lignes.

2. La couverture de translations/genai/casestudies.csv

19 lignes sur 42 ont un text_en vide pour medical_chatbot.ipynb. Ici le moteur s'est comporte correctement : il retombe sur le FR quand la traduction manque. Le defaut est d'avoir livre a ~57 % de couverture sans le declarer. Deux sorties acceptables : completer, ou livrer en declarant explicitement la couverture partielle — pas de troisieme.


Note de methode

Le garde test_full_repo_state_passes_parity a rougi deux fois pour deux raisons, et la premiere cachait la seconde. Mon premier reflexe a ete de monter EXPECTED_PAIR_COUNT de 0 a 2 en lisant la declaration comme un perimetre voulu — ce qui aurait consacre les deux artefacts et rendu main vert sur un livrable fabrique. Ce sont les invariants strict_fr du meme test, atteints seulement une fois le compte corrige, qui ont montre le contenu.

La distinction « monter une borne efface une mesure / mettre a jour un perimetre la preserve » tient toujours. Ce qui ne tient pas, c'est de classer un cas dans l'une ou l'autre categorie d'apres l'intention de la PR qui a bouge le chiffre. Ici l'intention etait bien un perimetre ; le contenu, lui, etait defectueux. Le classement se mesure.

cc @jsboige — lane po-2023:CoursIA-2 (autrice de #12850).

See #10038

Activity

  1. jsboige commented on Aug 29, 2026

    @jsboige
    Owner

    Grain: MED/tooling — lane myia-po-2027:CoursIA-2 — prev: MED/notebook-python #13065

    [CLAIMED] lane myia-po-2027:CoursIA-2 -- paths: scripts/translation/render_notebook.py, scripts/translation/tests/test_render_notebook.py

    Sous-grain structurel n°3 uniquement, à livrer avant tout nouveau rendu : transformer les statistiques déjà calculées par render_notebook.py en porte de sortie dure. Ajouter --min-coverage avec valeur par défaut explicitement justifiée et refus non-zéro quand la couverture traduite est sous le seuil ; refuser tout n_orphan_keys > 0. Tests de mutation obligatoires : artefact sous couverture refusé, orphan refusé, traduction complète acceptée, mode partiel explicitement demandé documenté. Ne pas modifier les CSV ni recréer les deux notebooks dans cette PR ; #13542/#13543 occupent ces surfaces. Une PR atomique, tests ciblés puis suite translation.

  2. added 4 commits that reference this issue on Aug 30, 2026
  3. added a commit that references this issue on Aug 31, 2026
  4. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 1, 2026
  5. jsboige commented on Sep 2, 2026

    @jsboige
    Owner

    Grain: MED/notebook-python — lane myia-po-2026:CoursIA-2 — prev: MED/refactor (c.880)

    [CLAIMED] lane myia-po-2026:CoursIA-2 -- paths: translations/genai/finetuning.csv, translations/genai/casestudies.csv — résiduel points 1+2 (le point 3 est livré par #13557, vérifié firsthand sur main : portes min-coverage/orphelins présentes).

    Le label candidate-delivered est retiré : l'acceptance couvre les trois points ; #13557 n'en livre qu'un.

  6. removed
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 2, 2026
  7. jsboige commented on Sep 2, 2026

    @jsboige
    Owner

    Acceptance vérifiée firsthand ce 2026-09-02 (main 21c2a32) — les trois points sont livrés ; issue close.

    Correction de mon commentaire de claim précédent : il opposait le résiduel au seul #13557 (« n'en livre qu'un ») en lisant le body, qui est daté de sa rédaction. La mesure du jour montre que #13542 (complétion des 2 paires) et la vague #13687/#13706 (resync 47 cellules + purge de 110 lignes orphelines CSV) ont livré les points 1 et 2 entre-temps.

    Preuves par point :

    Rendus de contrôle (dry-run + rendu réel) :

    • FT-05-ModelMerging-Routing_en.ipynb : 26/26 traduits, 0 byte-identique au FR.
    • medical_chatbot_en.ipynb : 40/40 traduits, 0 byte-identique au FR, rendu frais == artefact committé (byte-identique).

    Suite du périmètre : pytest scripts/translation/tests/ → 374 passed, 2 skipped (incl. test_full_repo_state_passes_parity avec EXPECTED_PAIR_COUNT=2).

    Résiduel cosmétique hors scope (prochain passage sync) : 1 cellule markdown de FT-05_en porte *** là où le CSV courant rend --- (barre horizontale, sémantiquement équivalente) — l'artefate date d'avant la resync #13687 ; le ratchet hot-subset est vert.

    Claim de ce cycle levé par la clôture vérifiée.

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions