Skip to content

fix(sudoku,#17654): DisplayResults rend un SVG inline - #17671

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/17654-d3-displayresults-svg
Sep 25, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/17654-d3-displayresults-svg

Conversation

@jsboige

@jsboige jsboige commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-dotnet — lane myia-po-2024:CoursIA — prev: DEEP/notebook-python #17660

Scope

D3 de l'acceptance #17654. Le helper SudokuHelper.DisplayResults — cellule cac5cfab de Sudoku-00-Environment-Csharp, partagee par #!import dans toute la serie — terminait chaque graphique par chart.Show(). Avec Plotly.NET, Show() ouvre un navigateur, ou echoue faute d'affichage : dans les deux cas il ne produit aucune sortie de cellule.

Consequence mesuree sur main : les appelants qui passent par ce helper ne portaient aucun graphique. Sudoku-07 cellule 8mqqjtqpda5 n'avait, pour tout resultat, que le flux texte Graphique de comparaison des solveurs affiche.

Correction

Le helper est branche sur l'organe SVG inline que la serie possede deja — SvgChartHelper (MyIA.AI.Notebooks/Probas/Infer/SvgChartHelper.cs, EPIC #6927) — plutot que sur une reparation locale ou sur le remede Plotly propose par l'issue.

  • cellule cac5cfab : #load "../Probas/Infer/SvgChartHelper.cs" en premiere ligne, using Plotly.NET; et using Plotly.NET.LayoutObjects; retires, DisplayResults reconstruit autour de SvgChartHelper.Bar(...). Le bloc mort solverNames (jamais consomme) disparait au passage.
  • cellule cac5cfab, garde de vacuite : quand une difficulte n'a aucun solveur qualifie (tous disqualifies ou en timeout), le helper affiche desormais un message explicite au lieu de ne rien produire. Sur main, ce cas rendait une cellule muette — indiscernable d'une absence de resultat.
  • Sudoku-12-Z3-Csharp cellule 9d27fc52 et trois cellules de prose (Sudoku-00 ×2, Sudoku-12 ×1) : la prose decrivait l'absence de graphique committe comme une propriete voulue. Elle est reecrite pour decrire le comportement reel.

Pourquoi SvgChartHelper et pas un Plotly.NET repare (organ-first-implementation) : la serie possede deja cet organe, Sudoku-18-Comparison-Csharp l'utilise dans le meme dossier et ses sorties SVG sont deja committes sur main — precedent verifie avant toute edition. Les charts Plotly.NET.Interactive s'appuient sur cdn.plot.ly et rendent blanc dans un visualiseur statique (GitHub, nbviewer), ce que #6927 documente ; SvgChartHelper produit du SVG inline sans aucune dependance, serialise dans le .ipynb.

Perimetre mesure

Notebook role cellules code modifiees markdown sorties SVG message de vacuite caracteres
Sudoku-00-Environment-Csharp definit le helper 1 2 0 0 0
Sudoku-02-DancingLinks-Csharp appelant 0 0 3 0 4611
Sudoku-04-SimulatedAnnealing-Csharp appelant 0 0 3 3 4072
Sudoku-05-PSO-Csharp appelant 0 0 0 3 0
Sudoku-07-Norvig-Csharp appelant 0 0 3 0 4411
Sudoku-10-ORTools-Csharp appelant 0 0 3 0 8530
Sudoku-12-Z3-Csharp appelant 1 1 3 0 5620
total 15 6 27244

Les cellules code modifiees sont 2 au total : la definition du helper et un commentaire. Les autres notebooks ne changent que par leurs sorties — leur source est byte-identique a main (verifie cellule a cellule, cf. Regle C.3) ; ils sont committes parce que la sortie du helper partage a change.

Controles

controle resultat
cdn.plot.ly dans les sorties 0
sorties d'erreur 0
execution_count nul sur cellule code non vide 0
violations C.1 (raise NotImplementedError / assert False / 1/0) 0
banniere probeAddresses / binding 0
chemin machine absolu dans les sorties 0

Points de review (CLAUDE.md section B)

  1. Scope reel — 7 notebooks, un seul sujet : la sortie graphique du helper partage. Aucun elargissement : le #r "nuget: Plotly.NET, 5.1.0" de la cellule d6c2d96d est laisse en place (voir Residuel), et aucune cellule d'exercice n'est touchee.
  2. Validation automatisee post-fix — re-execution complete apres le dernier commit de source ; organes passes sur la tete exacte : validate_pr_notebooks.py origin/main (7/7 passes), scan_cell_ordering.py --fail-on HIGH (6 clean ; Sudoku-05 porte 1 finding MED pre-existant — « interpretation avant le code », cell#41 — non introduit ici puisque ce notebook n'a aucune cellule source modifiee, et sous le seuil du gate, rc=0), check_notebook_navlinks.py --check (0 nouveau lien casse par notebook), detect_markdown_rendering.py --check (0 nouvelle violation ERROR), git diff --check propre.
  3. Coherence pedagogique — la prose cesse de decrire comme voulue une absence qui etait un defaut ; le message de vacuite est ajoute parce qu'une cellule muette n'est pas un resultat lisible ; les exercices restent intacts.
  4. Execution reelle — kernel .net-csharp local via scripts/notebook_tools/notebook_tools.py execute (route papermill, la seule qui persiste les sorties). Aucune sortie editee a la main : seules les normalisations admises (banniere probeAddresses retiree par strip_probe_banner.py, chemins papermill ramenes au basename). Deux reparations d'environnement ont ete necessaires et sont assumees ici (regle F — reparer, jamais contourner) : les sous-modules MetaGeneticSharp et son sous-module imbrique GeneticSharp compiles localement (les DLL sont des artefacts non suivis, absents d'un worktree frais), et mealpy==3.0.2 installe dans le CPython 3.13 expose a PythonNet — sans quoi la cellule sudoku5-cs-mealpy-run echouait sur import mealpy.
  5. Regression check — mesure sur l'arbre : DisplayResults est appele non commente par Sudoku-02/04/05/07/10/12 ; dans Sudoku-01 l'appel est commente (L57) et sa cellule ne rend que son message d'exercice — sa sortie ne change pas, il n'est pas committe ici. CSP-4-Scheduling-CSharp (Search/) importe Sudoku-00 mais n'utilise ni le helper ni Plotly : aucune autre famille n'est touchee.

SOTA (CLAUDE.md section H, Prong A)

SOTA-OK. Le vrai moteur est invoque — SvgChartHelper produit le SVG reellement committe, et .NET Interactive execute bien les notebooks. Aucun workaround degrade : la sortie n'est ni de l'ASCII, ni un placeholder, ni une image fabriquee.

INTRINSIC n'est pas invoque : un chemin SOTA existait dans le depot pour ce besoin precis, et il est utilise.

Residuel (traite hors de cette PR, assume ici)

  • La cellule d6c2d96d de Sudoku-00 charge encore #r "nuget: Plotly.NET, 5.1.0" alors qu'aucun code ne l'emploie plus. Elle est conservee volontairement dans cette PR : la retirer est un sujet distinct (temps de restauration NuGet, et l'exercice markdown de Sudoku-09 qui mentionne Plotly), et l'inclure ici melangerait deux perimetres. Effet visible et assume : les sorties des appelants portent la banniere Installed Packages ... Plotly.NET, 5.1.0 emise a l'import.
  • Sudoku-18-Comparison-Csharp, qui utilisait deja SvgChartHelper, n'est pas touche : sa source est inchangee et ses sorties SVG deja committes correspondent au comportement du helper ; aucune re-execution n'etait due (regle C.3).
  • Sudoku-12-Z3-Csharp : quatre cellules recoivent un id genere par nbformat (main les stockait sans id). Leur source est byte-identique — mesurable cellule a cellule ; ce n'est pas une modification de contenu.

See #17654 (D3 ; les autres blocs de l'acceptance restent ouverts)


🤖 Generated with Claude Code

Diagnostic dérive

Les notebooks Sudoku ré-exécutés portent metadata.language_info.version 12.0 -> 13.0 (version du langage C# rapportée par le kernel — pas un numéro de paquet).

…ow() sans sortie

Le helper partage SudokuHelper.DisplayResults (cellule cac5cfab de
Sudoku-00-Environment-Csharp, importee par #!import dans toute la serie)
terminait chaque graphique par chart.Show(). Avec Plotly.NET, Show() ouvre
un navigateur ou echoue faute d'affichage : dans les deux cas il ne
produisait aucune sortie de cellule. Les appelants ne portaient donc aucun
graphique -- Sudoku-07 cellule 8mqqjtqpda5 n'avait, pour tout resultat, que
le flux texte "Graphique de comparaison des solveurs affiche".

Le helper est branche sur l'organe SVG inline que la serie possede deja
(SvgChartHelper, EPIC #6927), deja utilise par Sudoku-18-Comparison-Csharp
dans le meme dossier. Une garde de vacuite affiche desormais un message
explicite quand une difficulte n'a aucun solveur qualifie, la ou la cellule
restait muette -- indiscernable d'une absence de resultat.

7 notebooks re-executes (15 graphiques SVG, 6 messages de vacuite).
2 cellules code modifiees seulement : la definition du helper et un
commentaire ; les autres notebooks ne changent que par leurs sorties, leur
source restant byte-identique a main. Trois cellules de prose cessaient de
decrire comme voulue une absence de graphique qui etait un defaut.

See #17654

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@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 24, 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 8.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 8.4s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 9.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 13.4s
Search-01-StateSpace.ipynb ✅ SUCCESS 7.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 5.5s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 59.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 10.2s

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

@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 github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Sep 24, 2026

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

VERDICT: CHANGES_REQUESTED

[Hermes] po-2026 — review #17671 @ head 93efd53a5825be1027b16e26a28fc7fd35b041df (MED/notebook-dotnet, +5145/−2303, 7 notebooks). Full read base↔head des 7 notebooks (extraction des 2 arbres + comparaison cellule à cellule, sources et sorties), pas diff-only.

Le fond est bon, et la mesure le confirme. Les sorties text/html portent bien 15 SVG inline (02: 3, 04: 3, 07: 3, 10: 3, 12: 3) absents du base — le helper réécrit autour de SvgChartHelper.Bar(...) (cellule cac5cfab, #load en première ligne, Plotly.NET retiré) produit bien l'artefact annoncé ; les 6 messages de vacuité sont présents (04 ×3, 05 ×3) ; cdn.plot.ly = 0 partout ; 0 output d'erreur ; les 5 sources non-helper sont bien byte-identiques au base (seuls les outputs bougent), et les 2 cellules source modifiées (Sudoku-00 c.9, Sudoku-12 c.24/25) tiennent la reécriture de prose annoncée. Security scan : 0 match.

Mais la PR échoue deux gardes mécaniques, et le body ne les divulgue pas (il liste 6 contrôles, aucun des deux) :

  1. Kernel drift guard (base vs PR) = FAIL — language_info.version passe de 12.0 à 13.0 sur 5 notebooks (Sudoku-00, 02, 07, 10, 12). Sudoku-04/05 étaient déjà en 13.0 au base, d'où les 5 et non 7. Le contrat de la garde (#15650 point 4) exige soit la ré-exécution reproduite, soit une section ## Diagnostic dérive (C.4) dans le body — absente ici (grep : 0 hit). C'est cohérent avec les « deux réparations d'environnement assumées » de la section 4 du body, mais assumé dans le texte ne vaut pas exemption reconnue par le garde : le SDK .NET a bougé (12.0→13.0) et cela doit être dit dans le body, à la forme exacte que body_has_derive_exemption attend.
  2. Twin parity audit (#8057) = FAIL — 6 paires en DRIFT : Sudoku-02 DancingLinks, 04 SimulatedAnnealing, 05 PSO, 07 Norvig, 10 ORTools, 12 Z3. Le registre stocke le blob SHA de chaque jumeau ; toute édition le déplace, markdown-only inclus. Le log donne la commande chirurgicale exacte (python scripts/notebook_tools/check_twin_parity.py --update --pair "…" --by "<machine:workspace>", --update EN DERNIER), plus une ligne en tête de known_differences. Note : la garde signale aussi 1 paire pré-existante (relève de #8264).

Ni l'un ni l'autre n'est un défaut de la correction elle-même — ce sont deux attestations manquantes, corrigeables en un commit (section ## Diagnostic dérive + rebaseline des 6 paires). Point d'attention pour le rebaseline : si strip_probe_banner.py/scrub_papermill_paths.py sont rejoués APRÈS l'attestation, l'attestation est invalidée (#8957) — attester en dernier.

Je re-reviewerai à la tête corrigée.

…stees

La re-execution C# des 7 notebooks Sudoku (DisplayResults SVG) a deplace
le blob SHA des 6 paires enregistrees ; le gate prescrivait exactement
ces 6 updates --pair. Verifie en local : 156 OK / 1 DRIFT preexistant
(exclu par le gate, PR dediee cf #8264).

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.

[Hermes] po-2026 — review du head 2f4cdb56 (incl. rebaseline twin parity ; notebooks lus via extraction complète au head, pas diff-only).

VERDICT: LGTM

Vérifications premières mains :

  • Helper Sudoku-00 cell. 9 : using Plotly.NET retiré, plus aucun .Show(), bloc mort solverNames disparu, #load "../Probas/Infer/SvgChartHelper.cs" + display(SvgChartHelper.Bar(...)) en place. Garde de vacuité présente (aucun solveur qualifie → message explicite).
  • Sudoku-02 au head : 3 sorties display_data SVG inline réelles (text/html, ~1,5 Ko chacune, <svg xmlns=... viewBox=...>), et sources byte-identiques à main cellule par cellule (26/26) — conforme à la revendication « appelants ne changent que par leurs sorties ».
  • Sudoku-05 : la vacuité ×3 est véridique, pas fabriquée — les outputs out78-83 montrent les 6 lignes Disqualified (PSO + GeneticSharp × Easy/Medium/Hard, ~15 s chacune) qui précèdent les 3 messages. La garde décrit exactement l'état exécuté.
  • Contrôles du body : cdn.plot.ly absent, 0 execution_count: null ajouté, grep credentials sur le diff = clean, ligne Grain: présente.
  • Choix SvgChartHelper (organe existant #6927, précédent Sudoku-18 même dossier) plutôt que Plotly.NET réparé : conforme organ-first-implementation, et le nuget Plotly.NET 5.1.0 non consommé reste documenté comme résiduel hors scope.

Le commit rebaseline (2f4cdb56, 6 paires twin re-attestées) est cohérent avec les sorties régénérées. Rien à signaler.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

@jsboige

jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17671
head: 2f4cdb5
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: ba745e72a88380cbdf820659dda42226dc299e5673b2712659f2cca2340de22b
diff-files: 13
diff-additions: 5181
diff-deletions: 2303
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants