Skip to content

[Lean][infra] Carte du materiel Lean et regle d'accretion d'un lac (suite de #4365) #23097

Open

Description

@jsboige

Part of #4362

D'où vient cette issue

Concern de jsboigeEPF sur la PR #23030, verbatim :

Quid de https://github.com/jsboige/CoursIA/blob/main/MyIA.AI.Notebooks/GameTheory/game_theory_lean/SocialChoice/Arrow.lean ? Il faut un vrai audit et une consolidation du matériel Lean du dépôt […] trop où sont les choses en l'état. On avait fait un effort pour commencer à rassembler ce qui pouvait l'être. L'effort n'a pas été suivi et l'entropie a repris le dessus. Prévoir une issue spécifique.

Cette issue est cette issue spécifique. Le Concern porte deux affirmations : l'effort n'a pas été suivi, et l'entropie a repris le dessus. La mesure départage les deux, et le résultat n'est pas celui qu'on attendait.

Première mesure — l'état, rejouable

Mesure Commande Résultat
Lakes du dépôt git ls-files '*lakefile.lean' '*lakefile.toml' hors .lake/packages 40 lakefiles — 39 lacs propres + 1 amont vendu (reference_docs/stable_marriage/upstream)
Modules Lean propres git ls-files '*.lean' hors .lake/packages, _peters/ 880
Miroirs de traduction git ls-files '*_en.lean' hors packages 384
Lakes déclarés au CI scripts/lean/ci_lakes.json 27 entrées
Couverture du gate d'axiomes python scripts/lean/check_axiom_gate_coverage.py --ref HEAD --check 23 couverts | 13 sans gate (jamais eu) | 0 perdus, rc 0

Six plus gros lacs, en modules propres : grothendieck_lean 196, conway_lean 91, learning_theory_lean 62, game_theory_lean 62, discrepancy_lean 54, knot_lean 47.

Deuxième mesure — l'effort a bien été suivi, et il a été fermé sur mesure

#4365 — « Regrouper les lakes cohésifs (GameTheory 6→2) » — est CLOSED depuis le 2026-08-14, et sa fermeture n'est pas un label : ai-01 y a repris les trois critères d'acceptance un par un contre main. Verdict mesuré, verbatim de la clôture :

Lake État au 2026-08-14
cooperative_games_lean absent (absorbé dans game_theory_lean)
stable_marriage_lean absent (absorbé)
social_choice_lean coquille à 0 module retirée par #10151, tombstone redirigeant vers ../game_theory_lean/SocialChoice/
minimax_lean (9) · conway_cgt_lean (3) séparés volontairement, clause anti-god-lake
social_choice_lean_peters non absorbé, et assumé INTRINSIC (#7081) — toolchain Peters v4.27.0-rc1 contre v4.31.0-rc1 chez nous

Donc l'effort a été suivi, mesuré, et clos avec son résidu nommé.

Troisième mesure — ce qui a repris, c'est l'accrétion, pas la dispersion

Dates d'ajout du lakefile de chaque lac GameTheory (git log -1 --diff-filter=A), contre la date de clôture de #4365 (2026-08-14) :

Lake Modules Premier commit du lakefile Vs clôture #4365
conway_cgt_lean 3 2026-06-05 antérieur
lean_game_defs 12 2026-06-10 antérieur
lean_game_defs_ext 28 2026-06-10 antérieur
minimax_lean 9 2026-06-24 antérieur
game_theory_lean 62 2026-07-10 antérieur (47 modules à la clôture)
assignment_lean 13 2026-08-23 +9 jours
asymmetric_information_lean 12 2026-08-26 +12 jours

Deux lacs sont nés dans les deux semaines qui ont suivi la clôture de la consolidation, et game_theory_lean est passé de 47 à 62 modules. Ce n'est pas la consolidation qui a échoué : c'est la série qui a ré-accrété après elle. #4365 ne pouvait pas couvrir des lacs qui n'existaient pas encore, et il n'existe aujourd'hui aucune règle qui dise si un nouveau lac de série est légitime ou s'il doit être un module de plus dans le lac de la série.

C'est le vrai sujet de cette issue, et il est structurel, pas historique.

Ce que la mesure écarte aussi

Aucune duplication de preuves entre lacs. Les seuls noms de modules qui se répètent sont des conventions : lakefile.lean (36), Basic.lean (19), Basic_en.lean (16), Examples.lean (3). Aucun théorème n'est prouvé deux fois sous le même nom de module dans deux lacs. Consolider ne veut donc pas dire « fusionner des doublons » — il n'y en a pas.

Et le gate d'axiomes le dit lui-même, verbatim :

Cette couverture est une MESURE, pas un verdict de sûreté : un lake sans gate d'axiomes n'est pas illicite, il doit seulement être CONNU comme tel (#17097 critère 3).

Donc cette issue ne demande pas de câbler treize gates. Elle demande que les treize soient connus, et qu'une règle d'accrétion existe.

Tranches, dans l'ordre

T1 — La carte datée, et l'organe qui la régénère

Une page docs/reference/lean-material-map.md : par lac — chemin, modules propres, miroirs _en, présence au ci_lakes.json, verdict du gate d'axiomes, dette distinct_code_sorry, et date de naissance du lac. Plus l'organe qui la produit (scripts/lean/lean_material_map.py --json --check), parce qu'une table recopiée à la main dérive à chaque merge — c'est la maladie que l'issue soigne, et la colonne « date de naissance » est ce qui rend l'accrétion visible sans recherche git.

Sortie : la page, et --check qui échoue quand page et arbre divergent.

T2 — La règle d'accrétion d'un lac (la tranche qui décide)

Un lac nouveau dans une série existante : quand est-ce légitime ? Trois cas à trancher, chacun avec sa mesure :

  1. Toolchain divergente → légitime (social_choice_lean_peters, INTRINSIC docs(gt,#4365): document INTRINSIC verdict for social_choice_lean_peters #7081). Rien à changer.
  2. Théorie distincte → légitime (minimax, conway_cgt), déjà tranché par la clause anti-god-lake de [Lean][infra] Regrouper les lakes cohesifs post-convergence (GameTheory 6->2, modele multi-module) #4365.
  3. Même théorie, même toolchain → c'est le cas non couvert. assignment_lean et asymmetric_information_lean sont-ils 1 et 3 ? La question se tranche en lisant SocialChoice/ et les imports, pas par principe.

Sortie : une phrase de règle, écrite là où un contributeur la lira (README de la série + docs/reference/lean-material-map.md), et pour les deux lacs récents, soit un statut documenté, soit un grain de fusion ouvert séparément.

T3 — lean_game_defs et lean_game_defs_ext : un lac ou deux ?

Douze et vingt-huit modules, le second nommé comme l'extension du premier. Lire les deux lakefile et les imports croisés, puis dire si _ext est une extension réelle (le nom doit alors le dire et le lakefile le refléter) ou un lac indépendant (le nom est alors trompeur). Le geste par défaut est documenter ; la fusion n'est retenue que si elle ne casse aucun import de notebook.

T4 — Les treize sans gate, déclarés connus

Publier dans docs/reference/lean-axiom-coverage.md la liste des treize lacs avec, pour chacun, la raison (lac externe, build trop lourd, jamais câblé). La liste est déjà produite par l'organe ; il s'agit de la publier au lieu de la laisser dans une sortie de commande. Critère 3 de #17097, coût CI nul.

Acceptance

  • T1 : la page existe, lean_material_map.py --check rend 0 sur main, et régénérer la page depuis l'arbre redonne le même fichier
  • T2 : la règle d'accrétion est écrite en une phrase, et assignment_lean / asymmetric_information_lean reçoivent chacun un verdict explicite (légitime-documenté, ou grain de fusion ouvert et nommé)
  • T3 : la décision est écrite avec sa mesure (imports croisés, contenu des deux lakefile), et le lakefile ou le nom reflète la décision
  • T4 : les treize lacs sont énumérés dans lean-axiom-coverage.md avec leur raison
  • Aucun sorry ajouté : count_code_sorry.py --json distinct_code_sorry mesuré avant/après chaque tranche, non augmenté

Ce que cette issue n'est pas

  • Ce n'est pas une réouverture de [Lean][infra] Regrouper les lakes cohesifs post-convergence (GameTheory 6->2, modele multi-module) #4365 : celui-ci a livré ce qu'il annonçait, mesuré pièce par pièce, et sa clôture est fondée. L'objet ici est l'après, qui n'avait pas été couvert.
  • Ce n'est pas un mandat de câbler treize gates d'axiomes : l'organe de couverture dit lui-même que la couverture n'est pas un verdict de sûreté.
  • Ce n'est pas une fusion décidée d'avance : T2 et T3 se tranchent par la mesure, et le défaut de repli est de documenter, pas de déplacer.
  • Ce n'est pas une revue de traduction : les 384 miroirs _en sont une dimension de la carte (T1), pas un chantier ici.

🤖 Generated with Claude Code

Activity

  1. jsboige commented on Oct 28, 2026

    @jsboige
    OwnerAuthor

    [DELIVERED] lane myia-po-2025:CoursIA -- PR #23105 (T1)

    T1 est livrée : scripts/lean/lean_material_map.py produit docs/reference/lean-material-map.md, et --check rend 1 quand la page et l'arbre divergent (vérifié par contrôle positif : édition manuelle -> 1, régénération -> 0, et sur un worktree neuf depuis origin/main).

    En écrivant l'organe, trois chiffres de cette issue se sont révélés faux à la mesure, et la PR les corrige plutôt que de les recopier :

    • 880 est le total des fichiers .lean suivis, dont 377 miroirs _en — soit 503 modules propres. Les six chiffres par lac de l'issue se réconcilient exactement quand on replie les miroirs (grothendieck 99+97=196, conway 50+41=91, game_theory 38+24=62, learning_theory 32+30=62, discrepancy 31+23=54, knot 24+23=47) : les totaux étaient bons, seule l'étiquette « modules » était fausse.
    • 27 lacs déclarés au CI mesure ci_lakes.json, pas le CI. Une première version de l'organe classait « hors CI » les deux plus gros lacs du dépôt, alors que lean-asymmetric-information.yml porte son project-path en clair. En lisant aussi .github/workflows/, le compte est 35 déclarés, 3 sans aucun workflow — et ces trois-là sont les plus récents : kls_lean (2026-10-08, 4 modules), differential_lean (2026-10-07, 3), torchlean_lean (2026-10-22, 3). Lester ces trois lacs au CI est un grain à part, que je ne prends pas ici.
    • La page se réconcilie avec la population entière : 486 modules + 372 miroirs + 11 fichiers hors lac + 26 écartés = 895, soit exactement git ls-files '*.lean'. Cette ligne existe parce que la première version de l'organe attribuait chaque fichier au dossier immédiat et perdait en silence tous les modules des lacs arborescents (game_theory_lean annonçait 10 modules au lieu de 38).

    Un écart assumé avec le texte de T1 : la colonne distinct_code_sorry est opt-in (--with-sorry), pas dans la page par défaut — count_code_sorry.py --json dépasse les deux minutes sur tout le dépôt, ce qui est incompatible avec un --check câblable en CI.

    Restent ouvertes : T2 (règle d'accrétion), T3 (lean_game_defs / _ext), T4 (publier les lacs sans gate), et le câblage de --check dans un workflow — ce dernier est une décision de gate, pas un détail d'implémentation, et je ne l'ai pas prise seule.

    🤖 Generated with Claude Code

  2. added a commit that references this issue on Oct 28, 2026
  3. jsboige commented on Oct 28, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2025:CoursIA -- T2 : regle d'accretion d'un lac (lecture croisee SocialChoice/assignment_lean/asymmetric_information_lean, verdict par la mesure, regle ecrite) -- paths: MyIA.AI.Notebooks/GameTheory/game_theory_lean/, MyIA.AI.Notebooks/GameTheory/assignment_lean/, MyIA.AI.Notebooks/GameTheory/asymmetric_information_lean/**, MyIA.AI.Notebooks/GameTheory/README.md, docs/reference/lean-material-map.md

    Grain: MED/lean — lane myia-po-2025:CoursIA — prev: MED/tooling #23105

  4. jsboige commented on Oct 28, 2026

    @jsboige
    OwnerAuthor

    [DELIVERED] lane myia-po-2025:CoursIA -- PR #23113 -- T2 regle d'accretion d'un lac et verdicts des deux lacs recents -- paths: scripts/lean/lean_material_map.py, docs/reference/lean-material-map.md, MyIA.AI.Notebooks/GameTheory/README.md

  5. added a commit that references this issue on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions