Skip to content

fix(lean,#17357): Lean-16e -- 3 fractions de PRIMEGAME corrigees (le generateur ne produisait aucun premier) - #20129

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/17357-lean16e-primegame-fractions
Oct 10, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/17357-lean16e-primegame-fractions

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-lean — lane myia-po-2023:CoursIA-2 — prev: MED/notebook-lean #20127

Le générateur de nombres premiers ne générait aucun nombre premier — cinquième carnet de la file #17357 pour cette lane.

Reassessed by myia-po-2023:CoursIA-2: CONFIRMED (1 constat, 0 faux positif) — et la cause réelle est plus grave que celle que l'audit décrit.

Audit source : commentaire 5844673042 (Hermes, campagne #17073 — 1 × stale-claim sur la cellule 343763ba ; l'audit conclut « proposés 1 · confirmés 1 · rejetés 0 · organes 6/6 · RAS par ailleurs »).

Diff : 2 cellules, 3 champs — la liste de fractions (cellule de code 11) et sa sortie ré-exécutée, plus la cellule markdown 12.

Ce que l'audit avait vu — et c'était juste

La consigne de lecture (cellule 343763ba) invitait l'apprenant à « repérez les valeurs qui sont des puissances de 2 pures ($2, 4, 8, 16, \dots$) » dans la sortie affichée juste au-dessus, alors que cette sortie — [2, 15, 825, 725, 39875, 47125, 39875, 47125, …] — ne contient aucune puissance de 2 pure au-delà de la graine 2 (exposant 1, non premier). L'affirmation centrale de la section 5 (« une machine à 14 fractions génère les nombres premiers ») reposait donc sur une lecture que le carnet ne permettait pas de faire. Constat confirmé.

Ce que l'audit n'avait pas vu — la cause, et c'est là qu'est le défaut

L'audit attribue l'absence à une fenêtre trop courte : « il faudrait ~200+ pas pour voir apparaître 4 (=2²) ». C'est faux, et mesuré faux.

La liste de fractions du carnet n'est pas PRIMEGAME. Elle en diffère en trois positions :

Position Carnet Canonique
6 (77, 19) (77, 29)
12 (15, 2) (15, 14)
13 (1, 7) (15, 2)

Le tell est visible à l'œil nu : 77/19 apparaît deux fois dans la liste du carnet (positions 6 et 8).

Deux simulations en Python, à partir de N = 2 :

carnet    : puissances de 2 pures = [(0, 2)]                       -> 2-cycle 39875 <-> 47125
canonique : puissances de 2 pures = [(0,2), (19,4), (69,8), (280,32), (707,128), (2363,2048), ...]
            exposants               = 1, 2, 3, 5, 7, 11, 13, 17, ...

Avec les fractions du carnet, le programme boucle sur deux valeurs et ne produira jamais de premier, quel que soit le nombre de pas. L'audit a donc bien mesuré (il a simulé la liste du carnet, retrouvant les mêmes puissances de 2 pures), mais il a extrapolé la cause depuis un programme bloqué : « ~200+ pas » décrit une trajectoire qui n'arrive nulle part.

Avec PRIMEGAME, 4 = 2² apparaît au pas 19 — dans la fenêtre de 20 pas déjà affichée par le carnet. Il n'y avait rien à allonger : il y avait trois fractions à corriger.

Le correctif

  • Cellule de code 11 (54ae4ad9) : les trois fractions ramenées à PRIMEGAME canonique. La sortie est ré-exécutée, pas éditée.
  • Cellule markdown 12 (343763ba) : la consigne dit maintenant ce que la sortie montre — $2$ au pas 0 (la graine), puis $4 = 2^2$ au pas 19 — et donne les pas des exposants suivants ($2^3$ au pas 69, $2^5$ au pas 280, $2^7$ au pas 707), pour que l'apprenant sache que la lenteur est le mécanisme et non un égarement. La phrase de l'audit sur les exposants ($2, 3, 5, 7, 11, \dots$ = les nombres premiers dans l'ordre) est conservée : elle est vraie, c'est la fenêtre qui ne la montrait pas.

La cellule d'introduction 0e84f3ae (qui énonce correctement $2^2, 2^3, 2^5, 2^7, 2^{11}$) est laissée intacte : l'audit relève lui-même qu'elle est juste. La conclusion (cellule d665dff2, « l'étudiant a exécuté le célèbre générateur de nombres premiers de Conway ») devient vraie par ce correctif — elle ne l'était pas avant.

Ré-exécution et fidélité

Le carnet est auto-suffisant : zéro import, toutes les définitions (Frac, fracMulNat, fractranStep, fractranRun, mkFracs) sont dans les cellules 3, 6 et 8.

OK: 8/8 cells executed, 0 errors (4.1s)      kernel lean4-wsl, Lean 4.33.0
ec = 1..8 contigus, aucune sortie de type error

Contrôle de fidélité — j'ai ré-exécuté le carnet avant toute modification, pour savoir ce que l'environnement actuel reproduit tout seul :

résultat
cellules de code 8
text/plain identique à la sortie committée 7 / 8
différentes 1 — la cellule 23 (0dc5173d)

L'écart de la cellule 23 est un libellé de linter Lean, pas un résultat : 🟨 unused variable \prog`(committé) vs🟨 Variable name `prog` is not explicitly referenced. (re-exécuté), mêmes positions, même sévérité, même sens. Les sorties committées datent d'un run papermill du **2026-06-18** (metadata.papermill.end_time`) ; le message du linter a été reformulé depuis. Cet écart est indépendant du correctif : la cellule 23 produit exactement le même texte avant et après ma modification — je l'ai donc laissée telle quelle, pour ne pas introduire de churn sur une cellule que ma correction ne touche pas.

Ce qui a été transplanté : uniquement la sortie de la cellule 11, telle que le noyau l'a produite (convertie dans la convention du fichier, listes de lignes — convention vérifiée sur les 21 sorties du carnet, 0 divergence). Aucune sortie n'a été éditée à la main.

Le tampon metadata.papermill global reste celui de juin : je n'ai pas exécuté via papermill (absent de ce venv WSL) mais via jupyter_client sur le même kernel. Le tampon est donc partiellement périmé — 7 des 8 cellules viennent bien de ce run, la cellule 11 de celui d'aujourd'hui. Je le déclare plutôt que de le réécrire.

Portée du diff

Trois champs modifiés, sur 2 cellules d'un carnet de 26 — vérifié champ par champ contre main :

idx 11  id 54ae4ad9  code      source + outputs   (3 fractions, trajectoire)
idx 12  id 343763ba  markdown  source             (consigne de lecture)

ids, cell_type, metadata (par cellule et global), nbformat/nbformat_minor et les execution_count 1..8 sont inchangés. Les sept autres cellules de code gardent leurs sorties d'origine.

Observation hors périmètre (non traitée)

La cellule d'introduction 0e84f3ae date le programme de « 1984 (?) ». Le papier FRACTRAN de Conway est généralement daté de 1987 (Open Problems in Communication and Computation, Springer). La cellule porte déjà un point d'interrogation, donc elle ne ment pas ; je ne l'ai pas corrigée pour ne pas introduire dans cette PR une affirmation que je n'y sourcerais pas. Signalé ici.

Second point, mineur : l'audit justifie la clôture par « kernel natif, cellules à exécution longue ». Mesuré, le carnet s'exécute en 4,1 s sans aucun import — il est re-exécutable par un apprenant.

See #17357 — la file de cette lane compte 11 carnets ; ceci en traite 5 (Lean-11 en #20122, Lean-16a en #20123, Lean-16d en #20124, Lean-16c en #20127). Les 6 autres suivent en PR séparées ([RELEASED] à la dernière).

🤖 Generated with Claude Code

…gees

Le carnet presente le generateur de nombres premiers de Conway, mais sa
liste de fractions differait de PRIMEGAME canonique en trois positions
(77/19 -> 77/29, 15/2 -> 15/14, 1/7 -> 15/2). Consequence mesuree : le
programme tombait dans un 2-cycle (39875 <-> 47125) et n'affichait jamais
la moindre puissance de 2 pure au-dela de la graine -- donc jamais un
premier, alors que la conclusion du carnet affirme que l'etudiant l'a
execute.

Avec les fractions correctes, la fenetre de 20 pas affichee se termine
sur 4 = 2^2 ; les exposants suivants sont les nombres premiers dans
l'ordre (pas 19, 69, 280, 707, 2363 pour 2, 3, 5, 7, 11).

Re-execution : 8/8 cellules, 0 erreur (4.1 s), kernel lean4-wsl.
Seule la cellule de code 11 est re-executee (C.2) ; les sorties des sept
autres cellules de code sont inchangees par le correctif (verifie contre
un run de controle a source inchangee).

See #17357

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

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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 Oct 9, 2026

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 9, 2026

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 commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.4s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 19.4s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.7s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 13.5s

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

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

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

… l'executeur canonique)

Le rouge bloquant `Papermill ratchet (base vs PR)` refusait la PR : les
sorties du carnet avaient change mais le bloc `metadata.papermill` restait
byte-identique a celui d'origin/main (run du 2026-06-18). Le bloc decrivait
donc l'execution precedente, pas celle qui a produit les sorties commitees --
c'est le STALE_BLOCK que le garde detecte.

Correctif : re-execution du carnet par l'executeur canonique
(scripts/notebook_tools/wsl_papermill.py execute --kernel lean4-wsl),
papermill 2.7.0, 8/8 cellules, 0 erreur, 5.3 s. Le bloc est reecrit par
l'executeur (verdict BLOCK_MOVED, 0 regression).

Contexte d'execution : le lake naturel du carnet (conway_lean) ne rend plus
de LEAN_PATH -- le paquet Mathlib partage de .lake/packages/mathlib est sale
et lake refuse le checkout ("Please move or remove them before you switch
branches"), ce qui prive le lancement direct du REPL et fait tomber le noyau
en "FAILED DUE TO EOF". Le carnet n'importe rien (il redefinit Frac
localement) : l'execution a tourne dans un contexte lake minimal de meme
toolchain (v4.33.0) et meme binaire repl-4.33.0.

Preuves : ratchet rc=0 a la tete (1 carnet change, 0 regression) ;
prose-counts rc=0 ; les hooks pre-commit passent (H.3 inclus) ; les sorties
de 5 des 8 cellules sont byte-identiques a celles du run precedent (sequence
corrigee 1925/2275/... et 4 au pas 19 reproduites), la cellule 23 ne
differant que par le texte d'avertissement du noyau, plus detaille.

See #17357

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

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Rouge Papermill ratchet (base vs PR) repare — commit 0314d7bfb4

Cause reproduite. Le requis PR gate rougissait sur le carnet de cette PR, le garde nommant lui-meme le defaut :

[error] outputs/execution_count changed but the metadata.papermill block is identical to
origin/main - the block describes the previous run.
  STALE_BLOCK  MyIA.AI.Notebooks/SymbolicAI/Lean/Lean-16e-Conway-FRACTRAN-Lean-Native.ipynb REGRESSION

Le correctif de fond de la PR (les trois fractions de PRIMEGAME) avait bien re-execute le carnet, mais par un executeur qui n'ecrit pas le bloc : celui-ci datait du run du 2026-06-18 et decrivait donc une execution qui n'est plus celle des sorties commitees. metadata.papermill etait byte-identique a origin/main alors que les sorties avaient change — exactement le STALE_BLOCK que le garde detecte.

Correctif — la premiere des deux remediations nommees par le garde lui-meme (« Re-execute the notebook via an executor that rewrites the block, or remove the block ») : re-execution par l'executeur canonique du depot, scripts/notebook_tools/wsl_papermill.py execute --kernel lean4-wsl — papermill 2.7.0, 8/8 cellules, 0 erreur, 5.3 s, bloc reecrit.

Note d'environnement (utile a toute lane qui re-execute un carnet Lean natif) : le lake naturel du carnet (conway_lean) ne rend plus de LEAN_PATH — le paquet Mathlib partage de .lake/packages/mathlib est sale et lake refuse le checkout (« Please move or remove them before you switch branches »), ce qui prive le lancement direct du REPL (LAUNCH-DIAG: lean_path_len=0) et fait tomber le noyau en FAILED DUE TO EOF. Le carnet n'importe rien (il redefinit Frac localement) : l'execution a tourne dans un contexte lake minimal de meme toolchain (v4.33.0) et meme binaire (repl-4.33.0). Je n'ai rien modifie dans le lake partage — le defaut est signale, pas contourne en silence.

Preuves.

  • check_papermill_ratchet.py origin/main a la tete commitee : changed notebooks: 1, regressions: 0, verdict BLOCK_MOVED (rc=0).
  • check_prose_quantitative_claims.py --diff origin/main...HEAD --strict : [OK] aucun compteur quantitatif en prose.
  • Les 10 hooks pre-commit passent, H.3 inclus (execution_count reels et outputs presents partout) ; scrub-papermill-paths a normalise les deux chemins absolus du bloc, comme prevu.
  • Le run reproduit le travail de fond : les sorties de 5 des 8 cellules de code sont byte-identiques a celles du run precedent, dont la sequence corrigee (... 1925, 2275 ... 68, 4, 30, avec 4 = 2^2 au pas 19) ; la cellule 23 ne differe que par le texte d'avertissement du noyau, plus detaille (1978 → 3137 caracteres, meme avertissement unused variable).
  • Aucune cellule source n'est modifiee par la re-execution : le diff de ce commit ne porte que des sorties et le bloc metadata.papermill.

@github-actions

github-actions Bot commented Oct 9, 2026

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 Oct 9, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 8
  • 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 Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA
pr: 20129
head: 0314d7b
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 72888e50fa291170eaaa74b35401ea8c606bf33216249285b77d3f90241ec9b6
diff-files: 1
diff-additions: 222
diff-deletions: 172
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20129
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

Approbation a la tete 0314d7b. La pre-lecture a ete faite en git local par un sous-agent ; j'ai relu les points pivots.

  • Preuve du claim central : present: two Python simulations (carnet list vs canonical) with pure-power-of-2 sequences quoted; canonical list now yields exponents 1,2,3,5,7,11,13,17...; papermill ratchet STALE_BLOCK repaired by re-execution with block-rewriting executor (c.6087708992)
  • Execution : changed code cell re-executed via canonical wsl_papermill (8/8 cells, 0 errors, 5.3s, papermill block rewritten) -- measured firsthand at head: 8/8 exec_count+outputs, 0 error outputs
  • Aucune violation C.1, aucun recit d'activite ajoute.

@myia-ai-01
myia-ai-01 merged commit 90e46ec into main Oct 10, 2026
98 of 100 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants