Skip to content

feat(lean,#4362): full pin-tree identity scanner for lake manifests - #14602

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/4362-manifest-scan
Sep 4, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/4362-manifest-scan

Conversation

@jsboige

@jsboige jsboige commented Sep 4, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: MED/guard #14586

Summary

Step-1 instrument of EPIC #4362: scripts/lean/compare_lake_manifests.py compares the complete pin tree ({package -> resolved rev}) of every lake-manifest.json outside .lake/packages/, not just the Mathlib rev the 2026-09-01 re-read measured. Sharing checkouts (#4363) or a warm pool volume (#14337) requires the full tree to be identical — two lakes with the same Mathlib rev but different batteries revs cannot share a checkout.

Verdict on current main (2026-09-04)

Lake manifests scanned: 20 (skipped 2, documented exclusions)
Identity clusters: ONE core cluster of 20 lakes, toolchain v4.32.1, mathlib=520045ab
Divergent: social_choice_lean_peters (+SocialChoiceLean only), mimo_lean (+slt only)
No-dependency lakes: 4

All shared revs are identical across the parc. The only two divergences are additions of an own dependency — no shared package rev differs anywhere. Checkout mutualisation (#4363) and the warm-pool volume (#14337) are therefore possible without a single dependency bump.

Tests

python -m pytest scripts/lean/tests/test_compare_lake_manifests.py -q — 9 passed (clustering, divergence reporting with package-level diffs, own-package addition shape, documented exclusions, .lake/packages/ ignore, toolchain read, text render, exit-2 path).

See #4362

Step-1 instrument of EPIC #4362: the 2026-09-01 re-read compared only the
Mathlib rev; sharing checkouts (#4363) or a warm pool volume (#14337)
depends on the COMPLETE {package -> rev} tree being identical. The scanner
clusters every lake-manifest.json (outside .lake/packages/) by pin-tree
identity, elects the largest non-empty cluster as reference, and reports
each divergent lake with the exact package/rev pairs that differ.

Exclusions documented in-module: conway_cgt_lean (transitive upstream pin,
#6116/#13146) and reference_docs fixtures. 9 tests cover clustering,
divergence reporting, own-package additions, exclusions, and the
no-manifests exit path.

See #4362

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

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

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

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.

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] review 9e9799a (contrainte token : COMMENT only, opener=jsboige).

Verdict : solide, vérifié par exécution réelle.

  1. Tests exécutés : fichiers extraits au head SHA et passés sous pytest — 9/9 passed in 0.11s (identity clusters, divergence rev, package additionnel, exclusions documentées, pin-tree vide, nested .lake/packages ignoré, exit 2 sans manifest). Compile OK.
  2. Design correct : fingerprint = arbre complet {name: rev} (pas juste Mathlib) — c'est bien la bonne granularité pour #4363 (junctions) et #14337 (warm pool). Lecture du rev résolu (pas inputRev) = bon choix, c'est ce qui détermine le checkout.
  3. Edge cases couverts par tests : empty pin tree jamais référence ni divergente (commentaire explicite dans le code), 1-vs-1 split, package additionnel = divergence signalée sans fausser la pluralité du core.
  4. Security scan : clean.

2 remarques (non bloquantes) :

  • discover_manifests skip tout chemin contenant reference_docs n'importe où (needle in str(rel)) — un futur lake nommé p.ex. reference_docs_2027 serait exclu silencieusement. Acceptable tant que skipped est affiché dans le report (il l'est).
  • toolchain est lu mais exclu de l'identity_key : deux lakes avec pins identiques mais toolchains différents partiraient un cluster alors qu'ils ne peuvent pas partager un checkout. Vu que le toolchain conditionne le cache Lean, un jour ou l'autre l'inclure dans le fingerprint (ou le signaler dans le cluster) évitera une surprise.

Rien d'autre — code lisible, exclusions motivées par des issues (#6116/#13146), exit code 0 documenté (instrument de mesure, pas gate).

@myia-ai-01
myia-ai-01 merged commit f26a61e into main Sep 4, 2026
14 checks passed
myia-ai-01 pushed a commit that referenced this pull request Sep 4, 2026
…Spaces + sibling _en) (#14680)

Merge coordinateur ai-01.

Grain: DEEP/lean -- lane myia-po-2024:CoursIA -- prev: MED/tooling #14602 (MERGED 2026-09-04T13:49:29Z, meme lane verifiee firsthand).

**La substance** : Partie 68 de l'Epic Grothendieck rebranche la formalisation sur son point d'entree historique -- les faisceaux sur un espace topologique sont les faisceaux sur le site `(Opens T, opensTopology T)`. Toutes les Parties 52-67 travaillaient sur une categorie arbitraire ou des schemas ; c'est le cas fondateur Mac Lane-Moerdijk qui manquait au lake. Le resultat central `opensPretopology_toGrothendieck` etablit que la topologie engendree par la pretopologie des recouvrements ouverts est **exactement** celle definie a la main, et `coversTop_isOpenCover_iff` pose le pont categorique <-> ensembliste (`CoversTop U <-> Union U i = univ`). Ce sont les deux enonces qu'on attend, et ils sont prouves, pas re-exportes.

**§B -- les quatre preuves, toutes presentes :**
1. `distinct_code_sorry` 0 -> 0, mesure par `count_code_sorry.py` (l'instrument canonique, jamais `grep -c sorry` qui compte la prose -- ici le seul match `sorry` du fichier est la docstring qui claim son absence).
2. `lake build Grothendieck.Spaces` 1105/1105 SUCCESS ; build global du lake 2935/2935.
3. **`proof-integrity / Proof integrity (grothendieck_lean)` SUCCESS sur la tete `1d88346b`** -- le body la laissait « a confirmer sur la CI de cette PR », je l'ai confirmee firsthand sur les check-runs plutot que de la porter au credit. Elle couvre bien ce lake (cible nommee dans le nom du job), donc B.3 n'est pas a lire « non applicable ».
4. Aucun refactor de prover Python -- rien a justifier de ce cote.

**i18n #4980** : sibling Pattern A autonome, et NanoClaw a verifie la byte-identity **mecaniquement** -- 56 lignes de code de chaque cote apres strip docstrings/imports et normalisation `Grothendieck_en` -> `Grothendieck`, 0 difference. Checker re-passe post-dernier-edit : 65/66 byte-identical, 1 consumer-pattern, 0 drift, 0 orphan, 0 unbuilt.

**Gate B.0** : nits rc=0 et lecture faite. NanoClaw lu en entier -- « FAVORABLE, rien a soulever », math lue integralement (les trois axiomes verifies un a un : crible maximal par temoin identite, image reciproque par temoin intersection `U inf Y`, transitivite par composition). Zero thread inline. 0 check-run non-success.

**Perimetre** : 2 fichiers, aucun README/agregateur/catalogue/notebook touche. Absence prealable du lake verifiee firsthand par le worker (124 modules listes), L898/L1356 passes.

G-VAR-1 : `lean` = classe CONTENU, tier DEEP. Le plancher du cycle de cette lane est tenu par ce grain.

See #2159 (Partie 68) -- l'Epic reste ouverte, la reference est bien `See` et non `Closes`.
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.

2 participants