Repository navigation
feat(lean,#4362): full pin-tree identity scanner for lake manifests - #14602
Conversation
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>
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] review 9e9799a (contrainte token : COMMENT only, opener=jsboige).
Verdict : solide, vérifié par exécution réelle.
- 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.
- Design correct : fingerprint = arbre complet
{name: rev}(pas juste Mathlib) — c'est bien la bonne granularité pour #4363 (junctions) et #14337 (warm pool). Lecture durevrésolu (pasinputRev) = bon choix, c'est ce qui détermine le checkout. - 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.
- Security scan : clean.
2 remarques (non bloquantes) :
discover_manifestsskip tout chemin contenantreference_docsn'importe où (needle in str(rel)) — un futur lake nommé p.ex.reference_docs_2027serait exclu silencieusement. Acceptable tant queskippedest affiché dans le report (il l'est).toolchainest 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).
…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`.
Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: MED/guard #14586
Summary
Step-1 instrument of EPIC #4362:
scripts/lean/compare_lake_manifests.pycompares the complete pin tree ({package -> resolved rev}) of everylake-manifest.jsonoutside.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.conway_cgt_lean(transitive upstream pinvihdzp/combinatorial-games, docs(lean,#4980): conway_cgt_lean/CGTTour_en sibling (namespace CGTTour_en, EN docstrings) #6116/docs(gametheory,#13138): reconcile Lean inventory with effective pins post-convergence #13146) andreference_docsfixtures.--jsonfor machine-readable output; exit code always 0 (measurement instrument, not a gate), exit 2 only when no manifest is found.Verdict on current main (2026-09-04)
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