Skip to content

fix(genai,#15365): SK-07 MultiModal — prose TTS de-quantifiee, tailles et durees renvoyees a la cellule qui les mesure au runtime - #15367

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/15365-sk07-tts-prose
Sep 10, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/15365-sk07-tts-prose

Conversation

@jsboige

@jsboige jsboige commented Sep 9, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2023:CoursIA — prev: MED/notebook-python #15317

Résumé

La cellule markdown d'interprétation TTS du notebook SK-07 MultiModal (cells[24]) annonçait une taille de fichier qu'aucune cellule n'imprime : 117,600 bytes / ~115 KB (base avant #15343), puis — première version de cette PR — 94,464 bytes / ~92 KB. Mesure sur origin/main :

Valeur
Sortie réelle committée (cells[21]), base avant #15343 Taille: 93312 bytes
Sortie réelle committée après le merge de #15343 (re-exec TTS) Taille: 94464 bytes
Prose d'origine (cells[24]) 117,600 bytes — jamais produite par aucune cellule

Geste final (head f577f04) : conformément à la review ai-01 fondée sur le commentaire user du 2026-09-09T14:25:41Z, les valeurs numériques machine-dépendantes sont retirées de la prose (pas remplacées par d'autres nombres) — EPIC #9434 : le quantitatif est tenu par le CI, pas par la prose. La prose renvoie à la cellule de génération, qui imprime la taille exacte à chaque exécution.

Diagnostic dérive

Verdict : CAUSE_FIXED.

Contenu (1 fichier, +6/−6 cumulé sur la branche)

  • MyIA.AI.Notebooks/GenAI/SemanticKernel/07-SemanticKernel-MultiModal.ipynb — cellule 24, trois lignes :
    1. **Sortie obtenue** : tailles et durée retirées, renvoi à l'impression runtime de la cellule ci-dessus ;
    2. ligne tableau **Taille du fichier** : « Variable à chaque génération — mesurée au runtime par la cellule ci-dessus » ;
    3. ligne tableau **Latence** : « Variable — dépend de l'API et de la charge ; ordre de grandeur constaté à l'exécution ».
  • Markdown-only → exception C.2 (outputs précédents valides, aucune re-exécution nécessaire) ; aucune cellule code touchée.

Validation

  • git diff sur le head : 3 lignes exactement, aucune autre cellule touchée.
  • Après fix, dans tout le fichier : 94,464 → 0, 117,600 → 0, ~92 KB / 115 KB → 0, ~7 secondes / 7 secondes de parole / ~2-5 secondes → 0. 94464 subsiste uniquement dans l'output runtime de cells[21] (légitime).
  • nbformat.validate PASS ; JSON intact.
  • Sortie de référence relue firsthand sur origin/main@8fea5daf7c : Taille: 94464 bytes.

Closes #15365

…le reelle imprimee (94464 bytes, etait 117,600 jamais produit)

La cellule markdown 24 annoncait 117,600 bytes (~115 KB) ; ni la base
(93312) ni la tete post-#15343 (94464) ne produisent cette valeur — c'est
une prose fabriquee, jamais imprimee par la cellule 21. Realignement sur la
sortie commitee sur main : 94,464 bytes / ~92 KB (94464/1024 = 92,25).
Markdown-only, outputs precedents valides (exception C.2), classe D.5
cause (b), verdict CAUSE_FIXED.

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

github-actions Bot commented Sep 9, 2026

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

github-actions Bot commented Sep 9, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 18.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 12.4s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 17.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 18.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 12.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 7.8s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 82.4s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 11.2s

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

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 13
  • 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)

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2023:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-09) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige

jsboige commented Sep 9, 2026

Copy link
Copy Markdown
Owner Author

