Status (2026-07-09): COMPLETE — B13-0 … B13-5 all ☑; axiom dyadicUnitFiltration discharged
as a same-name noncomputable def, census 12 → 11 (user-approved). Board archived to
docs/orchestration/. Design fixed during the
planning session (Fable pass, this board + b13-proof-plan.md): the
compactness + O/2O-pigeonhole route to the uniformizer (no spectral-norm value formula
anywhere), explicit graded isomorphisms for the counts, and the four Mathlib pillars
(ProperSpace ℚ_[2] instance, FiniteDimensional.proper/complete,
AddSubgroup.quotient_finite_of_isOpen, finite-field card lemmas) probed green in
lean_run_code. B13-0 recon adds the route-shortening find
IsUltrametricDist.closedBall_openAddSubgroup (ball = bundled OpenAddSubgroup) and turnkey
closers for all four pins (§B13-0). Census is 12; B13-5 decrements it, gated on explicit
user approval.
Conventions as on tickets.md — Model: F = Fable (design-heavy), O =
Opus (well-specified), F→O = Fable design then Opus close. Gates for every ticket:
own-file lake build; lean_verify = exactly {propext, Classical.choice, Quot.sound} on
every new declaration; scripts/check_axioms.sh (census stays 12 until B13-5); stage only your
own files and print the staged set. Development in two new files —
GQ2/UnitFiltrationTop.lean (lane A), GQ2/UnitFiltrationCounts.lean (lane B) — one lane per
file (merge-safety, docs/orchestration/b7prime-b34-coordination.md precedent); do not edit
GQ2/UnitFiltration.lean (shared: Foundations/Axioms.lean imports it).
| # | St | Model | Ticket | Est. | Deps |
|---|---|---|---|---|---|
| B13-0 | ☑ 07-09 | O | Recon: instance incantations at ↥k, card-lemma forms, ball-compactness path |
¼ | — |
| B13-1 | ☑ 07-09 | O | Topology layer: unitBall/dyadicBall, O/2O finite, pigeonhole (UnitFiltrationTop.lean) |
½–1 | B13-0 |
| B13-2 | ☑ 07-09 | O | Uniformizer: gap + attainment + hπ_max + he (UnitFiltrationTop.lean) |
½–1 | B13-1 |
| B13-3 | ☑ 07-09 | O | Residue field O/𝔪: finite, field, char 2, 2^f (hypothesis-π form ok) |
½ | B13-1 (∥ B13-2 vs interface) |
| B13-4 | ☑ 07-09 | O | Graded isomorphisms + the two Nat.card counts (UnitFiltrationCounts.lean) |
1 | B13-2 ∧ B13-3 |
| B13-5 | ☑ 07-09 | O | Capstone dyadicUnitFiltration' + census flip (user gate) |
½ | B13-4 |
Est. in lane-sessions. Limited parallelism: B13-3 ∥ B13-2 if lane B states its layer over
a hypothesis-π (hπ_max as an assumption) and instantiates later. Total ≈
3–4 lane-sessions.
Go/no-go: GO — no surprises, and one route-shortening find. Turnkey closers below. The
headline: IsUltrametricDist.closedBall_openAddSubgroup (Mathlib.Analysis.Normed.Group.Ultra)
gives the closed ball directly as a bundled OpenAddSubgroup ↥k — the plan's separate
"ball subgroup + prove-it-open" story collapses to one term, shrinking B13-1.
- ✓ Instances (planning probe):
NormedField ↥k := inferInstance;CompleteSpace ↥k := FiniteDimensional.complete ℚ_[2] ↥k;ProperSpace ↥k := FiniteDimensional.proper ℚ_[2] ↥k(direct at theIntermediateFieldsubtype);‖x‖ = ‖(x : ℚ̄₂)‖byrfl;IsUltrametricDist ↥k := inferInstance; unit ball compact viaisCompact_closedBall (0 : ↥k) 1. No fallback needed. - ✓ Card forms.
FiniteField.card F 2 : ∃ n : ℕ+, Nat.Prime 2 ∧ Fintype.card F = 2 ^ ↑n— sof := ↑nwith1 ≤ ffree fromn.2; bridgeFintype F := Fintype.ofFinite FandNat.card_eq_fintype_card; units byFintype.card_units(Nat.card Fˣ = 2^f − 1). Verified:[Field F] [Finite F] [CharP F 2] ⟹ ∃ f, 1 ≤ f ∧ Nat.card F = 2^f ∧ Nat.card Fˣ = 2^f − 1. - ✓
O/2Ofinite (the crux — full assembly green):Name pins: additiveopen IsUltrametricDist Metric noncomputable def Oball : OpenAddSubgroup ↥k := closedBall_openAddSubgroup ↥k (r := 1) one_pos noncomputable def twoOball : OpenAddSubgroup ↥k := closedBall_openAddSubgroup ↥k (r := ‖(2 : ℚ̄₂)‖) (norm_pos_iff.mpr two_ne_zero) -- membership is `rfl`-level: x ∈ (Oball k).toAddSubgroup ↔ ‖x‖ ≤ 1 := mem_closedBall_zero_iff -- CompactSpace ↥(Oball k).toAddSubgroup : -- isCompact_iff_compactSpace.mp (by rw [(rfl : ↑(Oball k).toAddSubgroup = closedBall 0 1)]; -- exact isCompact_closedBall 0 1) -- Finite (↥(Oball k).toAddSubgroup ⧸ (twoOball k).toAddSubgroup.addSubgroupOf (Oball k).toAddSubgroup) : -- AddSubgroup.quotient_finite_of_isOpen _ -- (continuous_subtype_val.isOpen_preimage _ (twoOball k).isOpen)
subgroupOfisAddSubgroup.addSubgroupOf; radius positivitynorm_pos_iff.mpr two_ne_zero; membershipMetric.mem_closedBall_zero_iff. - ✓ Residue + counts idioms. Unit ball as a ring:
Osub : Subring ↥k, carrier{‖x‖ ≤ 1},mul_mem'bymul_le_one₀ hx (norm_nonneg _) hy(+ theIsUltrametricDist.norm_add_le_maxadd_mem'fromdepthUnits). EndpointFinite.isField_of_domain S([Finite] [IsDomain]).Nat.cardquotient plumbing (B13-4):Nat.card_congr (QuotientGroup.quotientKerEquivOfSurjective f hf).toEquivafter rewriting theaddSubgroupOf-subgroup tof.ker. Additive graded hom toMultiplicative (O/𝔪):{ toFun := fun g => Multiplicative.ofAdd (φ g), map_one' := by simp […], map_mul' := fun x y => by simp [hm, ofAdd_add] }.
Model note: O — done; the route is fully de-risked. B13-1's deliverable interface is just
Oball/twoOball (above) + M := Nat.card (↥O ⧸ (2O).addSubgroupOf O); the Subring Osub
and 𝔪-ideal move to B13-3 (they carry the multiplicative structure the counts need).
Landed (all std-3, lean_verify on exists_pow_sub_dyadic = std-3, full lake build GQ2 green):
unitBall/dyadicBall : OpenAddSubgroup ↥k (off closedBall_openAddSubgroup), @[simp]
mem_unitBall/mem_dyadicBall, unitBall_pow_mem, the CompactSpace ↥(unitBall k).toAddSubgroup
and Finite (↥O ⧸ (dyadicBall).addSubgroupOf (unitBall)) instances, and the deliverable pigeonhole
theorem exists_pow_sub_dyadic {x : ↥k} (hx : ‖x‖ ≤ 1) :
∃ i j : ℕ, i < j ∧ ‖x ^ i - x ^ j‖ ≤ ‖(2 : ℚ̄₂)‖(Fintype.exists_ne_map_eq_of_card_lt on i ↦ ⟦xⁱ⟧ ∈ O/2O; QuotientAddGroup.eq_iff_sub_mem +
AddSubgroup.mem_addSubgroupOf extract the ball membership; norm_sub_rev handles the WLOG).
For B13-2: call exists_pow_sub_dyadic (with ‖x‖ ≤ 1 from ‖x‖ < 1), then factor
xⁱ − xʲ = xⁱ(1 − xʲ⁻ⁱ): for ‖x‖ < 1, ‖1 − xʲ⁻ⁱ‖ = 1 (ultrametric), so ‖x‖ⁱ ≤ ‖2‖, and
i = 0 is impossible (‖1 − x^{j}‖ = 1 > ‖2‖) ⟹ i ≥ 1. M was folded into the pigeonhole
(internal Fintype.card), not exported. The unit-ball Subring Osub + residue field are B13-3.
Landed (all std-3, check_axioms green, own-file + B13-3-rebuild green). Appended to lane A's
UnitFiltrationTop.lean:
norm_two_lt_one‖(2:ℚ̄₂)‖ < 1—spectralNorm_extends(spectral norm extends the base norm) +Padic.norm_p(‖2‖_{ℚ₂} = 2⁻¹). The load-bearing fact.dyadicIndex k := #(O/2O),one_le_dyadicIndex, andexists_pow_sub_dyadicrefined to exposej ≤ dyadicIndex k(the raw B13-1 pigeonhole folded into the bounded form).uniform_gap‖x‖ < 1 → ‖x‖ ^ dyadicIndex k ≤ ‖2‖(power form, norpow): factorxⁱ(1 − xʲ⁻ⁱ),‖1 − xʲ⁻ⁱ‖ = 1vianorm_add_eq_max_of_norm_ne_norm, then‖x‖^M ≤ ‖x‖ⁱ.exists_uniformizer—πnorm-maximal below 1, attained byIsCompact.exists_isMaxOnon the compact{‖y‖^M ≤ ‖2‖}(Metric.isCompact_of_isClosed_isBoundedin the proper↥k;uniform_gapputs every norm-< 1element there). (This replaces the plan'sK = {‖2‖ ≤ ‖x‖ ≤ …}set — the‖y‖^M ≤ ‖2‖ball is cleaner and rpow-free.)exists_ramificationIndex— exact‖2‖ = ‖π‖^e,e ≥ 1:e := Nat.findleast with‖π‖^{e+1} < ‖2‖; exactness fromhmaxapplied to2/π^e. (Norm algebra only — no finite-dimensionality; usable at hypothesis-π.)exists_uniformizer_data— theℚ̄₂-form package∃ π ∈ k, π ≠ 0 ∧ ‖π‖ < 1 ∧ hπ_max ∧ 1 ≤ e ∧ ‖2‖ = ‖π‖^e, exactly B13-5's π+e input.
The exchange ‖x‖ < 1 ↔ ‖x‖ ≤ ‖π‖ is just hπ_max + ‖π‖ < 1 (packaged in
exists_uniformizer); 𝔪 = πO belongs to B13-3's residue field (☑, UnitFiltrationCounts.lean),
which is already stated over hypothesis-π and instantiates at this π in B13-5.
Delivered (all std-3; lake build green 8593 jobs; guard census 12). Decoupled from B13-2
entirely — 𝔪 is defined intrinsically as {‖x‖ < 1} (the non-units), not via a
uniformizer, so no hπ_max hypothesis was needed and the file is independent of lane A. Public
API (namespace GQ2.UnitFiltrationCounts, for B13-4/B13-5):
Osub k : Subring ↥k({‖x‖ ≤ 1};mul_mem'viamul_le_one₀,add_mem'vianorm_add_le_max) + itsCompactSpace(carrier =closedBall 0 1,refine isCompact_iff_compactSpace.mp— B13-1's pattern).maxIdeal k : Ideal ↥(Osub k)({‖·‖ < 1}) +@[simp] mem_maxIdeal;IsPrimeinstance.Finite (↥(Osub k) ⧸ maxIdeal k)(AddSubgroup.quotient_finite_of_isOpen;𝔪open viacontinuous_subtype_val.isOpen_preimage {‖·‖<1}).ResidueField k(abbrev) +noncomputable instance : Fieldvia(Finite.isField_of_domain _).toField(reuses theIdeal.QuotientCommRing, diamond-free).norm_two_lt_one(‖(2:ℚ̄₂)‖ < 1vianorm_algebraMap'+Padic.norm_p),two_eq_zero, andCharP (ResidueField k) 2(from(2:F)=0viaCharP.exists+CharP.char_is_prime+cast_eq_zero_iff+Nat.prime_dvd_prime_iff_eq).residue_card—∃ f, 1 ≤ f ∧ Nat.card (O/𝔪) = 2^f ∧ Nat.card (O/𝔪)ˣ = 2^f − 1(FiniteField.card+Nat.card_eq_fintype_card+Fintype.card_units).
Note for B13-4: the reduction map is Ideal.Quotient.mk (maxIdeal k); the residue field is a
finite field, so frobeniusEquiv/FiniteField API applies. (Field instance is .toField,
not Ideal.Quotient.field — the IsMaximal→auto-Field path did not fire on the abbrev.)
Landed (all std-3, check_axioms green, own-file build green). Appended to lane B's
UnitFiltrationCounts.lean (namespace GQ2.UnitFiltrationCounts), parameterized by a uniformizer
π : ↥k (B13-2's exists_uniformizer):
gradeZeroHom : U⁰ →* (O/𝔪)ˣ(normUnitToOsubUnitthenUnits.map (Ideal.Quotient.mk 𝔪));gradeZeroHom_ker = U¹(the‖x‖ < 1 ↔ ‖x‖ ≤ ‖π‖exchange),gradeZeroHom_surjective, hencecard_gradeZero : #(U⁰/U¹) = #(O/𝔪)ˣ.gradeIHom : U^{(i)} →* Multiplicative (O/𝔪)(u ↦ (u−1)/πⁱ mod 𝔪,i ≥ 1) — the hom law isdepthRes_add, the cross-term(u−1)(v−1)/πⁱhaving residue 0 (norm≤ ‖π‖ⁱ < 1);gradeIHom_ker = U^{(i+1)}(the scaled exchange‖x‖ < ‖π‖ⁱ ↔ ‖x‖ ≤ ‖π‖^{i+1}),gradeIHom_surjective(witness1 + a·πⁱ), hencecard_gradeI : #(U^i/U^{i+1}) = #(O/𝔪).exists_gradeCounts(the B13-5 input):∃ f ≥ 1, #(U⁰/U¹) = 2^f − 1 ∧ ∀ i ≥ 1, #(U^i/U^{i+1}) = 2^f— the isos composed with B13-3'sresidue_card.
Nat.card transport is Nat.card_congr (QuotientGroup.quotientKerEquivOfSurjective … ).toEquiv
(the B12-1 idiom); Nat.card (Multiplicative X) = Nat.card X by rfl (type synonym). B13-5 now
has all four structure inputs: π + e (B13-2) and f + the graded counts (here).
(Original ticket text.) Plan §1(G). Two homs with kernel + surjectivity, then Nat.card
transport to the exact DyadicUnitFiltration-field shapes:
U⁰ →* (O/𝔪)ˣ,u ↦ ū; kernelU¹; surjective via the exchange (a ∈ O ∖ 𝔪 ⟹ ‖a‖ = 1).U^{(i)} →* Multiplicative (O/𝔪)(i ≥ 1),u ↦ ((u−1)/π^i)‾; hom law via the cross-term depth2i ≥ i+1; kernelU^{(i+1)}; surjective viau := 1 + aπ^i.
theorem dyadicUnitFiltration' (k) [FiniteDimensional ℚ_[2] k] : DyadicUnitFiltration k —
a plain public theorem (B11b consumes it at k and at L = k(δa) — no private, no
k-specific baggage); lean_verify = std-3. Then the flip (B7′-5b pattern): Axioms.lean
axiom → same-name theorem (+ import); EXPECTED_AXIOMS −1 + history note;
AxiomLedger.bAxioms row; literature-axioms.md B13 row → discharged (keep the Serre LF IV §2
Prop. 6 citation), onepage, tickets.md census notes; regenerate atlas-audit.md; spot
lean_verify on B13 consumers (ResidueLift.exists_rootOfUnity_near,
DimClose.lemma_6_17_dim_of_residueLift: B13 vanishes, nothing else changes); archive this
board + plan to docs/orchestration/. Quiet tree; coordinate with any active B11b lane
(B11b needs only the capstone, not the flip).