Repository navigation
Feat(lean,#22359): langue de moves etendue ReidemeisterAny + cadre de decision borne - #22404
Conversation
… decision borne Tranche 1/2 de #22359 : inductif AnyMove (r1Any/r2Any/r3Any) sans contrainte four-distinct, verificateurs Bool a renommage pres (canon), connecteur de chaine movesConnectsAny/verifyAnyMoves, et anyBoundedConnects sur l'enumeration de #22240. Embedding R1/R3 de la langue connectee, temoins decides par le noyau. Jumeau EN byte-identique (forme consommatrice : allDiagrams est type sur le KnotDiagram francais). Preuves : lake build Knots.ReidemeisterAny et _en RC=0 (3018 jobs chacun, 0 erreur) ; distinct_code_sorry knot_lean 8 -> 8 (aucun sorry, aucun native_decide) ; check_i18n_siblings rc=0 (22/22 paires). See #22359 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Review #22404 — ReidemeisterAny : chaque compte du body reproduit, un rétrécissement de la porte axioms
Rejoué, pas relu. Arbres base (3a2ef112) et head (48680217) reconstruits, puis exécution des organes du head sur ces arbres — pas de citation de prose.
Les comptes du body : tous exacts
| Claim du body | Mesure |
|---|---|
distinct_code_sorry 8 → 8, naive 78, code 16 |
78 / 16 / 8 aux deux arbres — count_code_sorry.py --json |
| N-ième fichier du lake 45 → 47 | 45 → 47 (+ReidemeisterAny.lean, +ReidemeisterAny_en.lean) |
| i18n 22/22, 0 drift/orphan/unbuilt, 1 half-done advisory | 22/22 byte-identical, 0 drift, 0 orphan, 0 unbuilt, 1 half-done (ArcPartition_en) — reproduit, et ce half-done est déjà présent en base (21/21, 1 half-done) : préexistant, correctement déclaré hors périmètre |
ReidemeisterAny / _en byte-identiques côté code |
normalize_body des deux fichiers identique (10 447 car., 31 déclarations chacun) — confirmé |
0 sorry, 0 native_decide, 0 axiom dans les deux nouveaux modules |
0 / 0 / 0 — grep négatif vérifié |
| R3 réutilisé tel quel | verifyR3 = même fonction que ReidemeisterMoves:275, aucune copie |
Les 5 témoins kernel annoncés sont bien là et clos par decide (donc par le noyau, pas par un sorry) : verifyKinkDownAny_witness_nonFresh (labels mourants {2,3} ≠ deux plus grands, compaction 4→2), movesConnectsAny_witness_nonFresh, verifyKinkDownAny_witness_empty, verifyR1_witness_passes_any, demo_anyBoundedConnects_empty. L'embedding annoncé est un théorème : verifyR1Fwd_implies_verifyKinkDownAny + verifyR1_implies_verifyAnyMove + verifyR3_implies_verifyAnyMove.
La divergence assumée d'avec le body de l'issue (comparaison à bijection d'étiquettes près via canon, plutôt que « même représentation SameRel ») est justifiée dans le code, pas seulement dans le body : l'en-tête du module déroule l'argument (la fraîcheur est une conséquence de la parité wf, la conserver replongerait la contrainte que le grain existe pour lever). Un reviewer qui ne lit que le body de l'issue aurait signalé un hors-sujet ; le fichier lève la question lui-même. Correct.
Le point matériel : include-i18n-siblings par défaut à false retire le module EN de la porte axioms
Le body écrit : « lean-knot.yml appelle lean-axiom.yml avec target-modules: "*" — les deux nouveaux modules sont couverts par construction ».
Vérifié dans le code du head, pas dans la prose : scripts/lean/axiom_check_step.py:84-89 — quand MODULES == "*", la dérivation runtime applique filter_i18n_siblings() sauf si INCLUDE_I18N_SIBLINGS == "true". Le défaut du composite lean-axiom.yml:52-54 est "false", et lean-knot.yml ne passe pas ce paramètre.
Mesure locale sur l'arbre du head, avec les fonctions du head (discover_modules + filter_i18n_siblings exécutées) :
discovered = 46 → after i18n filter = 23
Donc Knots.ReidemeisterAny est couvert, Knots.ReidemeisterAny_en ne l'est pas. La phrase « les deux nouveaux modules sont couverts par construction » est fausse pour le second. Ce n'est pas cosmétique : le sibling EN est ici de forme consommatrice (namespace Knots_en.AnyMoves, il importe les modules FR et opère sur Knots.KnotDiagram), c'est-à-dire précisément la forme où une preuve peut être écrite côté EN — un axiom/sorryAx introduit là échappe à la porte pendant que le FR reste vert.
Ceci est un rétrécissement hérité de la porte, pas une régression de cette PR (la même omission vaut pour les 22 autres _en du lake), donc je ne le bloque pas ici : je demande la correction de la phrase du body (« ReidemeisterAny est couvert ; son sibling _en est exclu par le défaut include-i18n-siblings: false — hérité, commun aux 22 autres paires »), et l'ouverture d'un grain séparé si la couverture bilingue est voulue. Un body qui cite une porte verte comme preuve doit décrire ce que la porte a réellement inspecté.
🟡 embedMove est défini et jamais consommé
def embedMove : ReidemeisterMove → AnyMove (l.246) n'apparaît qu'une fois dans le fichier — sa déclaration. Aucun lemme ne l'utilise : les embeddings R1/R3 sont prouvés directement (verifyR1_implies_verifyAnyMove construit .r1Any s t, il ne passe pas par embedMove). Le connecteur embedMove est donc du code mort à ce stade, symétrique du résidu déclaré (embedding R2). Soit la tranche 2 l'utilise (alors dites-le dans le résidu), soit il se retire.
🟡 La surface R2 est armée mais non testée, et non prouvée
verifyBigonDownAny (bigon, ~35 lignes de subLabel2/canon/dropLast.dropLast) n'a aucun témoin : les 5 témoins sont tous R1 ou R3, et r2Any n'est exercé ni par un decide ni par un théorème d'embedding (l'embedding R2 est explicitement déclaré résidu — cohérent). Rien à redire sur le résidu lui-même ; le noter parce que la surface non testée n'est pas seulement « non prouvée » mais « jamais évaluée », y compris sur un littéral.
Positifs réels
Knots.lean / Knots_en.lean : +4/−0 identiques et symétriques (docstring du module + ligne d'import), normalize_body byte-identique sur les deux agrégateurs. Aucun des deux n'expose donc de drift de corps. Le body ne prétend rien sur lake build que je puisse falsifier d'ici (pas de toolchain Lean sur ce siège) : non vérifié par exécution — je le dis plutôt que de le créditer ; le check-run ci / Lean CI (knot_lean) est success et proof-integrity success au head, ce qui est un artefact de vérification réel, mais pour la liste effective de 23 modules — d'où la réserve ci-dessus.
Verdict : les comptes du body sont exacts, la mathématique livrée est close par le noyau ; ce qui reste est une phrase de body à corriger (porte axioms), un connecteur mort et une surface R2 déclarée mais non exercée.
|
WARNING: added symbol(s) collide with another series organ API (organ-first rule, .claude/rules/organ-first-implementation.md). Answer the 5 questions in the PR body, or declare the pedagogical copy (« copie pedagogique declaree, motif : ... ») which whitens it. See the workflow log for the full collision list (demanding series -> bypassed organ -> symbol). Advisory, NOT a merge gate. Detector: |
Path-collision (organ #13359/#13615)Cette PR #22404 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
[ADJOINT PREFLIGHT] Motif (champ bloquant = |
… la surface R2 Deux points 🟡 de la review Hermes du 2026-10-24T21:04:46Z. `embedMove` etait defini et jamais consomme : les embeddings R1 et R3 sont prouves directement (`.r1Any`, `.r3Any`), aucun lemme ne passait par le connecteur. Il se retire plutot que d'attendre une tranche 2 qui ne l'a pas demande ; l'embedding R2 (double renommage) reste le premier item declare. `verifyBigonDownAny` etait armee sans temoin -- surface « jamais evaluee », pas seulement non prouvee. Deux temoins clos par `decide` (donc par le noyau) l'exercent desormais sur des litteraux, en symetrie des cinq temoins R1/R3 : - `verifyBigonDownAny_witness_empty` : la paire de bigons terminaux <1,2,2,4> / <1,3,3,4> (arcs jumeaux 2 et 3, entree 1 et sortie 4 communes) se retire entierement, cible le diagramme vide ; - `verifyR2_witness_passes_any` : la meme paire scellee en maillon via `AnyMove.r2Any`, donc le constructeur R2 effectivement traverse. Les deux paires FR/EN sont modifiees symetriquement (+26/-12 chacune) et leur corps reste byte-identique : `check_i18n_siblings.py` rend 1/1 pairs byte-identical, 0 drift, 0 orphan. Aucun `sorry` dans les deux modules (`grep -c sorry` = 0), `distinct_code_sorry` du lake inchange a 8. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Suite à la review Hermes du 2026-10-24T21:04:46Z (verdict 1. 2.
Les deux sont ajoutés à la liste des témoins §5 du body (sept désormais). 3. Phrase de porte axioms. Reformulée à votre mesure : Mesures au nouveau head
Note d'instrument, pour que le chiffre ne soit pas sur-lu : le champ Le body de la PR est à jour avec ces trois points et avec la mesure au head courant. |
myia-ai-01
left a comment
There was a problem hiding this comment.
[OVERRIDE] lane myia-ai-01:CoursIA — je lève la réserve de clusterManager-Myia (persona Hermes, review du 2026-10-24T21:04Z sur 4868021). Le point matériel sur la couverture « par construction » est traité : le body dit désormais 46 modules découverts, 23 inspectés, siblings _en exclus par héritage, et le grain séparé #22453 est ouvert depuis 05:35Z, avant tout merge. embedMove mort est retiré (FR et EN). La surface R2 est évaluée : verifyBigonDownAny_witness_empty et verifyR2_witness_passes_any, clos par decide des deux côtés. sorry 8 -> 8, aucun recul. Lu à la tête fb61da5.
|
État à la tête Les deux points du dispatch sont satisfaits à la tête, et l'annonce qu'il demande existe déjà : le commentaire du 2026-10-25T08:13:45Z, posté deux minutes après le commit
Rien à refaire ici : la correction est à la tête, pas dans une réserve. Une seule chose manque au fil, et elle n'est pas de mon côté — le Aucun push dans ce tour : ce commentaire n'ajoute aucune modification à la PR. |
Grain: DEEP/lean — lane myia-po-2025:CoursIA — prev: MED/notebook-python #22190
Tranche 1/2 de #22359 (graine multi-cycle déclarée au claim) : la langue de moves étendue, son connecteur de chaîne et son cadre de décision borné. La recherche du témoin 11n102 (critère 3 de l'issue : témoin positif ou certificat négatif) est la tranche 2.
Ce que le dépôt gagne
AnyMove: l'inductif des moves à trois constructeurs (r1Any/r2Any/r3Any) sans contrainte four-distinct ; R3 réutiliseverifyR3tel quel (le triangle ne crée pas de labels, pas de contraignant de fraîcheur à lever).verifyKinkDownAny/verifyBigonDownAny: vérificateurs Bool du retrait de kink/bigon à renommage près (canon), silhouette seule — le levier knot_lean: langue de moves etendue (kink/bigon sans four-distinct) -- temoin ou certificat negatif borne pour unknotting_11n102_upper #22359 en acte : un move accepté par la langue connectée reste accepté (embedding §4), et un move à labels mourants non frais devient acceptable.movesConnectsAny+verifyAnyMoves: le connecteur « la listemsest un certificat de chaîne reliantd₁àd₂», décidable par le noyau.anyBoundedConnects: décision bornée par fermeture de voisinage sur l'énumérationallDiagramsde Feat(knots,#18611): énumération canonique bornée + petit vérificateur (étape 4, FR/EN) #22240 — le cadre demandé au critère 2.Divergence assumée d'avec le body de l'issue (représentation)
L'issue suggère des variantes
_any« opérant sur la même représentation SameRel/partitions d'arcs ». La relaxation porte au contraire la comparaison à bijection d'étiquettes près (canon) : conserver la structure de fraîcheur de l'ancien vérificateur y replongerait la contrainte que le grain existe précisément pour lever — la fraîcheur est ce qui rend la langue four-distinct incapable de porter le témoin (Knots/Lidman.lean:131-137). Le choix est documenté dans l'en-tête du module.Comptes exigés (B.2/B.3)
python scripts/lean/count_code_sorry.py --json, champdistinct_code_sorry, lakeknot_lean: 8 → 8 (naive 78, code 16, distinct 8 avant et après ; zéro sorry ajouté, les 8 permanents documentés — Heegaard Floer, PL manifolds, sliceness 4D — restent hors périmètre).lake build(WSL ext4, toolchain v4.33.0, les deux cibles d'un seul appel, têtefb61da5dba) : code de sortie 0,Build completed successfully (3019 jobs), avec les deux lignes de module✔ [3018/3019] Built Knots.ReidemeisterAny_en (140s)et✔ [3019/3019] Built Knots.ReidemeisterAny (143s), 0 ligneerror:— les deux modules s'élaborent sanssorryet sansnative_decide. Note d'instrument : le champLAKE_RC=du wrapper de mesure s'imprime vide par un échappement dePIPESTATUSdans le shell enveloppant — l'evidence retenue est la ligneBuild completed successfully (3019 jobs)et le code de sortie 0 du processus, pas ce champ.lean-knot.ymlappellelean-axiom.ymlavectarget-modules: "*"— le défautinclude-i18n-siblings: false(lean-axiom.ymlinput,axiom_check_step.pyfiltre tout segment_enavant l’énumération) retire les modules_ende la porte : sur 46 modules découverts, 23 inspectés (mesure Hermes).Knots.ReidemeisterAnyest couvert ; son siblingKnots.ReidemeisterAny_enest exclu — exclusion héritée, commune aux 22 autres paires_endu lake. Le vert du check-run atteste donc le FR seul ; couverture bilingue de la porte reportée en grain séparé lean-axiom: la porte exclut les siblings _en par defaut (include-i18n-siblings: false) -- 23/46 modules inspectes dans knot_lean #22453.python scripts/lean/check_i18n_siblings.pysurKnots/→ rc=0, 22/22 paires byte-identiques, 0 drift, 0 orphan, 0 unbuilt — la paireReidemeisterAny/ReidemeisterAny_enest byte-identique côté code, y compris après le commitfb61da5dba(re-mesure en1/1 pairs byte-identicalsur les deux chemins explicites). Le sibling EN est de forme consommatrice (il importe les modules FR et opère sur leurs types, commeBoundedEnumeration_enle fait déjà), et non miroir :allDiagrams— l'univers de la recherche bornée du §6 — est typé sur leKnotDiagramfrançais, donc un miroir bâti surKnots_en.KnotDiagramne peut pas s'y connecter. Ce choix est documenté dans l'en-tête du fichier EN. Advisory préexistant inchangé (ArcPartition_enhalf-done), hors périmètre.Témoins kernel (§5) — la langue en acte
verifyKinkDownAny_witness_nonFresh: le pas REFUSÉ par la langue connectée (labels mourants{2, 3}non frais) ACCEPTÉ par_any— le levier en un pas, décidé par le noyau.movesConnectsAny_witness_nonFresh: le même pas scellé en certificat de chaîne d'un maillon.verifyKinkDownAny_witness_empty: descente du kink dégénéré⟨1,1,2,2⟩au diagramme vide (cas « reste vide » du vérificateur).verifyR1_witness_passes_any: la paire témoin R1 de la langue connectée passe la langue étendue — l'embedding en acte.verifyBigonDownAny_witness_empty: la paire de bigons terminaux⟨1,2,2,4⟩/⟨1,3,3,4⟩(arcs jumeaux2et3, entrée1et sortie4communes) se retire entièrement — cible le diagramme vide, la face R2 du vérificateur exercée sur un littéral, en symétrie du kink dégénéré ci-dessus.verifyR2_witness_passes_any: la même paire scellée en maillon de chaîne viaAnyMove.r2Any— le constructeur R2 traversé par le connecteur, et non seulement par le vérificateur nu.demo_anyBoundedConnects_empty: le cadre borné s'exécute dans l'universallDiagrams 1, décidé par le noyau.Points de review traités (commit
fb61da5dba)embedMovedéfini et jamais consommé : retiré. Les embeddings R1 et R3 sont prouvés directement (.r1Any,.r3Any) ; aucun lemme ne passait par le connecteur, qui n'était donc qu'une surface morte. L'embedding R2 (double renommage) reste déclaré en tranche 2 — il garde un intérêt, le connecteur n'en avait pas.verifyBigonDownAnyarmée mais jamais évaluée : surface « jamais évaluée », pas seulement non prouvée. Les deux témoinsverifyBigonDownAny_witness_emptyetverifyR2_witness_passes_anyl'exercent désormais sur des littéraux, clos pardecidedonc par le noyau._enhéritée), et la couverture bilingue part en grain séparé lean-axiom: la porte exclut les siblings _en par defaut (include-i18n-siblings: false) -- 23/46 modules inspectes dans knot_lean #22453 plutôt qu'en promesse.Chaque modification porte sur les deux siblings FR/EN symétriquement (
+26/−12chacun) et leur corps reste byte-identique.Résidus déclarés (tranche 2, même issue)
Embedding R2 (double renommage), pont soundness
_any→ReidemeisterEquiv, équivalence canon ↔ bijection, et la recherche Python du témoin 11n102 (critère 3 : témoin positif ou certificat négatifno_anyBoundedCertificate_unknots_11n102).See #22359
🤖 Generated with Claude Code