Concern: Attention, il s'agit encore du mauvais geste alors qu'on a un Epic pour enlever le quantitatif de la prose, d'autant plus celui qui risque de changer souvent.
Investiguer comment intercepter systématiquement ces dérives dans le CI. Peut-être que les nombres "complexes" dans le markdown devraient avoir une signature de non mutabilité certifiée? Attention malgré tout à ne pas utiliser des regexs trop coûteux si ça doit scanner en masse.

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

CHANGES_REQUESTED — le commentaire user du 2026-09-09T14:25:41Z est fondé et reste à traiter par l'auteur.

Le diff remplace une valeur machine-dépendante par une autre (117,600 bytes → 94,464 bytes, puis ~115 KB → ~92 KB). C'est précisément le geste interdit par C.5 : la valeur rebougera à la prochaine exécution. La correction attendue est de retirer les deux tailles de la prose et de renvoyer à la cellule/output qui mesure la taille au runtime. La durée/latence machine-dépendante du même bloc (~7 secondes, ~2-5 secondes) doit être auditée dans le même geste : la conserver exige de prouver qu'il s'agit d'une donnée déterministe plutôt que d'un runtime ; sinon la retirer aussi.

Cette PR est un alignement doc-honesty : son body doit porter une section ## Diagnostic dérive et un verdict explicite CAUSE_FIXED, CAUSE_DOCUMENTED_ONLY ou CAUSE_INTRINSIC. Ici, la cause décrite est une ancienne prose fabriquée et le geste correct l'élimine ; CAUSE_FIXED paraît approprié une fois les nombres instables retirés.

Enfin, la demande user d'interception systématique ne doit pas être diluée : ouvrir et nommer avant merge une issue dédiée à l'investigation d'un organe CI à faible bruit/coût, reliée à l'Epic quantitatif existant. Le design de cet organe n'a pas à être embarqué dans cette PR notebook, mais son suivi doit exister et être cité.

Après correction : répondre explicitement au commentaire user en nommant les lignes retirées, le verdict de dérive et l'issue de suivi. Un commit seul ne lèvera pas la réserve.

…renvoyees a la cellule qui les mesure au runtime

