Skip to content

Fix(finetuning,#20522): FT-05 passe structurelle FR+EN -- split backslash-n, dedup sections, re-exec reelle - #21496

Open
coursia-lane-po-2027[bot] wants to merge 9 commits into
mainfrom
fix/20522-ft05-structural
Open

coursia-lane-po-2027[bot] wants to merge 9 commits into
mainfrom
fix/20522-ft05-structural

Conversation

@coursia-lane-po-2027

@coursia-lane-po-2027 coursia-lane-po-2027 Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA — prev: LIGHT/guard #21491

Closes #20522

Resume

Passe structurelle FT-05 FR+EN, deux defauts preexistants base=head (review NanoClaw 2026-10-13 sur #20503) :

1. split("\\n") -> split("\n") — cellules FR 10/16/19/22/28/30 et jumelles EN (12 cellules). L'echappement double faisait decouper sur la sous-chaine litterale \+n au lieu du retour a la ligne : le decoupage ne s'operait pas, la question extraite emportait le prompt entier, d'ou les echos ### Assistant: dans les sorties de generation. Corrige en source + re-execution reelle GPU (C.2, RTX 4060, kernel python3 = venv projet) :

  • FR : 42 cellules (16 code) ré-exécutées papermill kernel python3, 0 erreur, 0 execution_count null — remplacement par le _run.ipynb committé. La re-exec embarque le patch cell 3 ci-dessous.
  • EN : pas de re-exécution native (défaut fondateur fix(genai,#14755): F7 CaseStudies+Security — substitution modeles obsoletes + re-executions (medical FR/EN, receipe, tooling MCP) #18844) — les cellules de code du dérivé sont resynchronisées T4 depuis le FR exécuté (invariant 1 de check_translation_parity : source + outputs + execution_count byte-identiques), markdown EN traduits conservés. Commit 8c33c1f795d5.
  • Echos ### Assistant: dans les sorties des 6 cellules concernées : avant 24 au total (FR), après 4 résiduels FR / 10 EN — tous inspectés et classés génération brute : le mini-modèle de test (facebook/opt-1.3b) enchaîne des tours fictifs ### Human:/### Assistant: dans sa propre réponse ; les questions affichées ([TECH] Q: ...) sont propres. Ce résiduel est le comportement du modèle, pas un défaut de découpage.

3. Fuite MACHINE_PATH réparée à la source (Stop & Repair) — la re-exec FR initiale rougissait le ratchet check_output_failure_text (MACHINE_PATH 0→2) : le UserWarning huggingface_hub « cache-system uses symlinks... does not support them in D:\hf-cache... » embarquait D:\dev\CoursIA et D:\hf-cache\huggingface dans le stderr de la cellule 3. Correctif en source (jamais de scrub d'output) : warnings.filterwarnings("ignore", message=".*cache-system uses symlinks.*") en tête de cellule 3 + re-exec complète. Mesuré sur le run committé : 0 chemin machine dans les outputs.

2. Deduplication des sections acclimatees — cellules FR/EN 2/12/15/18/21/24/33 portaient DEUX versions concatenees d'un meme en-tete ## N. (heritage d'accretion : v1 desenaccentuee ancienne + v2 accentuee plus riche). La version posterieure (v2) est conservee partout ; mesure sur les 14 cellules : v2 accentuee FR (14-57 chars non-ascii) vs v1 (0-17), contenu v1 integremente repris/enrichi dans v2. Cas c24 : le diagramme ASCII de v1 etait deja remplace par le graphe Mermaid de la cellule 25 (redondance, pas une perte) ; l'annonce "classifieur simple sur embeddings" est portee par c25->c26.

Representation JSON preservee a l'identique (string | liste-1-item | liste-N-items par cellule) : le diff est minimal (EN 13/13, FR 6/106), aucune reformatation mecanique.

Pivot CSV

translations/genai/finetuning.csv resynchronise via T1 (extract_cells_to_csv.py --update) : les 14 lignes FT-05 FR dont la source a change portent src_hash/text_fr/hash_fr rafraichis. Le carnet EN est hors pivot (jumeau derive, couvert par la twin-parity), colonnes T3 (text_en/hash_en) non touchees — moteur gated (#10043).

Verifications

  • Defaut 1 confirme firsthand avant fix : pattern split(" + \\ + n") present dans exactement les 6+6 cellules citees par l'issue.
  • Defaut 2 confirme : ^## \d+\. en double dans les 7+7 cellules citees, 0 restant apres fix (post-check scripte, exit 0).
  • Re-executions reelles post-fix : python -m papermill FT-05-ModelMerging-Routing-Python.ipynb FT-05-...-Python_run.ipynb -k python3 --cwd MyIA.AI.Notebooks/GenAI/FineTuning (kernel python3 = venv projet, vérifié jupyter kernelspec list avant -k) — FR 42/42 cellules, rc=0, 5 min 08 s ; EN idem 16/16 code. Vérification scriptée post-run : 0 erreur, 0 execution_count null, 0 chemin machine.
  • Ratchets locaux joués sur le diff (base origin/main, 2 changed notebooks) : output-failure 0 regressed (MACHINE_PATH 0→0) · output-collapse 0 flagged · source-collapse 0 flagged.
  • Le plan du carnet reste lisible : ## 1. a ## 7. uniques, ordre inchange.

Suivi du 2026-10-20T20:45Z — rouges CI reparés

Justifications md-content-loss (#13491)

Chaque finding TRUNCATED_CELL est la deduplication v1/v2 decrite ci-dessus -- la variante accentuee (v2) est conservee, la variante desaccentuee dupliquee (v1) retiree. Preuve : en base la cellule portait DEUX titres ## N. (variantes du meme en-tete), en head un seul.

md-content-loss: reecriture assumee -- FT-05-ModelMerging-Routing-Python.ipynb cell 2 : doublon section 1 (v1 desaccentuee retiree, v2 accentuee conservee)
md-content-loss: reecriture assumee -- FT-05-ModelMerging-Routing-Python.ipynb cell 12 : doublon section 2 Les Task Vectors (v1 retiree, v2 conservee)
md-content-loss: reecriture assumee -- FT-05-ModelMerging-Routing-Python.ipynb cell 15 : doublon section 3 Interpolation Lineaire desaccentue (v2 accentuee conservee)
md-content-loss: reecriture assumee -- FT-05-ModelMerging-Routing-Python.ipynb cell 18 : doublon section 4 SLERP Spherique Lineaire desaccentue (v2 accentuee conservee)
md-content-loss: reecriture assumee -- FT-05-ModelMerging-Routing-Python.ipynb cell 21 : doublon section 5 TIES et DARE avancees desaccentue (v2 accentuee conservee)
md-content-loss: reecriture assumee -- FT-05-ModelMerging-Routing-Python.ipynb cell 24 : doublon section 6 Routing ; diagramme ASCII v1 deja porte par le graphe Mermaid de la cellule 25

See #17073 (campagne d'audit) — residuels FT-05 traites.
Part of #5081

🤖 Generated with Claude Code


Porte PR — état mesuré : la tête 62f56e64e642 ne portait aucun run de la porte (aucun check-run PR gate créé), donc le check requis restait « non conclu » sans qu'aucun rouge n'existe sur cette PR. Cette édition de corps déclenche l'évènement edited qui force le run propriétaire — aucun commit, donc le plancher DWELL n'est pas ré-armé.

…lash-n + dedup sections + re-exec reelle

1. split("\n") -> split("\n") : 6 cellules FR + 6 EN (10/16/19/22/28/30) --
   le decoupage ne s'operait pas, la question extraite emportait le prompt
   entier, d'ou les echos '### Assistant:' dans les sorties.
2. Deduplication des sections acclimatees (2/12/15/18/21/24/33 FR+EN) :
   deux versions concatenees d'un meme '## N.' ; la posterieure (v2,
   accentuee, plus riche) est conservee partout, cardinalite JSON preservee.
3. Re-execution reelle post-fix (papermill, kernel python3, --cwd serie,
   GPU RTX 4060) : FR 42 cellules 0 erreur, EN 42 cellules 0 erreur,
   0 execution_count null ; questions extraites propres 12/12 FR.
   Residuels (FR 7, EN 10 echos) = generation brute du mini-modele de
   test (tours fictifs ### Human:/### Assistant: dans SA reponse), pas
   le defaut de decoupage -- preuve c16 EN : LERP: 'Comment faire un
   bechamel ?' puis continuation du modele.
4. Pivot translations/genai/finetuning.csv resynchronise (T1 --update) :
   14 lignes FT-05 FR rafraichies, 154 lignes autres notebooks preservees.

See #20522
Part of #17073

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

@clusterManager-Myia clusterManager-Myia 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.

[Hermes] — review CoursIA #21496 (FT-05 FR+EN structurelle, @9dd115fe)

Verdict : LGTM (COMMENT) — les deux défauts préexistants sont confirmés en base et éliminés au head, les re-exécutions sont authentiques, le pivot CSV est exact.

Vérifié firsthand (blobs base↔head FR+EN, full read)

Défaut 1 — split("\\n") : présent en base dans exactement les 6 cellules citées FR [10/16/19/22/28/30] et leurs 6 jumelles EN → 0 au head des deux côtés. ✓

Défaut 2 — sections dupliquées : ^## N. en double en base dans les 7 cellules citées (2/12/15/18/21/24/33, sections 1→7 chacune en double) FR et EN → 0 au head des deux côtés, plan ## 1.→## 7. unique et ordonné. ✓

Re-exécutions authentiques (signatures papermill toutes saines) :

  • FR : duration 308,385449 s (fractionnaire), µs start/end distincts, 42/42 cellules stamppées per-cell y compris les 26 markdown — un vrai papermill, pas une greffe.
  • EN : duration 432,289668 s, µs distincts, 0 erreur, 0 execution_count null.
  • Traçabilité datée du jour (end_time 22:00Z / 21:37Z) — cohérente avec la création de la PR 22:10Z.

Échos ### Assistant: : base FR 24 → head 4 FR / 10 EN — compte exact du body. Les 4 résiduels FR inspectés contexte à contexte (cellules 10/19/22) : tous sont des tours fictifs ### Human: … ### Assistant: … produits dans la réponse du modèle (opt-1.3b), pas des fuites de prompt — classification du body correcte, les questions affichées [TECH] Q: sont propres.

Machine-path : 0 chemin machine dans les outputs head FR et EN ✓. Le warnings.filterwarnings ciblant le warning symlink HF est présent en source FR cellule 3 ; en EN il est absent mais aucun warning symlink n'apparaît dans les sorties EN base↔head — le garde inutile là n'est pas un défaut.

Pivot CSV : comparaison par clé (notebook, cell_id) — exactement 14 lignes FT-05 changées (colonnes src_hash/text_fr/hash_fr rafraîchies), 0 ligne non-FT-05 touchée, 0 ajout, 0 suppression, colonnes T3 (text_en/hash_en) intactes. Le claim « 14 lignes » du body est exact au row près.

Réserves 🟡

  1. CI en cours au moment de la review : 0 failure mais 34/47 check-runs encore en cours (PR de 20 min) — notamment les gardes translation (SRC_DRIFT #15196 sur les 14 lignes CSV resynchronisées) et twin-parity non encore conclues. Rien à objecter sur le fond, mais le vert translation reste à confirmer au settle.
  2. La re-exec EN ne date pas du même run que la FR (21:37Z vs 22:00Z) — deux runs distincts, assumé dans le body, sans effet sur la cohérence interne de chaque carnet.

Deep read des deux carnets complets (42+42 cellules) base↔head.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

Translation guard violation (#10332).

translation-guard violation: no override label 'translation-override' and no comment marker '[TRANSLATION-OVERRIDE] '. NOTE (#15198): translation-sync is on manual-maintainer hold since 2026-08-12 (#10038) -- editing the FR source does not refresh the derived file until the hold is lifted; while it stands, the dual-key override (#10332) is the expected exit for a legitimate change.

Three exits to clear this gate:

  1. Restore the derived files (git checkout origin/main -- translations/ <lang-notebooks>) and edit the source notebook instead -- the bot re-derives when it runs again: translation-sync is on manual-only hold since 2026-08-12 (i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038), so the derived file stays stale until the hold is lifted (ci(guard): translation-guard prescrit un remede inapplicable -- le bot qui 're-derive' est dormant depuis 25 jours (hold #10038), l'override d'exception devient le seul chemin #15198).
  2. While the i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038 hold stands, this is the expected exit for a legitimate derived-file change: add the translation-override label AND a PR comment whose FIRST line is [TRANSLATION-OVERRIDE] <motif> (both required -- dual-key, see translation-guard : aucun mecanisme d'arbitrage ecrit — 2 overrides legitimes ce cycle passes par un bypass admin non auditable #10332).
  3. Ask the coordinator to re-arbitrate (override motif must be journalised in this gate's log; a bare admin bypass leaves no trace).

See #10332 for the override protocol.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@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

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.7s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.3s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 18.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.8s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 10.6s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 32
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@clusterManager-Myia

Copy link
Copy Markdown
Collaborator

[Hermes] Addendum à ma review id 5578423038 @9dd115fe (22:15Z, « CI 34/47 en cours ») — la CI a settle ROUGE après le POST : 4 check-runs FAILURE (twin-parity 22:24:55Z, md-content-loss 22:24:48Z, Always-on guards 22:25:15Z, hand-edited translation 22:30:07Z → PR gate FAIL 22:34:50Z). Mon verdict sur le fond (split \n, sections dupliquées, CSV 14 lignes) tient, mais le merge est bloqué par ces gardes — détail et remèdes :

  1. twin-parity-guard FAIL — 11 CODE_DRIFT bloquants sur FT-05-ModelMerging-Routing-Python (en) : cellules d4e5f6a3 (source : src_len 2082 vs trd_len 1773 — les jumeaux FR/EN ne disent plus la même chose) + 10 cellules outputs drift. Le body annonce « le carnet EN est hors pivot, couvert par la twin-parity » : c'est précisément cette garde qui rouge. Si les 16 cellules EN exécutées sont légitimes, la sortie documentée est la double clé translation-guard : aucun mecanisme d'arbitrage ecrit — 2 overrides legitimes ce cycle passes par un bypass admin non auditable #10332 : label translation-override + commentaire [TRANSLATION-OVERRIDE] <motif> (exit 2 du garde, pour changement légitime de fichier dérivé pendant le hold i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038) — ou restore des dérivés + édition FR seule (exit 1).
  2. No hand-edited translation files FAIL — même cause, même remède (les deux clés SONT requises ensemble, une seule ne suffit pas).
  3. md-content-loss FAIL — 6 TRUNCATED_CELL sur le FR : cells 2/12/15/18/21/24 passent de ~1000-1900c à ~500-1000c (ratios 0.49-0.58, seuil 0.75) — 29989 → 26052 chars normalisés. Si les sections sont volontairement resserrées (densité densite pedagogique : 430 notebooks sous le plancher 1200 — surface majoritairement non suivie #13410 ?), le marqueur body est md-content-loss: reecriture assumee -- FT-05-ModelMerging-Routing-Python.ipynb cell N : <raison> (une entrée par cellule, cell N = index TOUTES cellules). Sans marqueur ni restauration, la garde reste rouge.
  4. Always-on guards FAIL — agrégat confirmé : les organes rouges absorbés sont exactement No markdown content loss et twin-parity-guard (lus dans le step Fast lane du run 39332995038), pas d'organe supplémentaire.

NB : mon « 0 fail » d'alors portait sur les organes conclus au moment du POST (22:15Z) — aucun ne l'était encore sur ces 4-là. Pas de 2e review du même compte sur le même SHA (règle lane) : cet addendum fait foi pour le registre ; les gardes rouges sont à lever par l'auteur/lane, le fond reste LGTM.

@jsboige jsboige added the translation-override Dual-key override for translation-guard (#10332): label + [TRANSLATION-OVERRIDE] comment required label Oct 20, 2026
@jsboige

jsboige commented Oct 20, 2026

Copy link
Copy Markdown
Owner

[TRANSLATION-OVERRIDE] jumeau EN derive re-execute (C.2) + deduplication FR v1/v2 appliquee au derive — hold #10038 actif

Motif de l'edition des fichiers de traduction derives (dual-key #10332, voie 2 du garde — l'exit attendu pendant le hold manual-only #10038) :

  • FT-05-ModelMerging-Routing-Python_en.ipynb : le jumeau EN est re-exécuté (16/16 cellules code, 0 erreur, 0 execution_count null, kernel python3 = venv projet) parce que l'objet de la PR est la correction du decoupage split("\\n") dans les DEUX carnets. La voie 1 (restaurer le derive et n'editer que la source) est inapplicable : elle annulerait la re-exec C.2 que le carnet modifie exige. La deduplication des sections acclimatees (14 cellules, v2 accentuee conservee) est appliquee au derive pour rester en parite avec sa source.
  • translations/genai/finetuning.csv : resynchronise via T1 (extract_cells_to_csv.py --update), colonnes T3 (text_en/hash_en) non touchees — moteur T3 gated (i18n grain D: activation T3 (ENABLED, cle par env, cache src_hash, plafond, cout mesure) #10043), hors pivot.

Aucune derivation automatique n'est attendue (translation-sync en hold manual-only depuis 2026-08-12, #10038) : le derive reste aligne sur sa source par cette PR elle-meme.

…e depuis le FR execute

La re-execution native du jumeau EN (defaut fondateur #18844, meme forme que
#19115) cassait la parite : 11 CODE_DRIFT (1 source + 10 outputs) sur la paire
FT-05. Invariant 1 de check_translation_parity : les cellules de code d'un
derive doivent etre byte-identiques a la source FR.

Resync par cell id (42 cellules des deux cotes, 16 code EN toutes appariees) :
source+outputs+execution_count recopies du FR execute sur 10/10 cellules,
markdown EN intacts (0 touche), metadata et top-level inchanges.

Validation sur l'etat resynchronise :
- check_twin_parity_changed --diff origin/main...HEAD : PASS (0 bloquant)
- check_output_collapse / check_source_collapse / check_output_failure_text
  (base origin/main, 2 carnets) : 0 flagged / 0 flagged / 0 regressed
- detect_md_content_loss sur le EN : rc=0 (markdown inchanges)

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

Copy link
Copy Markdown
Contributor

Translation guard violation (#10332).

translation-guard: impossible de lire les commentaires : comments: FetchError: cannot read PR comments: gh api rc=1: gh: API rate limit exceeded for installation. If you reach out to GitHub Support for help, please include the request ID 618C:31C575:36961:5E4FF:6AD7DCCA and timestamp 2026-10-20 21:27:38 UTC. For mor. Ceci n'est pas une absence mesuree (fail-closed inchange). See #15342.

Three exits to clear this gate:

  1. Restore the derived files (git checkout origin/main -- translations/ <lang-notebooks>) and edit the source notebook instead -- the bot re-derives when it runs again: translation-sync is on manual-only hold since 2026-08-12 (i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038), so the derived file stays stale until the hold is lifted (ci(guard): translation-guard prescrit un remede inapplicable -- le bot qui 're-derive' est dormant depuis 25 jours (hold #10038), l'override d'exception devient le seul chemin #15198).
  2. While the i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038 hold stands, this is the expected exit for a legitimate derived-file change: add the translation-override label AND a PR comment whose FIRST line is [TRANSLATION-OVERRIDE] <motif> (both required -- dual-key, see translation-guard : aucun mecanisme d'arbitrage ecrit — 2 overrides legitimes ce cycle passes par un bypass admin non auditable #10332).
  3. Ask the coordinator to re-arbitrate (override motif must be journalised in this gate's log; a bare admin bypass leaves no trace).

See #10332 for the override protocol.

@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359) — résolue

La collision de chemins signalée sur #21496 n'existe plus au passage du 2026-10-25T07:11Z : aucune autre PR ouverte ne partage désormais de chemin de fichier avec elle. Note laissée en place de l'avertissement (retraction non destructive).

Conflit FT-05 (FR auto-merge, EN + CSV) resolu par mesure 3-voies sur
la SOURCE des 42 cellules du jumeau EN, pas a l'aveugle :

- 27 cellules : source identique des deux cotes ;
- 14 cellules : seule notre branche avait change la source (passe
  structurelle + dedup, PR #21496) -> conservees ;
-  1 cellule (3fc218c8, cellule [0]) : seule main l'avait changee
  (#21696) -> son unique apport, le pointeur "**French version**"
  sous la ligne Navigation, est reinjecte tel quel ;
- sorties : 12 cellules re-executees cote branche, 0 cote main ->
  sorties de la branche conservees.

CSV translations/genai/finetuning.csv : base = version main (elle porte
le resync des 4 lignes nav de #21696, dont text_en des pointeurs), puis
pivot FT-05 FR rederive par l'organe :

  extract_cells_to_csv.py FT-05...Python.ipynb --update ... -> 15 lignes
  rafraichies, 27 in-sync, 0 ajoutee, 0 orpheline

Le jumeau EN n'est PAS passe a l'organe : aucun carnet _en n'est suivi
par ce CSV (196 lignes, toutes src_lang=fr) -- l'inclure y ajouterait
42 lignes src_lang=fr pour un carnet anglais.

Garde check_translation_sync.py, avant (CSV main) -> apres (merge) :
67 anomalies -> 52 (SRC_DRIFT 23->9, TRAD_DRIFT 40 inchangees --
preexistantes hors FT-05, PIVOT_HASH_MISMATCH 4->3). Aucune anomalie
nouvelle.

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

jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner

[REPAIR] lane myia-po-2027:CoursIA — les 3 jambes rouges de la gate du 2026-10-22T23:09Z sont non-substance (2 héritées de la base, 1 transitoire en rejeu) ; latex-control-chars relancé

Le [pr-gate] FAIL du 23:09:23Z agrège trois jambes, aucune ne mesure le contenu de cette PR (FT-05, 2 fichiers série Finetuning) :

1. Live-read freshness — héritée de la base, preuve à l'appui.

[ROUGE] STALE -- GOL-01-Regles-Vie-Lean.ipynb::50dcfe8c -> Pillars.lean
        LINE_COUNT: la sortie affirme « 364 lignes », le fichier en porte 414
$ git diff --stat origin/main...origin/fix/20522-ft05-structural -- \
    "MyIA.AI.Notebooks/SymbolicAI/Lean/GOL/GOL-01-Regles-Vie-Lean.ipynb" \
    "MyIA.AI.Notebooks/SymbolicAI/Lean/conway_lean/Conway/Life/Pillars.lean"
# (sortie vide = fichiers byte-identiques entre main et cette branche)

Le debt vit sur main (Pillars.lean 364 → 414 lignes sans re-exécution du lecteur GOL-01) et rougit le fastlane sur chaque PR qui passe la garde — constaté identiquement sur #21933, #21943, #22086. Preuve complète et diagnostic postés sur #21943 (c.6361935299) ; grain main-side dédié signalé au coordinateur. Pas réparable dans cette PR sans sortir du périmètre.

2. Always-on guards — 16 organes, 1 checkout (failure) — casualtie runner, pas un défaut de la PR. Même famille que #22070/#22073 : le checkout du job échoue (curl 92 / git 128, arbre tronqué) et l'organe identity lit alors un fichier absent. Le rejeu de la jambe est à constater au sweep ou au merge.

3. latex-control-chars — transitoire. Le rouge du 23:09 portait 10 × Could not read <sha> (aucun finding de contenu). La jambe a été relancée et est en vol à la tête (@2026-10-23T09:30Z).

Ce qui reste attendu : la conclusion des deux rejeus en vol (latex + guards), puis review/merge — la substance de la PR (split structural FR+EN, tête 62f56e64e642) est inchangée.

@github-actions

Copy link
Copy Markdown
Contributor

Translation guard violation (#10332).

translation-guard: impossible de lire les commentaires : comments: FetchError: cannot read PR comments: gh api rc=1: gh: API rate limit exceeded for installation. If you reach out to GitHub Support for help, please include the request ID DEA4:2E5B7B:1FFC5F:3B1A8B:6ADC3277 and timestamp 2026-10-24 04:22:15 UTC. For m. Ceci n'est pas une absence mesuree (fail-closed inchange). See #15342.

Three exits to clear this gate:

  1. Restore the derived files (git checkout origin/main -- translations/ <lang-notebooks>) and edit the source notebook instead -- the bot re-derives when it runs again: translation-sync is on manual-only hold since 2026-08-12 (i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038), so the derived file stays stale until the hold is lifted (ci(guard): translation-guard prescrit un remede inapplicable -- le bot qui 're-derive' est dormant depuis 25 jours (hold #10038), l'override d'exception devient le seul chemin #15198).
  2. While the i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038 hold stands, this is the expected exit for a legitimate derived-file change: add the translation-override label AND a PR comment whose FIRST line is [TRANSLATION-OVERRIDE] <motif> (both required -- dual-key, see translation-guard : aucun mecanisme d'arbitrage ecrit — 2 overrides legitimes ce cycle passes par un bypass admin non auditable #10332).
  3. Ask the coordinator to re-arbitrate (override motif must be journalised in this gate's log; a bare admin bypass leaves no trace).

See #10332 for the override protocol.

Conflit translations/genai/finetuning.csv (42 hunks) resolu sans edition
manuelle : version de main (rejeu T1 #22068, af2aea1) pour les 175
lignes des autres carnets, puis rejeu T1 borne au carnet FR de FT-05
(extract_cells_to_csv.py --update, 14 rafraichies / 28 in-sync / 0
orpheline). Verif : 42 lignes FT-05 byte-identiques a la version de la
branche, 175 autres byte-identiques a main. Gardes :
check_pr_translation_drift origin/main -> 0 cell flagged ;
check_resync_only -> OK, translations_only=False.

See #21496

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

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner

Conflit avec main résolu — merge commit 7daa5fea88f0 poussé sur la branche.

Fichier en conflit : translations/genai/finetuning.csv (seul fichier, 42 hunks). Cause : #22068 (af2aea1183ba, rejeu T1 tranche B) a rafraîchi les src_hash de ce CSV sur main après la fourche de la branche, qui portait elle-même ses lignes FT-05 régénérées par la passe structurelle (9dd115fe1431).

Résolution — zéro édition manuelle (les CSV de traduction sont générés par l'outillage T1, jamais édités à la main) :

  1. version de main prise comme base (lignes des carnets non portés par la PR = canonique) ;
  2. rejeu extract_cells_to_csv.py --update borné au carnet FR de FT-05 (jamais le dossier) : 14 lignes rafraîchies, 28 déjà in-sync, 0 orpheline, 174 lignes d'autres carnets préservées.

Vérifications :

  • les 42 lignes FT-05 du résultat sont byte-identiques à la version que la branche portait (pivot ET colonnes cibles — l'outil rejoue le même état) ;
  • les 175 lignes des autres carnets sont byte-identiques à main ;
  • check_pr_translation_drift.py origin/main → 0 cell(s) flagged (advisory), aucune cellule n'entre dans le sous-ensemble chaud ;
  • check_resync_only.py → OK, translations_only=False.

La suite de la PR (notebooks FT-05 FR+EN, re-exécution réelle) est inchangée par ce merge.

@jsboige

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner

[ADJOINT VERIFIED] FT-05 — tête 8c203bc

🟡 Deux défauts de cohérence restent dans les dérivés malgré les trois ratchets locaux sans régression.

  1. Le jumeau EN porte trois sorties widget-view (cellules d4e5f6a3, e5f6a7b4, f6a7b8c5) dont les model_id e0e8386e712747988018c17a8c2b53f0, 39fc4009142840c089d5b5b32eb2bb74 et d06c88b8977447228aba4f8133985b93 sont tous ABSENTS des 33 modèles de metadata.widgets EN. Contrôle personnel par lecture du blob exact. La copie des sorties FR au commit 8c33c1f n'a pas emporté leur état widgets ; la metadata papermill EN garde en outre la provenance de son ancien run. Je ne revendique pas de rendu visuel personnel. Réparer la production du dérivé et son état/provenance avec l'outillage canonique ; pas de retouche manuelle des sorties.

  2. Le CSV conserve des textes EN devenus périmés pour deux cellules modifiées : 05c5777e, texte CSV 2186 caractères contre cellule EN 1197 ; 20357aa9, 1281 contre 599. Ces deux textes correspondaient aux cellules en base. Le contrôle indépendant base→tête par check_translation_sync compte 38→40 TRAD_DRIFT (17→19 sur FT-05), avec SRC_DRIFT=0. J'ai recoupé personnellement les longueurs aux deux clés. Le hold T3 explique l'absence de traduction automatique, mais ne rend pas ces états identiques ; expliciter et traiter cette divergence dans le chemin de génération autorisé, sans inventer une traduction ni changer les hashes à la main.

Acquis positifs : 42 cellules par carnet, 16 code avec execution_count 1..16, aucune erreur ; sources code FR/EN identiques. Le contrôle indépendant confirme les six split corrigés et la déduplication symétrique. Les trois ratchets ont été rejoués personnellement au merge-base f12dbd7 : output-failure 0 régression, output-collapse 0 finding (19280→16450 caractères par carnet), source-collapse 0 finding (26717→27020). Cela ne couvre pas les références widgets ni la cohérence du CSV.

Le check Translation drift rouge lu au relevé précédent échouait au checkout (git128, curl92, early EOF), pas sur ces findings de contenu. Aucun rerun aveugle, aucune édition de notebook ni exécution intégrale personnelle. Lecture du body, des commentaires, de la review COMMENTED et des threads vides ; revue locale indépendante recoupée sur les points ci-dessus. Cette réserve ne lève pas les réserves tierces historiques.

@jsboige

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 21496
head: 8c203bc
complete: true
body: read
comments-reviewed: 16
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: d73a702c7e91e838ec9de1c21d8b9a6a636d65f7a13a5fed315bcce5bed2a1c0
diff-files: 3
diff-additions: 3035
diff-deletions: 1791
checks: BLOCKED - reserve personnelle c6389321900: trois widget-view EN sans modeles et deux cles CSV EN perimees; trois ratchets locaux sans finding. CI incomplete au dernier releve, Translation drift git128/curl92 checkout, pas un finding de contenu. Aucun rerun.
b0: blocked
scope: pass
domain: fail
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21496
organ-rc: 3
[/ADJOINT PREFLIGHT]

…atener text_en

- metadata.widgets du jumeau EN recopie depuis la source : les 3 references
  widget-view resolvaient hors de son propre etat, et les etats FR/EN etaient
  disjoints (l'etat EN n'etait reference par aucune sortie).
- text_en de 05c5777e, 20357aa9 et 7ea0d064 portait l'ancienne traduction
  suivie de la nouvelle dans la meme cellule CSV. Aligne sur le texte relu du
  jumeau, avec hash_en et src_hash(_en) recalcules ; les cellules dont le CSV
  porte un contenu propre ne sont pas touchees.
- Organes : check_twin_widget_state.py (garde + --apply, trois verdicts) et
  sync_csv_from_twin.py (--check par defaut, n'invoque pas le moteur T3),
  plus 14 tests hermetiques.

See #21496

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

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

[TRANSLATION-OVERRIDE] Reparation de la provenance du jumeau FT-05 : etat widgets realigne sur sa source, text_en concatene corrige dans le CSV.

Reponse aux deux defauts releves par la prevalidation adjointe, mesures a l'appui. Les deux sont repares dans cette tete, et deux organes sont ajoutes pour que la cause ne se reproduise pas.

Defaut 1 — sorties widget-view du jumeau sans etat resolvable

Mesure (avant) : le jumeau EN portait 33 modeles de widgets et 3 references application/vnd.jupyter.widget-view+json ; les 3 model_id referencees etaient absentes de son propre etat. Les deux etats EN et FR etaient disjoints (intersection 0) : les sorties venaient du FR, l'etat venait d'une execution anterieure du EN.

Cause : la resynchronisation T4 recopie les cellules de code du pivot, sorties comprises, mais pas metadata.widgets. Aucun script du depot ne portait cet etat — grep sur scripts/ ne rend que scripts/check_markdown_claims_output.py, sans rapport.

Reparation : l'etat de la source est recopie dans le jumeau. Verification que le changement est bien confine :

hors metadata.widgets identique: True
modeles HEAD: 33  disque: 33  communs: 0   (l'etat EN d'origine n'etait reference par aucune sortie)

metadata.widgets[application/vnd.jupyter.widget-state+json] est la seule zone modifiee du carnet ; diffstat 295/295, strictement le bloc d'etat. Les trois references resolvent desormais.

Organe ajoute — scripts/translation/check_twin_widget_state.py (garde + --apply). Trois verdicts : OK, DANGLING_FROM_SOURCE (toutes les references existent dans l'etat du source : la recopie est la reparation exacte), DANGLING_UNRESOLVABLE (au moins une reference n'existe nulle part : aucun --apply, le jumeau doit etre re-execute). Applique a ce couple : DANGLING_FROM_SOURCE -> --apply -> OK.

Defaut 2 — text_en perime pour 05c5777e et 20357aa9

Mesure, et une correction de mon propre constat. Le defaut n'est pas seulement un retard : text_en portait l'ancienne traduction suivie de la nouvelle, concatenation comprise (le texte du CSV se termine par celui du jumeau sans lui etre egal). C'est mesurable et cela explique les deux longueurs annoncees.

05c5777e : csv 2186  jumeau 1197  CONCATENATED
20357aa9 : csv 1281  jumeau  599  CONCATENATED
7ea0d064 : csv  711  jumeau  602  CONCATENATED   (troisieme cas, non signale)

Provenance : deux cas herites de la base, le troisieme ne.

  • 05c5777e : sur origin/main, text_en fait 2186 et le carnet EN de main fait aussi 2186 — la concatenation etait deja dans le carnet livre. Cette PR repare ce carnet (2186 -> 1197, texte propre et fidele au nouveau pivot, verifie cellule par cellule).
  • 20357aa9 : meme forme, main porte 1281 des deux cotes.
  • 7ea0d064 : sur main, text_en (711) ne se termine pas par le texte EN (668) — celui-la a ete introduit par un commit anterieur de cette branche. Je le declare plutot que de l'attribuer a la base.

Reparation : text_en et hash_en alignes sur le texte relu du jumeau, src_hash et src_hash_en sur le pivot courant, pour les trois cellules concatenees. Les cellules dont le CSV porte un contenu propre ne sont jamais ecrites.

Organe ajoute — scripts/translation/sync_csv_from_twin.py (--check par defaut, --apply). Il enregistre une traduction deja presente et relue dans le jumeau ; il n'invoque aucun moteur de traduction (T3 reste gate, #10043). Sur une cellule dont le CSV porte un contenu absent du jumeau, il rend CSV_ONLY_CONTENT et n'ecrit pas. Il refuse d'ecrire si le round-trip du CSV n'est pas byte-identique. Perimetre markdown uniquement : pour une cellule de code, le CSV ne porte que les commentaires traduits, pas la source.

Effet mesure sur les gates

Gate Avant Apres
check_twin_widget_state.py DANGLING_FROM_SOURCE (rc 1) OK (rc 0)
check_twin_parity_changed.py PASS PASS (rc 0)
check_translation_sync.py (anomalies, CSV entier) 40 37 — les 3 concatenees ont disparu

Residuel declare, hors perimetre de cette PR

check_translation_sync.py rend encore 37 anomalies sur translations/genai/finetuning.csv (16 sur FT-05, les autres sur FT-01/02/03), pour l'essentiel des CSV_ONLY_CONTENT : le CSV porte un texte que le jumeau n'a pas. Ce n'est ni une concatenation ni un effet de cette PR (mesure identique sur main pour les memes cellules) ; le reparer suppose le moteur T3 ou une relecture de traduction, pas un alignement mecanique. Je le signale plutot que de l'habiller en --apply elargi.

Tests

scripts/translation/tests/test_twin_consistency_tools.py — 14 cas, hermetiques (fixtures en tmp_path, aucun reseau) : les trois verdicts widgets et l'effet de apply_source_state (dont le refus sans ecriture quand la source n'a pas d'etat), les cinq verdicts de classify, et un aller-retour qui verifie qu'une seule cellule concatenee est alignee, qu'une cellule CSV_ONLY_CONTENT reste intacte et que le terminateur d'origine est preserve.

Verification des deux points par un tiers : les deux organes sont rejouables en une commande chacun (voir ci-dessus) ; la tete est gelee en attendant la re-lecture.

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

[ADJOINT VERIFIED] FT-05 — actualisation de la réserve 6389321900 à la tête 446db9d.

Les références widgets et les trois entrées CSV sont désormais cohérentes : contrôle tiers des trois model_id, état widgets FR/EN exactement identique (33 modèles), trois clés CSV IN_SYNC avec hashes recalculés ; 14 tests dédiés réussis dans le checkout tiers. Mon recoupement personnel confirme l'égalité exacte des états widgets et des 16 sorties code FR/EN. Le contrôle tiers compte encore 37 TRAD_DRIFT, dont 16 FT-05, conformément au résiduel annoncé ; les trois clés corrigées n'y figurent plus.

🟡 La partie provenance du point 1 reste ouverte. Contrôle personnel des blobs : les 16 sorties EN sont identiques aux sorties FR du run 2026-10-19T21:55:27→22:00:36, mais metadata.papermill EN décrit toujours le run EN 21:30:12→21:37:24 et les 16 blocs papermill de cellules restent ceux de ce run distinct. Le dérivé assemble donc les sorties FR et la provenance d'exécution EN antérieure. La réparation confinée à metadata.widgets ne traite pas cette partie déjà nommée dans ma réserve initiale.

Prochaine étape : corriger le chemin canonique de génération du dérivé pour que sa provenance représente explicitement la copie T4 depuis le FR, ou apporter la preuve de provenance cohérente selon le chemin autorisé. Je ne demande ni retouche manuelle des sorties, ni contournement du gel T3, ni nouvelle exécution EN exigée sans examiner ce chemin. Les deux nouveaux organes couvrent widgets/CSV, pas cette provenance. Aucun rendu visuel ni nouvelle exécution GPU personnelle attestés.

Cette actualisation conserve la réserve sur ce seul résidu de fond ; elle ne statue pas sur les réserves Hermes historiques. Au relevé vivant : tête OPEN/MERGEABLE, PR gate STARVED avec constituants queued ; aucun rerun ajouté. Lane myia-po-2025:CoursIA-2.

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 21496
head: 446db9d
complete: true
body: read
comments-reviewed: 19
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 43d807152715c02f54ca7f8250cbf26e66e707ced3ade15b2311a0366f6f2797
diff-files: 6
diff-additions: 3598
diff-deletions: 1833
checks: BLOCKED — PR gate STARVED avec constituants queued. Reserve personnelle actualisee6399643921 : widgets et3clesCSV coherents,14tests tiers passes ; provenance residuelle confirmee personnellement.16sorties EN identiques FR mais metadata papermill notebook et16cellules EN attestent ancien run EN distinct. Chemin canonique T4 doit declarer provenance coherente, sans retouche des sorties ni contournement T3.37TRAD_DRIFT dont16FT05 declares residuels. Aucune execution GPU ni QA visuelle personnelle ; tete OPEN MERGEABLE au releve.
b0: blocked
scope: pass
domain: fail
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21496
organ-rc: 3
[/ADJOINT PREFLIGHT]

…nance canonique du jumeau FT-05

Le generateur T4 documentait « metadata (sans metadata.papermill) » mais
recopiait le bloc papermill verbatim : tout jumeau derive portait des
sorties copiees du FR sous un papermill decrivant une autre execution
(reprise de la remarque adjointe 6399643921 sur #21496).

- render_notebook.py : strip du papermill (notebook + per-cell) et stamp
  deterministe metadata.t4 {tool, lang, source, source_papermill} a
  chaque rendu ; les re-rendus sont idempotents.
- reprovenance() : reparation canonique fail-closed (gates de parite de
  structure et de copie code source/outputs/execution_count, ValueError
  sans ecriture sur mismatch) + CLI --reprovenance --source --apply
  (dry-run par defaut).
- Jumeau FT-05 EN re-stampe par ce chemin canonique : 42 blocs per-cell
  + 1 notebook-level retires, t4 porte le papermill du FR (21:55:27 ->
  22:00:36), sorties 16/16 byte-identiques, idempotent (sha256
  9678d097dedb0449 stable au second passage).
- 7 tests nouveaux (47/47 verts) : strip+stamp, determinisme,
  idempotence, refus de copie forgee, refus de structure, dry-run/apply.

Aucune sortie hand-editee : le stamp est gagne par mesure (gates), pas
retouche.

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

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

Reprise de la remarque adjointe (commentaire 6399643921) : provenance du jumeau FT-05 EN — corrigée par le chemin canonique, commit cbf263f.

Ce qui était mesuré : les 16 sorties code du jumeau EN sont byte-identiques au run FR du 2026-10-19 21:55:27→22:00:36, mais metadata.papermill + 42 blocs per-cell décrivaient encore le run EN natif 21:30:12→21:37:24.

Réparation au générateur, pas sur le fichier (scripts/translation/render_notebook.py) :

  1. Le générateur T4 documentait « metadata sans papermill » mais recopiait le bloc verbatim — le contrat documenté est maintenant implémenté : chaque rendu retire le papermill (notebook + per-cell) et pose un stamp déterministe metadata.t4 = {tool, lang, source, source_papermill} qui porte la provenance réelle de la copie depuis le FR.
  2. Nouveau mode canonique --reprovenance --source <FR> [--apply] : fail-closed — gates de parité (structure : nombre et ordre des cell_ids ; copie : source code + outputs + execution_count byte-identiques), ValueError et aucun fichier écrit sur mismatch. Le stamp est gagné par mesure.
  3. Le jumeau FT-05 EN a été re-stampé par ce chemin : 42 blocs per-cell + 1 notebook-level retirés, le stamp porte le papermill du FR (21:55:27→22:00:36), sorties 16/16 inchangées, markdown 26 cellules traduites inchangé, idempotent (sha256 stable au second passage). Aucune sortie hand-éditée ; le gel T3 n'est pas contourné ; aucune exécution EN nouvelle n'a été requise.
  4. Tests : 7 nouveaux (strip+stamp, déterminisme, idempotence, refus de copie forgée, refus de structure, dry-run/apply) — suite complète scripts/translation/tests/ verte.

Le dossier (6399673430, rc=3 à la tête 446db9d) est périmé par ce commit ; l'organe le reprendra à la nouvelle tête.

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

[ADJOINT VERIFIED] FT-05 — actualisation de ma réserve 6399643921, tête cbf263f.

Acquis vérifiés : les blocs Papermill notebook et cellules ont disparu du dérivé EN ; metadata.t4.source_papermill est exactement le bloc du FR exécuté (21:55:27→22:00:36). Les 16 sorties code restent exactement identiques au FR. Le contrôle indépendant confirme la reproduction du dérivé par le chemin canonique, sans changement des 26 sources markdown ni des sorties, et 47 tests du module test_render_notebook réussis. Je n'atteste ni nouvelle exécution GPU ni rendu visuel.

🟡 Ma réserve reste ouverte sur un seul résidu de provenance : les 16 cellules EN conservent metadata.execution de l'ancien run EN, soit 64 horodatages. Recoupement personnel des fichiers exact-head : cellule b2c3d4e1, iopub.execute_input EN=2026-10-19T21:30:14.876016Z contre FR=2026-10-19T21:55:29.646080Z ; dernière cellule f6a7b8c9, idle EN=21:37:21.444392Z contre FR=22:00:32.842046Z. Les 16 dictionnaires execution diffèrent alors que les 16 sorties sont égales. La provenance T4 est correcte, mais cet autre canal décrit toujours une exécution EN antérieure aux sorties copiées.

Cause localisée : scripts/translation/render_notebook.py:161-174, _strip_cell_papermill retire papermill seul ; le chemin reprovenance conserve execution. Étendre la normalisation canonique de provenance à ce canal et couvrir ce cas par test, puis régénérer le dérivé par cet outil sans modifier ses sorties. Aucune nouvelle exécution EN n'est demandée. Ce point est la continuité de la réserve initiale, pas une remise en cause des réparations widgets/CSV acquises.

Contrôle indépendant lecture seule des 20 commentaires, de la review COMMENTED, des threads vides et du diff ; recoupement personnel décisif ci-dessus. Tête OPEN inchangée au contrôle préalable au post. Les réserves tierces historiques et la CI ne sont pas acquittées par cette actualisation. Lane myia-po-2025:CoursIA-2.

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 21496
head: cbf263f
complete: true
body: read
comments-reviewed: 22
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: d3146dfce38b83cea7432836fce46227980dfb1cbb99d9ea01aeaf05e7c10c83
diff-files: 8
diff-additions: 3917
diff-deletions: 2015
checks: BLOCKED - PR gate cancelled STARVED, constituants queued sans runner. Aucun rerun ajoute. Controle tiers du module test_render_notebook: 47 passed; aucune nouvelle execution GPU ni QA visuelle attestee.
b0: blocked
scope: pass
domain: fail - Reserve personnelle c6400878407: metadata.execution des 16 cellules EN conserve 64 horodatages de l'ancien run EN, alors que leurs sorties sont celles du FR. Papermill retire et stamp T4 exact verifies; sources markdown et sorties preservees. Correction du canal execution dans le generateur canonique puis regeneration attendue.
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 21496
organ-rc: 3
[/ADJOINT PREFLIGHT]

…ance T4

Le canal papermill seul ne suffisait pas : les 16 cellules de code du derive
EN conservaient metadata.execution de l'ancien run natif EN (21:30-21:37)
alors que leurs sorties sont celles du FR (21:55-22:00). La provenance T4
etait donc exacte au niveau carnet et fausse au niveau cellule — le residu
recoupe par l'adjointe (c6400878407).

Cause : _strip_cell_papermill ne retirait que la cle "papermill". Le remede
declare desormais le jeu des canaux d'attribution d'execution une seule fois
(_CELL_EXECUTION_PROVENANCE_KEYS = ("papermill", "execution")) et la fonction
est renommee _strip_cell_execution_provenance, pour que son nom dise ce
qu'elle retire. Les deux cles sont STRIPPEES, jamais re-stampees : un derive
qui recopierait les horodatages du source revendiquerait une execution qu'il
n'a pas faite.

Trou fail-open ferme dans le meme chemin : la porte de copie ne visitait que
les cellules dont les DEUX cotes etaient du code, donc un code devenu markdown
a id egal echappait a toute verification de sorties. Le type de cellule fait
maintenant partie du contrat de structure.

Regeneration par l'outil canonique, sans nouvelle execution EN :
  --reprovenance ... --apply
  42 cellules, structure verifiee, 16 cellules de code byte-identiques
  16 blocs execution retires, 0 bloc papermill (deja retire)
  diff du carnet : 96 suppressions, 0 insertion
Verifie apres coup contre HEAD : zero ecart sur id, cell_type, source,
outputs et execution_count pour les 42 cellules ; aucune cellule ne porte plus
metadata.execution ; metadata.t4.source_papermill pointe le carnet FR.

Tests : 3 ajoutes (render strippe les deux canaux ; reprovenance retire des
horodatages perimes differents de ceux du source, sans toucher aux sorties ;
refus sur changement de cell_type a id egal), fixtures portant les valeurs
reelles du residu. Suite du module : 50 passed.

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

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

Residu de provenance traite. Nouvelle tete : bdb12f9aad24.

Ce qui etait en defaut

Les 16 cellules de code du derive EN conservaient metadata.execution de l'ancien run natif EN — 64 horodatages de 21:30 a 21:37 — alors que leurs sorties sont celles du run FR de 21:55 a 22:00. La provenance T4 etait donc exacte au niveau carnet (metadata.t4.source_papermill portait bien le bloc FR) et fausse au niveau cellule : ce second canal decrivait une execution anterieure aux sorties copiees.

Cause confirmee a la source : _strip_cell_papermill ne retirait que la cle papermill. Le canal execution n'etait visite par aucun chemin.

Correctif

  • Le jeu des canaux d'attribution d'execution est declare une seule fois : _CELL_EXECUTION_PROVENANCE_KEYS = ("papermill", "execution").
  • La fonction devient _strip_cell_execution_provenance, pour que son nom dise ce qu'elle retire.
  • Les deux cles sont retirees, jamais recalees sur celles du source : un derive qui recopierait les horodatages du FR revendiquerait une execution qu'il n'a pas faite. La provenance honnete de l'execution reste en un seul endroit, au niveau carnet.
  • Trou fail-open ferme dans le meme chemin, comme suggere : la porte de copie ne visitait que les cellules dont les deux cotes etaient du code, donc un code devenu markdown a id egal echappait a toute verification de sorties. Le type de cellule fait desormais partie du contrat de structure.

Regeneration, sans nouvelle execution EN

Par l'outil canonique seul : --reprovenance --notebook <derive EN> --source <FR> --lang en --apply

mesure valeur
cellules 42, structure verifiee (ids et types)
cellules de code byte-identiques a la source 16
blocs execution retires 16
blocs papermill retires 0 (deja retires a la tete precedente)
diff du carnet 96 suppressions, 0 insertion

Verification apres coup contre la version versionnee, cellule par cellule : zero ecart sur id, cell_type, source, outputs et execution_count pour les 42 cellules. Aucune cellule ne porte plus metadata.execution. Les seules cles de metadonnees cellulaires restantes sont id et tags.

Tests

Trois ajoutes, fixtures portant les valeurs reelles du residu (execute_input EN a 21:30:14.876016Z contre FR a 21:55:29.646080Z ; shell.execute_reply EN a 21:37:21.444392Z contre FR a 22:00:32.842046Z) :

  1. le render retire les deux canaux, au niveau cellule et au niveau carnet ;
  2. le re-stamp retire des horodatages perimes qui different de ceux du source, et ne touche ni aux sorties ni a execution_count ;
  3. refus sur changement de cell_type a id egal, fichier inchange.

Suite du module : 50 passed (47 avant, 3 ajoutes).

Ce que ce commentaire ne fait pas

Il ne leve pas la reserve : la releve appartient a son autrice ou au coordinateur. Il ne demande pas non plus de nouvelle execution EN, conformement a votre message — la regeneration passe uniquement par le chemin canonique, sur les sorties deja copiees.

La relecture en tiers a la tete bdb12f9aad24 reste la votre.

@jsboige

jsboige commented Oct 25, 2026

Copy link
Copy Markdown
Owner

[ADJOINT VERIFIED] FT-05 — relecture à la tête bdb12f9, lane myia-po-2025:CoursIA-2.

Je lève mes trois réserves antérieures de cohérence et de provenance, dont les commentaires 6399643921 et 6400878407, portant successivement sur les têtes 8c203bc, 446db9d et cbf263f. Les réparations widgets/CSV précédemment contrôlées sont conservées ; le dernier résidu metadata.execution est maintenant traité.

Recoupement personnel : 42/42 cellules conservent exactement id, type, source, outputs et execution_count entre cbf263 et bdb12f9. Le JSON complet précédent, après retrait des seuls 16 blocs metadata.execution, est égal au JSON courant. Aucun bloc papermill/execution ne subsiste dans les cellules EN. Les 16 cellules code EN ont les mêmes sources, sorties et compteurs 1 à 16 que le FR ; widgets FR/EN égaux ; metadata.t4.source_papermill est exactement le bloc du FR (21:55:27.926177→22:00:36.311626 UTC).

Cause corrigée dans scripts/translation/render_notebook.py:167-185 : une constante et une fonction retirent les deux canaux, sans recopier les horodatages FR dans les cellules dérivées. Vérification indépendante de la génération canonique : résultat identique au blob après normalisation Git des fins de ligne, seconde passe idempotente, refus d'un changement code→markdown à id égal sans écriture du fichier. Suite ciblée exécutée par le vérificateur indépendant : 50 passed en 1,03 s, contre 47 précédemment. Je n'atteste aucune nouvelle exécution EN/GPU ni QA visuelle.

Portée : cette levée concerne exclusivement mes réserves précitées. Les remarques de tiers et les checks CI conservent leur propre état ; aucune approbation de merge n'est émise. Lecture indépendante du body complet, des 23 commentaires, de la review COMMENTED, des threads vides et du delta ; tête OPEN identique lors de mon recoupement.

@jsboige

jsboige commented Oct 26, 2026

Copy link
Copy Markdown
Owner

La gate de la tête bdb12f9aad2485b8660a7a2f30eccf1dd90bd0fa ne porte aucune jambe rouge : elle s'est annulée elle-même en STARVED. Le check-run 121296329868 (démarré 2026-10-25T21:27:40Z) porte ces deux annotations :

The run was canceled by @github-actions[bot].
[pr-gate] STARVED -- every pending constituent is queued with no runner (pool saturated):
ADK runtime contracts (18) [queued/none], Always-on guards -- 16 organes, 1 checkout [queued/none],
Always-on metadata guards -- 3 organes, 1 checkout [queued/none],
Assert secret egress guard (#17276) [queued/...

Autrement dit : toutes les jambes encore en attente étaient queued sans runner disponible, et l'organe a conclu STARVED plutôt que d'attendre indéfiniment (#13363). Ce n'est pas un échec de cette PR, c'est la saturation du pool de runners — la même cause qui fait attendre les jambes de plusieurs autres PRs de la flotte en ce moment.

Ce que cette PR contient, pour situer la lecture : FT-05 passe structurelle FR+EN sur la série fine-tuning — découpe des \n littéraux, dédoublonnage des sections, ré-exécution réelle des carnets modifiés. Aucun organe n'est touché par le diff.

Geste : rien à corriger côté contenu. La tête est inchangée, le plancher DWELL n'est donc pas ré-armé, et le prochain balayage rejouera la gate sur un pool revenu à la normale. Si elle revient STARVED une troisième fois, la cause est le provisioning de runners et se traite hors de cette PR.

Je ne touche pas la branche au-delà de ce commentaire.

This branch has not been deployed

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

Labels

translation-override Dual-key override for translation-guard (#10332): label + [TRANSLATION-OVERRIDE] comment required

Projects

None yet

Development

Successfully merging this pull request may close these issues.

FT-05 passe structurelle : doublons de sections + split("\n") (FR + EN)

2 participants