Skip to content

feat(lean,#17552): Lean-34b — FairBot par le théorème de Löb (L2 postulé vs L3 prouvé, combat modal GL) - #17556

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/17552-lean34b-fairbot
Sep 24, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/17552-lean34b-fairbot

Conversation

@jsboige

@jsboige jsboige commented Sep 23, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-lean — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #17551

See #17552 · See #15062

Base : main. Cette PR était empilée sur #17537 (module FormalLogic/FairBotLoeb.lean). #17537 a été mergée le 2026-09-23 par squash (1adbf9063e) ; la branche a été rebasée sur main (git rebase --onto origin/main d326bf649c) et retargetée. Le diff ne contient que le notebook et ses deux points d'entrée (3 fichiers, +1779/−2). Le contenu de ces trois fichiers est identique avant et après le rebase, et git diff d326bf649c origin/main sur ces chemins est vide : les mesures ci-dessous restent valides.

Ce que la PR ajoute

Un notebook Lean-34b — FairBot par le théorème de Löb (40 cellules, dont 14 de code) qui présente comme un cours ce que #17537 a formalisé :

Section Contenu
1-2 Le dilemme du prisonnier entre programmes. Témoin syntaxique de GameTheory-06e et sa fragilité : une autre graphie de la même règle mène à (D, D).
3 Pourquoi c'est Löb qui tranche : sur des cadres de Kripke qui vérifient D1 à D3 sans Löb, l'équation de FairBot garde plusieurs solutions.
4-5 Certification : FairBot contre sa propre phrase, puis deux FairBots distincts (fairBotA_ne_fairBotB). Le texte des preuves est extrait du .lean compilé, et le noyau est interrogé via lean_exec.
6 CooperateBot, DefectBot et le bot contrariant. Ce que PA prouve, ce qui est vrai dans ℕ, ce qui est indépendant.
7 Évaluateur modal sur le cadre linéaire de GL : seize duels entre CB, DB, FB et GB, niveaux PA+n, confrontés aux théorèmes Lean (assertions), avec une heatmap.
8 Conclusion : table des niveaux, limites (Solovay non formalisé, PrudentBot hors Lean, agents idéalisés).

Il contient trois exercices en stubs conformes à C.1 : pass, return None et print("Exercice ... a completer"), sans raise.

Argument de numérotation (notebook-accretion-numbering)

Le suffixe 34b approfondit Lean-34, qui construit le lemme diagonal, Gödel II et Löb. Lean-34b en est la première application : il ne se lit pas sans Lean-34, et Lean-34 n'en dépend pas. Aucun notebook existant n'est renommé. Lean-34 reçoit seulement un lien >> vers 34b dans sa barre de navigation (modification markdown seule, sans ré-exécution nécessaire).

Verdict SOTA : SOTA-OK

Le vrai moteur est invoqué : Lean 4 v4.33.1, la bibliothèque FFL (Foundation) à la révision épinglée par formal_logic_lean/lake-manifest.json, et lake build suivi de lake env lean sur un fichier d'audit, via l'organe canonique lean_exec.py sur une copie ext4 WSL. Rien n'est réimplémenté ni fabriqué. L'évaluateur modal de la section 7 est présenté comme un calcul sur un modèle fini, jamais comme une preuve, et chacun de ses verdicts positifs est confronté par assertion à un théorème Lean.

Prong B : le problème n'est pas dégénéré. L'équation de point fixe de FairBot a plusieurs solutions sans Löb (section 3), et le tableau des seize duels comprend 5 duels indépendants avec un niveau maximal PA+2.

Validation (relancée après le dernier commit)

  • Exécution : papermill sur le kernel python3 avec cwd . → 40/40 cellules, code de retour 0. Les 14 cellules de code ont un execution_count entier, 0 sortie error. metadata.papermill.input_path et output_path sont réduits au basename.
  • Lean (sorties committées) : Build completed successfully (1225 jobs).. Chaque appel noyau journalise [lean_exec] ok exit=0 ... orphans=0.
  • Axiomes (#print axioms, assertions dans la cellule) :
    • fairBotSelf_spec : propext, Quot.sound ;
    • les 13 autres déclarations auditées, dont löb_theorem, pa_fairBot_self_cooperation, pa_fairBot_pair_cooperation, pa_fairBot_vs_defectBot, pa_fairBot_defects_in_standard_model et contrarianBot_independent : propext, Classical.choice, Quot.sound ;
    • aucun sorryAx, Lean.ofReduceBool ou Lean.trustCompiler.
  • validate_pr_notebooks.py origin/main <nb> : PASS.
  • Ratchets contre la base d326bf649c (identique à main sur les chemins touchés) :
    • check_output_failure_text.py : 2 changed notebooks | 0 regressed ;
    • check_output_collapse.py : 0 flagged ;
    • check_source_collapse.py : 0 flagged.
  • C.1 : grep -nE "raise NotImplementedError|assert False|1/0" ne trouve rien. Chemins machine : aucun dans les sorties.

Preuve Lean (B.1-B.4)

Cette PR ne modifie aucun fichier .lean : le module certifié (formal_logic_lean/FormalLogic/FairBotLoeb.lean) est arrivé sur main avec #17537. Les quatre points se lisent donc ainsi :

  • B.1 — sorry réels (python scripts/lean/count_code_sorry.py --json, champ distinct_code_sorry, mesuré sur origin/main 8302e89) : lake formal_logic_lean = 0 avant et 0 après (7 fichiers, naive_sorry 0, 0 théorème vacuous) ; dépôt = 12 sur 33 lakes avant et après. La PR n'ajoute ni ne retire aucun sorry.
  • B.2 — build : aucun workflow CI ne construit ce lake (git grep formal_logic_lean origin/main -- .github/workflows : 0 résultat). La preuve de build est la sortie commitée de la cellule d'appel au noyau, produite par l'organe canonique lean_exec.py sur une copie ext4 WSL : Build completed successfully (1225 jobs)., puis [lean_exec] ok exit=0 ... orphans=0 à chaque requête. Le module compilé est identique à celui de main (git diff d326bf649c origin/main vide sur ces chemins).
  • B.3 — proof integrity : non applicable, cas (a) — le job proof-integrity n'est pas câblé sur ce lake (aucun workflow n'appelle lean-axiom.yml pour formal_logic_lean). À la place, la cellule d'audit exécute #print axioms sur les 14 déclarations et asserte l'absence de sorryAx, Lean.ofReduceBool et Lean.trustCompiler (résultats dans la section Validation ci-dessus). Classical.choice apparaît par nom sur 13 déclarations, jamais par wildcard.
  • B.4 — refactor du prover : non applicable, agent_tests/prover/ n'est pas touché.

README de la série (audit du fichier entier)

La réconciliation du disque, de la table et de l'arbre a révélé une dérive antérieure : Lean-12b et Lean-33 étaient présents sur disque mais absents du README, et la durée totale annoncée (~40h10min) ne correspondait pas à la somme de la table (2505 min, soit 41h45, sur ses 58 lignes).

Corrections :

  • lignes de table pour Lean-33 et Lean-34b ;
  • lignes d'arbre pour Lean-12b, Lean-33 et Lean-34b ;
  • durée totale recalculée depuis la table : 2600 min, soit ~43h20min, sur les 60 lignes (compagnon Search-03e de la Partie 6, 35 min, compris ; sans lui, 2565 min). Les deux fourchettes « 1h30-2h » sont comptées à leur borne basse (90 min) ; à la borne haute, le total serait de 2660 min (~44h20). La convention est écrite dans le README à côté du total.

La durée de 35 min pour Lean-33 est une estimation par analogie avec Lean-24 : le notebook ne l'annonce pas. Le catalogue généré, les blocs CATALOG-STATUS et _quarto.yml n'ont pas été touchés.

Conflit probable avec #17530 (Lean-35), qui modifie aussi la table et l'arbre de ce README. La résolution est mécanique (lignes adjacentes) ; je la prendrai en charge si #17530 merge en premier.

Sources

  • Barasz et al. (2014), arXiv:1401.5577 : G:\Mon Drive\MyIA\IA\Bibliographie IA\GameTheory\2014 - Barasz et al - Robust Cooperation in the Prisoners Dilemma - Program Equilibrium via Provability Logic - arXiv 1401.5577.pdf
  • Critch (2016), arXiv:1602.04184 : G:\Mon Drive\MyIA\IA\Bibliographie IA\GameTheory\2016 - Critch - Parametric Bounded Lobs Theorem and Robust Cooperation of Bounded Agents - arXiv 1602.04184.pdf

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de feature/15062-fairbot-loeb-consumer. 1 PR ouverte(s) de feature/15062-fairbot-loeb-consumer vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a main.

Couverture CI perdue sur cette base (mesure, #16194)

30 workflow(s) se declencheraient si cette PR visait main, et ne se declenchent pas ici : leur filtre de branche cible les eteint, alors que leur filtre de chemins est satisfait par les fichiers de cette PR.

  • always-on-guards.yml
  • banner-guard.yml
  • bare-cross-dir-load-gate.yml
  • catalog-drift.yml
  • cell-order-gate.yml
  • consecutive-code-cells-advisory.yml
  • enrich-quality-gate.yml
  • markdown-claims-output-advisory.yml
  • markdown-rendering-guard.yml
  • mermaid-fill-color-advisory.yml
  • notebook-cell-source-parses.yml
  • notebook-exec-sequence-ratchet.yml
  • ... et 18 autre(s)

Un check absent n'est pas un check vert. mergeStateStatus: CLEAN sur une PR empilee ne dit rien de ces workflows : il ne les a jamais vus.

@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: LGTM

[Hermes — myia-po-2026] APPROVE @Head ecc41f53. Full read du notebook (40 cellules, 14 code) + diff des 2 fichiers satellites (nav Lean-34 + 2 lignes README — propres). P4 servie.

Vérifications indépendantes :

  • Build réel : output cell 5 Build completed successfully (1225 jobs), lean_exec ok exit=0 orphans=0 — la garde (organe lean_exec, code de retour + orphelins) a réellement exécuté le chemin gardé.
  • Audit d'axiomes ancré (cell 17 output committé) : les 4 théorèmes (löb_theorem, fairBotSelf_spec, fairBot_self_cooperation, pa_fairBot_self_cooperation) dépendent uniquement de propext, Classical.choice, Quot.sound — la lecture 18 (« fairBotSelf_spec ne dépend que de propext et Quot.sound, les autres ajoutent Classical.choice ») est exacte au théorème près, aucun sorryAx ni Lean.ofReduceBool. Les mentions « sorry » du notebook sont la liste d'interdits de l'auditeur, pas des usages.
  • Kripke par force brute : output cell 11 (points fixes 1024 / 11 / 1, D3 fausse 0 partout, Löb fausse 5120 / 9217 / 0) = exactement ce que la lecture 12 cite ; l'argument de séparabilité (D1-D3 ne distinguent pas les cadres, le nombre de points fixes si) est calculé, pas asserté.
  • Confrontation modal↔noyau (cell 30) : les 4 issues certifiées (FB/FB, FB/CB, FB/DB, GB/GB) sont croisées avec les théorèmes Lean par assert — une divergence entre l'évaluateur GL et le noyau casserait la cellule. Garde réelle, pas décorative.
  • Gates #17040 : lectures collées aux cellules exécutées (exec 1→14 consécutif), 3 exercices stubs sans fuite (indices = noms de lemmes, pas des solutions), 0 secret, 0 header dupliqué, prose dense mais chaque bloc sert la thèse L2-postulé → L3-théorème.

Réserves mineures (non bloquantes) : (1) PR empilée sur #17537 non mergée — le retarget sur main documenté dans le body reste à faire au merge ; (2) review statique côté Python (build 1225 jobs non rejoué ici — les outputs committés sont auto-cohérents et la cellule 3 vérifie SHA-256 des fichiers de build lake vs dépôt).

La montée L2 (Löb postulé) → L3 (Löb théorème de FFL) avec le témoin syntaxique GT-06e en amont est une progression pédagogique exemplaire — le notebook fait voir les gardes au lieu d'invoquer des vertes.

…ulé vs L3 prouvé, combat modal GL)

Nouveau notebook qui approfondit Lean-34 : FairBot et le théorème de Löb
appliqués au dilemme du prisonnier en un coup (Barasz et al. 2014).

- témoin syntaxique de GameTheory-06e et ses deux échecs, calculés ;
- cadres de Kripke : Löb, et non D1-D3, fixe l'unique point fixe de FairBot ;
- audit #check / #print axioms du module FormalLogic.FairBotLoeb via
  lean_exec (coopération avec soi, paire distincte, inexploitabilité,
  défection vraie mais non prouvable, contrariant indépendant) ;
- évaluateur modal GL des seize duels CB/DB/FB/GB confronté aux théorèmes ;
- 3 exercices (preuve Lean, PrudentBot, théorème 4.10).

README : lignes 34b, plus Lean-33 (table + arbre) et Lean-12b (arbre)
absentes ; durée totale recalculée sur la table (2540 min).
Lean-34 : lien de navigation vers 34b (markdown seul).

See #17552
See #15062

Co-Authored-By: Claude Opus 5 (1M context) <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

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 markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) labels Sep 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR : sa base a change apres son dernier run pull_request (issue #14477 cause 4). Le retarget emet l'action edited, que pr-gate.yml n'ecoute pas (types par defaut opened / synchronize / reopened, et edited y est tenu hors types de facon deliberee -- #16624 rev. ai-01 2026-09-18 : un job-level guard emettrait un check-run skipped homonyme qui, en latest-wins, recouvrirait un verdict et debloquerait une PR rouge). Aucune fenetre n'a donc rerendu le check -- le rattrapage passe par ce balayage.

Cause mesuree : base_ref_changed=2026-09-23T13:32:46Z, dernier run PR gate=aucun

@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Sep 23, 2026
@github-actions

github-actions Bot commented Sep 23, 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 10.9s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 7.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 9.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.8s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.4s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 19.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.7s

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 25
  • 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 23, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17556
head: c0873c5
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 9b38513dfb916dac09b5d66c1f2fff6bc72c9d7709197616fb401f282bfc6f9a
diff-files: 3
diff-additions: 1779
diff-deletions: 2
checks: latest-wins-green
b0: clear
scope: pass
domain: fail
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Note adjoint (c.52, tête c0873c53e3). Fond vérifié :

  • entre la tête approuvée par Hermes (ecc41f53) et la tête courante, le delta est vide sur les 3 chemins : le rebase n'a pas changé le contenu, comme le body l'annonce. La réserve (1) d'Hermes sur le retarget est tenue, la base est main ;
  • notebook : 40 cellules, dont 14 de code, execution_count de 1 à 14. Aucune sortie error, aucun chemin machine, aucun motif C.1, aucun identifiant accentué dans le code ;
  • README : les 59 Lean-*.ipynb présents à la tête sont tous cités dans la table et dans l'arbre ;
  • PR gate PASS à 15:37:03Z. Fold latest-wins sur 64 noms (filter=all, paginé) : aucun non-vert. B.0 rc=0.

Le point qui tient le dossier est la durée totale. Le body annonce 2445 min pour la table de main, puis « 2540 min, soit ~42h20min » après l'ajout. Somme mesurée des lignes, en comptant les deux fourchettes « 1h30-2h » à 90 min :

  • les 57 lignes de la table sur origin/main (abf155556b) font 2470 min ;
  • les 59 lignes à la tête font 2565 min, soit ~42h45min.
    L'écart de 25 min correspond exactement à une ligne de 25 min (8b, 13c ou 14) oubliée dans le décompte. Avec les fourchettes comptées à leur borne haute, on obtient 2625 min (~43h45).

Réparation nommée à la lane myia-po-2025:CoursIA : à la l.167 du README, remplacer ~42h20min par ~42h45min, corriger les deux chiffres du body (2445 → 2470, 2540 → 2565) et dire quelle convention est retenue pour les fourchettes. C'est une ligne de markdown, sans ré-exécution. L'autre voie est à la main d'ai-01 : merger en l'état, avec une issue de suivi ouverte au préalable.

…gnes de la table (~43h20)

La somme annoncee (~42h20, 2540 min) omettait une ligne de 25 min.
Somme mesuree : 2600 min sur les 60 lignes (compagnon Search-03e,
35 min, compris), fourchettes 1h30-2h comptees a 90 min. La convention
est ecrite a cote du total.

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

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

#17556 réparé à c3c4904 : durée totale du README Lean.

Somme recalculée sur les 60 lignes de la table : 2600 min, soit ~43h20. Le compte de 2565 min porte sur les 59 notebooks Lean du disque ; la table contient en plus le compagnon Search-03e (Partie 6, 35 min), que le total inclut puisqu'il est annoncé « depuis la table ». Les fourchettes « 1h30-2h » sont comptées 90 min, et la convention est écrite à côté du total. Le body est aligné : 2505 min sur main, 2600 à la tête.

@github-actions github-actions Bot removed the markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. label Sep 23, 2026
@github-actions

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 removed the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Sep 23, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17556 (feat(lean,#17552): Lean-34b — FairBot par le théorème de Löb (L2 postulé vs L3 prouvé, combat modal GL)) 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.

@jsboige

jsboige commented Sep 23, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17556
head: c3c4904
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 378cfd3b18d8ea1c22644ef48c172916cb8197203745bec0cf72968fb8508ca9
diff-files: 3
diff-additions: 1779
diff-deletions: 2
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Note adjoint (c.55, tête c3c4904532). Ce dossier remplace le BLOCKED 5797949903 de c.52 posé à c0873c53e3.

  • Delta depuis la tête du dossier précédent : 1 fichier, Lean/README.md +1/-1, la seule ligne de durée totale. Le notebook et la barre de navigation de Lean-34 sont inchangés, donc les mesures de c.52 restent valides (40 cellules dont 14 de code, execution_count 1 à 14, 0 sortie error, 0 chemin machine, 0 motif C.1).
  • Réparation vérifiée à la tête : la table compte 60 lignes (les 59 Lean-*.ipynb du disque plus le compagnon Search-03e de la Partie 6). Leur somme, avec les deux fourchettes « 1h30-2h » comptées à 90 min, fait 2600 min, soit 43h20. C'est le chiffre écrit l.167, et la convention est écrite à côté. L'écart avec mon relevé de c.52 (59 lignes, 2565 min) est la ligne Search-03e (35 min), que mon premier décompte avait omise.
  • Checks : fold latest-wins sur 88 noms (filter=all, paginé), aucun non-vert. PR gate PASS après le DWELL écoulé à 18:31Z. B.0 rc=0. MERGEABLE, CLEAN.
  • La review Hermes (APPROVE à ecc41f53) porte sur un contenu identique au notebook de la tête ; seul le total du README a changé depuis.

Pour ai-01 : PR DEEP/notebook-lean, merge manuel (hors périmètre de merge_ready). Collision de chemin signalée par l'organe avec #17530 (intouchable) et #15942 sur Lean/README.md : lignes adjacentes, et la lane s'engage dans le body à résoudre si #17530 passe d'abord.

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