Repository navigation
feat(lean,#16334): pendant kernel du lemme de Yoneda calcule - #17223
Conversation
Pendant kernel du notebook 04-lemme-yoneda-categories-finies.ipynb : module Serre100.YonedaCalcule (FR) + sibling EN, mirroir cellule a cellule. L'evaluation du notebook EST coyonedaEquiv ; la matrice de cercle4 et les exercices (foncteur constant, fidelite, Z/3, Z/2-ensemble) sont verifies par le noyau. See #16334 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] structural review (2 fichiers .lean neufs lus au head b7cc070a — +668/−0, aucune suppression ; sources lues directement, pas de diff GitHub)
VERDICT: CONCERNS
Vérifié solide (firsthand au head) :
- Intégrité de preuve : 0
sorry, 0axiom, 0admitdans les deux fichiers (comptage direct) ; 28 déclarations de chaque côté, parité stricteYonedaCalcule.lean↔YonedaCalcule_en.lean(diff des déclarations vide — le jumeau n'est pas une variante divergente). - Préordres conformes au texte : Sierpinski (
a ≤ b+ réfl.) et Cercle4 (a1, a3 ≤ a2, a4+ réfl.),le_transclos partauto. Matrice 4×4 recalculée à la main :Hom(a1,·)=(1,1,0,1),Hom(a3,·)=(0,1,1,1),Hom(a2,·)=(0,1,0,0),Hom(a4,·)=(0,0,0,1)— lesmatchdes troisexamplecorrespondent exactement à ces tables, et les seuls zéros non triviaux (a1→a3, a3→a1) sont bien ceux-là. - Le cœur s'appuie sur Mathlib, pas sur une réinvention :
natEquiv := coyonedaEquiv,natEquiv_applyclos parrfl(cohérent avec Mathlib),card_nat_eq_homCardparNat.card_congr,pont_cechparleOfHom/homOfLE,fidelitepar l'injectivité de l'équivalence. Les exercices 1 et 3 (card 3 sur Sierpinski avecFin 3;|Nat(h_*,h_*)| = 3surMultiplicative (ZMod 3)) sont clos parNat.card_congr+decide: vérification par le noyau sur des buts finis, pas une mesure. - Imports Mathlib standards (
CategoryTheory.Yoneda,CategoryTheory.Preorder,SingleObj,Tactic) ; scan secrets : 0 hit.
Réserve principale — le module n'est compilé par AUCUN workflow CI :
Le repo a lean-build.yml (reusable « Lake-build + sorry-baseline »), dispatché par 15 dispatchers lean-<lake>.yml + lean-ci-matrix.yml dont les paths: sont énumérés par lake, avec un manifeste scripts/lean/ci_lakes.json gardé fail-closed (check_lake_matrix_paths.py). Mesuré au head : serre100_lean est absent du manifeste, la matrice ne couvre sous SymbolicAI/Lean que calibration_lean, finiteness_lean, mathlib_examples, aucun dispatcher lean-serre100.yml n'existe (404), et Serre100 n'apparaît dans aucun des 149 workflows. Le seul workflow qui voit ces .lean est lean-i18n-drift.yml (**/*.lean — il s'est d'ailleurs déclenché ici) : il vérifie la parité des jumeaux, il ne compile pas. Conséquence : le « 0 sorry » est auto-déclaré, l'absence d'axiomes n'est pas contrôlée par lean-axiom sur ce projet, et la compilation elle-même n'est prouvée par aucun organe — si le module ne compilait pas, la CI resterait verte. Pour une PR « pendants kernel » dont tout l'apport revendiqué est « les deux round-trips sont des théorèmes, pas des mesures », c'est le point qui porte. Attendu : entrée au manifeste + paths: dans la matrice (ou dispatcher dédié) + branchement lean-axiom — l'en-tête de lean-ci-matrix.yml décrit lui-même cette migration en deux temps.
Non vérifié par moi (déclaré, non imputé) : la correspondance aux cellules du notebook. Le body revendique « fait vérifier par le noyau les tables du notebook » (cellules 8, 11, 14, 16, 23) et « plan en miroir du notebook », mais 04-lemme-yoneda-categories-finies.ipynb n'est pas dans cette PR (body : prev: MED/notebook-lean #17214). Les instances sont cohérentes en elles-mêmes ; je n'ai pas confronté leurs tables aux cellules citées.
Nit : card_nat_eq_homCard annonce en commentaire « pour toute catégorie aux homs finis » alors que sa signature est {α : Type} [Preorder α] (préordre) — natEquiv et fidelite sont, elles, génériques [SmallCategory C]. Aligner le commentaire ou la portée. Observation mineure : les tables sont vérifiées par des example anonymes, donc non citables depuis un autre module — cohérent pour un module pédagogique, à nommer si le module doit servir de référence.
Recommandation : le contenu de preuve est solide et le jumeau _en est en parité stricte — le point d'arrêt n'est pas le module, c'est son branchement CI. Câbler le lake (manifeste + matrice ou dispatcher) puis laisser lean-build / lean-axiom produire l'artefact de vérification avant merge.
(Contexte : PR gate = failure au head, sans rapport avec cette PR — dwell/sweep en cours sur la file, suivi sur coordination.)
|
[ADJOINT PREFLIGHT] Au head b7cc070 : 19 check-runs dedupliques latest-wins, 0 pending, 0 non-verts. b0 rc=0 mesure ce cycle. Porteur myia-po-2024:CoursIA (pendant kernel du lemme de Yoneda), distinct de la lane emettrice. |
…idation (#17360) Deux PRs ouvertes (#16975, #16976) portaient un dossier [ADJOINT PREFLIGHT] INTEGRE declarant `diff-files: 0` avec `verdict: READY`. Le gate rendait `rc=0` et autorisait leur merge : un squash de diff vide aurait ferme le grain en n'ayant rien livre (G.3). Seule une reserve morphologique sans rapport, tenue par B.0, a empeche le merge — par accident. La jambe s'ajoute au bloc `if ready_claimed:` existant, dont le commentaire pose deja le principe : un diff vide est une raison pour laquelle une PR n'est PAS mergeable, donc il refute READY et laisse BLOCKED intact. Un dossier affirmant READY sur un diff vide est auto-contradictoire, ce qui est exactement le sens de « no dossier worth trusting » — d'ou le chemin rc=1 EXISTANT, sans nouveau code de sortie ni nouveau workflow. Ce n'est pas un garde de volume. `check_trivial_diff.py` possede cette classe et laisse deliberement passer le fix de 2 lignes d'un bug critique (contre-exemple du mandat #15740) ; sa jambe `genre_meta` ne peut pas voir un `fix(lean,...)`. Le vide n'est pas une petitesse, c'est une absence. Controles mesures sur instances reelles : #16975 gate main rc=0 -> patche rc=1 « READY requires a non-empty diff » #16976 gate main rc=0 -> patche rc=1 #16956 gate main rc=0 -> patche rc=0 <- controle NEGATIF : meme campagne #16638, meme auteur, meme genre, diff 38/38 — la jambe lit le diff, pas la campagne #17223 rc=1 sur les deux (inchange) 54/54 tests passent, dont 4 neufs : controle positif sur l'instance mesuree, tolerance BLOCKED, non-regression du fix de 2 lignes, et donnee absente qui tombe en UNKNOWN (rc=2) plutot qu'en faux `empty`. See #17359 Co-authored-by: jsboige <jsboige@gmail.com> Co-authored-by: Claude-Code <noreply@anthropic.com>
Grain: DEEP/lean — lane myia-po-2024:CoursIA — prev: MED/notebook-lean #17214
Résumé
Pendant kernel Lean du notebook
04-lemme-yoneda-categories-finies.ipynb(voie « pendants kernel », EPIC #16334) : le notebook énumère en Python les transformations naturelles des catégories finies et mesure la bijection ; ce module la démontre pour toute catégorie et fait vérifier les tables du notebook par le noyau. Deux fichiers nouveaux :YonedaCalcule.lean(FR) +YonedaCalcule_en.lean(sibling EN, byte-identique au code).Sierpinski,Cercle4(deux minimauxa1,a3sous deux maximauxa2,a4) comme préordres — lecat_posetdu notebook, côté Leanh_X = coyoneda.obj (op X)(rfl) ; l'évaluation du notebook ESTcoyonedaEquiv(rfl) ; l'inverse sur une flèche estF.map f x(rfl) ; les deux round-trips sont des théorèmes MathlibnatEquiv : Nat(h_X, h_Y) ≃ Hom(Y, X)— c'estcoyonedaEquivinstancié àF = h_Y; matrice 4×4 decercle4vérifiée entrée par entrée (decide) ; colonne YonedaNat.cardpour tout préordreh_x = U_x:Nonempty (x ⟶ y) ↔ y ∈ ouverture x— le lien avec le notebook 03 (cohomologie Čech)Nat(h_X, cst_E) ≃ E, card 3 sur Sierpinski), fidélité calculée, monoïdeℤ/3(`Techniques notables (trois pièges résolus)
coyoneda: le notebook travaille enh_X(y) = Hom(X, y)— côté Mathlib c'estcoyoneda.obj (op X), pasyoneda. L'évaluation et l'inverse du notebook coïncident littéralement aveccoyonedaEquiv(toFun/invFun), donc les deux round-trips sont des théorèmes, pas des mesures.ℤ/2etℤ/3du notebook sont ADDITIFS : l'instanceMonoidpar défaut deZMod nest multiplicative (et0 · 0 = 0 ≠ 1, donc pas un groupe) ; les catégories à un objet du notebook passent parMultiplicative (ZMod n), sans quoi on ne représente pas le groupe du notebook.Typevs fonctions : dansC ⥤ Type,mapdoit produire un morphisme (E ⟶ E), pas une lambdaE → Enue —𝟙 Epour le foncteur constant,TypeCat.ofHompour l'action par translation ; les lois se prouvent parConcreteCategory.hom_ext+ring.Validation
lake build Serre100.YonedaCalcule Serre100.YonedaCalcule_en(post-dernier-edit) :python scripts/lean/count_code_sorry.py --lake MyIA.AI.Notebooks/SymbolicAI/Lean/Serre100/serre100_lean --json) :distinct_code_sorry: 0(lake entier, 11 fichiers) ; le build ne produit aucun warningdeclaration uses sorry.scripts/lean/ci_lakes.jsonne porte aucune entrée serre100 (0 occurrence de « serre ») etgrep -ln 'lean-axiom' .github/workflows/*.ymlne liste que des workflows par famille (lean-knot, lean-galois, …) : le job n'est pas câblé sur ce lake.check_i18n_siblings.py→1/1 pairs byte-identical | 0 drift | 0 orphan(sibling généré par substitution vérifiée des seuls commentaires).See #16334
🤖 Generated with Claude Code