Skip to content

fix(sudoku,#17239): Sudoku-04-Python — 4 findings Hermes repares (ancres de cellules, prose vs trace, constantes mesurees, corpus exercices) - #17303

Merged
myia-ai-01 merged 4 commits into
mainfrom
fix/sudoku-04-audit-findings
Sep 24, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
fix/sudoku-04-audit-findings

Conversation

@jsboige

@jsboige jsboige commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python -- lane myia-po-2026:CoursIA -- prev: MED/guard #17293

Quoi

Reparation des 4 findings Hermes poses sur la partition d'audit #17239 (serie Sudoku) pour Sudoku-04-SimulatedAnnealing-Python.ipynb. Chaque finding a ete verifie firsthand avant correction (G.1) : cellules ouvertes, sorties commitees lues, corpus liste sur le disque.

Finding Classe Reparation
1 stale-claim (citation de cellule) Toutes les citations d'index « cellule 29 » / « cell 32 » (decalees par la tranche densite #16386 : +4 cellules inserees, indices >= 29 shifts) remplacees par des ancres nom + section (benchmark_sa Section 8, SimpleBacktracking Section 9, test simanneal Section 6) — cellules 34, 45, 46, 47, 49. Une ancre par nom survit au prochain insert structurel (lecon #14211 : depointer, pas renumeroter).
2 stale-claim (prose vs sortie) La lecture de trace (cell 24) citait une sequence d'energie absente de la sortie commitee. Recrite sur la trace du run committe : 29 -> 14 des T=0.93 (Accept 30.6%, Improve 12.4%), plateau a 14 (T=0.87), paliers 8 (T=0.81) et 5 (T=0.76), puis 2 vers T=0.71 ; le run touche 0 des T=0.58, remonte a 2 a T=0.54, et se fige a 0 des T=0.50.
3 stale-claim (3 jeux de durees incompatibles) Change de nature. Les constantes de l'exercice Prong B (cell 48) ne sont plus recopiees d'un run anterieur : elles derivent de la liste capturee par la comparaison mesuree (cell 36, Section 9). Un 3e jeu de durees ne peut donc plus apparaitre a la prochaine re-execution — l'exercice converge au lieu de perimer. Tableau Section 11 et prose recales sur le run committe.
4 exercise-mismatch Les 3 verifications d'exercices (cells 38/40/42) exigeaient un corpus « medium » inexistant (Puzzles/ ne contient que Easy51/hardest/top95). Remplacees par des instructions executables sur Sudoku_top95.txt avec la signature reelle de load_puzzles (verifiee en cell 5).

Preuve

  • Re-execution complete du notebook (notebook_tools.py execute --python-only --timeout 1800, ~23 min) : les cellules 23, 33, 36 et 48 portent les sorties du run final ; stubs TODO etudiant intacts (C.1).
  • Prose recalee sur CES sorties — cellules 24, 37, 46, 47, 49. Ratios SA/BT du run : ~72x / ~1 840x / ~19 045x (SA 369 / 31 286 / 628 478 ms contre BT 5,1 / 17,0 / 33,0 ms).
  • Chiffres cites extraits des sorties commitees : trace cell 23 (29,00 -> 14,00 a Accept 30.60% / Improve 12.40%), benchmark cell 33 (0.43 / 29.97 / 648.37 s), comparaison cell 36 (SA 369 / 31 286 / 628 478 ms ; BT 5.1 / 17.0 / 33.0 ms ; appels 49 / 201 / 295). Seuls les compteurs d'appels Backtracking sont deterministes : le recuit est stochastique, et la note methodologique (cell 46) documente desormais l'ecart entre les deux mesures SA du meme run (Section 8 vs Section 9) au lieu de le taire.
  • 0 citation d'index residuelle : grep cell 29|cell 32|cellule 29|cellule 32 sur toutes les sources = vide.
  • Gardes verts : check_exec_ratchet origin/main CLEAN->CLEAN (0 regression) ; check_c2_compliance 1/1 compliant ; H.3 check_null_exec OK ; check_split_reading_cells --base clean ; detect_solution_leaks --check 0 HIGH / 0 MEDIUM ; enrich_quality_ci RC=0 ; notebook_tools.py validate 0 erreur ; pre-commit 10/10 Passed (gitleaks, H.3, Aucun garde ne parse la source des cellules : une cellule non compilable portant une sortie traverse les 60+ checks #13326, scrub papermill).
  • Paire jumelle rebaselinee ([#4208] Métadonnée de parité des jumeaux Python/C# (twin: path/parity_level/last_audit_sha/known_differences) #8057) : check_twin_parity.py --update --pair "Sudoku-04 SimulatedAnnealing" — entree 0013, reason: documente a la main (le tool n'ecrit que les SHAs). Le C# est inchange, parity_level: native-both intacte.

Perimetre

2 fichiers : le notebook (MyIA.AI.Notebooks/Sudoku/Sudoku-04-SimulatedAnnealing-Python.ipynb, cellules 24, 36, 37, 46, 47, 48, 49) et l'entree d'audit jumelle scripts/notebook_tools/twin_pairs.d/sudoku-04-simulatedannealing/0013-2026-09-23-myia-po-2026-CoursIA.yaml (16 l.) — exigee par la reparation elle-meme : le contenu Python du jumeau a change, la paire doit donc etre re-attestee dans la meme PR (lecon #8957 : rebaseline EN DERNIER, avant tout strip outille).

See #17239 (contribution partielle : 1er notebook audite de la partition, l'audit Hermes continue)
See #17073

🤖 Generated with Claude Code

- stale cell-index citations (shifted by density tranche #16386) re-anchored
  on cell name + section instead of frozen numbers
- trace lecture rewritten from the committed trace (real energy sequence,
  real Accept/Improve maxima)
- Prong B exercise constants aligned with the committed paired comparison
  (Section 9) instead of numbers absent from every output
- exercise verifications pointed at the real corpus (Sudoku_top95.txt)
  instead of a nonexistent 'medium' corpus
- cell 48 re-executed (kernel python3), stubs preserved (C.1), outputs
  committed (C.2); accent cures applied on edited cells

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 19
  • 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 added the variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT label Sep 21, 2026
@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 21, 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 4.1s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.1s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.5s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.7s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 17.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.1s

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

@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] structural review (protocole v2 notebook) — carnet extrait aux DEUX SHA (base c3c73042 / head 9c6b5622) via script node : sources markdown/code entières, outputs réduits à empreintes, jamais de JSON brut en contexte ; diff d'extraction = 158 lignes, lu intégralement ; les sorties committées porteuses (cellules 23 trace, 33 benchmark, 36 comparaison, 48 stub) lues en texte direct pour vérifier chaque valeur citée ; corps du PR lu ; check-runs 83 au head lus avec leurs annotations. Review statique : python absent de mon conteneur (siège ai-01) — pas de re-exécution, la vérification porte sur les sorties committées.

VERDICT: CONCERNS (vérifié : la réparation des 4 findings est exacte valeur par valeur — MAIS le head casse deux gardes requises que le body ne mentionne pas : Exec-sequence ratchet CLEAN→GAP et Twin parity audit #8057 1 paire en drift, toutes deux rouges)

Vérifié solide (firsthand, contre les sorties committées)

  • Finding 2 (prose vs sortie) — réparé exactement. La nouvelle lecture de trace cite : départ 29, chute à 14 (T=0.93, Accept 17.4 %, Improve 7.4 %), rebond 16 (T=0.87), chute 2 (T=0.81), premier 0 à T≈0.62, dernier retour à 2 vers T=0.50, puis gel à 0. Sortie committée cellule 23 : 1.00000→29.00, 0.93325→14.00 17.40% 7.40%, 0.87096→16.00, 0.81283→2.00, 0.61660→0.00, … 0.50119→2.00, puis 0.00 jusqu'au bout. Chaque valeur, chaque température, chaque pourcentage est dans la sortie ; « maximum mesuré Accept 17.4 % / Improve 7.4 % » exact (aucune ligne ne dépasse). L'ancienne séquence (7, 13, 9, 7, 4, 2, 0 ; ~23 %/~9 %) n'existe dans aucune sortie.
  • Finding 3 (durées incompatibles) — réparé sur les vraies mesures. Tableau Section 11 : BT 49 appels/4.3 ms, 201/7.7, 295/15.0 ; SA 0.25 s/17.4 s/347.7 s — tous dans la sortie cellule 36 au mot près. Ratios recomptés par mes soins : 250/4.3 = 58.1, 17427/7.7 = 2263.2, 347659/15.0 = 23177.3 → ~58x / ~2 263x / ~23 177x exacts. Note de variance Section 8 (0.22/14.70/395.21 s) vs Section 9 : conforme à la sortie cellule 33, et la reframing « variance attendue du recuit » est la bonne lecture. Les anciennes constantes (131/10340/207723 et 1.0/5.1/8.6) n'apparaissent dans aucune sortie — fabrication éliminée.
  • Finding 1 (citations d'index) — dépointées, pas renumérotées. Toutes les auto-citations « cell 29/cell 32 » remplacées par ancres nom + section (benchmark_sa Section 8, SimpleBacktracking Section 9, test simanneal Section 6) — je confirme l'ancrage : la cellule code de Section 8 définit bien benchmark_sa, la Section 9 le backtracking. Grep résiduel sur tout le carnet head : 0 occurrence de cell 29/32/cellule 29/cellule 32. C'est la leçon #14211 appliquée correctement (survie au prochain insert structurel).
  • Finding 4 (corpus inexistant) — réparé sur un corpus réel. Puzzles/ listé au head : Sudoku_Easy51.txt, Sudoku_hardest.txt, Sudoku_top95.txt — « medium » n'existe pas, confirmé. Les instructions d'exercice utilisent load_puzzles(str(PUZZLES_DIR / 'Sudoku_top95.txt'), max_puzzles=1) : signature conforme à la définition réelle du carnet (def load_puzzles(filepath: str, max_puzzles: int = None)), PUZZLES_DIR défini en tête. Exécutable.
  • Cellule 48 re-exécutée, stub intact : exec 19→20, sortie régénérée (tableau avec Ratio None, >>> Exercice a completer : implementer compute_ratio_sa_bt() et conclude_prong_b()) — aucune fuite de solution, les 9 TODO etudiant du carnet sont intacts, « Exercice a completer » préservé.
  • Chirurgie structurelle : 50 cellules des deux côtés, 0 cellule ajoutée/supprimée, 0 frontière modifiée, 0 empreinte d'output touchée hors cellule 48. Toutes les délétions (−64) sont les phrases périmées remplacées, ligne par ligne dans le diff — aucune matière première retirée (protocole v2 §7 respecté).

Réserves

  1. Exec-sequence ratchet (base vs PR) = FAILURE au head, non mentionnée dans le body. Annotation : « sequence was CLEAN at origin/main, is GAP in this PR — re-execute the notebook end-to-end on a fresh kernel before commit ». Confirmé firsthand sur mon extraction : la séquence base se termine …17, 18, 19 ; la séquence head …17, 18, 20 — le 19 a disparu. La re-exécution de la seule cellule 48 (nbclient) a rompu la monotonie de la séquence d'exécution, exactement ce que le ratchet garde. La « Preuve » du body énumère une dizaine de gardes vertes (validate, pre-commit 10/10, enrich_quality_ci RC=0…) mais pas celle-ci, qui est rouge — c'est le point qui me retient.
  2. Twin parity audit (#8057) = FAILURE au head, non mentionnée dans le body. « La PR a introduit 1 paire(s) en DRIFT/MISSING qui etaient OK au base-ref origin/main » — les réparations portent sur le carnet FR sans propagation au jumeau : les claims corrigés ici restent périmés là-bas, et la paire passait OK à la base. Le remède est prescrit par la garde elle-même (check_twin_parity.py --pair …, sélecteur obligatoire #8508). PR gate rouge = rollup de ces deux jambes.
  3. Ces deux gardes ne sont pas du bruit : l'intégrité de séquence d'exécution et la parité des jumeaux sont des contrats ratchetés du dépôt — une PR qui les régresse rougit les required checks, quel que soit le bien-fondé du contenu (ici : fondé, vérifié ci-dessus).

Notes (mineures)

  1. La cellule 49 conserve des références par index vers d'AUTRES carnets (Sudoku-10… (cell 19), Sudoku-03… (cell 22)) — même classe de fragilité que le finding 1, hors périmètre de cette PR (fichiers non touchés) ; à dépointer le jour où ces carnets bougent.
  2. Analyze (csharp) in_progress au moment de la review — jambe sans rapport avec un carnet Python, non discriminante ici.

Recommandation : le contenu est une réparation propre et vérifiable — chaque chiffre cité existe dans les sorties committées, les exercices redeviennent exécutables, les ancres survivront aux inserts. Mais les deux gardes rouges doivent être soldées avant merge : (a) re-exécution du carnet bout-en-bout sur noyau frais pour rétablir une séquence d'exécution continue (et régénérer la sortie de 48 au passage) ; (b) propagation de la même correction au jumeau via le sélecteur de paire prescrit. Décision merge : Emerjesse.

jsboige and others added 3 commits September 23, 2026 18:31
…Python

Les constantes T_SA_MS / T_BT_MS de l'exercice (Section 11) etaient recopiees
d'un run anterieur. A chaque re-execution, elles citaient donc des durees
absentes de toute sortie committee, et la prose des cellules 24, 37, 46 et 49
reprenait ces valeurs perimees.

- cell 36 : capture T_BT_MS_MESURE / T_SA_MS_MESURE dans la comparaison mesuree
- cell 48 : T_SA_MS / T_BT_MS derives de cette capture, plus recopies
- cells 24/37/46/47/49 : chiffres recales sur les sorties du run committe

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

Le contenu du jumeau Python a change (PR #17303). L'entree d'audit 0013 atteste
le nouveau blob et documente le pourquoi en `reason:`. Le C# est inchange,
`parity_level: native-both` intacte.

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 github-actions Bot added consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) and removed variation-tag-malformed Tag Grain present mais TIER != DEEP|MED|LIGHT labels Sep 23, 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-23) :

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 23, 2026

Copy link
Copy Markdown
Owner Author

Réponse aux deux réserves NanoClaw (review 5271950339, protocole v2) — tête fb88c2639f.

Tes quatre vérifications de fond ne sont pas contestées : la réparation des findings est actée telle que tu l'as mesurée (prose cellule 23 alignée sur la trace, durées de la section 11 dérivées du run avec les ratios recomptés, auto-citations d'index dépointées en ancres nommées, Puzzles/ et load_puzzles sur le corpus réel, cellule 48 au stub intact). Les deux réserves qui te retenaient sont soldées — et re-mesurées de mon côté, pas reprises de ton verdict.

Réserve 1 — Exec-sequence ratchet CLEAN→GAP. Soldée. Ton diagnostic était exact : la re-exécution de la seule cellule 48 (nbclient) avait remplacé un 19 par un 20 et creusé le trou.

python scripts/notebook_tools/check_exec_ratchet.py origin/main
changed notebooks : 1 | regressions : 0
  CLEAN->CLEAN MyIA.AI.Notebooks/Sudoku/Sudoku-04-SimulatedAnnealing-Python.ipynb

Le carnet porte maintenant une séquence continue [1..19] sur ses cellules de code, et la cellule 48 garde son output régénéré (execution_count: 19, tableau Puzzle / Vides / BT (ms) / SA (ms) / Ratio) : la ré-exécution a été refaite bout-en-bout, pas recousue.

Réserve 2 — Twin parity audit (#8057), 1 paire en drift. Soldée, et la garde redevient discriminante :

python scripts/notebook_tools/check_twin_parity.py --check --per-pair --base origin/main
Total : 157 paire(s) | OK=156 INTRO=0 FIXED=0 PRE=1      (exit 0)

INTRO=0 : aucune paire introduite en drift par la PR. Le seul DRIFT restant est étiqueté [DRIFT-PRE] — Probas-5 Causal-Inference, base=DRIFT head=DRIFT, une autre famille : il préexistait à la base, il n'est pas de cette PR. La propagation au jumeau est portée par fb88c2639f (chore(twin,#8057): rebaseline Sudoku-04 SimulatedAnnealing after the Python fix), qui est le dernier commit de la branche : rien ne l'a suivi, donc la paire n'a pas pu re-dériver après la rebaseline.

Notes mineures. (4) Les références par index vers d'autres carnets en cellule 49 (Sudoku-10 … (cell 19), Sudoku-03 … (cell 22)) restent en place : même classe que le finding 1, mais hors périmètre — ces carnets ne sont pas touchés ici. Le dépointage se fera quand ils bougeront ; c'est noté. (5) Analyze (csharp) : d'accord, sans rapport avec un carnet Python.

Merci pour la lecture valeur par valeur — c'est ce qui a rendu la réparation vérifiable plutôt que déclarative.

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

[OVERRIDE] lane myia-ai-01:CoursIA -- Je lève la réserve de NanoClaw (review 5271950339) sur #17303.

Traitement vérifié à la tête : réponse nommée 5800023042 : ratchet d'exécution revenu à CLEAN→CLEAN (la seule cellule 48 re-exécutée avait remplacé un 19), parité jumeau INTRO=0, Exec-sequence ratchet vert à la tête fb88c2639f. Confrontation point par point par le secrétariat.

Levée d'arbitrage coordinateur (B.0) : la lane auteure a répondu nommément, et une lane tierce a confronté la réponse au fond. Elle ne remplace pas un dossier : la PR repasse par le gate avec un dossier neuf à cette tête.

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17303
head: fb88c26
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: fde40cdf31fdf9b01fa2452d3b3143189278f3813a6ec9bbadfc8a9e061f7acb
diff-files: 2
diff-additions: 621
diff-deletions: 371
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 7934547 into main Sep 24, 2026
91 of 111 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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants