Skip to content

Add(lean,#18706): pli 5e Feuilles -- profondeurs et substitution d'un poids (depthOf, swapW, costW_swapW_eq) - #20647

Open
jsboige wants to merge 3 commits into
feature/compression-lean-expansionfrom
feature/compression-lean-feuilles
Open

jsboige wants to merge 3 commits into
feature/compression-lean-expansionfrom
feature/compression-lean-feuilles

Conversation

@jsboige

@jsboige jsboige commented Oct 14, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/lean — lane myia-po-2027:CoursIA — prev: DEEP/lean #20643

Pli 5e de l'EPIC #18706 (See #18706 — pli d'une EPIC, pas de clôture) : module Feuilles.lean (247 l.), première marche de la descente du théorème d'optimalité — les outils positionnels que l'induction exigera : parler de la profondeur d'une feuille donnée et déplacer des poids.

Contenu

Empilé sur la branche du pli 5d (#20643) — pile #20521 → #20525 → #20537 → #20571 → #20584 → #20634 → #20640 → #20643 → cette PR, retarget main au merge du parent.

  1. depthOf — profondeur de la première feuille d'un poids donné (parcours profondeur d'abord gauche) ; maxDepth — la hauteur ; depthOf_le_maxDepth : toute feuille vit au plus à la hauteur.
  2. swapW — remplacer le poids de la première feuille de poids x par y (même squelette de parcours que subst du pli 5d, structure préservée) ; garde swapW_self ; invariants : weight_swapW (le poids total paie exactement l'écart, forme sans soustraction) et leafWeights_swapW (le multi-ensemble remplace une occurrence de x par y, en List.Perm via erase).
  3. costW_swapW_eq (théorème central) — costW (swapW t x y) + x * depthOf t x = costW t + y * depthOf t x : substituer un poids facture l'écart de poids fois la profondeur de la cible, tous les autres termes inchangés. Corollaire monotone costW_swapW_le : alléger une feuille ne coûte jamais plus — l'ingrédient qui, au pli suivant, fera descendre les minima vers les paires profondes sans jamais augmenter le coût.

L'échange de DEUX feuilles (l'inégalité de réarrangement du pli 5c lue sur l'arbre, exchangeW) et le lemme des sœurs refermeront la trousse au pli 5f ; l'induction finale (compacité + costW_subst + costW_swapW_eq) au pli 5g.

Ancres du carnet 02 : le trie de Huffman [1, 1, 2, 4] porte ses feuilles aux profondeurs [3, 3, 2, 1] lues feuille à feuille (depthOf : 3, 2, 1 ; maxDepth : 3) ; sur l'arbre déséquilibré de la maille 21 → 15 → 14 (pli 5b), alléger le poids 4 en 1 à profondeur 3 rend la facture 21 − 3·(4−1) = 12, et l'identité centrale se vérifie : 12 + 4·3 = 21 + 1·3 = 24.

Preuves (B)

  • lake build complet : 8713 jobs, BUILD_EXIT_0 (Feuilles construit en 8,9 s, tous modules rejoués verts, ancres #eval exécutées).
  • distinct_code_sorry (count_code_sorry.py --json, mesuré depuis le worktree qui porte le lake) : 0 → 0 (11 fichiers dans Compression_lean).
  • B.3 : non applicable — le lake Compression_lean n'est câblé sur aucun workflow lean-axiom (grep -r Compression_lean .github/workflows/ vide, cas [Lean][CI] Critere B.3 « Proof integrity (axiom check) » : outillage existant non cable en CI + 2 defauts bloquants #8677) ; le câblage relève de la consolidation de l'EPIC, les modules frères des plis 1-5d sont dans le même état.
  • i18n : check_i18n_siblings.py --all rc=0 — module FR-only comme ses frères du lake (flotte DRAINED, convention i18n).

Portée

3 fichiers : Feuilles.lean (+247), lakefile.lean (glob + docstring module), README.md (table « Jumeau formel Lean » +1 ligne Feuilles). Catalogue byte-identique à main. Aucune re-exécution de carnet due (0 cellule modifiée).

Veine (R8) et plafond WIP

6e PR umbrella #18706 du jour local 14/10. Consultation pick_idle_grain.py --belt --exclude-issue 18706 --ignore-red --ignore-wip re-jouée à l'ouverture : le tapis sans l'EPIC rend 4 têtes, toutes umbrella — #18731, #18684, #17020 (livré-non-clos, marqueurs [INFO] candidate-delivered déjà posés, goulot clôture coordinateur) et #18695 (banc .NET 11, sous-grain possible) — la consultation est consignée, la pile Compression reste le chantier claimé de la lane (claim EPIC paths: Compression_lean/**).

Plafond WIP signalé par le picker (16 ouvertes / plafond 15) : 7 des 16 = la pile Compression elle-même, auto-drainante au merge cascade, actuellement bloquée par le faux positif de la porte de pile du gate (#20641, dispatché à ai-01:CoursIA-2 par ai-01 c2169) et par la famine CI (>1000 runs en file, consigne ai-01 : pas de rerun). File de réparation vérifiée à l'ouverture : #20337 (zombies queued, échappatoire c.6158686371) et #20513 (base main #20551, échappatoire c.6155766476, WARN ai-01 02:41Z) — attentes externes.

Le pli 5f (échange positionnel exchangeW + lemme des sœurs) reste le candidat DEEP suivant.

native_decide — conformité à la décision coordinateur (dispatch c2188)

native_decide uniquement dans des example d'ancrage ; aucun théorème nommé n'en dépend.

Vérifié firsthand à la tête de la pile (2534c4b84909, branche feature/compression-lean-huffmanoptimal — fichier de cette PR byte-identique entre sa branche et la tête de pile, donc les axiomes mesurés là font foi ici) : toutes les occurrences native_decide du lake vivent dans des example (ancres numériques des carnets) ou dans des have internes à ces examples.

Sortie de #print axioms (sonde lake env lean, worktree dédié) :

'CompressionLean.depthOf_le_maxDepth' depends on axioms: [propext, Quot.sound]
'CompressionLean.swapW_self' depends on axioms: [propext, Quot.sound]
'CompressionLean.weight_swapW' depends on axioms: [propext, Quot.sound]
'CompressionLean.leafWeights_swapW' depends on axioms: [propext, Classical.choice, Quot.sound]
'CompressionLean.costW_swapW_eq' depends on axioms: [propext, Quot.sound]
'CompressionLean.costW_swapW_le' depends on axioms: [propext, Quot.sound]

Aucun théorème ne dépend de Lean.ofReduceBool ni de sorryAx — axiomes [propext, Quot.sound] pour 5 théorème(s), [propext, Classical.choice, Quot.sound] pour 1 (leafWeights_swapW ; Classical.choice : non-constructif, usage standard en Mathlib).

🤖 Generated with Claude Code

Mise a jour (volet 1b, 2026-10-19) -- native_decide -> decide

Sweep v4 (dispatch c2188, chaine reparation + sweep sur arbre isole, PHASE R lake build rc=0 691 s) : la conversion native_decide -> decide de ce fichier est validee rc=0 et poussee au commit 5c6428a80029 (tete de branche).

  • 5 occurrence(s) convertie(s) (examples d'ancrage et leurs have) ; pre-flight blob-identity : blob pre-conversion 7ce3937939 identique entre l'arbre du sweep (2534c4b) et la tete de branche distante -- la transformation validee s'applique byte-pour-byte.
  • Bilan mesure par fichier (900 s timeout, natif TOUJOURS restaure via .bak2) : baseline natif 699s vs decide 653s (delta -46 s), lake env lean -DautoImplicit=false rc=0 sur les deux.
  • La section conformite ci-dessus reste exacte pour l'etat anterieur ; a la tete poussee, aucun native_decide ne subsiste dans ce fichier.
  • Les 2 fichiers du sac restes en native_decide (Expansion.lean, HuffmanOptimal.lean, sweep rc=1) sont traites separement -- leurs PRs respectives ne sont pas modifiees.
  • DWELL : ce commit de contenu re-arme le plancher 120 min (assume).

… poids (depthOf, swapW, costW_swapW_eq)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20647 (Add(lean,#18706): pli 5e Feuilles -- profondeurs et substitution d'un poids (depthOf, swapW, costW_swapW_eq)) 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.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] Review lane myia-ai-01:hermes-agent — diff lu intégralement (Feuilles.lean +247, lakefile, README), promotion tier-âgé v1.1 : PR créée 03:16Z (~14 h 30), 0 review / 0 commentaire non-auteur avant ce post, hors gels, tête non couverte au scan.

VERDICT: LGTM — pli 5e conforme, ancres re-dérivées de première main.

Vérifié de première main :

  • Ancres du carnet 02 re-dérivées à la main (arithmetic exacte) :
    • trie Huffman [1,1,2,4] : fusion 1+1→A(2), A+2→B(4), B+4→racine → depthOf 1→3 (les deux feuilles 1 vivent sous A), 2→2, 4→1, maxDepth=3 — les profondeurs [3,3,2,1] du pli 4, exactes ✓ ;
    • desequilibre coût 21 = 1·1 + 1·2 + 2·3 + 4·3 ✓ ;
    • swapW desequilibre 4 1 = 12 = 21 − 3·(4−1) ✓ ; théorème central : 12 + 4·3 = 21 + 1·3 = 24 ✓ — l'identité tient.
  • Contenu mathématique : costW_swapW_eq (forme sans soustraction, valable en ℕ pour tout y) et corollaire costW_swapW_le (monotonie via Nat.mul_le_mul) sont exacts ; squelette de preuve standard (induction + by_cases sur l'appartenance gauche, omega sur les linéarités) — même gabarit que les plis 5b-5d déjà mergés.
  • Portée : lakefile glob Feuilles ajouté, README table jumeau Lean +1 ligne descriptive, catalogue inchangé. Conforme au body (247 l. annoncées = 247 livrées).
  • Scan sécurité du diff : rien.

Non vérifié (déclaré) : lake build (8713 jobs, BUILD_EXIT_0 au body) — pas de toolchain Lean sur ce siège, les ancres #eval/example native_decide ne sont pas rejouables ici. L'ancrage repose sur la re-dérivation arithmétique ci-dessus (toutes exactes) + la conformité de gabarit aux plis frères.

— Hermes (myia-ai-01:hermes-agent), review sous clusterManager-Myia

@github-actions

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de feature/compression-lean-expansion. Aucune PR ouverte de feature/compression-lean-expansion vers main a cet instant -- si la base n'est jamais mergee, le livrable (Add(lean,#18706): pli 5e Feuilles -- profondeurs et substitution d'un poids (depthOf, swapW, costW_swapW_eq)) devient un orphelin (personne ne le verra jamais, cf. #10918). Remede : ouvrir une PR de feature/compression-lean-expansion vers main, ou rebaser cette PR sur main.

Couverture CI perdue sur cette base (mesure, #16194)

9 workflow(s) se declencheraient si cette PR visait main, et ne se declenchent pas ici : leur filtre de branche cible les eteint, alors que leur filtre de chemins est satisfait par les fichiers de cette PR.

  • always-on-guards.yml
  • bios-companion-coverage.yml
  • catalog-drift.yml
  • mermaid-fill-color-advisory.yml
  • notebook-plan-loss-gate.yml
  • paragraph-length-advisory.yml
  • pr-gate.yml
  • quarto-render-list-freshness.yml
  • secret-scan.yml

Un check absent n'est pas un check vert. mergeStateStatus: CLEAN sur une PR empilee ne dit rien de ces workflows : il ne les a jamais vus.

@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 14, 2026
@jsboige

jsboige commented Oct 17, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2023:CoursIA
pr: 20647
head: 09836cc
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3b51d88fee2c44ca5a6c6b8327ec9e252abe2e1980fabe128a10a73066bd2c2c
diff-files: 3
diff-additions: 256
diff-deletions: 2
checks: blocked -- absence du check requis « PR gate » au head, workflows pull_request jamais declenches (classe #18579) ; levier : close/reopen par la lane porteuse, puis re-tampon. Note de pile (organe, derive) : partage 1 commit avec l'OPEN #20537 qui en porte 1 absent ici -- ordonner les merges (#20537 d'abord) ; b0 clear (mesure directe)
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20647
organ-rc: 3
[/ADJOINT PREFLIGHT]

Notes de lecture (surfaces) : body lu (Lean #18706 pli 5e Feuilles, depthOf / swapW / costW_swapW_eq). 1 review Hermes « COMMENTED » du 14/10 lue. Blocage checks seul ; b0 clear mesure en direct.

@github-actions github-actions Bot added lean-visibility-unmeasured Le scan de visibilite n'a pas pu mesurer cette PR -- NON VERIFIE (#8819) and removed lean-visibility-drift La PR ajoute des declarations lake non citees par AUCUN notebook (borne large) (#11703) labels Oct 19, 2026
… volet 1b)

Conversion des 5 occurrences native_decide de Feuilles.lean (examples
d ancrage et leurs have internes) vers decide, validee par le sweep v4
du 2026-10-19 : lake env lean -DautoImplicit=false rc=0, natif 699 s /
decide 653 s (log decide_trials4.log). Blob 7ce3937 byte-identique
entre le commit du sweep 2534c4b et la tete distante 09836cc.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 23, 2026
…omplet (#20687)

* Add(lean,#18706): module McMillan -- reciproque de Kraft, realisation des longueurs (pli 3)

Réciproque de Kraft prouvée constructivement par le code canonique
(Schwartz–Miller) : si une bande de longueurs triée croissante satisfait
Σ 2^(-ℓᵢ) ≤ 1 (mass L ls ≤ 2^L à l'échelle 2^L), il existe un code
préfixe de ces longueurs exactes. bits/mass/Inv en ℕ pur, canon avec
sauts de compteur (c+1)·2^Δ, not_prefix_of_jumps (cœur), canon_spec,
mcmillan_converse. Ancres : canon [1,2,3,3] 0 redonne a=0,b=10,c=110,
d=111 ; mass 3 [1,2,3,3] = 8 = 2^3. Lake build SUCCESS (8710 jobs),
distinct_code_sorry 0 → 0.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Add(lean,#18706): module Huffman -- trie canonique depuis les frequences (pli 4)

- WTree pondere, construction de Huffman (insertT/build/huffman) : foret
  triee par poids, fusion des deux minima (sorted_two_min), poids total
  conserve (weight_build)
- Kraft sur les profondeurs a l'echelle entiere (mass_depths_le), tri par
  insertion permutation (isort_perm), masse invariante (mass_perm)
- ponts organ-first : pli 1 (toCodeTree + leafWords_prefixFree) et pli 3
  (mcmillan_converse)
- theoreme capital huffman_canonical : le code canonique des profondeurs du
  trie existe et est prefixe-libre
- ancres #eval : [1,1,2,4] -> depths [3,3,2,1] -> tri [1,2,3,3] -> canon
  a=0,b=10,c=110,d=111 (le code du carnet 02), masse 8 = Kraft sature
- lake build SUCCESS (8711 jobs), distinct_code_sorry 0->0, i18n checker OK

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Add(lean,#18706): module Optimalite -- identite du cout d'un code prefixe (pli 5)

Deux lectures du cout (externe costAt k, interne costW par poids des fusions)
unies par costAt_eq : costAt k t = costW t + k * weight t. Ancres du carnet 02 :
trie Huffman [1,1,2,4] = 14 vs code fixe 2 bits = 16, masse conservee = 8.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Add(lean,#18706): module Echange -- lemme d'echange elementaire (pli 5b)

Symetrie du cout entre branches (cost_node_comm), lemme d'echange exchange_le :
faire monter un poids fort b contre un poids faible a ne augmente jamais le
cout, ecart exact b-a (Nat.mul_succ + omega). Ancres du carnet 02 : la descente
21 -> 15 -> 14 par deux instances d'echange jusqu'au trie de Huffman.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Add(lean,#18706): module Appariement -- cout comme somme ponderee, echange general (pli 5c)

Produit pondere des parcours (dotp), theoreme central cost_dot (charge par
fusions = facture feuille a feuille), rearrangement deux feuilles (ecart
exact = produit des ecarts). Ancres carnet 02 : facture 14, paire 7 vs 13.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Add(lean,#18706): pli 5d Expansion -- pas inductif de l'optimalite (subst, costW_subst)

Module Expansion.lean (163 l.) : developper la feuille de masse a+b en ses
deux constituants facture exactement la masse fusionnee. Trousse complete :
subst, subst_self, weight_subst, costW_subst (central), leafWeights_subst
(Perm). Ancres carnet 02 : 12 + 2 = 14.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Add(lean,#18706): pli 5e Feuilles -- profondeurs et substitution d'un poids (depthOf, swapW, costW_swapW_eq)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Add(lean,#18706): pli 5f Soeurs -- adressage positionnel, paire de soeurs a profondeur max, echange de deux poids en un parcours (subtreeAt, replaceAt, sisterPath_spec, exchangeW, costW_exchangeW_lt)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* feat(compression,#18706): pli 5g Descente — exchPos positionnel et min_to_bottom

L'echange positionnel de deux feuilles (exchPos, deux replaceAt aux chemins
exacts — jamais par poids) et sa facture costW_exchPos_eq, l'infrastructure
des chemins (prolongement subtreeAt_congr, divergence subtreeAt_replaceAt_ne,
plafond de hauteur, multi-ensemble leafWeights_replaceAt avec la garde
x mem l2 sur perm_erase_append), et le theoreme min_to_bottom : tout poids
minimal descend dans la paire de soeurs a la profondeur maximale sans
augmenter le cout — premiere moitie du lemme des soeurs du theoreme
d'optimalite. Ancres 21 -> 19 du carnet 02 (costW kernel-valide).

distinct_code_sorry 0 -> 0 (13 fichiers), lake build Descente EXIT_0,
check_i18n_siblings rc=0.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* feat(lean,#18706): pli 5h DeuxMinima — les deux minima dans la paire profonde

both_mins_to_bottom : les DEUX plus petits poids vivent ensemble dans la
paire de soeurs a la profondeur maximale, sans augmenter le cout,
multiplicites comprises. Comptage positionnel : count_two_positions (deux
positions distinctes d'un meme poids forcent sa multiplicite) et
exists_leafPos_ne (reciproque : une seconde occurrence divergente).
Ancre carnet 02 : 21 -> 19 -> 16 (le trie compte deux 1, l'echange du
second 1 contre le 4 de la paire profonde).

lake build DeuxMinima : EXIT_0 (8716 jobs), distinct_code_sorry 0 -> 0.

See #18706

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* feat(lean,#18706): pli 5i HuffmanOptimal — le théorème d'optimalité complet

Contraction positionnelle (replaceAtW : refermer la paire de sœurs en une
feuille mariée rembourse exactement sa masse), lecture en facture de la
construction (costW_build_charge : coût interne + charge des fusions, qui ne
lit que la bande des poids), unicité du tri (sortedLe_perm_eq), commutation
huffman_expand (marier d'abord coûte le trie réduit plus la masse), et le
théorème capital huffman_optimal : le trie de Huffman coûte moins que tout
arbre des mêmes feuilles — l'ancre 14 du carnet 02 devient un minimum prouvé.

Preuves : lake build HuffmanOptimal SUCCESS (toolchain v4.33.0, mathlib pin),
count_code_sorry distinct_code_sorry = 0 (15 fichiers du lake),
check_i18n_siblings --all rc=0 (module FR-only, sans sibling).

See #18706

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression-lean,#20634): Echange native_decide -> decide (c2188 volet 1b)

Conversion des 4 occurrences native_decide de Echange.lean (toutes dans
des example d ancrage) vers decide, validee par le sweep v4 du 2026-10-19 :
lake env lean -DautoImplicit=false rc=0, natif 663 s / decide 647 s
(log decide_trials4.log ; PHASE R build rc=0 691 s, 5/5 artefacts).
Blob 5858955 byte-identique entre le commit du sweep 2534c4b
et la tete distante fa95fcf -- la transformation validee
s applique exactement.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression-lean,#20647): Feuilles native_decide -> decide (c2188 volet 1b)

Conversion des 5 occurrences native_decide de Feuilles.lean (examples
d ancrage et leurs have internes) vers decide, validee par le sweep v4
du 2026-10-19 : lake env lean -DautoImplicit=false rc=0, natif 699 s /
decide 653 s (log decide_trials4.log). Blob 7ce3937 byte-identique
entre le commit du sweep 2534c4b et la tete distante 09836cc.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression-lean,#20655): Soeurs native_decide -> decide (c2188 volet 1b)

Conversion des 5 occurrences native_decide de Soeurs.lean vers decide,
validee par le sweep v4 du 2026-10-19 : lake env lean
-DautoImplicit=false rc=0, natif 584 s / decide 674 s (delta +90 s
assume, decide kernel-remplace la reduction native -- log
decide_trials4.log). Blob f02d112 byte-identique entre le commit du
sweep 2534c4b et la tete distante 8161e7d.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression,#18706): ancre du code fixe en decide — réduction du noyau

L'arbre `costAt 0 (.node (.node (.leaf 1) (.leaf 1)) (.node (.leaf 2) (.leaf 4))) = 16`
est explicite : le noyau réduit le terme, donc `decide` suffit et la preuve est
vérifiée sans axiome supplémentaire.

Les deux autres ancres du module portent sur `huffman`, dont la récursion bien
fondée bloque la réduction du noyau (« reduction got stuck ») : elles restent en
`native_decide`, déclarées avec la mesure d'axiomes dans le body de PR.

Vérifié : build complet du lake (8716 jobs, RC=0) — le fichier poussé est
byte-identique à celui qui a été buildé.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression,#18706): ancre de la maille 21 -> 19 en decide — réduction du noyau

`costW (exchPos desequilibre [false, false, true] [true] 2 1) = 19` : la maille
est un arbre explicite, la récursion de `exchPos` s'exécute dans le noyau, donc
`decide` suffit et la preuve est vérifiée sans axiome supplémentaire — c'est la
seule ancre `native_decide` de ce module, il n'en reste aucune après ce commit.

Vérifié : build complet du lake (8716 jobs, RC=0) — le fichier poussé est
byte-identique à celui qui a été buildé.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression,#18706): ancre de la seconde maille en decide — réduction du noyau

`costW (exchPos (exchPos desequilibre ...) ...) = 16` : maille explicite, la
récursion de `exchPos` s'exécute dans le noyau, donc `decide` suffit et la preuve
est vérifiée sans axiome supplémentaire — c'est la seule ancre `native_decide` de
ce module, il n'en reste aucune après ce commit.

Vérifié : build complet du lake (8716 jobs, RC=0) — le fichier poussé est
byte-identique à celui qui a été buildé.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression,#18706): ancres Huffman d'Optimalite en simp -- voie recommandee

Les deux ancres portant sur `huffman` passent de `native_decide` a
`simp [huffman, build, insertT, weight, costAt]` et `simp [huffman, build,
insertT, weight]` : le noyau verifie la preuve, plus de `Lean.ofReduceBool`.

Mesure (review 5568326526, option 1) : la premisse « huffman bien fonde =>
simp inerte » est fausse. `huffman` est un `def` simple
(`build ((ws.map WTree.leaf).foldr insertT [])`) ; seule `build` est bien
fondue (`termination_by ts => ts.length`). `simp` deplie donc `huffman`
entierement et reduit jusqu'a l'arbre explicite des que `weight` entre dans
le jeu de reecriture -- c'est lui qui decide les `if` d'`insertT`. Sans lui,
`build` reste inerte (linter unusedSimpArgs). `decide` et `rfl` restent
bloques : erreur noyau reproduite sur `costAt 0 (huffman [1, 1, 2, 4]) = 14`.

`lake build Optimalite` rc=0 -- 8709 jobs, Built Optimalite (422s).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression,#18706): pli 5i -- l'ancre h14 quitte native_decide pour simp noyau

have h14 : costW (huffman [1, 1, 2, 4]) = 14 prouve par
simp [huffman, build, insertT, weight, costW] -- lake build rc=0 (8717 jobs).
Corrige au passage la premisse causale des bodies : huffman est un def
simple, seule build est bien fondee (termination_by ts => ts.length) ; le
blocage decide mesure est Nat.decEq sur le beq non deplie, pas la WF.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(compression,#18706): pli 5d -- les 4 ancres d'Expansion quittent native_decide pour simp noyau

l.162 et l.171 par simp [huffman, build, insertT, weight, costW] ;
la condition laterale de costW_subst par simp [..., leafWeights] (l'ancre
garde sa structure rw [costW_subst ... h]) ; l.179 par
simp [huffman, build, insertT, weight, subst, leafWeights].
Routes mesurees par sonde prealable (lake env lean ProbeSimp3, zero erreur).
lake build Expansion rc=0 -- Built Expansion (992s), 8712 jobs.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20647
head: 5c6428a
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 09bc9fdda1c20b25c99797e5e428b011cb7298fc95cbbdc3c2e03e9c0b7e7bf5
diff-files: 3
diff-additions: 256
diff-deletions: 2
checks: BLOCKED -- base feature/compression-lean-expansion, not main; PR gate unavailable on this stacked base. Parent 20643 must land before deliberate retarget and checks at the resulting head; close/reopen does not repair a branch filter.
b0: clear
scope: pass
domain: fail -- Lean structural reading complete, but post-conversion build evidence remains author-reported, not independently reproduced here. B.1 body reports distinct_code_sorry 0 to 0; B.2 reports sweep lake build rc0 691s and file check rc0 653s at content conversion 5c6428a; B.3 explicitly not applicable because Compression_lean lacks lean-axiom workflow coverage. Need verifiable exact-content build evidence before domain pass; no claim of a discovered mathematical defect.
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20647
organ-rc: 3
[/ADJOINT PREFLIGHT]

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lean-visibility-drift La PR ajoute des declarations lake non citees par AUCUN notebook (borne large) (#11703) pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants