You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
MyIA.AI.Notebooks/SymbolicAI/Lean/knot_lean/Knots/Conway.lean est aujourd'hui un mur de 3 736 lignes dans un seul namespace Knots, avec 112 déclarations enchainées sans coupure par fichier. Mesure :
grep -cE "^/-!|^/--|^-- " : ~33 commentaires/docstrings de section. Le ratio signal/bruit reste honorable intra-fichier, mais la navigation est impossible : on ne saute pas un mur de 3 736 lignes pour chercher où est définie KT_trivial_alexander.
Un seul namespace Knots (ligne 33) → end Knots (ligne 3736). Aucun section Lean intermédiaire.
Sections thématiques déjà présentes en docstrings mais non séparées en sous-fichiers (relevé manuel sur le source) :
Bornes (lignes)
Thème
Mentions
35–244
Mutation de Conway (KleinRot, mutateWindow, AreMutants, contrôle négatif trèfle)
/-! ## 1. Mutation de Conway l.35, contrôles l.195–244
Théorème de Piccirillo (conway_not_smoothly_slice)
énoncé seul, 4 sorry permanents
Les 4 exact sorry (l.3677, 3707, 3718) et les 2 def ... := sorry (l.3644, 3652) sont explicitement marqués permanents dans les commentaires (« This sorry is effectively permanent », « Mathlib prerequisites missing »). Ce ne sont pas des dettes à lever, ce sont des limites connues : théorie des 4-variétés lisses, s-invariant de Rasmussen, homologie de Khovanov — toute la machinerie est hors Mathlib.
Pourquoi c'est un problème
Navigation impossible : un lecteur qui cherche mergePair_symm (l.361) doit grep -n dans un fichier monolithique. Aucune table des matières en tête, aucun section Lean, aucun point d'entrée par sous-thème.
Progression pédagogique invisible : la séquence « mutation → contrôle négatif trèfle → contrôle positif Conway/KT → arcPartition → Alexander → slice → Piccirillo » est didactique (chaque étape pose un objet utilisé par la suivante), mais elle n'est lisible qu'en lisant tout le fichier.
Commentaires de digestion absents : la convention i18n FR/EN i18n(lean): harmoniser les fichiers .lean en francais + traduction anglaise — inventaire, convention, PR pilote #4980 a ses /-! de section, mais le corps des preuves (by induction ... ; simp_all ; ring) n'a aucun commentaire expliquant pourquoi cette tactique, quelle est l'intuition, où la preuve réutilise un lemme antérieur. C'est particulièrement vrai pour les preuves par déterminant Dehn (lignes 1000–2900) où le Matrix.of ![...] puis Matrix.det_of_upperTriangular ne disent rien au lecteur non-averti.
Cible lake build non scopée : un lake build Knots.Conway recompile 3 736 lignes à chaque modification. Un split par sous-thème permettrait un cache plus granulaire et un cycle PR/review plus court.
Cause racine
Conway.lean a grandi par accretion (cf. git log --oneline -- Knots/Conway.lean — 16 commits visibles) :
À chaque PR, le diff s'ajoute au fichier maître. Personne n'a séparé en sous-fichiers parce que la doctrine de gradation (« un sujet = un fichier ») n'a pas été appliquée rétroactivement au moment où le sujet a cessé d'être un.
Portée proposée (à arbitrer coordinateur)
Option A — Split par section thématique (préférée) :
Chaque sous-fichier devient un point d'entrée digestible (~75–1 225 lignes, la borne haute reste l'ArcPartition qu'on peut re-splitter en ArcPartition/Basic.lean + ArcPartition/Invariance.lean).
lake build Knots.Mutation compile ~210 lignes au lieu de 3 736.
La convention i18n sibling pair reste byte-identique par sous-fichier, ce qui est même plus précis qu'aujourd'hui (toute la docstring FR diffère du EN, on pourra auditer fichier par fichier).
La progression pédagogique devient structurelle : lire dans l'ordre Mutation → ConwayPD → ArcPartition → AlexanderTrivial → Slice raconte le cours.
Option B — Split minimal : séparer seulement la section Slice (l.3635–3736, 100 lignes, 4 sorry permanents + Piccirillo) en Knots/Slice.lean. Le reste reste monolithique. Plus rapide (1 PR) mais ne résout pas la navigation ni les commentaires de digestion.
Commentaires de digestion : à intégrer dans la PR de split, dans les deux siblings (convention FR/EN : seules les docstrings diffèrent, mais les commentaires -- ... sur les lignes de tactique sont aussi à dupliquer). Trois niveaux :
En-tête de section (déjà partiellement présent en /-!) : expliciter le pourquoi de la section, pas le quoi.
Au-dessus de chaque preuve (ligne vide puis -- ...) : dire ce que la preuve établit en une phrase.
Au-dessus de chaque set_option ou simp non-trivial : expliquer pourquoi cette option est nécessaire (ex. maxRecDepth 8000 l.2882 : la récursion sur les mineurs de Gauss explose la borne par défaut, on borne O(10²)).
Garde anti-régression
python scripts/lean/count_code_sorry.py --json : avant/après. Le compte distinct_code_sorry doit rester à 8 pour knot_lean (les 4 sorry permanents sont doublonnés FR/EN par la convention #4980). Si le split change ce compte, c'est une régression (anti-regression.md).
scripts/lean/check_i18n_siblings.py --all : pour chaque nouveau sous-fichier FR, vérifier que le _en sibling reste byte-identity hors docstrings/commentaires.
lake build Knots.Conway + lake build Knots.Mutation + lake build Knots.ArcPartition + lake build Knots.AlexanderTrivial + lake build Knots.Slice doivent tous passer.
Knots/MathlibPrerequisites.lean : contient déjà 8 theorem ... := by sorry marqueurs is_marker: true (cf. organe count_code_sorry.py section vacuous) — même doctrine, à appliquer sur Slice.
Anti-régression : .claude/rules/anti-regression.md (compte réel via count_code_sorry.py, jamais grep -c sorry).
Constat first-hand
MyIA.AI.Notebooks/SymbolicAI/Lean/knot_lean/Knots/Conway.leanest aujourd'hui un mur de 3 736 lignes dans un seul namespaceKnots, avec 112 déclarations enchainées sans coupure par fichier. Mesure :wc -l: 3 736 lignes (sibling ENConway_en.leande taille comparable, convention i18n i18n(lean): harmoniser les fichiers .lean en francais + traduction anglaise — inventaire, convention, PR pilote #4980 doublonne la lecture).grep -cE "^(theorem|lemma|def|structure|inductive|namespace|end )": 112 déclarations.grep -cE "^/-!|^/--|^-- ": ~33 commentaires/docstrings de section. Le ratio signal/bruit reste honorable intra-fichier, mais la navigation est impossible : on ne saute pas un mur de 3 736 lignes pour chercher où est définieKT_trivial_alexander.Knots(ligne 33) →end Knots(ligne 3736). AucunsectionLean intermédiaire.Sections thématiques déjà présentes en docstrings mais non séparées en sous-fichiers (relevé manuel sur le source) :
/-! ## 1. Mutation de Conwayl.35, contrôles l.195–244wfconway_wfl.265,kinoshitaTerasaka_wfl.306arcPartition+ lemmes de préservation (mergePair_symm, sameClass_*, foldl, etc.) — brique majeure du PR #16650/-!)t⁰, KTt⁵), preuves par déterminant Dehnconway_trivial_alexanderetKT_trivial_alexander(l.2889) — preuvesset_option maxRecDepth 8000 inqui s'étendent sur 200+ lignesIsSmoothlySlice,IsTopologicallySlice)def ... := sorryconway_not_smoothly_slice)sorrypermanentsLes 4
exact sorry(l.3677, 3707, 3718) et les 2def ... := sorry(l.3644, 3652) sont explicitement marqués permanents dans les commentaires (« This sorry is effectively permanent », « Mathlib prerequisites missing »). Ce ne sont pas des dettes à lever, ce sont des limites connues : théorie des 4-variétés lisses, s-invariant de Rasmussen, homologie de Khovanov — toute la machinerie est hors Mathlib.Pourquoi c'est un problème
mergePair_symm(l.361) doitgrep -ndans un fichier monolithique. Aucune table des matières en tête, aucunsectionLean, aucun point d'entrée par sous-thème./-!de section, mais le corps des preuves (by induction ... ; simp_all ; ring) n'a aucun commentaire expliquant pourquoi cette tactique, quelle est l'intuition, où la preuve réutilise un lemme antérieur. C'est particulièrement vrai pour les preuves par déterminant Dehn (lignes 1000–2900) où leMatrix.of ![...]puisMatrix.det_of_upperTriangularne disent rien au lecteur non-averti.Conway_en.leanreproduit la même structure monolithique (convention sibling pair i18n(lean): harmoniser les fichiers .lean en francais + traduction anglaise — inventaire, convention, PR pilote #4980 : byte-identique hors docstrings). Un split du FR impose un split du EN, sinon l'organecheck_i18n_siblings.pyne valide plus le corps byte-identity.lake buildnon scopée : unlake build Knots.Conwayrecompile 3 736 lignes à chaque modification. Un split par sous-thème permettrait un cache plus granulaire et un cycle PR/review plus court.Cause racine
Conway.leana grandi par accretion (cf.git log --oneline -- Knots/Conway.lean— 16 commits visibles) :AreMutantsau niveau PDbound Alexander divergence on 4_1arcPartition(~1 200 lignes ajoutées)figureEightDiagram(cette PR a touché le sibling_enaussi)À chaque PR, le diff s'ajoute au fichier maître. Personne n'a séparé en sous-fichiers parce que la doctrine de gradation (« un sujet = un fichier ») n'a pas été appliquée rétroactivement au moment où le sujet a cessé d'être un.
Portée proposée (à arbitrer coordinateur)
Option A — Split par section thématique (préférée) :
Knots/Mutation.lean+_en.leanKleinRot,mutateWindow,AreMutants, contrôle négatif trèfleKnots/ConwayPD.lean+_en.leanwf+ mutants concretsKnots/ArcPartition.lean+_en.leanmergePair,arcPartition, lemmes de préservationKnots/AlexanderTrivial.lean+_en.leanconway_trivial_alexander(t⁰),KT_trivial_alexander(t⁵), preuves DehnKnots/Slice.lean+_en.leanIsSmoothlySlice,IsTopologicallySlice, théorème de PiccirilloKnots/Conway.lean+_en.leanKnotsouvert-fermé (~30 lignes)Avantages :
ArcPartition/Basic.lean+ArcPartition/Invariance.lean).lake build Knots.Mutationcompile ~210 lignes au lieu de 3 736.Mutation → ConwayPD → ArcPartition → AlexanderTrivial → Sliceraconte le cours.Option B — Split minimal : séparer seulement la section Slice (l.3635–3736, 100 lignes, 4
sorrypermanents + Piccirillo) enKnots/Slice.lean. Le reste reste monolithique. Plus rapide (1 PR) mais ne résout pas la navigation ni les commentaires de digestion.Commentaires de digestion : à intégrer dans la PR de split, dans les deux siblings (convention FR/EN : seules les docstrings diffèrent, mais les commentaires
-- ...sur les lignes de tactique sont aussi à dupliquer). Trois niveaux :/-!) : expliciter le pourquoi de la section, pas le quoi.-- ...) : dire ce que la preuve établit en une phrase.set_optionousimpnon-trivial : expliquer pourquoi cette option est nécessaire (ex.maxRecDepth 8000l.2882 : la récursion sur les mineurs de Gauss explose la borne par défaut, on borneO(10²)).Garde anti-régression
python scripts/lean/count_code_sorry.py --json: avant/après. Le comptedistinct_code_sorrydoit rester à 8 pourknot_lean(les 4sorrypermanents sont doublonnés FR/EN par la convention #4980). Si le split change ce compte, c'est une régression (anti-regression.md).scripts/lean/check_i18n_siblings.py --all: pour chaque nouveau sous-fichier FR, vérifier que le_ensibling reste byte-identity hors docstrings/commentaires.lake build Knots.Conway+lake build Knots.Mutation+lake build Knots.ArcPartition+lake build Knots.AlexanderTrivial+lake build Knots.Slicedoivent tous passer.Liens
_en).Knots/MathlibPrerequisites.lean: contient déjà 8theorem ... := by sorrymarqueursis_marker: true(cf. organecount_code_sorry.pysectionvacuous) — même doctrine, à appliquer sur Slice..claude/rules/anti-regression.md(compte réel viacount_code_sorry.py, jamaisgrep -c sorry).git log --oneline -- Knots/Conway.lean).