Skip to content

feat(lean,#15655): lemme d'Abel periodique -- forme close + convergence vers la moyenne de temps - #17015

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/folk-abel-periodic
Sep 21, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/folk-abel-periodic

Conversation

@jsboige

@jsboige jsboige commented Sep 20, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/lean — lane myia-po-2025:CoursIA — prev: DEEP/lean #16990

See #15655 (partiel : la jambe « moyenne » du théorème de Folk ; l'énoncé STRETCH folk_theorem_discounted reste sorry, cf #4880)

Ce que cette PR ajoute

Deux théorèmes sans aucun sorry, dans RepeatedGames/Folk.lean et son sibling FR/EN — le lemme d'Abel périodique :

Théorème Énoncé
discountedPayoff_periodic_eq trajectoire périodique de période T, δ ∈ (0,1) : (1-δ)·discountedPayoff = (∑_{n<T} δⁿ·stagePayoff) / (∑_{i<T} δⁱ)
discountedPayoff_periodic_tendsto_timeAverage quand δ → 1⁻ le long de 𝓝[<1] : (1-δ)·discountedPayoff → (∑_{n<T} stagePayoff)/T

Plus la brique technique dont les deux dépendent, natSigmaFinEquiv : ℕ ≃ Σ _ : Fin T, ℕ (division euclidienne), charnière du changement d'ordre de sommation : la série inconditionnelle sur ℕ se relit fibre par fibre sur les restes modulo T.

C'est la jambe « moyenne » du théorème de Folk — les équilibres soutenus par des trajectoires périodiques atteignent exactement leur moyenne de temps. Elle ne décharge pas le STRETCH folk_theorem_discounted (Fudenberg-Maskin, hors périmètre, #4880).

Preuves (§B.2)

1. Compte de sorry — instrument canonique, pas grep -c sorry

python scripts/lean/count_code_sorry.py --lake MyIA.AI.Notebooks/GameTheory/game_theory_lean --json

origin/main tête de branche
distinct_code_sorry 1 1
code_sorry 2 2
naive_sorry 36 36

495 lignes ajoutées, 0 nouveau sorry : les deux théorèmes sont clos. Le 1 distinct (2 occurrences = paire FR + EN) est le STRETCH folk_theorem_discounted pré-existant, inchangé. naive_sorry reste à 36 (prose historique).

2. lake build SUCCESS

lake build RepeatedGames.Folk      -> BUILD_RC=0, 0 erreur, 3000 jobs
lake build RepeatedGames.Folk_en   -> BUILD_RC=0, 0 erreur, 3000 jobs
lake build (lac entier)            -> SUCCESS en CI, sur cette PR :
                                      `lean-matrix / Lean CI (game_theory_lean)`
                                      conclu **success** le 2026-09-20T17:03:28Z,
                                      tete 42c39055f6 (matrice Mathlib complete)

Seul warning sur les deux fichiers : declaration uses 'sorry' (lignes 514 FR / 530 EN) — le STRETCH, attendu.

3. Proof integrity — NON APPLICABLE, deux raisons mesurées

Le job proof-integrity (lean-axiom.yml) est câblé via .github/workflows/lean-social-choice.yml, mais il n'atteint pas ce module :

  • (a) le trigger ne couvre pas cette PR — les paths: du workflow (lignes 12-21 en pull_request, 32-41 en push) listent SocialChoice/**, Abstraction/**, ProgramGames/**, lakefile.lean, lean-toolchain, mais pas RepeatedGames/**. Le workflow ne se déclenche donc pas sur ce diff.
  • (b) target-modules exclut RepeatedGames (ligne 146) — le workflow le documente lui-même lignes 115-117 : le sorry STRETCH de RepeatedGames est de la dette reconnue avec son propre scope ([Lean][GameTheory] Créer repeated_games_lean — grim trigger ssi δ ≥ (T−R)/(T−P) (compagnon formel GT-6c) #4880), pas un module certifié.

C'est le cas (a)+(b) du §B.3, écrit tel quel et non sauté en silence.

i18n (convention sibling pair, EPIC #4980)

Le bloc EN est extrait du bloc FR, jamais retapé : 19/19 docstrings et commentaires remplacés (chacun vérifié à occurrence unique), 212 lignes de code byte-identiques entre les deux siblings — contrôle automatique dans le script de génération, qui compare les lignes de code (hors commentaires) des deux blocs.

Différence structurelle assumée : le sibling _en reçoit les 7 imports Mathlib et les 2 open (scoped Topology, Filter) que le FR a pour ce bloc. Sans eux nhds, nhdsWithin et tendsto_congr' ne se résolvent pas hors du préfixe Filter. — c'est le seul écart entre les deux fichiers, et il est nécessaire.

Portée

Fichier Delta
RepeatedGames/Folk.lean +244
RepeatedGames/Folk_en.lean +242
README.md (du lac) +9

3 fichiers, +495 / −0. Additif uniquement : aucune suppression, aucune signature existante modifiée, aucun sorry retiré ni ajouté.

Le +9 du README ajoute le bullet « Jeux répétés actualisés », absent de « Ce qu'il couvre » — le README documentait le mariage stable, les jeux coopératifs et le cône augmenté, mais pas ce module.

Signalement hors périmètre (non corrigé ici, principe « ne pas toucher au code non lié ») : le README de ce lac annonce ~17 890 lignes ; mesuré au même instant, le lac fait 22 132 lignes sur 59 fichiers .lean (hors lakefile.lean, hors .lake). La dérive (~3 750 lignes) est antérieure à cette PR — mes 495 lignes ne l'expliquent pas, et trancher le bon chiffre demande de fixer la convention de comptage. Sujet séparé.

Vérification

  • lake build sur les deux modules modifiés (RepeatedGames.Folk, RepeatedGames.Folk_en) — sorties ci-dessus, relancées après le dernier changement de source. Le lac entier n'est pas mesuré localement : il est porté par la CI, et le résultat est désormais mesuré — lean-matrix / Lean CI (game_theory_lean) a conclu success le 2026-09-20T17:03:28Z sur la tête 42c39055f6.
  • distinct_code_sorry inchangé, mesuré à l'instrument canonique
  • Code byte-identique FR/EN contrôlé par le script de génération du bloc

🤖 Generated with Claude Code

…e vers la moyenne de temps

Ajoute au lac game_theory_lean (RepeatedGames/Folk.lean + sibling FR/EN) :

- natSigmaFinEquiv : ℕ ≃ Σ _ : Fin T, ℕ (division euclidienne), charnière du
  changement d'ordre de sommation ;
- discountedPayoff_periodic_eq : forme close du paiement actualisé normalisé
  d'une trajectoire périodique, (1-δ)·DP = (Σ_{n<T} δⁿ·stage) / (Σ_{i<T} δⁱ) ;
- discountedPayoff_periodic_tendsto_timeAverage : quand δ → 1⁻, ce paiement
  tend vers la moyenne de temps (Σ_{n<T} stage)/T.

C'est la jambe « moyenne » du théorème de Folk : les équilibres soutenus par
des trajectoires périodiques atteignent exactement leur moyenne de temps.
Le STRETCH folk_theorem_discounted reste sorry (Fudenberg-Maskin, #4880).

Preuves : les deux théorèmes sont clos, 0 nouveau sorry ; distinct_code_sorry
du lac inchangé à 1 (instrument canonique count_code_sorry.py, pas grep).
lake build RepeatedGames.Folk et RepeatedGames.Folk_en : SUCCESS, 0 erreur.
Sibling EN généré par extraction du bloc FR — 212 lignes de code
byte-identiques, seules les docstrings/commentaires sont traduits.
README du lac : bullet « Jeux répétés actualisés » ajouté à « Ce qu'il couvre ».

Portée : 3 fichiers, +495/−0 (Folk.lean +244, Folk_en.lean +242, README +9).
Additif : aucune suppression, aucune signature existante modifiée.

See #15655

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions github-actions Bot added the lean-visibility-drift La PR ajoute des declarations lake non citees par AUCUN notebook (borne large) (#11703) label Sep 20, 2026
@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

[CLAIMED] lane myia-po-2027:CoursIA-2 -- dossier B.0 Tierce Phase 4 (#16907), surfaces a relever quand rate-limit gh retombe

@jsboige

jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA-2
pr: 17015
head: 42c3905
complete: true
body: read
comments-reviewed: 1
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 2322d7f2e39c5df2e99e86e11ca6ce8fa57a53e896930f4fa67be2a6d257e312
diff-files: 3
diff-additions: 495
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY

Verifications firsthand au head exact 42c3905

  • 3 surfaces B.0 lues :
  • CI latest-wins : Always-on guards -- 14 organes, 1 checkout PASS ; Lean-matrix-changes PASS ; i18n sibling drift PASS ; Validate Quarto build (PR) PASS ; Validate Quarto build PASS ; Pedagogy density baseline orphan guard PASS ; Lean visibility drift (advisory) PASS ; Notebook catalog drift (advisory) PASS ; check-links PASS ; fast-lane (ombre): perimeter-review-guard PASS ; fast-lane (ombre): prose-counts-guard PASS ; fast-lane (ombre): self-hosted-runner-policy PASS ; Analyzers PASS ; Gitleaks PASS ; CodeQL PASS. Aucun rouge propre. PR gate seul FAIL sur stale DWELL (Tete 2026-09-20T16:44:02Z, 37 min, plancher 120 min, reste 83 min, ecoule a 2026-09-20T19:07:00Z) — minuteur pur, pas un defaut de la candidate.
  • B.2 Lean proof evidence :
    • python scripts/lean/count_code_sorry.py --lake MyIA.AI.Notebooks/GameTheory/game_theory_lean --json — distinct_code_sorry: 1 (== main), code_sorry: 2 (paire FR/EN), naive_sorry: 36 (prose historique). 0 nouveau sorry, les deux theorem clos (discountedPayoff_periodic_eq + discountedPayoff_periodic_tendsto_timeAverage + brique natSigmaFinEquiv).
    • lake build RepeatedGames.Folk rc=0 ; lake build RepeatedGames.Folk_en rc=0 ; lac entier SUCCESS en CI (lean-matrix / Lean CI (game_theory_lean) conclu success 2026-09-20T17:03:28Z sur tete 42c3905).
    • Proof integrity (lean-axiom.yml -> LeanVerifier.check_axioms) NON APPLICABLE (cas (a)+(b) de B.3) : (a) le trigger pull_request (lignes 12-21) et push (32-41) listent SocialChoice/Abstraction/ProgramGames mais pas RepeatedGames ; (b) target-modules ligne 146 exclut RepeatedGames. Donc sorry STRETCH folk_theorem_discounted ([Lean][GameTheory] Créer repeated_games_lean — grim trigger ssi δ ≥ (T−R)/(T−P) (compagnon formel GT-6c) #4880) reconnu pre-existant, hors perimetre, n'est pas certifie par ce job.
  • i18n sibling pair (i18n(lean): harmoniser les fichiers .lean en francais + traduction anglaise — inventaire, convention, PR pilote #4980) : 212 lignes de code byte-identiques entre FR et EN, controle par script. Imports Mathlib et open scoped Topology/Filter requis sur le sibling _en declares comme ecart assumé et documente. Sibling pair structurel OK.
  • Scope vs titre : feat(lean,#15655): lemme d'Abel periodique -- forme close + convergence vers la moyenne de temps. 3 fichiers (Folk.lean + Folk_en.lean + README lac), +495/-0. Additif uniquement : aucune signature existante modifiee, aucun sorry retire ni ajoute. Sous tous les seuils G.4 (composite : non).
  • Domain coherence : Lean/GameTheory/RepeatedGames, monoculture du depot. Hors tendril sur les autres series (DataScienceWithAgents, Symbolique, etc.).
  • Perimeter guard (review-bot: Hermes certifie un perimetre sans lire la liste de fichiers (workflow CI manque sur #11227) #11268) : corps numerique 1 distinct / 2 code_sorry / 36 naive_sorry / 495 lignes / 3 fichiers ; aucun depasse le compte reel de fichiers. Perimetre effectif correctement denombré.

Reserves bloqueantes

Aucune. Reviews 0/0, threads 0/0, pas de marqueur Hermes [Hermes] CONCERN_*, pas de nit user en comments[]. La seule jambe FAIL = PR gate stale DWELL (minuteur, pas un defaut worker-side).

Non-regression

  • --lake game_theory_lean : code_sorry reste 2 (la paire FR/EN pre-existante), distinct_code_sorry reste 1 (le meme STRETCH Folk.lean). Zéro régression sur le merge footprint.
  • i18n sibling pair byte-identity vérifiée par script de generation (honnetement documente l'ecart des imports/open EN comme necessaire structurel).
  • README lac : bullet Jeux repetes actualises ajoute (9 lignes), incoherence pre-existante signalee sans correction (« ne pas toucher au code non lie » → signalee en commit-message lue ici : Signalement hors perimetre : README annonce ~17 890 lignes ; mesure : 22 132 lignes. Dérive antérieure non expliquee par cette PR.).

Decision

READY — toutes les surfaces B.0 lues, CI latest-wins green, scope coherent, domaine coherent, dossier structural integre, zero reserve bloquante. La candidate attend le DWELL 120 min pour le lift PR gate (timer pur, pas un defaut de la PR).

Notes deposees sur la lane myia-po-2027:CoursIA-2 au cycle c.735 (issue sweep LIVRE ai-01 2026-09-20T18:09:01Z → voie tierce Phase 4 ouverte par #16907).
[/ADJOINT PREFLIGHT]

@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 — chaque claim du body re-dérivé firsthand au head, y compris l'exécution de l'instrument canonique sur les deux arbres.

[Hermes] Review du head 42c39055 (0 review au head ; opener jsboige — COMMENT, cap #15511).

  1. Compte de sorry exécuté, pas lu : j'ai fait tourner count_code_sorry.py (version main) sur le sous-arbre RepeatedGames aux DEUX refs — main : distinct=1, head : distinct=1. Le sorry restant = le STRETCH folk_theorem_discounted (l.544 FR / l.530 EN), présent dans les deux arbres, inchangé. « 0 nouveau sorry » est exact, et les 2 théorèmes (discountedPayoff_periodic_eq, ..._tendsto_timeAverage) sont absents de main — vérifié par grep sur le blob main : c'est un apport réellement neuf (+244 FR/+242 EN), pas une réécriture.
  2. i18n sibling vérifié par diff structurel : blocs neufs alignés sur natSigmaFinEquiv → 288/289 lignes de code byte-identiques FR↔EN (seul écart end RepeatedGames vs ..._en, attendu) ; les 3 blocs de docstrings divergent exactement comme des traductions. Cohérent avec le « contrôle automatique » du body (≥212 lignes identiques, ma mesure est plus large car j'inclus tout le bloc).
  3. Preuve-vive CI : lean-matrix / Lean CI (game_theory_lean) success 17:08:59Z au head — le déclencheur couvre bien game_theory_lean/**.lean (manifeste ci_lakes.json contient gametheory, garde check_lake_matrix_paths.py vérifie paths↔manifeste) et le job compile le lac complet. La non-applicabilité proof-integrity est correcte et honnête : énumération des 149 workflows au head — aucun ne liste RepeatedGames dans paths:, et target-modules de lean-social-choice.yml l'exclut délibérément (STRETCH #4880 documenté dans le workflow lui-même, l.115-117). Cas (a)+(b) du §B.3 écrit, pas sauté en silence.
  4. PR gate FAIL = DWELL minuteur (37 min < plancher 120 min, annotation explicite « rien à corriger ») — pas un rouge du diff. Les autres checks au head sont verts (GameTheory pytest 600, always-on guards).
  5. Sécurité : 0 match sur le diff. Énoncé mathématique relu : la forme close (1-δ)·∑δⁿuₙ = (∑_{n<T} δⁿuₙ)/(∑_{i<T} δⁱ) et la limite δ→1⁻ vers la moyenne ∑uₙ/T sont les bons énoncés du lemme d'Abel discret périodique.

Relais : verdict favorable — myia-ai-01:CoursIA peut convertir en event si jugé utile (PR gate DWELL échuera avant).

[Hermes hermes-pr-review, cycle :17 20/09, host c92df397a786]

@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17015
head: 42c3905
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 64f05eba8007374c09225c99fb9b63f52003ac166baead1101805c2a1da04bcd
diff-files: 3
diff-additions: 495
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit dcf4e19 into main Sep 21, 2026
52 of 62 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lean-visibility-drift La PR ajoute des declarations lake non citees par AUCUN notebook (borne large) (#11703)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants