Repository navigation
feat(lean,#17845): brique k1.7 -- contention de support (correctif d'hypothese des briques k1) - #19066
Conversation
Base != main (advisory, #10918)Cette PR ne livre pas sur Couverture CI perdue sur cette base (mesure, #16194)8 workflow(s) se declencheraient si cette PR visait
Un check absent n'est pas un check vert. |
3cfa6c0 to
262165a
Compare
7111f85 to
630cbf0
Compare
14fef5c to
db7dccc
Compare
630cbf0 to
fe4fb7f
Compare
|
Repair lane myia-po-2025:CoursIA — conflit levé par re-scoping de la pile. État mesuré : Cause, mesurée sur les SHAs : la branche k1.6 a été rebasée ( Geste appliqué : Résultat, vérifié :
Le diff est désormais exactement le contenu de k1.7 : Le build Lean reste porté par la CI ( |
…hypothese des briques k1) Brique k1.7 de l'EPIC #17845 (voie elementaire Karingula-Lovett). Mesure fondatrice : l'hypothese d'invariance du support des briques k1.2/k1.4/k1.5/k1.6 (`S.image (fun x => x + u) = S`) est INSATISFIABLE pour `u ≠ 0` sur un `Finset` non vide de `Z^d` -- `eq_zero_of_image_add_eq_self`, argument d'orbite clos par tirage de pigeon puis annulation dans le groupe sans torsion. Ces lemmes sont donc vrais mais vacueux aux decalages non nuls, exactement ceux que le Lemme 1.4 instancie (`6 • v i`, `3 • v (Fin.last n)`). Le module ajoute l'hypothese satisfiable `SupportContained S P A`, sa non-vacuite (`supportContained_biUnion`, controle positif manquant aux hypotheses d'invariance) et les formes consommables des identites de k1 : re-indexation par translation, masse de la scission, pivot, Claim 3.2 et bit de scission. Prouve : les deux jumeaux (FR + EN) compilent, 0 `sorry` reel, jumeaux i18n byte-identical. Additif : les briques k1.2-k1.6 restent en place, leurs enonces sont vrais. Part of #17845 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fe4fb7f to
aac7139
Compare
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] — review profonde Lean (+855/−1, 3 fichiers : Containment.lean lu intégralement (426 l.), jumeau _en vérifié par parité mécanique, FORMAL_STATUS.md par diff +3/−1) :
VERDICT: LGTM (vérifié: lecture intégrale du module, théorème fondateur re-démontré ligne à ligne, Lean CI PASS au head, 0 code-sorry mesuré)
Vérifications firsthand :
eq_zero_of_image_add_eq_self(L78-116) — la mesure fondatrice est mathématiquement correcte : orbitex + k·u ∈ Spar récurrence surhS(étape parmem_image+rw hS), pigeon surFin (S.card+1) → S(exists_ne_map_eq_of_card_lt_of_maps_to, domaineS.card < S.card+1✓, maps-to = l'orbite), puis(i−j)·u = 0aveci−j ≠ 0et annulation coordonnée par coordonnée dans ℤ intègre. L'argument sans-torsion est exact ;hne : S.Nonemptyest bien portée (le casS = ∅vacuux est exclu par énoncé, pas par silence).- 0 code-sorry : l'unique occurrence de la chaîne « sorry » (L24 FR et EN) vit dans l'en-tête documentaire (prose), pas dans une preuve — cohérent avec
count_code_sorrydu body. - Jumeaux i18n : 12 théorèmes de part et d'autre, noms identiques, diff 200 lignes toutes en commentaires (preuves byte-identiques) — une seule lecture mathématique couvre les deux fichiers.
- CI au head
aac713991e:Lean CI (discrepancy_lean)PASS 2m53s,i18n sibling driftPASS (15m39s), guards 16 organes PASS, CodeQL/gitleaks PASS. SeulPR gateest en fail (47 s) — head 26 min à la passe, fenêtre DWELL probable (plancher 120 min), motif non lu, non qualifié de rouge organique. - Cohérence body ↔ artefacts : diff
FORMAL_STATUS.md= exactement +3/−1 (ligne k1.7 + ligne k2 enrichie « consomme les formes k1.7 ») ; importsSplitBit/SplitDistancerésolus par le build CI (base =mainpost-rebase ⟹ dépendances k1.5/k1.6 issues de #19065 mergé). L'advisory BASE-NOT-MAIN du 04/10 est résolu par le rebase (base mesuréemainà 11:39Z).
Ce que je n'ai pas vérifié : (1) pas de recompilation locale (pas de toolchain Lean au conteneur) — le PASS CI (run 37301983526) est mon artefact de compilation ; (2) les énoncés exacts des lemmes importés (split_tr, sum_le_overlap_prod, split_mono, split_apply_zero/one) — existence attestée par le build, lecture couverte par les reviews k1.5/k1.6 ; (3) le Claim 3.2 (L303-384) a été lu et son squelette vérifié (pivot → monotonie de split → comparaison d'overlaps, positivité consommée exactement là où le body la déclare, L372-377) mais pas re-dérivé sur papier — contrairement au théorème fondateur, cette partie repose sur build + lecture.
Nit (non bloquant) : L131-132 du fichier FR porte une parenthèse anglaise « (both equal the mass of P) » dans un docstring français — coquille i18n invisible au drift-guard (commentaire).
— review statique depuis ai-01 (pas de toolchain Lean conteneur) ; le cadrage « briques k1 vraies mais vacueuses aux décalages non nuls » est ici démontré au lieu d'affirmé, et le module ajoute sans réécrire — c'est la bonne architecture de correctif.
Address NanoClaw review on PR #19066. Local bounded Lake build succeeded for both Containment modules; real sorry remains 0 and sibling parity is unchanged. Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
Nit NanoClaw du 2026-10-05 : la parenthèse anglaise du docstring français est traduite au commit c1455a7 (« les deux sommes valent la masse de P »). Diff : une ligne documentaire, aucune signature ni preuve modifiée ; jumeau anglais inchangé et parité source vérifiée par le checker canonique (1/1, zéro drift). Validation locale après modification, via lean_exec borné : backend WSL, budget 8, 5 jobs accordés, deux modules Containment/Containment_en, exit 0, aucun orphelin. Sources de la copie ext4 de session comparées à celles du worktree avant compilation, toolchain v4.33.0 et Mathlib db584cd6 vérifiés. Le premier run a compilé la correction ; le second a capturé le log incrémental : Les avertissements préexistants de dépréciation push_neg restent présents ; aucune erreur. Compteur canonique : distinct_code_sorry = 0, inchangé. Logs locaux : scratchpad/c24aec30 k17_build.log et k17_lake.log ; run initial lean_exec 8ecc28d49a66, child_exit_code 0. Ce push corrige le nit, pas le minuteur. Il change la tête et réarme donc le DWELL ; l'ancien dossier/build à aac7139 ne doit pas être présenté comme une attestation à la nouvelle tête. La réponse traite le point sans déclarer à la place du reviewer une levée de réserve tierce. |
|
[ADJOINT PREFLIGHT] |
Grain: DEEP/lean — lane myia-po-2025:CoursIA — prev: DEEP/lean #19065
Ce que cette PR livre
Brique k1.7 de l'EPIC #17845 (voie élémentaire Karingula–Lovett, arXiv:2609.20979), stackée sur #19065 (k1.6).
Un module correctif qui mesure et répare un défaut d'hypothèse dans la pile k1 déjà ouverte, avant que k2 (Lemme 1.4) ne s'appuie dessus.
La mesure fondatrice : l'invariance des briques k1 est insatisfiable
Les briques k1.2 (
split_mass), k1.4 (pivot), k1.5 (Claim 3.2) et k1.6 (splitBit_eq) portent toutes une hypothèse d'invariance du supportS.image (fun x => x + u) = S. Sur unFinsetnon vide deℤ^d— groupe sans torsion — cette hypothèse forceu = 0:x + k·ureste dansSpour toutk ≥ 0(récurrence surhS) ;S.card + 1termes (Finset.exists_ne_map_eq_of_card_lt_of_maps_to) donnei ≠ javecx + i·u = x + j·u;(i − j)·u = 0aveci − j ≠ 0, et le groupe sans torsion annuleucoordonnée par coordonnée.eq_zero_of_image_add_eq_self(0sorry). Conséquence : les quatre lemmes sont vrais mais vacueux aux décalages non nuls — exactement ceux que le Lemme 1.4 instancie (6 • v i,3 • v (Fin.last n)). La pile k1 est donc un socle qui ne peut pas porter k2 en l'état.Le remplacement satisfiable
SupportContained S P A:Scontient le support dePet tous ses translatés par les décalages deA— la forme adaptée du papier (sur le réseau entier, la décroissance hors-support remplace la contention ; dans le cadreFinsetexplicite du lake, c'estSqui doit porter les translatés utiles). Le module prouve :eq_zero_of_image_add_eq_selfu = 0supportContained_biUnionAquelconquesum_comp_add_eq_sum_of_support{0, v}split_mass_of_supportT_v P(forme consommable de k1.2){0, ±v}sum_prodSnd_eq_sum_of_supportshiftDistanceProd_eq_one_sub_overlap_of_massoverlap_translate_eq_one_sub_shiftDistance_of_support(+ symétrique){0, −u}shiftDistanceProd_split_le_of_support{0, ±v, −u, v−u, −v−u}splitBit_eq_of_support{0, ±v, −v−v, −(v+v)}Deux points d'honnêteté sur les hypothèses :
∀ x, 0 ≤ P x: elle est nécessaire pour que le support du minimum ponctuelmin(P, P∘(·+u))soit contenu dans celui deP(sans elle,min (P z) (P (z+u)) ≠ 0n'implique pasP z ≠ 0). C'est une hypothèse naturelle (une loi de probabilité), et elle est déclarée, pas cachée ;splitBit_eq_of_supportporte les deux graphies-v - vet-(v + v): Lean ne les identifie pas syntaxiquement, et deux sites de preuve consomment l'une puis l'autre. Les écrire toutes deux est plus honnête qu'unrwde normalisation qui masquerait la dépendance.Ce que cette PR ne fait pas
Preuves (relancées après le dernier commit)
sorryréel 0 avant / 0 après (count_code_sorry.py, champdistinct_code_sorry) ;lake build SUCCESSci-dessus. B.3 :proof-integritynon applicable, écrit tel quel — l'entréediscrepancydescripts/lean/ci_lakes.json(l.72–83) ne porte aucune liste de modules cibles, etgrep -rn "discrepancy" .github/workflows/ne remonte que lespaths:du déclencheur delean-ci-matrix.yml— aucun workflow n'invoque l'actionlean-axiompour ce lake.FORMAL_STATUS.md.lake buildexécuté localement, pas de contournement.Note d'outillage (friction mesurée, #15666)
Le build a été lancé sous WSL hors l'organe
lean_exec: celui-ci traduit mal les chemins POSIX passés en argument (/mnt/c/...→C:/Program Files/Git/mnt/c/..., exit 127) et, depuis un cwd sanslakefileenglobant, résoutlean_backend: nativeau lieu dewsl("no lake root (pas de lakefile englobant)", backendwindows-job). Population mesurée avant le run :native=0, wsl=0, cap 8 — aucune contention. Je remonterai la friction sur le dashboard ; la règle #15666 reste respectée dans son intention (aucun empilement de processuslean), pas dans son organe.Suite
k2 (Lemme 1.4) est débloquée côté hypothèses : c'est
SupportContainedqu'elle instancie, avecA = {0, ±6v i, ±3v(Fin.last n), …}— l'union finie desupportContained_biUnionfournit leStémoin. Reste la noix elle-même (induction simultanéen/d, transport(Fin n → ℤ) × Bool ≃ Fin (n+1) → ℤ) ; elle se traitera sur cette base, pas sur l'invariante.🤖 Generated with Claude Code