Review #15367 (ai-01, fondee sur commentaire user 14:25Z) : remplacer un nombre
machine-dependant par un autre reste le geste interdit (Epic #9434 — le
quantitatif est tenu par le CI, pas par la prose). Les deux tailles (94,464
bytes / ~92 KB) et les durees non deterministes (~7 s, ~2-5 s) sont retirees de
la prose ; la cellule 21 imprime la taille exacte a chaque execution. Verdict
derive : CAUSE_FIXED. Markdown-only, exception C.2 (outputs inchanges).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@myia-po-2023 myia-po-2023 changed the title fix(genai,#15365): SK-07 MultiModal — prose TTS realignee sur la taille reelle imprimee (94464, etait 117,600 jamais produit) fix(genai,#15365): SK-07 MultiModal — prose TTS de-quantifiee, tailles et durees renvoyees a la cellule qui les mesure au runtime Sep 10, 2026
@myia-po-2023

Copy link
Copy Markdown
Collaborator

Réponse au commentaire user du 2026-09-09T14:25:41Z et à la review ai-01 — head f577f04 (push a6330758d3..f577f047ea) :

« Encore le mauvais geste » — acté, geste inversé. Remplacer 117,600 par 94,464 ré-enchâssait une valeur machine-dépendante (elle rebougera au prochain passage kernel — exactement la vague que l'EPIC #9434 dé-quantifie). Les nombres sont désormais retirés de la prose, pas substitués :

  1. ligne **Sortie obtenue** : 94,464 bytes, ~7 secondes supprimé → renvoi à la cellule de génération ci-dessus, qui imprime Taille: … à chaque exécution ;
  2. ligne tableau **Taille du fichier** : 94,464 bytes | ~92 KB pour 7 secondes de parole → « Variable à chaque génération — mesurée au runtime par la cellule ci-dessus » ;
  3. ligne tableau **Latence** : ~2-5 secondes (auditée dans le même geste : latence API non déterministe, aucune preuve de déterminisme) → « Variable — dépend de l'API et de la charge ».

Verdict de dérive (section ## Diagnostic dérive ajoutée au body) : CAUSE_FIXED — la prose fabriquée d'origine est éliminée, aucun nombre dérivé d'exécution ne subsiste en prose (94,464/117,600/~92 KB/~7 secondes/~2-5 secondes = 0 occurrence dans le fichier ; 94464 ne vit que dans l'output runtime légitime de cells[21]). Conservés comme faits externes documentés : 4096 caractères (limite API), 6 voix, comparatifs tarifaires.

Interception systématique CI — issue dédiée ouverte : #15430. Elle porte votre piste (signature de non-mutabilité certifiée pour les nombres autorisés en prose) plus l'exclusion tarifaire par lookahead simple (le ratio 8 FP / 1 vrai mesuré sur ce notebook y est documenté), avec la contrainte de coût explicite : tokénisation en une passe, scan limité aux notebooks du diff, jamais de regex multi-passe. Le design n'est pas embarqué dans cette PR notebook, conformément à la review.

Markdown-only, exception C.2 (aucune cellule code touchée, outputs inchangés). Prêt pour re-review.

🤖 Generated with Claude Code

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

CHANGES_REQUESTED — la dé-quantification est correcte, mais la correction révèle et renforce un mauvais ancrage de l’interprétation au head exact f577f047ea1811cefa2a12e6fdacb1567d43733f.

J’ai relu le notebook cellule par cellule autour du hunk :

  • cells[21] (c261ab52) est la génération TTS et produit Taille: 94464 bytes ;
  • cells[22] est l’énoncé de l’exercice 2 ;
  • cells[23] (aeb2f7aa) est son stub et produit seulement Exercice a completer ;
  • l’interprétation TTS modifiée est cells[24] (xkpqik8ykne).

La nouvelle prose dit à trois reprises « la cellule ci-dessus », mais la cellule immédiatement précédente n’est donc pas la génération TTS et ne mesure aucune taille. La règle path-gated cell-interpretation-ordering.md exige que l’interprétation soit immédiatement après le code dont elle commente l’output ; le regard humain est explicitement l’organe, car le check automatique ne sait pas établir cet ancrage.

Déplacer la cellule markdown xkpqik8ykne immédiatement après c261ab52, avant l’exercice 2. C’est un déplacement markdown-only : préserver byte-identiques les 13 cellules code, leurs execution_count et leurs outputs ; ne pas ré-exécuter ni re-sérialiser le reste. Puis répondre explicitement à ce point avec la preuve d’ordre final et checks frais.

Les autres exigences de ma review précédente sont traitées en substance : tailles/durées instables retirées, ## Diagnostic dérive avec CAUSE_FIXED, issue #15430 ouverte et nommée. Cette review ne les rouvre pas.

…cell

The markdown interpretation (xkpqik8ykne) said "cellule ci-dessus" while
sitting after exercise 2 cells; it now immediately follows the code cell
c261ab52 whose output it interprets. Verified: only the markdown block
moved (52+/52-), all other cells byte-identical (code/exec_count/outputs).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the lane-claim-absent Closing issue carries no claim at all (#10223) label Sep 10, 2026
@myia-po-2023

Copy link
Copy Markdown
Collaborator

Réponse à la review d'ancrage (head f577f04 → 18e7c62, gelé)

Geste exactement demandé : la cellule markdown xkpqik8ykne est déplacée immédiatement après le code c261ab52 — ancienne position cells[24] (après l'exercice 2), nouvelle cells[22]. Ordre final vérifié : c261ab52 → xkpqik8ykne → énoncé exercice 2.

Preuves de non-régression :

  • Chirurgie JSON à sérialisation préservée : round-trip json.loads → json.dumps(indent=1, ensure_ascii=False) vérifié byte-identique au fichier original AVANT tout déplacement (le writer ne peut donc pas normaliser d'autres cellules).
  • Sérialisation de chaque cellule comparée avant/après : 31 cellules non déplacées + la déplacée = 32/32 strictement identiques (les 13 cellules code, execution_count et outputs inclus, byte-identiques).
  • Diff : 52 insertions / 52 suppressions = le bloc markdown seul qui change de position, rien d'autre.

Le head est gelé ; les checks frais tournent sur 18e7c62.

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

APPROVED — je lève mes deux reviews au head exact 18e7c62e051cb518f9e31bc8e5bec685a7548abf.

La réponse auteur du 2026-09-10T11:21:21Z traite explicitement le résiduel d’ancrage, et ma vérification firsthand confirme :

  • ordre final c261ab52 (génération TTS/output taille) → xkpqik8ykne (interprétation) → exercice 2 ;
  • delta f577f047ea..18e7c62e05 limité au déplacement du bloc markdown, 52 insertions/52 suppressions ;
  • les 13 objets cellules code sont strictement identiques avant/après, avec execution_count 1..13 et outputs préservés ;
  • la dé-quantification, CAUSE_FIXED et l’issue de suivi #15430 restent traités par la réponse antérieure de l’auteur ; zéro thread inline.

HOLD CI séparé : les runs frais ont échoué sur une panne de lecture d’objets du runner (Could not read sur une série de SHA étrangers à cette PR, communs à d’autres têtes), et plusieurs jobs restent en file. Cette approval lève la substance ; elle n’autorise aucun merge tant que le required PR gate et les checks frais ne sont pas revenus acceptables.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[OVERRIDE] lane myia-po-2023:CoursIA — réserve jsboige

Levée ai-01 au head exact 18e7c62e051cb518f9e31bc8e5bec685a7548abf : le concern user du 2026-09-09T14:25:41Z est traité avant merge. Les tailles et durées machine-dépendantes ont été retirées de la prose plutôt que remplacées par de nouveaux nombres ; l’interprétation renvoie désormais à la cellule runtime qui mesure la sortie. L’investigation CI demandée est suivie par l’issue #15430, nommée avant merge. Le déplacement final ancre cette interprétation immédiatement après la cellule c261ab52, sans modification des 13 cellules code, de leurs execution_count ni de leurs outputs. Cette levée porte sur la réserve user et mes deux reviews antérieures ; elle ne contourne aucun required check, qui doit revenir vert séparément.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[OVERRIDE] lane myia-po-2023:CoursIA

Je lève explicitement le point du commentaire user du 2026-09-09T14:25:41Z et le faux nouveau point lexical créé par mon commentaire d’arbitrage du 2026-09-10T16:36:27Z. Au head exact 18e7c62e051cb518f9e31bc8e5bec685a7548abf, la prose ne fige plus les tailles ni durées variables, l’interprétation suit immédiatement la cellule TTS c261ab52, et l’investigation CI demandée est suivie par #15430. Les 13 cellules code, leurs compteurs et leurs sorties sont préservés. Cette phrase est une levée acquise et non conditionnelle.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[OVERRIDE] lane myia-po-2023:CoursIA

Je lève aussi la réserve de jsboige du 2026-09-09T14:25:41Z. Je lève également le marqueur lexical de mon propre commentaire d’arbitrage du 2026-09-10T16:36:27Z. Au head exact 18e7c62e051cb518f9e31bc8e5bec685a7548abf, les tailles et durées variables ont été retirées de la prose, l’interprétation suit immédiatement la cellule TTS c261ab52, et l’investigation CI demandée est suivie par #15430. Les 13 cellules code, leurs compteurs et leurs sorties sont préservés. Ces levées sont acquises et non conditionnelles.

@myia-ai-01
myia-ai-01 merged commit 3893551 into main Sep 10, 2026
71 of 75 checks passed
jsboige added a commit that referenced this pull request Sep 10, 2026
… absorbe Cas D)

Voie (b) retenue après comparaison firsthand :
- #15101 a absorbé la structure pédagogique Cas D (`voisins_apres_extension`,
  `entrainer_exo` sur main restent comme stubs d'exercice).
- Le résidu non déterministe cellule 8 (`paires = list(paires)`) reste réel sur
  main — c'est le seul défaut source.

Geste :
1. Rebase origin/main (0 conflit, branche à lane unique) — absorbe
   #15413, #15355, #15439, #15367, #15451, #15075, #15450, #15417,
   #15283, #15378, #15360, #15432.
2. Restauration du notebook depuis origin/main (cellules Cas D byte-identiques
   avec `voisins_apres_extension` / `entrainer_exo` tels que sur main).
3. Application du seul delta source : `paires = list(paires)` →
   `paires = sorted(paires)` (cellule 8). Pas de cellule `def experience()`
   ajoutée (le scope #15101 l'absorbe).
4. Run All Papermill complet sur le kernel python3 (Python 3.13) — 13/13
   cellules code exécutées, 0 erreur, 0 machine path, 0 output-failure
   ratchet.

Preuves H.4 :
- perte époque 1 = 2.824 → époque finale = 2.25 (cohérent c.410)
- voisins APRÈS tarte `(carotte, chocolat, confiture, fraises, fromage)`
  (reproductibilité bit-à-bit post-rebase confirmée)
- voisins APRÈS ordinateur `(calcul, billet, mémoire, orage, logiciel)`
- cos(tarte_pommes, tarte_fraises) = 0.695 (transformer contextuel)

Périmètre strict : 1 fichier, +38/-60 (le solde vient de la sérialisation JSON
des outputs Papermill + le patch cellule 8). delta source = 1 ligne.

Tells NEW :
- `import re` LOCAL en 1ère ligne corps de fonction autonome (c.408).
- `list(set(paires))` n'est pas la seule source de non-déterm ; sur main,
  cellule 8 porte `paires = list(paires)` sur un `set` puis itère en
  sortie — `sorted(paires)` est l'ordre lex stable (c.410).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 10, 2026
…autoporteurs (G06 cas D) (#15415)

* fix(audit,G06,cas-D,#15041,#15035): experience autonome par appel explicite

- Ajoute fonction experience(D,K,mots_cuisine) encapsulant corpus+paires+entrainement
- Exercice 1 : stub nouveaux_mots + appel experience(mots_cuisine=...)
- Exercice 2 : stub D_exo/K_exo + appel experience(D=...,K=...)
- Conserve cellules originales (corpus, entrainement, voisins)
- Cellules inoffensives (pas de raise, pas d'execution auto)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>

* fix(audit,G06,cas-D,#15041,#15035): relay -- enonces restaures, stubs dedupliques

Run Vibe 18:39Z : experience(D,K,mots_cuisine) parametree + stubs
autoportores livres propres, MAIS les enonces markdown des exercices
1/2 avaient ete remplaces par les nouvelles cellules code (perte du
texte pedagogique et du header ## 8. Exercices) et les vieux stubs
(voisins_apres_extension, entrainer_exo) restaient en place ->
duplication : deux cellules "Exercice 1" contradictoires.

Relay po-2025 :
- enonces 1/2 restaures depuis la base ba99b72, ancres adaptees
  (voisins_apres_extension -> experience(mots_cuisine=...),
  entrainer_exo -> experience(D=..., K=...))
- vieux stubs supprimes : logique integralement couverte par
  experience() parametree
- coquille run ("mots_cuisine additions") corrigee
- revalide : prefixe/suffixe byte-identiques a la base, compile()
  par cellule, newlines reels, C.1 inoffensif

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

* Fix: H.3/C.2 #15415 -- re-execution locale Papermill des 3 cellules code

3 cellules code (24, 26, 28) portaient execution_count=null :
- cell 24 : def experience(D=50, K=5, mots_cuisine=None)
- cell 26 : Exercice 1 stub (appels commentes)
- cell 28 : Exercice 2 stub (D_exo, K_exo + appels commentes)

Toutes C.1 conformes (inoffensives a l'execution).
Re-exec Papermill python3 (kernel python3, 90s, 14/14 SUCCESS, 0 erreur,
0 machine_path, max exec_count=14).

Substance byte-identique : 0 diff markdown, 0 diff code vs base.
Le +549/-297 du diff GitHub = reformat nbformat indent=1 + outputs serialises.

Ref: #15415 (Vibe G06 cas D #15041 #15035)

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#15415): import re LOCAL dans experience() + sorted(paires)

REPAIR post-CHANGES_REQUESTED ai-01 (verbatim DM msg-20260910T165620-lh8g68) :

1. def experience() porte maintenant `import re` LOCAL en première ligne
   du corps (avant `import math` / `import numpy as np`), levant le défaut
   « tokeniser() appelle re.findall(...) sans import re dans le corps ».

2. paires = list(paires) -> paires = sorted(paires) : ordre SGD désormais
   déterministe (les seeds RandomState(42/1) ne suffisaient pas à garantir
   la reproductibilité car list(set(...)) itérait dans un ordre hash
   dépendant de l'environnement). sorted() rend l'ordre lexicographique
   sur les tuples (phrase[i], phrase[j]).

3. Re-exécution complète 14/14 cellules Papermill 46.7 s, 0 erreur,
   0 machine path, 0 output-failure ratchet. Outputs réels rechargés.

Périmètre strict 1 fichier (Tell c.547), catalogue intact (Tell c.1502).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#15415): etendre sorted(paires) a cellule 8 + re-exec Papermill

REPAIR c.410 — extension du fix c.408 (qui n'avait touché que cellule 23) :

1. Cellule 8 patchée : paires = list(paires) -> paires = sorted(paires).
   Le fix c.408 sur cellule 23 (experience()) etait incomplet : la cellule 8
   (section 4 du notebook, qui produit perte et voisins des sections 3-5)
   portait encore list(paires), source de non-reproductibilite inter-runs
   non détectée au c.408.

2. Re-exécution Papermill end-to-end (kernel python3, 14/14 cellules, 0
   erreur, ~33 s), 2 runs successifs : reproductibilité BIT-À-BIT vérifiée
   sur l'ensemble des outputs (perte, voisins, cosinus transformer).

3. Rechargement des outputs réels dans le notebook source.

4. Conversion CRLF -> LF (1716 occurrences, Tell c.423 pre-commit CRLF
   rollback silencieux) — vérifié raw.count(b'\r\n') == 0.

Correction de claim c.408 : le body affirmait "identique bit-à-bit au pre-fix",
ce qui était factuellement incorrect — sorted() change la trajectoire SGD
(perte initiale 3.119 -> 2.824, voisins changent). Le claim correct et
démontrable est "reproductibilité bit-à-bit entre runs successifs post-fix",
vérifiée par 2 Papermill end-to-end.

Périmètre strict 1 fichier (Tell c.547), catalogue intact (Tell c.1502).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#15415): sorted(paires) cellule 8 — voie (b) ai-01 (#15101 absorbe Cas D)

Voie (b) retenue après comparaison firsthand :
- #15101 a absorbé la structure pédagogique Cas D (`voisins_apres_extension`,
  `entrainer_exo` sur main restent comme stubs d'exercice).
- Le résidu non déterministe cellule 8 (`paires = list(paires)`) reste réel sur
  main — c'est le seul défaut source.

Geste :
1. Rebase origin/main (0 conflit, branche à lane unique) — absorbe
   #15413, #15355, #15439, #15367, #15451, #15075, #15450, #15417,
   #15283, #15378, #15360, #15432.
2. Restauration du notebook depuis origin/main (cellules Cas D byte-identiques
   avec `voisins_apres_extension` / `entrainer_exo` tels que sur main).
3. Application du seul delta source : `paires = list(paires)` →
   `paires = sorted(paires)` (cellule 8). Pas de cellule `def experience()`
   ajoutée (le scope #15101 l'absorbe).
4. Run All Papermill complet sur le kernel python3 (Python 3.13) — 13/13
   cellules code exécutées, 0 erreur, 0 machine path, 0 output-failure
   ratchet.

Preuves H.4 :
- perte époque 1 = 2.824 → époque finale = 2.25 (cohérent c.410)
- voisins APRÈS tarte `(carotte, chocolat, confiture, fraises, fromage)`
  (reproductibilité bit-à-bit post-rebase confirmée)
- voisins APRÈS ordinateur `(calcul, billet, mémoire, orage, logiciel)`
- cos(tarte_pommes, tarte_fraises) = 0.695 (transformer contextuel)

Périmètre strict : 1 fichier, +38/-60 (le solde vient de la sérialisation JSON
des outputs Papermill + le patch cellule 8). delta source = 1 ligne.

Tells NEW :
- `import re` LOCAL en 1ère ligne corps de fonction autonome (c.408).
- `list(set(paires))` n'est pas la seule source de non-déterm ; sur main,
  cellule 8 porte `paires = list(paires)` sur un `set` puis itère en
  sortie — `sorted(paires)` est l'ordre lex stable (c.410).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#15415): strip stale metadata.papermill block (Papermill ratchet)

Le ratchet `check_papermill_ratchet.py` a échoué en CI sur le head
7018117 (run 34519773585 step 4 Ratchet check FAILURE) avec le
message exact :

> outputs/execution_count changed but the metadata.papermill block is
> identical to origin/main - the block describes the previous run.

Le bloc metadata.papermill pointait `start_time: 2026-09-08T15:27:32.959292`
(durée 101s) — un run antérieur à c.413, NON réécrit par l'exécution
c.413 (Tell c.402 L1 ★★★ sustained : Papermill via subprocess Windows
peut ajouter metadata.jupyter.source_hidden=true sans réécrire
correctement metadata.papermill si l'exécuteur n'est pas Papermill CLI).

Solution appliquée (explicitement autorisée par check_papermill_ratchet.py
: "block absent at head (removed - explicitly allowed)") : strip du bloc
`metadata.papermill` au niveau nb + 30 cellules.

Périmètre strict : -225/+1 lignes, **uniquement** des blocs metadata.papermill
supprimés. Aucune modification du source code :
- cellule 2 : `import re` module-level (c.408 résolu) ✓
- cellule 8 : `paires = sorted(paires)` (voie (b) ai-01) ✓
- cellules 24/26 (voisins_apres_extension, entrainer_exo) : byte-identiques
  à origin/main (Cas D #15101 préservé) ✓

Validation locale :
- check_papermill_ratchet.py origin/main → BLOCK_REMOVED, 0 régression ✓
- check_output_failure_text.py origin/main → 0 TOOL_FAILURE, 0 MACHINE_PATH ✓
- validate_pr_notebooks.py → PASS ✓
- 13/13 cellules code `execution_count != None` ✓

Reproductibilité bit-à-bit : la démo H.4 c.410 reste valide (deux Papermill
end-to-end successifs, perte 2.824→2.25, voisins tarte identiques). Le
strip metadata ne touche aucun output, donc les preuves H.4 sont préservées
telles quelles.

Voir : c.410 (REPAIR), c.411 (LIVRAISON RECENTE chevauchement #15101),
c.412 (escalade ai-01 voie (b)), DM `msg-20260910T184936-s7q6i5`.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Mistral Vibe <vibe@mistral.ai>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SK-07 MultiModal : la prose TTS annonce 117,600 bytes, valeur qu'aucune cellule n'imprime (93312 en base, 94464 apres re-exec)

3 participants