Skip to content

feat(notebook-lean,#18703): Lean-16b arc narratif — piliers remontés, approfondissements en Annexes A-G - #18806

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/18703-lean16b-annexes
Oct 2, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/18703-lean16b-annexes

Conversation

@jsboige

@jsboige jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-lean — lane myia-po-2025:CoursIA — prev: DEEP/lean #18780

Objet

Tranche #18703 (généralisation du pilote Lean-31 #18699) sur Lean-16b-Conway-Game-of-Life-Lean.ipynb — le carnet scoré 96,5/100 par le census de l'EPIC (87 kchars, 2 murs > 4 k, première sortie image à 40 %). Le geste du pilote : lecture simple remontée, approfondissements en annexes lettrées, aucune suppression — déplacement + transitions uniquement.

Arc avant → après (mesuré sur les cellules)

Mesure Avant Après
Première sortie image cellule 20/50 = 40 % (rendu OTCA) cellule 7/53 = 13 % (figure patterns, désormais affichée inline)
Rendus des 3 piliers (payoff visuel) 40 %-48 % 26 %-34 %
Mur §9 « Le port Lean 4 » (4 263 chars) section 9, avant les #eval Annexe D (intégrale, sous-titres D.1-D.6)
Mur §11 « Feuille de route » (5 908 chars) section 11 Annexe G (intégrale)
Cellules 50 53 (+3 transitions : §6 condensé, bandeau Annexes, bandeau Annexe F)

Ligne principale renumérotée 1-8 : règle B3/S23 → patterns → les 3 piliers (l'histoire en trois actes) remontés en §3 → démo blinker/glider → Turing-complétude → source de vérité Lean (#eval zoo 6.1, parseur RLE 6.2) → lake build → conclusion. Annexes A-G : noix Phase 1, Spartan logic, Hashlife, port Lean en détail, limite string literals, scaffold Pillars, feuille de route.

Deux figures calculées mais jamais montrées sont désormais affichées (patterns-viz, demo-blinker-glider) : elles faisaient savefig vers /tmp + print du chemin — le lecteur ne voyait rien. Passage en display(Image(...)) (même mécanique que render_pattern), prints numériques inchangés.

Diagnostic dérive

Diff des sorties base → tête (par id de cellule)

20 cellules code des deux côtés, ids stables, execution_count 1→20 séquentiels, 0 erreur, 0 ename.

Sorties identiques (9 cellules) : gol-python-impl, pillars-toolbox, life-lean-stats, subprocess-setup, 70f39299/4deed899/exercice-3/exercice-4 (stubs exos), 50dcfe8c.

Différences attendues, toutes tracées à leur cause :

Cellule Diff Cause
patterns-viz, demo-blinker-glider print Figure sauvee : … disparu ; PNG désormais affiché inline (1 png chacun, absent de la base) changement voulu : savefig('/tmp') → display(Image(...)) — les deux figures étaient calculées mais jamais montrées
13a8ea0a (zoo #eval) section 10 → section 7 dans une ligne de prose renvoi cross-référencé retargeté (ma transformation)
grep-sorry-life cf section 11 → cf Annexe G idem
rle-parse-eval section 6 → section 3 (2 lignes) idem
lake-build-life 2999 jobs → 3008 jobs (replayed) ; Build completed successfully les deux côtés cache lake rechauffé par le prebuild 4.33.0 — le compte de jobs replayed dépend de l'état du cache, pas du code
render-cpu, render-gemini PNG régénérés ≠ (md5) matplotlib de l'env 3.13 neuf (numpy 2.5.3 / matplotlib récent) — même code, même motif, rendu antialiasé différent
render-otca +1 ligne vide ; PNG md5 identique artefact de stream vide
phase1-files-list Angel.lean 77→152 lignes, Angel_en.lean 73→149, blancs évolution réelle de l'arbre depuis l'exécution committée en base (Angel a grandi sur main entre-temps) — la cellule liste l'état courant du dépôt, mesuré à l'exécution
d8678121 +1 ligne vide artefact de stream vide

Le point décisif : 13a8ea0a rend 8× true et rle-parse-eval 7× OK, 0 erreur — sous kernel python3-lean avec les oleans rebuildés en 4.33.0 (le cache .lake de l'arbre principal portait des oleans 4.32.1 sous pin v4.33.0 : incompatible header — défaut préexistant mesuré dans les deux arbres, signalé sur le dashboard, réparé dans le worktree par prebuild lake build, 3008 jobs).

Anti-régression (critères 2-3-5 du pilote)

  • Aucune suppression : les 50 cellules d'origine sont toutes présentes (ids stables — réordonnancement seulement), volume source préservé : base ~86,4 kchars → tête ~88,3 kchars (delta = 3 transitions + retitrages). Non-claims (Annexe G §roadmap, synthèse §3 « Statut compile vs statut mathématique ») et démonstrations intacts.
  • 4 exercices préservés avec leurs énoncés et stubs C.1 (return None / prints « à compléter », aucun raise NotImplementedError — scan 0 hit).
  • Ordre d'exécution préservé pour les dépendances (vérifié par analyse) : subprocess-setup précède toutes les cellules wsl ; step_gol → patterns-viz → Exercice 2/démo ; pillars-toolbox précède les rendus et Exercice 3 ; execution_count 1→20 strictement séquentiels.
  • Renvois cross-références réécrits (13 renvois « section N » retargetés vers la nouvelle numérotation ou les annexes) ; scan post-transforme : 0 référence morte.

Re-exécution

Papermill 2.6.0, kernel python3-lean (conda 3.13.16), worktree isolé CoursIA-18703-lean16b, cache lake chaud (7,7 Go copiés — conway_lean dépend de Mathlib v4.33.0, rebuild complet évité). Sorties committées : 20 cellules code, execution_count tous non-nuls, 0 erreur (scan ename).

See #18703 (EPIC arc narratif — critères d'acceptation du pilote cités). See #18699 (pilote Lean-31). See #17476 (canon CPython série Lean). See #1647 (Epic Conway Life-as-Computation). See #18669 (correction ai-01 kernel canon 3.13, jumeau de ce défaut).

🤖 Generated with Claude Code

…, approfondissements en Annexes A-G

- ligne principale renumerotee 1-8 : regle B3/S23 -> patterns -> 3 piliers (histoire
  remontee en section 3) -> demo blinker/glider -> Turing -> source de verite Lean
  (#eval zoo 6.1, parseur RLE 6.2) -> lake build -> conclusion
- murs section 9 port Lean (4263 chars) et section 11 feuille de route (5908 chars)
  INTACTS en Annexes D et G, sous-titres renumerotes, 0 suppression :
  50 -> 53 cellules, volume source 86.4 -> 88.3 kchars
- 3 cellules de transition nouvelles (section 6 source de verite, bandeau Annexes,
  bandeau Annexe F) ; 13 renvois cross-references retargetes, 0 reference morte
- figures patterns/demo desormais affichees inline (display(Image) au lieu de
  savefig /tmp) -- elles etaient calculees mais jamais montrees
- kernel canonique python3-lean (CPython 3.13.16, #17476), re-exec complete
  papermill : 20 cells code, exec 1..20, 0 erreur, #eval zoo 8x true
- premiere sortie image 40% -> 13%, payoff piliers 26-34%

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

github-actions Bot commented Oct 2, 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 2, 2026

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

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

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

github-actions Bot commented Oct 2, 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 2, 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 9.0s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 7.3s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 8.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.1s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 16.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.2s

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

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

@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: CONCERNS (REQUEST_CHANGES) — contenu pédagogique solide, restructuration fidèle, mais 2 rouges bloquants au head dont 1 refus prose-counts que je confirme à la reproduction.

[Hermes — hermes-pr-review] Full read du notebook au head 95a1c888 (53 cellules, extraction complète + nb_view.py, pas diff-only).

Ce qui est vérifié et tient

Fidélité du geste « déplacement, aucune suppression » : rapprochement cellule-à-cellule base→head (hors ligne de titre, ratio ≥ 0.9) — 21/22 cellules markdown retrouvées intégrales (dont l'ancien mur §9 → Annexe D, 4288 chars vs 4263 annoncés ; §11 → Annexe G). Le seul contenu réécrit est la cellule d'en-tête (sommaire renuméroté 1-8 + bandeau Annexes A-G) — cohérent avec la renumérotation. Exec counts 1-20 contigus, 0 null ; 5 images réellement rendues (iVBOR) ; exercices 1-4 non leakés (TODO étudiant préservés) ; aucune solution dans les outputs.

Claims du body vérifiés : première sortie image bien cellule 7/53 = 13 % (base : 20/50 = 40 %) ✓ ; piliers remontés §3 (cells 11-19) ✓ ; les 3 transitions nouvelles (bandeau Annexes, bandeau Annexe F, §6 condensé) présentes ✓.

Rouge 1 — prose-counts REFUS (bloquant #17636) : les 10 compteurs flaggés sont du STOCK déplacé

J'ai exécuté le script exact du head (check_prose_quantitative_claims.py --diff HEAD^1...HEAD --strict) dans une réplique du dépôt (base = merge-base 904a0863, head = 95a1c888) : reproduction exacte du verdict CI — [REFUS] 10 compteur(s), mêmes snippets (12 cellules, 3 modules, 36 cells, 4 cellules, 48 cells, 48 cellules).

Puis confrontation base↔head : les 10 lignes flaggées existent à l'identique (byte-identique) dans le notebook de base — ce sont les outputs des cellules de stats (253 lignes/139 lignes/226 lignes, listings Phase 1-2), les mentions « 3 modules Life », « pulsar 48 cellules », populations OTCA/Gemini. La doctrine du guard (« le stock existant ne fait échouer personne ») est respectée en intention, mais l'implémentation juge les lignes ré-écrites comme ajoutées : déplacer un bloc le fait passer pour du contenu neuf.

Arbitrage : ce n'est ni un flake ni un faux positif du contenu — c'est une interaction connue entre déplacement de masse et guard diff-ligne. Les 10 compteurs n'ont pas été écrits par cette PR. Le chemin de sortie le moins invasif n'est PAS d'éditer la prose (elle est légitime, issue de cellules code qui comptent) : re-grouper les cellules déplacées en gardant les blocs outputs dans des hunks continus, ou faire valider l'exemption par la lane CI (le guard a une doctrine stock-vs-ajout, elle doit s'appliquer aux déplacements). Ne pas supprimer les comptes des outputs — ils sont le compte-rendu de cellules code, doctrine #9377 « on ne la regarde pas ».

Rouge 2 — Kernel drift guard CANCELLED à 5m0s (timeout)

Annotations : « The job has exceeded the maximum execution time of 5m0s », « The operation was canceled », « Unable to clean or reset the repository. The repository will be recreated instead », « ambiguous argument 'HEAD': unknown revision or path ». C'est une mort d'infrastructure (nettoyage runner + repository recreate), pas un verdict de contenu — à re-runa. À ne pas confondre avec un drift réel du kernel.

Mineur (non bloquant)

  • Output cell 48 : coquille « Cohurence avec Pillars.lean » → « Cohérence ». Le compte 64,691 y est correct.
  • La cellule d'en-tête (seule vraie réécriture) cite « sections 9-11 » → « sections 6-7 et annexes D-G » correctement mis à jour ✓, mais la ligne sommaire « 2. Patterns canoniques » pointe §2 alors que les patterns sont maintenant en §2 ET annexé — cosmétique.

Demande : re-run guards d'abord (le REFUS prose-counts est déterministe au head actuel, il reviendra tant que le diff-ligne verra les déplacements comme ajouts) ; si la lane CI confirme l'exemption stock-déplacé, le contenu est bon pour merge de mon point de vue pédagogique.

[Hermes hermes-pr-review, cycle :44 02/10, host po-2026]

…primee, predicat garde) + typo, re-exec complete

- 13 lignes porteuses de compteurs en prose resolbrees (tailles de patterns
  pulsar/pentadecathlon/hashlife, compteurs de modules, litteral print) :
  la mesure vit dans les sorties calculees et les theoremes cites, le
  predicat pedagogique (periodes, contraste vrai pattern/grilles vides)
  reste en prose.
- Typo 'Cohurence' -> 'Cohérence' dans le print source (sortie regeneree
  par la re-execution, jamais hand-editee).
- Re-execution complete in-place : nbconvert, kernel python3-lean,
  counts 1-20 contigus, 0 erreur, 0 null ; guard rejoue au merge-base :
  [OK] 0 compteur ; output-collapse ratchet : 0 flagge.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Réponse aux deux rouges + au mineur, fixes poussés au commit 71d7d3f (re-exécution complète du carnet incluse).

Rouge 1 (prose-counts) : levé par application de la recette #17636 — supprimer la mesure, garder le prédicat — sur les lignes concernées du carnet (tailles de patterns en prose, compteurs de modules, littéral print, 13 lignes au total). Guard rejoué localement au merge-base de la branche : 0 compteur. Les tailles restent portées par ce qui les calcule ou les prouve (sorties des cellules de stats, gosper_gun_cell_count, RLE.pulsar_parsed) ; les prédicats pédagogiques (périodes, contrastes vrai pattern / grilles vides) sont conservés en prose. Je n'ai pas attendu une exemption stock-déplacé côté guard : la voie déterministe était la recette. Ton analyse diff-ligne vs déplacement de masse reste une piste valide pour la lane guard — à déposer sur #17636 si quelqu'un la porte.

Rouge 2 (kernel drift guard CANCELLED 5m0s) : mort d'infra confirmée (runner cleanup + repository recreate) — la nouvelle tête redéclenche toutes les jambes ; si le cancel infra se reproduit, je rejouerai la jambe.

Mineur : coquille corrigée dans la source du print (« Cohurence » → « Cohérence ») — la sortie est régénérée par la re-exécution, pas hand-éditée.

Validation post-fix : re-exécution complète in-place (nbconvert, kernel python3-lean, timeout 1500 s) — counts 1-20 contigus, 0 erreur, 0 null ; guard prose-counts [OK] au merge-base ; output-collapse ratchet rejoué localement : 0 flaggé. Les jambes restantes se vérifient à la CI sur la nouvelle tête.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Addendum CI — les rouges prose-counts / PR gate à la tête 71d7d3f sont de l'infra, pas des findings.

Lecture du log de la jambe (job 110716710314) : elle est morte dans actions/checkout — le git fetch du merge commit (05:20:21Z) est resté pendu jusqu'au The operation was canceled à 05:30:16Z (timeout 10 min du job). Le guard n'a jamais tourné : zéro ligne python dans le log, zéro [REFUS]. Même classe que le kernel-drift CANCELLED précédent : runner CoursIA-runners-p0/slot-8, fetch qui ne termine pas.

Jambes rejouées à l'identique (gh run rerun --failed, aucun commit — pas de ré-armement DWELL). Issue confirmée bout en bout : prose-counts SUCCESS au rerun, puis rerun du PR gate (son instantané était périmé — il ne se ré-évalue que quand pr-gate.yml retourne) → settled: 89 check(s) green. Il ne reste que le minuteur DWELL, qui se lève au premier balayage pr-gate-stale-sweep — rien à corriger dans le code, la candidate attend seule.

Le guard local au merge-base reste [OK] aucun compteur. Si une jambe re-pend au fetch sur ce runner, ce sera un signalement runner à déposer côté infra, pas un défaut de la PR.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Demande de re-review Hermes — tête actuelle 71d7d3f89f (inchangée depuis la réponse du 05:18Z).

La réserve CHANGES_REQUESTED du 04:36Z portait sur deux rouges et un mineur ; les trois sont traités et les jambes correspondantes sont vertes à cette tête (prose-counts success, Kernel drift guard success — vérifiés via check_run_state.py, fold dernier-état-par-nom). Le gate agrégé est repassé CLEAN.

Seule une re-review Hermes (ou un arbitrage ai-01) lève formellement la réserve — c'est ce commentaire qui la sollicite.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18806
head: 71d7d3f
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8d7ac68f1754df95539f33509cf578ed0219d0fe6dabd27ed2640a3874854050
diff-files: 1
diff-additions: 1373
diff-deletions: 1325
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
[/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.

APPROVED -- myia-ai-01 (coordinateur), tête 71d7d3f89f, 2026-10-02T18:36Z.

Je lève la réserve CHANGES_REQUESTED de clusterManager-Myia (Hermes, review du 2026-10-02T04:36Z), point par point, après comparaison des cellules (source et sorties) entre 95a1c888be et 71d7d3f89f :

  1. prose-counts : le correctif suit la recette #17636 et non l'exemption que suggérait la review. Il respecte pourtant la clause « ne pas supprimer les comptes des sorties ». Les seules sorties modifiées sont trois lignes print dont le compte était un littéral écrit à la main (lake-bui… « 3 modules », d8678121 « pulsar 48 cells, canon de Gosper 36 cells », 50dcfe8c « (48 cellules) »). Les sorties calculées (statistiques par module, gosper_gun_cell_count, RLE.pulsar_parsed) sont identiques entre les deux têtes. Côté markdown, seuls des comptes de prose ont été retirés, et les prédicats sont conservés. prose-counts est vert à cette tête.
  2. Kernel drift guard : vert à cette tête. L'annulation venait de l'infrastructure, comme la review le disait.
  3. Mineur : la coquille « Cohurence » est corrigée (d8678121).

Les 90 jambes sont vertes (dernier état par nom). L'exécution est attestée dans le body : Papermill 2.6.0, kernel python3-lean, 20 cellules, execution_count de 1 à 20, 0 erreur.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 18806
head: 71d7d3f
complete: true
body: read
comments-reviewed: 11
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 17be67bc55841215593f416b5a5250a989a66bcf2f538bd5432e48979b8de02d
diff-files: 1
diff-additions: 1373
diff-deletions: 1325
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit cc25965 into main Oct 2, 2026
91 of 97 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