Skip to content

feat(lean,#13483): tranche 14a — loi de localite evolve_union (compositionalite union disjointe) - #19042

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/13483-tranche14-union
Oct 4, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/13483-tranche14-union

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/lean — lane myia-po-2024:CoursIA — prev: MED/docs #19022

See #13483 (tranche 14a, compositionalité — suite du programme de landing de hashlife_correct_margin).

Ce que livre cette PR

La loi de localité manquante du lake : deux configurations aux supports séparés de plus de 2·t évoluent indépendamment — l'évolution de l'union est l'union des évolutions. C'est la brique d'assemblage des classes admises (nature morte hcap_of_still_life, oscillateurs hcap_of_period{,_mod}, vaisseaux hcap_of_spaceship{,_mod}) : le contenu réel des motifs Life est une juxtaposition de pièces de ces classes.

Quatre briques sorry-free dans HashlifeMarginFragment (+ jumeau _en, preuves byte-identical) :

Maillon Énoncé
isAlive_append_or brique 0 purement ensembliste : isAlive (g₁ ++ g₂) q = (isAlive g₁ q || isAlive g₂ q) — aucune séparation exigée
union_agrees_with_left accord local union/partie sur la boîte Chebyshev-t d'un point proche de la partie
evolve_union loi pointwise : l'état de l'union après t générations est le « ou » des états des parties
evolve_union_mem forme ensembliste : q ∈ evolve t (g₁ ++ g₂) ↔ (q ∈ evolve t g₁ ∨ q ∈ evolve t g₂)

Pourquoi pas la forme « liste littérale » evolve t (g₁ ++ g₂) = evolve t g₁ ++ evolve t g₂ : elle est fausse pour t ≥ 1 — l'énumération canonique de evolve (ordre lexicographique, canonical_evolve_of_pos de GridCanonical) entrelace les points de parties séparées partageant une colonne, là où l'append les bloque. L'ordre n'est pas préservé, seul le support l'est — et c'est le support (boîtes de trajectoire) que consomme 14b.

Pont d'ordre d'append : la loi pointwise près de g₂ s'obtient sur g₂ ++ g₁ — le pont vers g₁ ++ g₂ passe par evolve_congr (adhérence identique via List.mem_append + or_comm), invalide à t = 0 au niveau liste ; le cas t = 0 est couvert par la brique 0 directement.

Pourquoi la séparation est stricte (2·t < d, pas ≤) : au cas d'égalité, la boîte de rayon t touche les deux supports (témoin de hnear à distance t de q, cellule de g₂ à distance t de l'autre côté — distance mutuelle exactement 2·t) et l'accord local échoue. Identifié pendant la conception du maillon (a), avant toute tentative de build.

Preuves — briques existantes uniquement

evolve_box_agree + evolve_reach_chebyshev (LightCone), chebDist_triangle / chebDist_comm (ConeGeometry), evolve_congr (GridCanonical), isAlive_true_iff_mem. Trois cas par point : proche de g₁ (accord local + mort de g₂ par cône et triangulaire), proche de g₂ (symétrique, via le pont d'ordre d'append ci-dessus), hors des deux cônes (tout mort, evolve_reach_chebyshev sur l'union + List.mem_append). Les lemmes Bool Bool.or_false / Bool.false_or ferment les cas de mort.

Validation

  • lake build Conway.Life.HashlifeMarginFragment : SUCCESS (WSL local, incrémental)
  • lake build Conway.Life.HashlifeMarginFragment_en : SUCCESS — preuves byte-identical
  • checker i18n (scripts/lean/check_i18n_siblings.py sur Conway/Life/) : 19/19 byte-identical, 0 drift
  • proof-integrity : câblé — lean-conway.yml → lean-axiom.yml avec target-modules: "*" (dérivation des modules porteurs de sorry, incluant HashlifeMarginFragment + _en)
  • instrument canonique scripts/lean/count_code_sorry.py --json : conway_lean distinct_code_sorry 1 avant / 1 après (sorry-stable — le sorry de l'énoncé-cadre reste l'objet du programme)

Non embarqué (par design)

  • Tranche 14b : le transfert de capture (boîtes de trajectoire des parties → jumpCapturedF de la reconstruction de l'union). Il exige la géométrie du rendu paddé (padCenter2 c).toGrid vs contenu), la cloison déjà nommée par la docstring de jumpCapturedF_of_dilation (« les hypothèses h₀/hwin sont ce que la partie géométrique de L3 doit établir »). Scoping consigné dans la docstring de section de cette PR.
  • Le capstone hashlife_correct_margin_of_union suivra 14b (il consomme le transfert de capture pour décharger par hashlife_correct_margin_of_hcap).

🤖 Generated with Claude Code

…itionalite union disjointe)

Quatre briques sorry-free dans HashlifeMarginFragment (+ jumeau _en byte-identical) :
isAlive_append_or (brique 0 ensembliste, isAlive de l'append = ou des isAlive),
union_agrees_with_left, evolve_union (loi pointwise), evolve_union_mem (forme
d'adhérence : q ∈ evolve t (g₁++g₂) ↔ q ∈ evolve t g₁ ∨ q ∈ evolve t g₂). La
forme liste littérale est fausse pour t ≥ 1 (énumération canonique lexicographique
entrelace des colonnes séparées). Pont d'ordre d'append via evolve_congr + or_comm
(append non commutatif au niveau liste, couvert à t = 0 par la brique 0).
Séparation stricte 2·t < d exigée (le cas d'égalité laisse la boîte toucher les
deux supports). Briques : evolve_box_agree, evolve_reach_chebyshev, chebDist_triangle,
chebDist_comm, evolve_congr, isAlive_true_iff_mem. Tranche 14b (transfert de
capture) scoppée dans la docstring de section, non embarquée.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the lean-visibility-drift La PR ajoute des declarations lake non citees par AUCUN notebook (borne large) (#11703) label Oct 4, 2026
@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[myia-po-2026:CoursIA-3] c423 : PR #19042 -- NO-DOSSIER Tell c400 #1 strict : PR gate absent/failure/in_progress (rolled up at head, source: commits//check-runs). Aucune levee par push du secretaire possible. Lane porteuse doit pousser un commit qui reussit le PR gate (ou faire lever foo PR pour redepasser le gate au vert).

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[myia-po-2026:CoursIA-3] c425 : PR #19042 -- NO-DOSSIER Tell c400 #1 strict : PR gate FAILURE @00:52:19Z. Aucune levee par push du secretaire possible. Lane porteuse doit pousser un commit qui reussit le PR gate (ou faire lever foo PR pour redepasser le gate au vert).

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19042 (feat(lean,#13483): tranche 14a — loi de localite evolve_union (compositionalite union disjointe)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19042
head: db21e20
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3265f041677e275d5fecf92075d73ba5d84e2e55dfdcf1b462f679b828ff1c97
diff-files: 2
diff-additions: 353
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@myia-ai-01
myia-ai-01 merged commit fce3c3b into main Oct 4, 2026
26 of 28 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 5, 2026
…oire de l'union (evolve_union_hull_box) (#19271)

Sous separation stricte 2*T < d des supports initiaux, les boites de
trajectoire des parties (langage corridor) transferent a la boite-coque
de l'union, a tout instant s <= T, via evolve_union_mem (#19042).
Maillon 2 (geometrie niveau/fenetre de la reconstruction de l'union,
vers jumpCapturedF_of_dilation) annonce dans la docstring.

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige
jsboige deleted the feature/13483-tranche14-union branch October 7, 2026 07:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) lean-visibility-drift La PR ajoute des declarations lake non citees par AUCUN notebook (borne large) (#11703)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants