Skip to content

fix(notebooks,#17498): tranche residuel -- 15 defauts de rendu corriges (15 -> 0) - #17755

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/17498-math-render-residuel
Sep 25, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/17498-math-render-residuel

Conversation

@jsboige

@jsboige jsboige commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebooks -- lane myia-po-2026:CoursIA -- prev: MED/notebooks #17754

Tranche « residuel » de #17498 : 15 defauts mesures, corriges a 0

Quatrieme et derniere tranche du rollout, apres SymbolicAI (#17745), GenAI (#17751) et GameTheory (#17754). Perimetre : ML / Probas / RL / Complexity / IIT, 9 carnets, jambe KaTeX ON des deux cotes.

Mesure check_math_render Avant Apres
Occurrences 15 dans 9 carnets 0
Classes KATEX-UNRENDERABLE 12, NUDE-LATEX 2, ODD-DOLLARS 1 —

1. \* -> * dans un scope math (9 defauts, 10 occurrences)

\* n'existe pas en KaTeX (« Undefined control sequence ») ; l'etoile d'un exposant s'ecrit ^*. Rencontre sur \varepsilon^\*, w^\*, a^\*, k^\*.

Le cadrage est le sujet, pas l'etoile. Hors scope, \* est un asterisque echappe legitime du markdown : un remplacement fichier-entier changerait la prose. La definition du scope est donc celle de l'organe, importee (MATH_SCOPE, BACKTICK_SPAN, FENCED_BLOCK, ESCAPED_DOLLAR) -- aucune detection reimplementee. Le masquage est reecrit en longueur egale (espaces au lieu des substitutions courtes de l'organe) pour que les positions restent celles du texte d'origine, et la substitution se fait par splice aux offsets exacts : un \* hors scope dans le meme element reste intact. Le compte est verifie par fichier (10 attendues, 10 faites -- un ecart aurait fait echouer le script).

2. Caracteres de controle : l'inverse exact du macro (4 occurrences, 2 carnets)

Meme regle que la tranche GameTheory, ou elle a ete validee sur 4 KATEX-UNRENDERABLE : \v + ert = \vert, \v + arepsilon = \varepsilon. Rien a deviner, c'est la substitution inverse de la corruption JSON.

CausalBridges-01 porte le deuxieme artefact du meme incident : un ecrivain fonde sur splitlines() (qui coupe sur la VT) avait scinde la puce en 3 elements de source, avec un LF au milieu de chaque macro. Les recoller est necessaire -- sans fusion, la substitution seule rendrait \v + LF + arepsilon, soit un accent sur une lettre sans rapport. La puce est rendue en un element, $\varepsilon_W, \varepsilon_Y$.

3. Les 4 autres defauts

  • Devise non echappee (ML-1, ODD-DOLLARS) : une transaction à 1 800 $ ouvrait un scope que rien ne fermait. Deux autres $ de devise dans un autre paragraphe de la meme cellule sont corriges au passage : ceux-la s'apparient (nombre pair = aucun orphelin) et formaient un faux scope de prose en italique -- invisible a la detection d'orphelins de l'organe. Meme classe, meme remede que touche 2 $ de la tranche GameTheory.
  • Indice _ dans un \text{} (CausalBridges-08) : KaTeX refuse un indice en mode texte (« Expected 'EOF', got '_' »). Mesure sur les deux modes d'affichage : \text{... comme si x_0 »)} echoue, \text{... comme si } x_0 \text{ »)} passe.
  • Formule nue (Infer-2, NUDE-LATEX x2) : BIC_K = -2 \ln(\hat{L}_K) + p_K \ln(n) sans delimiteurs. Encadree en $$...$$.

Deux reconstructions DECLAREES (a confirmer par le proprietaire)

  1. Le marqueur 865. La formule d'Infer-2 etait entouree de 865 : 865BIC_K = ... \ln(n)865. Balayage du corpus entier (11 608 carnets, elements de source commencant par 3 chiffres colles a une lettre) : une seule occurrence, celle-ci. C'est un artefact d'ecriture, pas du contenu -- la formule elle-meme est intacte, seuls les delimiteurs manquaient. Retire.
  2. Les deux symboles d'Infer-2. La phrase qui suit a perdu le contenu de ses deux scopes : ou $\hat{L}_K$ est la vraisemblance maximisee, $ le nombre de paramètres du modèle a K composantes, et $ le nombre de données. Les deux symboles manquants sont ceux de la formule ci-dessus, dans l'ordre de la phrase (p_K, puis n). Fournis par moi : $p_K$ et $n$. La reconstruction est fondee (la formule est a deux lignes au-dessus) mais elle reste une reconstruction.

Portee

git diff --stat (trois points vs origin/main) : 13 fichiers, 35 insertions / 23 suppressions -- 9 carnets de contenu edite (les 15 lignes corrigees, plus le net -2 de la fusion de la puce 3 elements -> 1, plus 12 lignes de metadata.papermill), plus 4 fichiers du registre twin (section suivante).

Verification structurelle des 9 carnets contre origin/main : nombre de cellules identique, cell_type identique, sources des cellules de code byte-identiques, outputs et execution_count intacts. Seules des sources markdown (12 cellules) et 6 chemins de metadata different. Edition markdown-only : aucune re-execution requise (C.2).

Normalisation annexe DECLAREE : le hook scrub-papermill-paths a ramene au basename 6 chemins absolus deja presents dans metadata.papermill de 3 carnets (worktrees d'autres lanes : CoursIA-complexity03, CoursIA-16795-qc, CoursIA-16795). Normalisation sanctionnee de metadata -- aucune sortie de cellule editee. A noter : l'un de ces chemins designait encore Complexity-03 dans un carnet renomme Complexity-05.

Twin parity : 2 paires mises en DRIFT, rebaselinees dans cette PR

Le gate Twin parity audit (#8057) a nomme exactement 2 paires (base=OK head=DRIFT) : ML-1 Introduction (cote Python edite) et Probas-2 Gaussian-Mixtures (cote C# edite, Infer-2). Le registre stocke le blob SHA de chaque jumeau, donc toute edition le deplace, y compris markdown-only : rebaseliner atteste la parite, il ne la repare pas -- et il va en dernier, apres tout strip outile (le hook scrub-papermill-paths avait deja tourne au commit precedent, #8957).

Re-audit firsthand avant d'attester, les deux paires etant sur des moteurs distincts (parity_level: native-both) : le jumeau C# de ML-1 (ML-1-Introduction.ipynb) et le jumeau Python de Probas-2 (PyMC-02-Gaussian-Mixtures.ipynb) mesurent 0 defaut de check_math_render (jambe KaTeX ON), et le second ne porte aucun bloc BIC. La correction est donc unilaterale a juste titre : une entree known_differences en tete de chaque paire la documente (date, lane, raison, etat mesure du jumeau). Controle de parse du registre apres edition manuelle des YAML : 1630 fichiers lus, 0 casse.

Cliquets (avec l'organe de main)

split-reading : 8 carnets, 0 en regression (0 -> 0 paires partout)
papermill     : regressions 0  (7 OUTPUTS_UNCHANGED, 1 BLOCK_REMOVED -- ML-1 n'a pas de bloc)

Complement, meme classe vue par l'autre organe (advisory, check_latex_control_chars). Mesure sur le perimetre des 9 carnets : 2 occurrences / 1 carnet -> 0 (le VT -> \vert de Complexity-05, x2).

Sur le corpus entier, cette branche en laisse 5 occurrences / 3 carnets, toutes hors perimetre : 2 faux positifs LF -> \nu (GameTheory-02c) documentes dans #17754 -- laisses en place, les « corriger » falsifierait deux formules correctes -- et 3 BS -> \bar deja corriges par #17754 (2) et #17751 (1), non encore mergees.

A noter, la difference de perimetre entre les deux organes, mesuree ici : les 2 VT de CausalBridges-01 sont invisibles pour l'organe advisory (son discriminant « un scope inline ne franchit pas un saut de ligne brut » -- or c'est exactement la forme de la corruption, $\x0b\narepsilon), et c'est la jambe KaTeX de check_math_render qui les voit. Deux organes, deux perimetres, meme famille de defaut.

Reste du rollout #17498

Search (tranche 2, lane po-2023) et QC. Ces deux-la n'appartiennent pas a cette lane.

See #17498

🤖 Generated with Claude Code

…es (15 -> 0)

Quatrieme et derniere tranche du rollout #17498 (apres SymbolicAI, GenAI,
GameTheory). Perimetre : ML / Probas / RL / Complexity / IIT, 9 carnets.
Mesure check_math_render, jambe KaTeX ON des deux cotes : 15 -> 0.

Trois mecanismes, tous en cellule markdown uniquement :

1. `\*` -> `*` DANS UN SCOPE MATH (9 defauts, 10 occurrences). `\*` n'existe
   pas en KaTeX ; l'etoile d'exposant s'ecrit `^*`. Le cadrage est
   indispensable : hors scope, `\*` est un asterisque echappe legitime du
   markdown. La definition du scope est celle de l'organe, importee
   (`MATH_SCOPE`, `BACKTICK_SPAN`, `FENCED_BLOCK`, `ESCAPED_DOLLAR`) ; aucune
   detection reimplementee.

2. Caracteres de controle = inverse exact du macro (4 occurrences, 2 carnets).
   `\v` + `ert` = `\vert` (Complexity-05) ; `\v` + `arepsilon` =
   `\varepsilon` (CausalBridges-01, dont la puce scindee en 3 elements par un
   ecrivain fonde sur `splitlines()` est rejointee -- meme regle que la tranche
   GameTheory).

3. Editions litterales declarees (7) : devises non echappees (3, ML-1),
   formule nue + marqueur d'outil `865` isole dans tout le corpus
   (Infer-2), indice `_` dans un `\text{}` refuse par KaTeX
   (CausalBridges-08).

Deux reconstructions declarees dans le body de PR : le marqueur `865`
(artefact d'ecriture, balayage corpus) et les deux symboles `p_K` / `n`
manquants d'Infer-2, fournis par nous.

Normalisation annexe DECLAREE : le hook `scrub-papermill-paths` a ramene au
basename 6 chemins ABSOLUS deja presents dans `metadata.papermill` de 3
carnets (worktrees d'autres lanes : CoursIA-complexity03, CoursIA-16795-qc,
CoursIA-16795). Normalisation sanctionnee de METADATA : aucune sortie de
cellule editee, aucune re-execution requise. A noter, l'un des chemins
designait encore `Complexity-03` dans un carnet renomme `Complexity-05`.

Verification : 0 occurrence restante (KaTeX ON) ; structure identique a
origin/main sur les 9 carnets (nombre de cellules, cell_type, sources de code
byte-identiques, outputs/execution_count intacts) ; seules des sources
markdown et ces 6 chemins de metadata different ; cliquets split-reading et
papermill verts avec l'organe de main.

See #17498

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@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 github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Sep 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 9
  • Code cells validated: 145
  • 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

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 added the variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 label Sep 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

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.

@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Sep 25, 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 7.3s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 7.4s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 7.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 8.7s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.4s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 44.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 5.5s

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

…che residuel

Le gate `Twin parity audit (#8057)` a nomme exactement deux paires, et le
registre stocke le blob SHA de CHAQUE jumeau : toute edition le deplace, y
compris markdown-only. Le rebaseline ATTESTE la parite, il ne la repare pas --
et il va en DERNIER, apres tout strip outile (le hook scrub-papermill-paths a
deja tourne au commit precedent, #8957).

Re-audit firsthand avant d'attester (les deux jumeaux sont sur un moteur
DISTINCT, `parity_level: native-both`) :

- **ML-1 Introduction** (cote Python edite : 3 devises non echappees). Le
  jumeau C# `ML-1-Introduction.ipynb` mesure **0 defaut** de
  `check_math_render`, jambe KaTeX ON.
- **Probas-2 Gaussian-Mixtures** (cote C# edite : formule nue, marqueur `865`,
  deux symboles reconstruits). Le jumeau Python
  `PyMC-02-Gaussian-Mixtures.ipynb` mesure **0 defaut** et ne porte aucun bloc
  BIC.

Correction unilaterale a juste titre dans les deux cas : une entree
`known_differences` en tete de chaque paire la documente (date, lane, raison,
et l'etat mesure du jumeau).

Controle de parse du registre apres edition manuelle des YAML : 1630 fichiers
lus, **0 casse**, les deux nouvelles entrees en tete.

See #17755, See #8057

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

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17755 (fix(notebooks,#17498): tranche residuel -- 15 defauts de rendu corriges (15 -> 0)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@jsboige

jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17755
head: 437df82
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7c3dbb7a637c6ae63910769e4c7f91e6779ac6c9a5a9a531c9a1fb3e5e377d9b
diff-files: 13
diff-additions: 35
diff-deletions: 23
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 9882979 into main Sep 25, 2026
95 of 116 checks passed
myia-ai-01 pushed a commit that referenced this pull request Sep 25, 2026
…es -- renumerotation en 0017 (#17858)

Deux PRs mergees le 2026-09-25 ont ecrit le meme index 0016 dans la meme paire
du registre jumelle : #17808 (lane myia-po-2024:CoursIA, mergee 17:37:44+02:00)
et #17755 (lane myia-po-2026:CoursIA, mergee 22:19:02+02:00). Chacune a calcule
`max(index) + 1` = 0016 sur une base qui ne voyait pas l'autre -- mesure par le
contenu : chacune atteste un seul cote courant, l'autre perime, depuis une base
commune anterieure aux deux.

`test_audit_index_unique_and_no_identical_duplicates_per_pair` rougit depuis sur
main (run Scripts Tests (CPU) sur 9882979 = failure, precedent = success), ce
qui rougit le job sur toute PR ouverte descendant de ce main.

L'entree entree dans main en second prend l'index suivant, 0017 : l'index est la
cle de tri du journal, et l'ordre chronologique observable est l'ordre d'entree
dans main. Les deux attestations sont conservees -- elles ne sont pas
byte-identiques (SHA de contenu et motifs distincts), donc aucune ne se deduit
de l'autre.

Renumerotation pure : aucun octet de contenu modifie, aucun SHA reecrit, aucun
`--update` passe. Verification : test_twin_registry_integrity.py 1 failed -> 46
passed ; collisions d'index sur le registre entier 1 -> 0.

Co-authored-by: Claude Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants