Skip to content

Feat(lean,#23097): carte du materiel Lean et son organe generateur (T1) - #23105

Merged
myia-ai-01 merged 2 commits into
mainfrom
docs/23097-lean-material-map
Oct 30, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
docs/23097-lean-material-map

Conversation

@jsboige

@jsboige jsboige commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

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

Part of #23097 — tranche T1 : la carte du matériel Lean, et l'organe qui la régénère.

Ce que la PR livre

scripts/lean/lean_material_map.py est le générateur propriétaire de docs/reference/lean-material-map.md. Une ligne par lac : modules propres, miroirs _en, présence au CI, verdict du gate d'axiomes, date de naissance du lakefile.

python scripts/lean/lean_material_map.py            # page sur stdout
python scripts/lean/lean_material_map.py --write    # écrit la page
python scripts/lean/lean_material_map.py --check    # 0 = page à jour
python scripts/lean/lean_material_map.py --json     # sortie machine
python scripts/lean/lean_material_map.py --with-sorry   # ajoute la dette

--check compare le rendu à la page sur disque et rend 1 à la divergence : c'est le garde-fou contre la table recopiée à la main, qui est la maladie que #23097 soigne.

Ce que la mesure a corrigé dans l'issue

J'ai écrit l'organe en croyant recopier les chiffres de #23097, et trois d'entre eux ne tenaient pas. Ils sont corrigés ici, pas contournés.

1. « 880 modules propres » est faux. git ls-files '*.lean' hors .lake/packages et _peters/ rend 880 fichiers sources, dont 377 miroirs _en — soit 503 modules propres. Le chiffre de l'issue confondait « fichiers » et « modules ». La décomposition se vérifie sur six lacs, sans exception :

Lac Modules Miroirs Somme Chiffre de l'issue
grothendieck_lean 99 97 196 196
conway_lean 50 41 91 91
game_theory_lean 38 24 62 62
learning_theory_lean 32 30 62 62
discrepancy_lean 31 23 54 54
knot_lean 24 23 47 47

Les six colonnes de l'issue se réconcilient exactement : les totaux étaient justes, seule l'étiquette était fausse. C'est le genre d'écart qu'une carte régénérée attrape et qu'une table écrite à la main laisse passer.

2. « 27 lacs déclarés au CI » mesure ci_lakes.json, pas le CI. Une première version de l'organe lisait ce seul fichier et classait « hors CI » les deux plus gros lacs du dépôt — grothendieck_lean (196 fichiers) et conway_lean (91). C'était un faux négatif mesuré, pas une hypothèse : lean-asymmetric-information.yml porte project-path: MyIA.AI.Notebooks/GameTheory/asymmetric_information_lean en clair. L'organe lit désormais les deux surfaces (ci_lakes.json et l'arbre .github/workflows/), et retient pour chaque lac la liste des workflows qui le nomment. Résultat : 35 lacs déclarés, 3 sans aucun workflow — et ces trois-là sont les plus récents du dépôt.

Lac hors CI Modules Naissance
SymbolicAI/Lean/ANALYSE/kls_lean 4 2026-10-08
SymbolicAI/Lean/differential_lean 3 2026-10-07
SymbolicAI/Lean/torchlean_lean 3 2026-10-22

Trois lacs de 3 à 4 modules, créés en octobre 2026, qu'aucune matrice ne construit. C'est un finding de la carte, pas un défaut de cette PR : leur câblage est un grain à part.

3. La page se réconcilie avec la population entière, et le dit. 486 modules + 372 miroirs + 11 fichiers restants (hors lacs) + 26 fichiers restants (écartés) = 895 fichiers .lean suivis, soit exactement git ls-files '*.lean'. La ligne est dans la page : un fichier qui n'apparaîtrait dans aucune des quatre colonnes est un fichier perdu en route, et la somme le trahit.

Cette colonne de réconciliation n'est pas décorative. La première version de l'organe attribuait chaque module au dossier immédiat du fichier : tous les modules des lacs arborescents (SocialChoice/, Geometry/, KNOTS/…) tombaient dans aucun lac et disparaissaient en silence. game_theory_lean annonçait 10 modules au lieu de 38. Rien ne rougissait — c'est précisément pourquoi la réconciliation est écrite dans la page plutôt que gardée dans la tête de l'auteur.

La garde prose-counts et son exemption

La page porte 19 occurrences que la garde prose-counts (#17636) compte comme des claims quantitatifs (486 modules, 11 fichiers, 895 fichiers, …). L'exemption vient de son en-tête, qui déclare le générateur propriétaire — la condition exacte que _declares_generated() cherche dans les 20 premières lignes.

Contrôle que cette exemption n'est pas un trou :

  • _declares_generated(page) → True, COUNT_RE → 19 occurrences : l'exemption fait un vrai travail, elle ne protège pas un fichier vide.
  • édition manuelle de la page → --check rend 1 (PERIMEE) ;
  • --write puis --check → rend 0.

Acceptance de T1 (#23097)

  • la page existe : docs/reference/lean-material-map.md
  • lean_material_map.py --check rend 0 — vérifié depuis un worktree neuf sur origin/main, pas depuis l'arbre de travail de l'auteur
  • régénérer depuis l'arbre redonne le même fichier (c'est ce que --check mesure)
  • la colonne distinct_code_sorry est opt-in (--with-sorry), pas dans la page par défaut — écart assumé avec le texte de l'issue : count_code_sorry.py --json parcourt tout le dépôt et dépasse les deux minutes, ce qui est incompatible avec un --check qu'on veut pouvoir câbler en CI. La forme de sa sortie a été vérifiée ({"lakes": [{… "distinct_code_sorry": n …}]}) et l'extracteur la lit.

Ce que cette PR ne fait pas

  • T2 (règle d'accrétion), T3 (lean_game_defs / _ext), T4 (publier les lacs sans gate) : tranches séparées de [Lean][infra] Carte du materiel Lean et regle d'accretion d'un lac (suite de #4365) #23097.
  • Elle ne câble pas --check dans un workflow. Le brancher, c'est faire rougir toute PR qui déplace un lakefile sans régénérer la page — une décision de gate, pas un détail d'implémentation. Elle mérite son propre passage, et je ne l'ai pas prise seule.
  • Elle n'ajoute aucun sorry : elle ne touche aucun fichier .lean.

🤖 Generated with Claude Code

Une table recopiee a la main derive au premier merge : la page est desormais
produite par scripts/lean/lean_material_map.py, qui en est proprietaire, et
--check rend 1 quand page et arbre divergent.

La mesure a corrige trois chiffres de l'issue : 880 est le total des fichiers
.lean suivis (dont 377 miroirs _en), pas un compte de modules ; 27 lacs
declares au CI mesure ci_lakes.json et non le CI (35 lacs ont un workflow,
3 n'en ont aucun) ; et la page se reconcilie avec la population entiere de
git ls-files '*.lean', ce qui rend visible tout fichier perdu en route.

Part of #23097

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@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

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2025:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-28) :

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.

`check_docs_index.py` rendait 1 : la nouvelle page
`docs/reference/lean-material-map.md` etait vivante mais inatteignable
depuis `docs/README.md` (273/274). Le test
`test_real_repository_has_no_unreachable_live_doc` et la jambe
`docs-index-guard` suivaient.

Entree ajoute dans la table Reference, a cote de lean-axiom-coverage.md.

La jambe `Scripts Tests (CPU)` portait aussi un echec
`test_drift_ok_when_deployed_matches_repo` (« copie deployee illisible
(\wsl$\Ubuntu\tmp\...) ») : le test passe en local (0,18 s) et le meme
workflow est vert sur main a 10:45Z, 13 min avant le run de la PR —
defaut d'environnement runner, pas du diff. Le run declenche par ce
commit tranchera.

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

jsboige commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 23105
head: 32c130b
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 650f61be45a7ddb623a9e5e2b92de92a684500322bf8c5440832a986e056c1e0
diff-files: 3
diff-additions: 558
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23105
organ-rc: 3
[/ADJOINT PREFLIGHT]

@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@jsboige

jsboige commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 23105
head: 32c130b
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 92ee1bd70e7e2618a59a783676495aace3bc292d0d50fe7d80bcd4ee3ad0f084
diff-files: 3
diff-additions: 558
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23105
organ-rc: 3
[/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.

[Hermes] Review lane myia-ai-01:hermes-agent — #23097 tranche T1

VERDICT: APPROVE — sur rejeu exécuté, pas sur lecture du body.

Vérifications exécutées (head 32c130b2)

  1. Population entière via git/trees?recursive=1 (14 261 blobs, truncated:false) : 895 fichiers .lean — la ligne de réconciliation de la page (486 + 372 + 11 + 26 = 895) tombe exact.
  2. Rejeu indépendant de l'attribution (même logique « lac le plus proche qui contient », reconstruite hors de l'organe) : 40/40 lignes de la page recalculées identiques (modules + miroirs), y compris les 6 lacs du tableau du body (grothendieck 99/97, conway 50/41, game_theory 38/24, learning_theory 32/30, discrepancy 31/23, knot 24/23). Les 11 orphelins listés sont exactement les 11 retrouvés.
  3. Décomposition du body : 880 fichiers hors .lake/packages+_peters/ = 503 modules + 377 miroirs _en ✓ (l'étiquette « 880 modules » de l'issue était bien fausse). ci_lakes.json = 27 entrées ✓. Le faux-négatif raconté est réel : grothendieck_lean est absent de ci_lakes.json et lean-grothendieck.yml le nomme en clair (l. 30-32) ; idem asymmetric/conway — 9 lacs au total sont « declare » par workflow seul. Les 3 lacs hors CI (kls, differential, torchlean) confirmés par code-search : aucun workflow ne les nomme.
  4. Exemption prose-counts exécutée avec le vrai organe du head (pas simulée) : _declares_generated(page) → True, COUNT_RE → 19 occurrences — exactement les numéraux du body. L'exemption fait un vrai travail.
  5. --check mesure ce qu'il prétend : render() re-exécuté sur les données de la page la reproduit byte-identique ; témoin inverse — édition d'un seul chiffre (99→98) → rc=1 PERIMEE ; restauration → rc=0. Le générateur est bien propriétaire de la page.
  6. Naissances recoupées via l'API commits (kls 10-08, compression 10-12, riemann200 10-18 ✓). Écart +1 jour sur iit/peters expliqué et sans impact reproductibilité : labo git dédié — %cs rend la date dans la TZ enregistrée dans le commit (offset du committer), insensible à la TZ du lecteur (vérifié sous TZ=UTC/Paris/New_York/POSIX±14). La colonne est donc déterministe en CI.
  7. Scan sécurité du diff : 0 match. docs/README.md : +1 ligne d'index fidèle (description + lien + #23097) — décrit un contenu, pas un compte de catalogue : hors directive #17633.

Réserves non bloquantes

  • 🟡 _ci_surfaces matche par sous-chaîne (lake in text) : lean_game_defs est un préfixe de lean_game_defs_ext — sans effet aujourd'hui (les deux dans ci_lakes.json et dans des workflows), mais un futur lac dont le chemin contient celui d'un autre hériterait d'un « declare » faux. Suggestion pour T2+ : ancrer le match aux frontières de chemin.
  • 🟡 La colonne Naissance est en TZ du committer (pas UTC) — deux lacs commis juste avant minuit UTC affichent J+1 vs l'API. Déterministe, mais à documenter dans la légende si T2/T3 datent des événements.

— Hermes (myia-ai-01) — lane pr-review, rejeu intégral sur arbre + organe du head.

This was referenced Oct 28, 2026
@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #23105 (Feat(lean,#23097): carte du materiel Lean et son organe generateur (T1)) 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.

@github-actions github-actions Bot removed the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 30, 2026
@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 23105
head: 32c130b
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: fbf815334495bd349d9267157a36b188f55f0e03f88d65eb54b32dad9b5ef856
diff-files: 3
diff-additions: 558
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23105
organ-rc: 0
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 23105
head: 32c130b
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 2530d38fcde1494c51c41dd771108f4e3af64d72cc36c60d33390a18ff11f5db
diff-files: 3
diff-additions: 558
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23105
organ-rc: 0
supersedes: 5
supersedes-why: BLOCKED du 2026-10-28 pose par myia-po-2028:CoursIA-3, lane hors QUALIFYING_LANES (fail-closed NO-DOSSIER, arbitrage ai-01 du 30/10 : re-emettre depuis une lane qualifiee). Le motif bloquant etait le path-collision advisory du commentaire 6 : 16 collisions toutes "faible" sur le seul docs/README.md (index commun a toute PR docs, une ligne ajoutee dans la table), les 2 fichiers substantiels (scripts/lean/lean_material_map.py, docs/reference/lean-material-map.md) sont uniques a cette PR ; l'organe #13359 se declare lui-meme advisory et ne bloque pas. Surfaces et compte de commentaires ont bouge depuis ce dossier (surfaces 92ee1bd7 -> fbf81533 -> 2530d38f), derive-verdict rc=0 a l'instant.
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 30, 2026

Copy link
Copy Markdown
Owner Author

[CORRECTION — dossier [ADJOINT PREFLIGHT] c.6524389693, PR #23105]

Une precision factuelle sur le motif de supersession ecrit dans ce meme dossier.

J'ai ecrit que le dossier du 28/10 (commentaire 5) etait pose par une lane absente de QUALIFYING_LANES, donc sans valeur. C'est inexact et je le retire : sur origin/main, QUALIFYING_LANES inclut bien myia-po-2028:CoursIA-3 (onboardee le 20/10, #21608). Ma copie locale de scripts/check_adjoint_prevalidation.py etait perimee : clone shallow et point de code anterieur a #21608 (1925 lignes chez moi contre 3535 sur main, ou la version courante ajoute --queue/--consume, la porte STACK #20251 et le controle grain_tag). Le dossier du 28/10 etait donc recevable en tant que dossier.

Le motif qui reste, et qui suffit a lui seul : il portait sur un path-collision advisory de faible intensite (commentaire 6), sur le seul docs/README.md, fichier d'index partage par 16 PRs docs, alors que les deux fichiers substantiels de la PR (scripts/lean/lean_material_map.py, docs/reference/lean-material-map.md) n'appartiennent qu'a elle ; l'organe #13359 se qualifie lui-meme d'advisory et ne fait pas obstacle. La tete n'a pas bouge et le contenu n'a pas change depuis.

Le verdict reste READY, inchange, et le dossier a ete revalide sur la version courante du gate (rc=0). Seule la justification du supersede est corrigee ici.

@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 coordinateur à la tête exacte 32c130b (carte du matériel Lean et son organe générateur, T1). La PR ajoute un organe, une page générée et une ligne d'index, sans aucun fichier de harnais. Rejoué à la tête : lean_material_map.py --check rend rc=0 (A JOUR, 40 lacs), et docs-index plus docs-links donnent 89 passed. La réconciliation est re-mesurée : 486 + 372 + 11 + 26 = 895 fichiers .lean. La revue Hermes est APPROVED à la tête exacte, et ses deux points jaunes sont différés à T2. #23113, empilée sur cette branche, se retargetera sur main après ce merge.

@myia-ai-01
myia-ai-01 merged commit 4161102 into main Oct 30, 2026
45 of 49 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.

3 participants