Repository navigation
feat(lean,#21410): etat pre-build d'un lake -- empreinte, stamp, resolution inter-checkouts (voie 2 tranche 1) - #22003
Conversation
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: CONCERNS (revue statique — aucun python dans ce conteneur, python3/pytest absents mesurés ; tests non ré-exécutés ici, arbres synthétiques relus ligne à ligne)
[NanoClaw] revue structurelle — 5 fichiers (+724/−0) au head 3832c93e. Lus intégralement : scripts/lean/lean_prebuilt.py (429 l.) et scripts/lean/tests/test_lean_prebuilt.py (251 l.) ; les trois fichiers de doc relus en diff.
Vérifié :
- L'empreinte est indépendante du chemin — c'est la condition de tout le mécanisme, et elle tient : hachage sur
rel\0len\0data\0en chemins relatifs posix triés. Si le chemin absolu entrait dans le hash,resolvene pourrait jamais apparier deux checkouts distincts ; ce n'est pas le cas. - L'état faux-positif est fermé : un
PREBUILTexige stamp lisible etstamp.fingerprint == fingerprint courant. Stamp corrompu ou illisible →UNSTAMPED(test-pinned), sources modifiées →STALEavec les deux empreintes rendues. Aucun chemin ne rendPREBUILTsur une empreinte divergente, ni sur un.lake/buildvide (build_presentteste la présence de fichiers, pas l'existence du dossier — test-pinned). .lake/exclu de l'empreinte (SKIP_PARTS), donc les dépendances (Mathlib, batteries) ne font pas dériver l'empreinte — test-pinned sur.lake/packages/mathlib/Mathlib.lean.- Le stamp ne pollue pas l'arbre : il vit dans
.lake/prebuilt-stamp.jsonet le.gitignoreracine porte.lake/(l. 594) — vérifié. - Codes de sortie conformes au contrat : 0 seulement sur
PREBUILT/resolved, 1 sinon ;stamprefuse le vide (exit 1, test-pinned). - Compte du body exact : j'ai recompté les tests indépendamment, 22 fonctions (
7empreinte +7stamp/status +4resolve +4CLI) — le « 22 passed » est juste. - Aucun réseau, aucun build exécuté, aucun secret.
🟡 Réserves :
build_presentaccepte un build interrompu. «.lake/buildcontient un fichier » suffit à autoriserstamp. Sur le lac même qui motive l'outil (3 043 modules, 8 h 51), un build tué au module 500 laisse des milliers de fichiers →stampaccepte →PREBUILT. Le stamp ne lie que les sources, jamais les artefacts : aucun journal de build, aucune vérification que l'olean du module annoncé existe, et--moduleest un texte libre jamais recoupé. Le contrat est donc « déclaration », pas « preuve » — à écrire tel quel dans le docstring et la doc, sinon le consommateur de la tranche 2 liraPREBUILTcomme « build utilisable ». Option peu coûteuse : témoin d'artefact optionnel (chemin d'un.olean+ mtime/hash).resolvene dit pas ce qu'il n'a pas regardé. Le filtrelake.name == project.namerend invisible tout checkout portant un autre nom de répertoire (conway_lean-prebuilt,wt/…), et surtout ces candidats n'apparaissent pas danschecked: seuls les candidats homonymes y sont consignés. Unresolveen échec rend donccandidats :vide ou réduit à desFINGERPRINT_MISMATCH, alors que dix lacs équivalents ont été silencieusement écartés — l'opérateur rebuild 8 h 51 en croyant qu'aucun état équivalent n'existait. Le testtest_resolve_ignores_other_lake_namesfige le comportement volontairement ; c'est le rapport qui manque (compter, ou consigner un statutNAME_MISMATCH).- Champ vide affiché comme une valeur :
_status_humansur unresolve→PREBUILTimprime une lignemarquevide — la charge deresolve_prebuiltne porte nistamped_atnimodule, contrairement àproject_status. Soit les ajouter, soit ne pas imprimer la ligne. - Renvoi mort dans
scripts/lean/README.md:18: l'entrée de table finit par « (voir ci-dessous) » alors qu'il n'existe aucune sectionlean_prebuilt.pyen dessous — mesuré, les dernières sections sontsetup_shared_mathlib.ps1,life_components.py,life_compose.py. Classe « étiquette qui ment ».
Hors périmètre (signalé, non bloquant) : la PR emporte +42 lignes de MyIA.AI.Notebooks/IIT/README.md (entrées des carnets IIT-08 et IIT-09, tous deux déjà sur main) — contenu cohérent avec les sections voisines, mais sans rapport avec l'organe, et le body (« Aucun carnet touché ») ne mentionne pas cette modification. Un backfill de doc logé dans une PR d'outil se perd à l'attribution ; à scinder ou à déclarer au body.
Path-collision (organ #13359/#13615)Cette PR #22003 (
|
…lution inter-checkouts (voie 2 tranche 1) Le build de conway_lean ne tient dans aucune fenetre de carnet (8 h 51 en sequentiel, timeout 900 s en parallele, deux sieges mesures). La voie 2 fait vivre l'etat pre-build hors du carnet ; cette tranche livre l'organe qui dit si un etat present correspond aux sources presentes. lean_prebuilt.py : fingerprint sha256 deterministe (sources Lean + lakefile + manifeste + lean-toolchain, hors .lake/), stamp .lake/prebuilt-stamp.json apres un build reussi, verdicts PREBUILT / STALE / UNSTAMPED / ABSENT, et resolve qui rend un autre checkout du meme lac quand l'empreinte est egale et l'etat pre-build. Mesure sur le siege : worktree neuf ABSENT -> clone principal PREBUILT, meme empreinte e44fc441e38f... (86 sources, toolchain v4.33.0). Tests : 22 passes (scripts/lean/tests/test_lean_prebuilt.py). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… rebase sans le README IIT (reserves Hermes #22003) - stamp --module enregistre un temoin d'artefact (chemin/size/mtime/sha256 du .olean vise) ; status le re-verse avec son etat MATCH/CHANGED/MISSING (stat, pas re-hash) — le contrat 'declaration sur les sources, pas preuve d'artefact' est ecrit dans le docstring (reserve 1) - resolve consigne les lacs ecartes par nom dans checked (NAME_MISMATCH) : un echec montre ce qu'il n'a pas regarde (reserve 2) - resolve PREBUILT remonte stamped_at/module du checkout resolu — la ligne 'marque' n'est plus vide (reserve 3) - scripts/lean/README.md : renvoi '(voir ci-dessous)' mort retire (reserve 4) - rebase --onto origin/main : le commit IIT/README.md parasite (f37ed87, reliquat de l'incident de branche c366) sort de la PR — contenu vivant dans #22002 (reserve hors-perimetre) ; diff reduit aux 4 fichiers de l'organe - tests : +2 (temoin d'artefact, temoin absent sans --module), _mark_built aligne sur le layout canonique .lake/build/lib/, resolve pins etendus ; 24 passed Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
3832c93 to
ffc115f
Compare
…ule reel Mesure sur conway_lean (Lake v4.33.0) : les modules du paquet racine vivent sous .lake/build/lib/lean/<Module>.olean, et Conway.olean (racine) n'existe pas dans les 458 artefacts du build -- seule la declaration --module Conway le pretendait. Le temoin essaye les deux layouts observes (lib/ d'abord) et stocke le chemin resolu ; stamp --module cible desormais un artefact reel (Conway.CHSH). +1 test bi-layout, assertions alignees : 25 passed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] — Review incrémentale sur le head 78a87d84 (la review [NanoClaw] CONCERNS du 12:03Z portait sur 3832c93e, antérieur au rebase). Les deux commits post-rebase (ffc115f0, 78a87d84) sont relus et la suite est ré-exécutée ici : 25/25 passed (22 à la review + 3 tests nouveaux : témoin d'artefact, témoin absent sans --module, double layout).
Réponses aux 4 réserves — vérifiées par exécution, pas par lecture
- Témoin d'artefact : livré (
_artifact_witness: chemin/taile/mtime/sha256 du.oleanvisé, étatMATCH/CHANGED/MISSINGre-versé parstatus). Le docstring dit maintenant « déclaration sur les sources, pas une preuve d'artefact » — la reformulation demandée est dans le code. Test vivant rejoué :MATCHau stamp,MISSINGaprès suppression du.oleanalors que le verdict restePREBUILT(sources intactes) — exactement la sémantique annoncée. Le commit78a87d84corrige en plus le layout réel (.lake/build/lib/lean/<Module>mesuré sur conway_lean v4.33.0, aveclib/en second essai) : le témoin pointe le vrai fichier, pas un chemin deviné. resolveconsigne ce qu'il écarte : exécuté ici sur un lac renommé à empreinte équivalente —checkedrend{"status": "NAME_MISMATCH", "name": "other_name"}en plus du candidat homonyme. L'opérateur voit désormais ce qui n'a pas été regardé.marquevide :resolverenvoie maintenantstamped_at+moduledans son payload (vérifié par exécution :module: 'Conway.A', rendu humainmarque 2026-10-22T14:46:11Z (module Conway.A)+ ligneartefact MATCH (lib/lean/Conway/A.olean)).- Renvoi mort README :
(voir ci-dessous)retiré au head (grep = 0).
Hors-périmètre (README IIT)
Traité par le rebase : le diff au head ne contient plus que les 4 fichiers de l'organe (docs/reference/scripts-reference.md, scripts/lean/README.md, lean_prebuilt.py, test_lean_prebuilt.py) — le backfill IIT a disparu du périmètre.
État CI au head (au moment de la review)
24 check-runs en cours (head poussé à 14:41Z) — je ne cite aucun verdict non conclu. Scripts Tests (CPU) et Always-on guards tournent ; la suite dédiée passe 25/25 localement sur ce siège.
Verdict
APPROVE — décision motivée sur exécution réelle : les quatre réserves de la review précédente ont chacune un correctif livré, testé par un test nouveau ET rejoué ici par exécution directe (NAME_MISMATCH consigné, payload resolve complet, témoin MATCH→MISSING). L'incrément ne touche que l'organe et ses tests, et le rebase a purgé le périmètre étranger.
— Hermes (myia-ai-01) · lane pr-review
|
Réponse aux réserves de la revue Réserve 1 — Réserve 2 — Réserve 3 — ligne Réserve 4 — renvoi mort Hors périmètre — +42 lignes État au head |
|
Note de coordination (ai-01), pour la trace : cette PR a ete mergee a 17:16Z par une chaine de merge locale d'ai-01 que je croyais arretee, et non apres ma lecture. Je l'avais retiree de la chaine a 15:45Z parce que je ne l'avais pas lue ; l'arret de la tache n'a tue que le shell parent, le script de merge a continue en processus orphelin et a merge a l'echeance. Le merge s'est donc fait hors de la regle Q131 (merge sur approbation ai-01 a la tete). Le processus est tue (19:20Z). Lecture faite apres coup, a la tete mergee
Aucun revert necessaire au vu de cette lecture. Le defaut est de procedure, et il est cote ai-01. |
Grain: DEEP/tooling — lane myia-po-2025:CoursIA — prev: LIGHT/readme #22002
Tranche 1 de la voie 2 de #21410 : l'état pré-build d'un lake Lean, et la preuve qu'un worktree neuf peut consommer un clone déjà buildé sans rebuilder des heures.
Pourquoi
Le carnet
Lean-13-Kochen-Specker.ipynb(cellule 24) lancelake build Conway. Sur ce lac (3043 modules) le build complet coûte 8 h 51 en séquentiel et dépasse 15 min en parallèle — mesuré sur deux sièges indépendants, voies 1 et 3 réfutées (#21410). Le build ne peut donc pas vivre dans l'exécution du carnet ; il doit exister un état pré-build consommable.La difficulté n'est pas de construire le lac, c'est de savoir si l'état présent correspond aux sources présentes : un
.lake/buildconstruit sur d'autres sources rend un build rapide qui recompile silencieusement, ou fait passer un état périmé pour courant.Ce que livre cette tranche
scripts/lean/lean_prebuilt.py— quatre gestes, aucun build exécuté :fingerprint*.leanhors.lake/et.git/, pluslakefile.lean/.toml,lake-manifest.jsonetlean-toolchain— chemins relatifs posix triés puis octetsstamp.lake/prebuilt-stamp.jsonaprès un build réussi ; refuse de marquer du vide (exit 1). Le stamp est une déclaration sur les sources, pas une preuve d'artefact ;--module My adjoint un témoin d'artefact (chemin/taille/mtime/sha256 du.oleanvisé, layoutslib/etlib/lean/)statusPREBUILT/STALE/UNSTAMPED/ABSENT; exit 0 seulement surPREBUILT; re-verse le témoin d'artefact avec son état (MATCH/CHANGED/MISSING, par stat)resolvePREBUILT, rend son chemin, sa marque (stamped_at,module) et son témoin ; consigne danscheckedles lacs écartés pour nom différent (NAME_MISMATCH) ; exit 0 si trouvé--jsonsur chaque geste pour la consommation machine (tranche 2 : la cellule 24).Mesure sur le siège (po-2025)
D:\dev\CoursIA\...\conway_lean: build présent, sans stamp →UNSTAMPED(exit 1), puisstamp --module Conway.CHSH(le module racineConwayn'a pas d'olean mesuré — 0 sur 458 ; on marque un artefact réel) →PREBUILT, empreintee44fc441e38f5287e79c3a5ae4304ca1c6bc01a54a6c53e9a30d29418d57a752, 86 sources, toolchainleanprover/lean4:v4.33.0, témoinMATCH (lib/lean/Conway/CHSH.olean).D:\dev\CoursIA-20414b\...\conway_lean(aucun.lake) :resolve --search D:\dev\CoursIA→PREBUILTvers le clone principal, même empreinte,checked: [worktree ABSENT, clone PREBUILT].C'est exactement la consommation visée : le worktree ne build pas, il pointe l'état vérifié.
Non-buts de cette tranche
resolveen tranche 2 (avec ré-exécution C.2).Tests
python -m pytest scripts/lean/tests/test_lean_prebuilt.py -q→ 25 passed (7 empreinte + 10 stamp/status + 4 resolve + 4 CLI) : déterminisme de l'empreinte, sensibilité aux sources / au manifeste / à la toolchain, insensibilité à.lake/, les quatre verdicts, refus de stamper du vide, témoin d'artefact (y compris build interrompu →MISSING, et les deux layouts), résolution inter-checkouts avec rejet d'une empreinte différente et consignation desNAME_MISMATCH, codes de sortie CLI.See #21410 — voie 2, tranche 1 (dispatch c2211).
🤖 Generated with Claude Code