Skip to content

fix(notebooks,#17498): tranche SymbolicAI -- 18 defauts de rendu mathematique corriges (18 -> 0) - #17745

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

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

Conversation

@jsboige

@jsboige jsboige commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

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

Tranche SymbolicAI de #17498 : 18 defauts de rendu mathematique mesures, corriges a 0

Tranche de la famille SymbolicAI du rollout #17498 (organe scripts/notebook_tools/check_math_render.py, 4 classes de defauts). 10 notebooks, cellules markdown uniquement. Le [CLAIMED] de la tranche est sur l'issue (commentaire listant les 10 chemins et la ventilation par classe).

Mesure avant -> apres

Avant Apres
Occurrences (302 notebooks SymbolicAI balayes) 18 dans 10 notebooks 0 dans 0 notebook
ODD-DOLLARS 11 0
KATEX-UNRENDERABLE 4 0
NUDE-LATEX 2 0
LATEX-PURE-DELIMS 1 0
Jambe KaTeX on on

La jambe KaTeX etait aveugle : reparer l'environnement, pas le contourner

Sur cette machine node est present mais katex n'etait pas resolvable : katex_available() renvoyait faux et l'organe sautait la classe KATEX-UNRENDERABLE — le compteur local etait structurellement incapable de voir 4 des 18 defauts. Conformement a la regle F, l'environnement est repare (installation locale hors du depot + NODE_PATH), pas contourne : c'est ce qui rend la mesure d'arrivee 0 credible dans cette classe.

Un premier sondage « toutes candidates OK » etait un faux vert d'instrument : les echappements JS avaient transforme \Longmapsto en ASCII avant l'appel a KaTeX. Sonde ecrite en fichier (katex_probe.js) : \Longmapsto ECHEC, \longmapsto OK ; \{0,1\\} ECHEC, \{0,1\} OK ; fragment s(f) \l ECHEC.

Trois natures de correctif, trois preuves differentes

  • ODD-DOLLARS (11) — devise post-fixee echappee dans les cellules markdown (625M$ -> 625M\$, pour 200 $ par mois -> \$, Reel ($$$) -> (\$\$\$)). C'est la remediation prescrite par l'issue.
  • KATEX-UNRENDERABLE (4) — vraie correction LaTeX, verifiee par le rendu reel et pas par ressemblance : \Longmapsto -> \longmapsto (macro rejetee par KaTeX) dans Argument_Analysis_Dated_Graphs, \{0,1\\} -> \{0,1\} (x2 cellules) dans Lean-12b.
  • LATEX-PURE-DELIMS (1) — \[...\] -> $$...$$, que Jupyter/GitHub/VS Code rendent (Argument_Analysis_Recollement_Strate6).

Defaut de CONTENU signale, pas invente

Lean/Lean-12b cell#7 portait une phrase tronquee en pleine macro : ... la borne optimale $s(f) \l, suivie d'une ligne non separee — l'emphase etait donc avalee par un scope mathematique jamais ferme. Aucun sibling ne porte la phrase intacte (recherche de la phrase sur tout le depot : une seule occurrence, la tronquee). Le fragment est retire et la separation de paragraphes retablie, sans fabriquer la formule manquante : la restauration du contenu revient a l'auteur du notebook (signale au proprietaire, pas resolu par moi).

Normalisation par le hook du depot, declaree

Deux --- ouvreurs de cellule de OR-tools-Stiegler.ipynb ont ete convertis en *** par le hook pre-commit du depot (fix-hr-separator, yaml_block_open_no_close), sur un fichier deja dans le perimetre de la tranche. Cellules markdown ; la mesure post-hook de ce fichier reste a 0 occurrence.

Ce qui garantit que rien d'autre n'a bouge

Controle Resultat
Cellules de code byte-identiques oui — asserte par le correcteur (source de chaque cellule code comparee avant/apres)
Grep des cles de cellule dans le diff (execution_count, outputs, cell_type, metadata) 0 ligne ajoutee
Fidelite du round-trip nbformat, fichier par fichier, avant ecriture 10/10 identiques — trois notebooks n'ont pas de saut de ligne final, la serialisation le preserve
Meme controle apres le passage du hook 10/10 identiques
Re-execution non requise : modification markdown seule (exception C.2) ; execution_count/outputs intacts
Hooks pre-commit verts (gitleaks, H.3, #13326, markdown-rendering)

Perimetre

10 fichiers, +22 / -21 :

Argument_Analysis/Argument_Analysis_Dated_Graphs.ipynb
Argument_Analysis/Argument_Analysis_Recollement_Strate6.ipynb
Lean/Lean-12b-Lean-Sensitivity-Theorem.ipynb
Lean/Lean-16a-Conway-Man-and-Work.ipynb
Lean/Lean-21-MIMO-Detection-Flips.ipynb
Lean/Lean-31-Euler-Navier-Stokes.ipynb
OR-tools-Stiegler.ipynb
SmartContracts/06-Real-World/SC-23-Cross-Chain.ipynb
SmartContracts/06-Real-World/SC-24-Testnet-Deploy.ipynb
SymbolicLearning/SL-9-LLM-SymbolicLearning.ipynb

Aucun catalogue, aucun script, aucune dependance. Le catalogue est byte-identique a main.

See #17498 — tranche partielle : restent GenAI (13), GameTheory (5), residuel (3).

Adjudication du rouge Split-reading ratchet (dispatch ai-01) : enonce d'exercice preexistant revu en place, classe a tort comme lecture ajoutee

La cellule 31 de OR-tools-Stiegler.ipynb est l'enonce preexistant de l'Exercice 3 (meme index en base et en tete, 38 cellules des deux cotes, aucun id des deux cotes) : cette PR ne fait que le reviser en place (39,66 $/an -> 39,66 \$/an, remediation ODD-DOLLARS de #17498) — et le cliquet compte cette revision comme un ajout parce qu'une cellule markdown sans id dont la source change echoue les trois discriminants REWRITE de #17044 ((a) source identique, (b) id en base, (c) is_reading_cell des deux cotes : le titre ### Exercice 3 n'est pas une lecture). Defaut du detecteur enregistre en #17747 (rayon mesure : 229/1409 carnets portent du markdown sans id). Sortie de l'organe (python scripts/notebook_tools/check_split_reading_cells.py --base-ref origin/main --head HEAD --json) :

OR-tools-Stiegler.ipynb  base_total=0 head_total=0 delta=0 regressed=True
  added: {"type": "READING_BEFORE_CODE", "cells": [31],
          "src_first_120": "### Exercice 3 : Analyse de sensibilite du regime optimal |  | La solution optimale indique 5 aliments pour un cout de 39,66",
          "prev_role": "code_with_output", "next_role": "exercise"}

base_total=0 et head_total=0 : meme le detecteur head-wide ne compte aucune lecture sur ce carnet — aucun ajout reel. Le rouge ne se force pas (aucune porte body sur cet organe) ; il se leve par le correctif #17747.

🤖 Generated with Claude Code

…ematique corriges (18 -> 0)

Tranche SymbolicAI du rollout #17498 (organe scripts/notebook_tools/check_math_render.py),
10 notebooks, cellules MARKDOWN uniquement.

La jambe KaTeX de l'organe etait SAUTEE sur cette machine (node present, katex non
resolvable) : installe localement hors du depot et exposee par NODE_PATH -- regle F,
reparer l'environnement, pas le contourner. La classe empirique (KATEX-UNRENDERABLE)
devient donc mesurable : 4 des 18 defauts n'etaient visibles que par elle.

Mesure avant -> apres (302 notebooks SymbolicAI balayes, jambe KaTeX ON) :
  occurrences 18 -> 0 ; ODD-DOLLARS 11, KATEX-UNRENDERABLE 4, NUDE-LATEX 2,
  LATEX-PURE-DELIMS 1 -> 0.

Trois natures de correctif, distinguees parce qu'elles n'ont pas la meme preuve :
- ODD-DOLLARS (11) : devise post-fixee echappee (`625M$` -> `625M\$`), dans les
  cellules markdown -- c'est la remediation prescrite par l'issue ;
- KATEX-UNRENDERABLE (4) : vraie correction LaTeX, verifiee par le rendu reel
  (`\Longmapsto` -> `\longmapsto`, macro rejetee par KaTeX ; `\{0,1\}` -> `\{0,1\}`) ;
- LATEX-PURE-DELIMS (1) : `\[...\]` -> `$$...$$`, que Jupyter/GitHub/VS Code rendent.

Defaut de CONTENU signale, pas invente : Lean-12b cell#7 portait une phrase tronquee
en pleine macro (`... la borne optimale $s(f) \l`) suivie d'une ligne non separee,
donc l'emphase etait avalee par un scope mathematique jamais ferme. Aucun sibling ne
porte la phrase intacte (grep `Huang prouve` : une seule occurrence, la tronquee) :
le fragment est retire et la separation de paragraphes retablie, sans fabriquer la
formule manquante. A restaurer par l'auteur du contenu.

Deux `---` ouvreurs de cellule de OR-tools-Stiegler.ipynb ont ete normalises en `***`
par le hook pre-commit du depot (fix-hr-separator, yaml_block_open_no_close), sur un
fichier deja dans le perimetre. Cellules markdown, verifie apres coup.

Cellules de code byte-identiques (asserte par le correcteur), `execution_count` et
`outputs` intacts : modification markdown seule, la re-execution n'est pas requise
(exception C.2). Fidelite du round-trip nbformat verifiee fichier par fichier AVANT
ecriture -- trois notebooks n'avaient pas de saut de ligne final, la serialisation
le preserve ; reverifiee APRES le passage du hook (10/10 identiques).

Perimetre : 10 fichiers, +22 / -21.

See #17498

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@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

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

Notebook PR Validation: PASS

  • Notebooks checked: 10
  • Code cells validated: 150
  • 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 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.4s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.7s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 11.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.8s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.7s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.5s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 21.4s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.5s

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

@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 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 outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@jsboige

jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner Author

Les 4 rouges de cette PR ont une seule cause : un faux positif du cliquet split-reading, corrigé par #17749 (Closes #17747). Aucun n'est un défaut de contenu de la tranche.

Mesure : les 35 gardes de la fast lane passent sauf Split-reading ratchet (base vs PR), et ce seul organe bloqueur entraîne Always-on guards, PR gate et Golden-set execution (l'agrégat propage). La fast lane le dit noir sur blanc : [fast-lane] 35 garde(s) evalue(s), au moins un bloquant en echec.

Le finding, et pourquoi il est faux : OR-tools-Stiegler.ipynb, 38 cellules des deux côtés, 4 sources modifiées, aucune cellule ajoutée — le cliquet compte la cellule 31 comme un ajout parce qu'elle n'a pas d'id et que son titre (### Exercice 3 : …) n'en fait pas une « lecture » au sens de is_reading_cell. Or elle n'a changé que par l'échappement prescrit par #17498 : 39,66 $/an → 39,66 \$/an. Les trois signaux is_rewrite (#17044) manquaient donc tous — source modifiée, pas d'id, pas deux lectures.

Ce que ça aurait signifié de « réparer » côté notebook : retirer cet échappement rendrait le cliquet vert en laissant un défaut de rendu réel (c'est-à-dire gaming du détecteur), ou ajouter un id de cellule pour satisfaire un garde — hors sujet de la tranche. Le défaut est dans le détecteur, pas dans le notebook, et il frappe 229 carnets sur 1409 (1978 cellules markdown sans id).

Suite : #17749 corrige le signal topologique (markdown/markdown au même index), avec falsification mesurée (1 failed → 90 passed) et un contrôle négatif qui garde l'empilement réel rouge. Après son merge, je reprends main dans cette branche — le garde de cette PR redeviendra vert (aucun re-push sans raison, le DWELL de cette tête n'est pas ré-armé par une édition de body).

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17745 (fix(notebooks,#17498): tranche SymbolicAI -- 18 defauts de rendu mathematique corriges (18 -> 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.

myia-ai-01 pushed a commit that referenced this pull request Sep 25, 2026
…plus comptee comme un ajout (#17749)

Le garde BLOQUANT `Split-reading ratchet (base vs PR)` rougissait une PR qui
n'ajoute aucune cellule : sur un carnet SANS id, la revision en place d'une
cellule markdown non classee lecture etait comptee comme un ajout, et le bucket
READING_BEFORE_CODE la signalait -- soit exactement le geste que le mandat user
PRESCRIT (« si on rajoute une lecture, on modifie le paragraphe de lecture
existant »), et que l'organe documente lui-meme comme a ne pas signaler.

Mesure fondatrice (PR #17745, tranche SymbolicAI de #17498) : OR-tools-Stiegler,
38 cellules des deux cotes, 4 sources modifiees, AUCUNE ajoutee -- l'echappement
de la devise (`39,66 $/an` -> `39,66 \$/an`, correctif de rendu prescrit) a
suffi. Les trois signaux REWRITE manquaient : source modifiee (a), cellule sans
id (b), titre « ### Exercice 3 » donc is_reading_cell faux (c).

Correctif : le signal topologique (c) passe de « les deux sont des lectures » a
« les deux sont MARKDOWN au meme index ». Il ne depend plus de la classification
lecture/exercice, et il reste EXACT (aucun seuil de similarite) : un empilement
reel arrive toujours a un index ou la base portait autre chose (ou rien).

Falsification mesuree (organe de main restaure puis remis par cp) :
- AVANT : 1 failed / 89 passed / 1 xfailed -- echec du seul test ajoute ;
- APRES : 90 passed / 1 xfailed ;
- fast lane : 76 passed.

Controles de non-regression : l'empilement reel reste rouge (nouveau controle
negatif : la lecture empilee tombe au slot ou la base portait du code), et
`test_cliquet_mord_si_la_lecture_arrive_APRES` (#17044) est inchange.

Exposition mesuree : 229 carnets sur 1409 portent au moins une cellule markdown
sans id (1978 cellules) -- toute PR qui en reecrit une en place est exposee.

Perimetre : 2 fichiers (organe + tests). Closes #17747.

Co-authored-by: Claude Sonnet 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.

[NanoClaw]

VERDICT: LGTM (vérifié: extraction intégrale des 10 notebooks base↔head — code byte-identique par hash, 22 lignes du diff lues une à une, greps head, check-runs 84 success/0 failure)

Review structurelle du head 14668c17 (base 173dfdd3) — protocole v2 : extraction intégrale des 10 notebooks aux deux refs (sources markdown entières, sorties réduites en empreintes type/mime/sha, aucun JSON brut lu). Review statique (pas de python3 ni KaTeX au siège) ; la jambe KaTeX de l'organe est couverte côté CI (§5).

Vérifié firsthand

  1. Markdown-seul prouvé mécaniquement. Sur les 10 notebooks, les cellules code sont byte-identiques base↔head, sorties et execution_count compris (hash par output) — 16/21/8/16/13/17/12/11/12/24 code cells, 0 différence. Aucune cellule ajoutée ni supprimée (décomptes cellulaires identiques deux à deux sur les 10 fichiers) : chaque changement est une édition de ligne en place dans du markdown existant.
  2. Les 22 lignes du diff sont inventoriées une à une. 21 lignes modifiées + 1 ligne blanche ajoutée — cette dernière est la séparation de paragraphe restaurée de Lean-12b c7 (20→21 lignes, exactement le +22ᵉ ajout du décompte GitHub, invisible d'un diff ligne-à-ligne naïf). Les 21 : 14 échappements de devise $→\$ (1000 $, pour 200 $ par mois, ~15 M$ ×2, 39,93 $, 39,66 $/an, 1M$/625M$/320M$/100M$, récap 625M$×3, Reel ($$$), Price=$/Price=$$$), \Longmapsto→\longmapsto (Dated_Graphs c0), \{0,1\\}→\{0,1\} ×2 cellules (Lean-12b c18/c20), \[...\]→$$...$$ (Strate6 c40), 2 conversions ---→*** (OR-tools c15/c33, normalisation par le hook du dépôt, déclarée). Rien d'autre ne bouge.
  3. Greps head : aucun résidu. \Longmapsto : 0. \{0,1\\} : 0. \[ display : disparu de Strate6. --- hr : 0 restant dans OR-tools. (Mon premier grep du fragment tronqué matchait des \le légitimes — vérifié en lecture intégrale : $s(f) \l nu n'existe plus au head.)
  4. La délétion de contenu (Lean-12b c7) est la bonne décision, vérifiée en lecture intégrale base+head. En base, $s(f) \l ouvrait un scope math jamais fermé qui avalait le paragraphe suivant (collé sans ligne vide) — l'emphasise et le « L'arc en 4 sous-sections » étaient rendus comme math. Au head : phrase grammaticalement complète (« Huang prouve la borne optimale. »), paragraphe séparé, formule non fabriquée — et la borne manquante existe telle quelle en c0 ($s(f) \le \sqrt{n}$) : perte d'information nulle pour le lecteur, restauration triviale pour l'auteur.
  5. CI vert au head courant : 90 check-runs relevés (per_page=100), 84 success / 0 failure / 2 neutral / 4 skipped. Le rouge Split-reading ratchet adjudiqué dans le body (faux positif du détecteur sur la cellule 31 d'OR-tools, #17747, corrigé par #17749) n'est plus présent à 14668c17.
  6. Densité #17040 : sans objet — aucune lecture ajoutée ni retirée (éditions en place, décomptes cellulaires inchangés), aucun chiffre cité modifié.

Nits

  • La ventilation par classe (11 ODD / 4 KATEX / 2 NUDE / 1 LATEX-PURE) n'est pas re-dérivable statiquement depuis ce siège : mon recompte ligne à ligne donne 18 lignes de correctif rendu + le fragment c7 signalé à part (19), total cohérent — mais la 4ᵉ occurrence KATEX-UNRENDERABLE et les 2 NUDE-LATEX ne sont pas nominatives dans le body et ne se distinguent pas mécaniquement dans le diff (taxonomie interne de l'organe, probablement sur les lignes d'échappement). Sans impact sûreté : chaque ligne changée est inventoriée et rendue sûre.
  • c7 : « Huang prouve la borne optimale. » peut être complétée depuis c0 sans invention ($s(f) \le \sqrt{n}$.) — geste optionnel pour l'auteur du notebook.
  • La mesure « après = 0 » dépend de la jambe KaTeX réparée hors dépôt (installation locale + NODE_PATH) : la preuve durable est le garde markdown-rendering vert en CI, qui est bien là (§5).

Périmètre : extraction intégrale des 10 notebooks base+head (sources md entières des cellules modifiées, sorties en empreintes) ; les 22 lignes du diff lues in extenso ; greps globaux au head ; check-runs au head. Aucune re-exécution (md-only prouvé par hash sur les cellules code).

Aucune recommandation de merge — décision Emerjesse.

@jsboige

jsboige commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17745
head: 14668c1
complete: true
body: read
comments-reviewed: 8
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 948c062b11c9da7cc99fbd18e444d1a3914f8ba98ff54758d712d9fedb0be260
diff-files: 10
diff-additions: 22
diff-deletions: 21
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

Re-stamp secretaire c.140 -- tiers au titulaire (Tell c.111 strict). NO-DOSSIER -> READY. PR gate SUCCESS, B.0 rc=0 OK. Lane secretaire myia-po-2026:CoursIA-3.

@myia-ai-01
myia-ai-01 merged commit 6e94987 into main Sep 25, 2026
91 checks passed
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.

3 participants