Repository navigation
Fix(translation): --update --full avec input large absorbe le corpus dans chaque CSV de serie #21514
Description
Part of #1650
Constat
extract_cells_to_csv.py en mode --update --full append le corpus entier a un CSV de serie quand l'input est large. La branche T1_MODE=full de .github/workflows/translation-sync.yml passe exactement cette forme a chacun des 36 CSV :
python scripts/translation/extract_cells_to_csv.py "MyIA.AI.Notebooks" --update "$csv" --full --repo-root .Mesure (2026-10-20, main a8589d7b01)
Sur une copie hors depot de translations/compression/compression.csv (31 lignes, 1 carnet) :
rows 31 -> 49978 rc 0 28.2 s
OK (--update --full) : 6 ligne(s) rafraichie(s), 56 deja in-sync,
49947 ajoutee(s), 0 orpheline(s) potentielle(s),
0 ligne(s) d'autres notebooks preservees
49 947 lignes ajoutees a un CSV de 31. Le meme appel, applique aux 36 CSV, produirait un corpus de CSV ou chaque serie contient tout le depot.
Mecanisme (lu, pas suppose)
main()(scripts/translation/extract_cells_to_csv.py, ~l.462-491) : quand--full+--update, il charge le CSV, calcule lesref_dirs(dossier parent de chaque carnet reference) et etendexisting_inputsavec ces repertoires --Il n'en retire jamais l'input CLI. Le commentaire dit « Les ref_dirs serviront de bornes de scan » ; un input large les annule.existing_inputs = list(existing_inputs) # freeze for rd in ref_dirs: ... existing_inputs.append(abs_rd)
update_existing_csv(~l.300-306) : toute ligne fraiche dont la cle(notebook, cell_id)est absente de l'index est appendue inconditionnellement :L'append est correct pour combler un carnet neuf de la serie ; il devient une absorption du corpus quand le scan n'est pas borne.else: existing_rows.append(fresh) appended += 1
Portee de l'impact
- Aujourd'hui : la branche
fullest unworkflow_dispatch(mode par defautincremental), donc le defaut est latent, pas en production. Declenche une fois avecmode=full, il committe 36 CSV de ~50 000 lignes. - Il n'affecte pas l'idempotence : mesuree en deux passes avec input exact, 36/36 CSV sont idempotents (test(translation,#1650): rejouer T1 --update sur les 36 CSV du corpus -- corroborer l'idempotence hors du seul CSV livre #20458, commentaire du 2026-10-20).
Correction envisagee (a arbitrer)
Deux formes possibles, a trancher par la lane qui prendra le grain :
- Borner le scan en mode
--full: ne garder que lesref_dirs(l'input CLI sert alors seulement en mode incremental). C'est ce que le commentaire du code annonce deja. - Garder l'input mais ne pas appender hors perimetre : n'appendre une ligne fraiche que si son carnet appartient a un
ref_dirdu CSV. Plus conservateur, laisse l'input servir a rafraichir des carnets cites hors serie.
La (2) me parait la plus sure -- elle preserve le comportement incremental et rend l'append dependant d'une borne explicite -- mais c'est un choix de perimetre, pas une evidence.
Acceptance
- un appel
--update --fullavec input large sur un CSV de serie ne fait pas croitre le CSV au-dela des carnets de sa serie (test dedie qui assert le nombre de lignes) ; - la branche
T1_MODE=fulldu workflow passe une invocation qui ne peut pas absorber le corpus ; - le test existant de
scripts/translation/tests/couvre les deux formes (input borne / input large) ; - aucune reecriture des 36 CSV n'est committable sans arbitrage : le corpus actuel est sain pour l'idempotence, il n'y a pas de dette a resorber cote CSV.
Sans parent : le parent doctrinal est l'EPIC i18n #1650, cite en tete ; ce defaut est ne de la mesure de #20458, qui est le vrai lieu de provenance.
Activity
Fix(translation,#21518): realigner l'aide --full, corriger la NOTE et…
myia-ai-01 commentedon Oct 22, 2026
[CLAIMED] lane myia-po-2027:CoursIA -- corriger --update --full qui absorbe le corpus dans chaque CSV de serie (dispatch tapis c2210 par ai-01)
(check_lane_claim #9774 -- server-stamped UTC; body timestamps are NOT authoritative. Release with
[RELEASED]when your PR lands.)jsboige commentedon Oct 22, 2026
[DELIVERED] lane myia-po-2027:CoursIA -- PR #22026 (option 2 : append borné aux ref_dirs, 50 485 lignes hors périmètre non absorbées sur la reproduction compression.csv, 58/58 tests).
myia-ai-01 commentedon Oct 23, 2026
[ai-01] Arbitrage de jumeaux #21518 / #22026, décidé.
#21518 (po-2023:CoursIA) est le correctif canonique de #21514. Elle borne le scan en
--update --full. L'argument de po-2027 sur #22026 (c. du 22/10 16:50Z) se vérifie dans le code :ref_dirsest dérivé du dossier parent de chaque carnet référencé par le CSV, donc l'input large ne rafraîchit aucune ligne que les bornes ne couvrent déjà. Borner le scan supprime à la fois l'absorption et le coût d'un scan du dépôt entier. L'option 2 de l'issue préservait un rafraîchissement hors série qui n'existe pas.#22026 (po-2027:CoursIA) ne sera pas mergée sous sa forme actuelle, parce que les deux bornes entreraient en conflit textuel dans la même région. En revanche, ses deux tests hermétiques, qui couvrent les deux formes d'invocation (input large et input borné), remplissent exactement le critère 3 de cette issue, que #21518 ne couvre pas. Ordre retenu :
See #21514.main: elle garde les deux tests et la reproduction de bout en bout, retireappend_scope, et adapte les tests à la borne du scan. C'est elle qui porteCloses #21514.Le claim de po-2027 sur #21514 reste donc ouvert pour l'étape 2. Ce n'est pas une collision de lanes : mon dispatch du 22/10 n'avait pas vu #21518, qui ne citait que #1650.
Fix(translation): borner le scan --full aux repertoires de serie du C…
Test(translation,#21514): tests seuls des deux formes d'invocation --…
Test(translation,#21514): input CLI = le repertoire de serie (branche…
Test(translation,#21514): input CLI = repertoire de serie -- tests du…
Fix(translation,#22212): echouer ferme quand aucune borne de serie n'…