Skip to content

Commit c0c70c6

Browse files
hyperpolymathclaude
andcommitted
feat+docs: Lane 3 lex-pair closes <ᵇ-ψΩ≤ ν=μ + Lane 5 Walkthrough 2 + Pillar E packaging README
Three follow-ups in one slice, all on top of the consolidation branch. Lane 3 (follow-on slice, 2026-05-27): - Ordinal.Buchholz.RankLex: RankLex record over Ord × Ord, _<lex_ data type (first-strict / second-strict-with-shared-implicit-a), rank-lex : BT → RankLex (bOmega ν seeds the second component with ω-rank-pow ν as a placeholder), and headline rank-mono-<ᵇ-ψΩ≤-lex covering both ν<μ (first-strict via ω-rank-pow-mono) and ν=μ (second-strict via the admissibility bound rank-pow α <′ ω-rank-pow ν). - Pinned in proofs/agda/Ordinal/Buchholz/Smoke.agda (own block per CLAUDE.md Working rules), wired into proofs/agda/All.agda. - docs/echo-types/buchholz-rank-obstruction.adoc per-constructor verdict bumped 10/13 → 11/13; <ᵇ-ψΩ≤ flips from "encoding mismatch" to "closed (Lane 3 follow-on)" with the lex pair explanation. Open work narrowed to just <ᵇ-+1 joint-bplus. Lane 5 (Walkthrough 2 LANDED): - tutorial/epistemic_erasure/EpistemicErasure.agda — concrete KDF (4-seed → 2-key), two distinct echoes of the same key, no-section-via-residue lifted from EchoResidue's existing Bool-collapse no-section. Honest-bound disclosure at top (NOT a byte-zeroing claim). Matched-negative block at bottom (NotProved-byteZeroing / cryptographicOneWayness / collisionResistance / seedDistribution as ⊤-aliases so a grep NotProved catches every category-error claim). - tutorial/epistemic_erasure/Smoke.agda, All.agda, README.adoc. - Wired into tutorial/All.agda; tutorial/README.adoc unpark status updated to "1 + 2 LANDED, 3 still at design-doc level". Pillar E offline (pre-staging beyond gates): - README.md gains §"Installing as a library" (under Build) + §"Citation". Both consistent with the existing CITATION.cff placeholder DOI and pillar-e-offline.adoc activation sequence. - docs/echo-types/pillar-e-offline.adoc §"Zenodo DOI mint" and §"Library packaging" gain "Pre-staging status" subsections recording what is landed (CITATION.cff, .zenodo.json, README sections, echo-types.agda-lib) and what is deferred (CI install-self job + GitHub→Zenodo workflow — both gated on user authorising the Zenodo integration; bundling them avoids a transient CI red). Build verification: All four entry points exit 0 under --safe --without-K with zero postulates: - proofs/agda/All.agda - proofs/agda/Smoke.agda - proofs/agda/Ordinal/Buchholz/Smoke.agda - tutorial/All.agda Based off the in-flight PR #118 consolidation branch (which carries RankAdm + the previous session's Lane 3 active-push, Lane 5 Walkthrough 1, N5 sharpening, and Pillar E pre-staging). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 0cc2c13 commit c0c70c6

12 files changed

Lines changed: 710 additions & 29 deletions

File tree

README.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,46 @@ cd /var/mnt/eclipse/repos/echo-types
201201
agda -i proofs/agda proofs/agda/All.agda
202202
```
203203

204+
### Installing as a library
205+
206+
The repo is structured as an Agda library via `echo-types.agda-lib`
207+
at the repo root. To use `echo-types` from another Agda project,
208+
register the library file once:
209+
210+
```bash
211+
git clone https://github.com/hyperpolymath/echo-types.git
212+
echo "$(pwd)/echo-types/echo-types.agda-lib" >> ~/.agda/libraries
213+
```
214+
215+
Then in any other project, depend on `echo-types` in that
216+
project's own `.agda-lib`:
217+
218+
```text
219+
name: my-project
220+
depend: standard-library echo-types
221+
include: src
222+
```
223+
224+
Consumers can then `open import Echo`, `open import EchoLinear`,
225+
or `open import tutorial.region_exit_audit.RegionExitAudit` — the
226+
library's `include:` line covers both `proofs/agda` and the repo
227+
root (for the Lane 5 tutorial track).
228+
229+
Requires `standard-library` v2.3 or later registered alongside.
230+
231+
## Citation
232+
233+
If you cite this repository in academic work, please cite via the
234+
Zenodo DOI listed in [CITATION.cff](CITATION.cff). The Zenodo
235+
record is the canonical citation target; GitHub's "Cite this
236+
repository" widget resolves directly to it.
237+
238+
GitHub→Zenodo integration is a one-time author setup; until that
239+
is wired the `CITATION.cff` `doi:` field carries a placeholder
240+
(`10.5281/zenodo.0000000`). See
241+
[docs/echo-types/pillar-e-offline.adoc](docs/echo-types/pillar-e-offline.adoc)
242+
§"Zenodo DOI mint" for the activation sequence.
243+
204244
## Tooling Stance
205245

206246
- default development stays plain Agda with the standard library

docs/echo-types/buchholz-rank-obstruction.adoc

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -304,29 +304,33 @@ constructors discharge by additive-principal closure.
304304
| `<ᵇ-+Ω` | ✓ closed | `rank-pow-bplus-into-ω-rank-pow` (additive-principal at the target) plus the WfCNF tail bound `y ≤ᵇ x` (caller-provided).
305305
| `<ᵇ-+ψ` | ✓ closed | Same as `<ᵇ-+Ω` since `rank-pow (bpsi ν _) = ω-rank-pow ν`.
306306
| `<ᵇ⁺-ψα` | ✓ closed (Lane 3, 2026-05-26) | `rank-adm (bpsi ν α) = ω-rank-pow ν ⊕ rank-pow α`; `⊕-mono-<-right` closes the shared-Ω-index lex case from `rank-pow α <′ rank-pow β` (which the existing `_<ᵇ⁰_` umbrella discharges). Primitive `rank-mono-<ᵇ⁺-ψα-from-pow` in `Ordinal.Buchholz.RankAdm`.
307-
| `<ᵇ-ψΩ≤` | ⏳ encoding mismatch | `ν <Ω μ` (strict) case closes by `additive-principal-ω-rank-pow {μ}`. `ν = μ` case STILL OPEN: `ω-rank-pow μ ⊕ rank-pow α <′ ω-rank-pow μ` is impossible under any rank shape with `ω-rank-pow νrank-adm (bpsi ν α)`. The classical Buchholz gap `[Ω_μ, Ω_{μ+1})` that admissible ψ_μ(α) lives in is not modelled by `ω-rank-pow ν ⊕ rank-pow α`. Two design follow-ups (lex pair, multiplicative ordinal) documented in `RankAdm.agda` §"<ᵇ-ψΩ≤-still-open"; option A (lex pair) recommended.
307+
| `<ᵇ-ψΩ≤` | ✓ closed (Lane 3 follow-on, 2026-05-27) | Lex-pair rank `rank-lex : BT → RankLex` in `Ordinal.Buchholz.RankLex`, with `rank-lex (bOmega ν) = mkLex (ω-rank-pow ν) (ω-rank-pow ν)` and `rank-lex (bpsi ν α) = mkLex (ω-rank-pow ν) (rank-pow α)`. Both sub-cases close via `rank-mono-<ᵇ-ψΩ≤-lex`: ν<μ via `<lex-first` + `ω-rank-pow-mono`; ν=μ via `<lex-second` + the admissibility bound `rank-pow α <′ ω-rank-pow ν`. The "structurally impossible under any rank shape with `ω-rank-pow ν ≤ rank-adm (bpsi ν α)`" verdict from `RankAdm.agda` was scoped to *scalar* ranks; option (A) lex-pair sidesteps it cleanly.
308308
| `<ᵇ-+1` | ⏳ joint-bplus | `rank-pow (bplus z₁ z₂)` is not additive principal in general (it's a sum of additive principals). Discharging requires a coarser bound (e.g., dominate by `ω-rank-pow` of the leading subterm's Ω-index) or a structurally richer rank.
309309
| `<ᵇ-0-+` | ✓ closed* | `rank-pow bzero = oz`, and `rank-pow (bplus x y) ≥′ oz` strictly when *either* `x` or `y` is non-`bzero` and the term is WfCNF. The degenerate `bplus bzero bzero` is excluded by WfCNF (atomic-right ≤ left forces both `bzero` and then the sum reduces to a `bzero`-shaped equivalent that doesn't pattern-match as a `bplus` under CNF normalisation — covered as a side-condition).
310310
|===
311311

312-
*Score: 10/13 constructors closed (9 under the original `rank-pow`
313-
umbrella + 1 under the new `rank-adm` slice); 2 deferred under
314-
explicit blockers; 1 closed conditionally with documented side
315-
condition. The Lane-3 active-push slice on 2026-05-26 advanced the
316-
score by 1 (`<ᵇ⁺-ψα`) and re-classified `<ᵇ-ψΩ≤` from "admissibility"
317-
to "encoding mismatch" with two named follow-up routes.*
312+
*Score: 11/13 constructors closed (9 under the original `rank-pow`
313+
umbrella + 1 under the `rank-adm` slice + 1 under the `rank-lex`
314+
slice); 1 deferred under an explicit blocker (`<ᵇ-+1` joint-bplus);
315+
1 closed conditionally with documented side condition. The Lane-3
316+
active-push slice on 2026-05-26 closed `<ᵇ⁺-ψα` (rank-adm) and
317+
re-classified `<ᵇ-ψΩ≤` to "encoding mismatch"; the Lane-3 follow-on
318+
slice on 2026-05-27 closed `<ᵇ-ψΩ≤` via option (A) (lex pair).
319+
Only `<ᵇ-+1` joint-bplus remains in the per-constructor matrix.*
318320

319321
=== What remains open
320322

321323
* *ψ-admissibility predicate* (`WellFormedAdmissible.agda`, landed
322324
earlier; `RankAdm.agda` landed 2026-05-26 in the Lane 3 active-push
323-
slice). Refines `WfCNF` with the rank-bound on ψ-arguments.
325+
slice; `RankLex.agda` landed 2026-05-27 in the Lane 3 follow-on).
326+
Refines `WfCNF` with the rank-bound on ψ-arguments.
324327
*Status*: `<ᵇ⁺-ψα` *closed* via `rank-mono-<ᵇ⁺-ψα-from-pow` in
325-
`RankAdm.agda`. `<ᵇ-ψΩ≤` ν=μ boundary case re-classified as
326-
*encoding mismatch* — needs a richer rank target (two-component
327-
lex or multiplicative ordinal), not just the admissibility
328-
carrier. See `RankAdm.agda` §"<ᵇ-ψΩ≤-still-open" for the two
329-
design options; option A (lex pair) recommended.
328+
`RankAdm.agda`. `<ᵇ-ψΩ≤` (both ν<μ and ν=μ) *closed* via
329+
`rank-mono-<ᵇ-ψΩ≤-lex` in `RankLex.agda` (option A from the
330+
design follow-up — lex pair over `Ord × Ord`). The boundary
331+
case ν=μ no longer needs the additive-principal closure; the
332+
admissibility bound `rank-pow α <′ ω-rank-pow ν` discharges it
333+
directly on the second component of the lex pair.
330334
* *`<ᵇ-+1` joint-bplus*. Needs either a coarser dominator (e.g., a
331335
function `BT → OmegaIndex` returning the leading Ω-index, then
332336
rank into `ω-rank-pow ∘ leading-index`) or a richer rank shape.

docs/echo-types/pillar-e-offline.adoc

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,17 @@ The DOI ladder for a mechanised artefact paper:
142142
I leave there) and commit. Same for `.zenodo.json`.
143143

144144
This is a 15-minute author-driven sequence once Zenodo is hooked.
145-
I'll pre-stage `CITATION.cff` and `.zenodo.json` in a separate PR
146-
on request.
145+
146+
*Pre-staging status (updated 2026-05-27).* `CITATION.cff` and
147+
`.zenodo.json` are both landed at the repo root with placeholder
148+
DOI (`10.5281/zenodo.0000000`) and creator block (ORCID commented
149+
out — supply on author setup). The README citation section
150+
(`README.md` §Citation) points at `CITATION.cff` and at this
151+
document's §"Zenodo DOI mint" for the activation sequence. The
152+
GitHub→Zenodo workflow itself is intentionally NOT pre-staged
153+
because activating it before the user has authorised the Zenodo
154+
integration would cause CI runs to fail noisily; the workflow
155+
lands as a small follow-on once the integration is on.
147156

148157
== Library packaging
149158

@@ -191,9 +200,14 @@ echo "$(pwd)/echo-types/echo-types.agda-lib" >> ~/.agda/libraries
191200
`agda --library echo-types -- proofs/agda/All.agda` to prove the
192201
packaging works end-to-end.
193202

194-
This is wholly in-repo — I can do all three. The Zenodo bits
195-
require the user's account, so they're tracked as the next step
196-
after packaging lands.
203+
*Pre-staging status (updated 2026-05-27).* Items 1 (`echo-types.agda-lib`
204+
with dual `include: proofs/agda .`) and 2 (README §"Build" >
205+
"Installing as a library" subsection with the registration and
206+
consumer-side `depend:` snippet) are both landed. Item 3 (CI
207+
install-self job) is deferred so it can be wired alongside the
208+
GitHub→Zenodo workflow once the user authorises the integration —
209+
both are downstream of the same author-driven setup, and bundling
210+
them avoids a transient CI red between the two PRs.
197211

198212
== Outreach drafts
199213

proofs/agda/All.agda

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ open import Ordinal.Buchholz.RankBrouwer
108108
open import Ordinal.Buchholz.RankPartial
109109
open import Ordinal.Buchholz.RankPow
110110
open import Ordinal.Buchholz.RankAdm
111+
open import Ordinal.Buchholz.RankLex
111112
open import Ordinal.Buchholz.RankMonoUmbrella
112113
open import Ordinal.Buchholz.RecursiveSurfaceOrder
113114
open import Ordinal.Buchholz.RecursiveSurfaceBudget
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
{-# OPTIONS --safe --without-K #-}
2+
3+
-- Lex-pair rank for Buchholz terms (Lane 3 follow-on slice, 2026-05-27).
4+
--
5+
-- ## Where this sits
6+
--
7+
-- `Ordinal.Buchholz.RankAdm.rank-adm` discharged the `<ᵇ⁺-ψα`
8+
-- (shared-Ω-index lex) constructor by shifting the ψ-rank from
9+
-- `ω-rank-pow ν` (α-blind) to `ω-rank-pow ν ⊕ rank-pow α`
10+
-- (α-discriminating). That fixed `<ᵇ⁺-ψα` cleanly, but it surfaced
11+
-- a new gap: the `<ᵇ-ψΩ≤` constructor at the ν = μ boundary case is
12+
-- *structurally impossible* under any scalar `Ord`-valued rank with
13+
-- `ω-rank-pow ν ≤ rank-adm (bpsi ν α)` — that monotonicity forces
14+
-- the goal `rank-adm (bpsi ν α) <′ ω-rank-pow ν` to imply the absurd
15+
-- `ω-rank-pow ν <′ ω-rank-pow ν` (see `RankAdm.agda`
16+
-- §"<ᵇ-ψΩ≤-still-open" for the full diagnostic).
17+
--
18+
-- The recommended follow-up there was option (A): a two-component
19+
-- lex rank. This module lands it as a *thin* slice: the lex pair
20+
-- exists alongside `rank-pow` and `rank-adm`, only for the headline
21+
-- `<ᵇ-ψΩ≤` close-out. The existing 10 + 1 = 11 closed cases
22+
-- continue to consume the scalar `rank-pow` / `rank-adm` infrastructure
23+
-- unchanged.
24+
--
25+
-- ## What this slice closes
26+
--
27+
-- 1. `RankLex` record with two `Ord` fields (`first`, `second`).
28+
-- 2. `_<lex_` strict order: lex on first, fall through to second on
29+
-- *syntactic* first-component equality (the second-strict
30+
-- constructor pattern-matches the same implicit `a` on both
31+
-- sides, so equality is by unification, not propositional).
32+
-- 3. `rank-lex : BT → RankLex`:
33+
-- bzero ↦ mkLex oz oz
34+
-- bOmega ν ↦ mkLex (ω-rank-pow ν) (ω-rank-pow ν)
35+
-- bpsi ν α ↦ mkLex (ω-rank-pow ν) (rank-pow α)
36+
-- bplus x y ↦ mkLex (rank-pow (bplus x y)) oz
37+
-- The `bOmega ν` second-component placeholder is `ω-rank-pow ν`
38+
-- itself — large enough to dominate any admissible `rank-pow α`
39+
-- bound by `<′ ω-rank-pow ν`.
40+
-- 4. `rank-mono-<ᵇ-ψΩ≤-lex` — the headline. Both the ν <Ω μ strict
41+
-- case (closes via `<lex-first` + `ω-rank-pow-mono`) and the
42+
-- ν = μ boundary case (closes via `<lex-second` + the
43+
-- admissibility bound `rank-pow α <′ ω-rank-pow ν`).
44+
--
45+
-- ## What this slice deliberately does NOT close
46+
--
47+
-- * `<ᵇ-+1` joint-bplus. Unchanged from `RankAdm.agda` / `RankPow.agda`
48+
-- deferral — needs a coarser dominator (leading-Ω-index) or a
49+
-- richer rank shape on `bplus`. See `RankPow.agda` and
50+
-- `docs/echo-types/buchholz-rank-obstruction.adoc`.
51+
-- * Full `rank-lex-mono-<ᵇ⁻` umbrella. The 11 existing constructor
52+
-- primitives in `RankPow` / `RankAdm` are scalar; lifting them to
53+
-- the lex form would require re-stating each (per design note A in
54+
-- `RankAdm.agda`). This slice ships ONLY the headline lex-mono
55+
-- for the boundary-case constructor; the umbrella will compose
56+
-- `rank-pow-mono-<ᵇ⁰` (10 cases) + `rank-mono-<ᵇ⁺-ψα-from-pow`
57+
-- (`<ᵇ⁺-ψα` via `rank-adm`) + this slice's
58+
-- `rank-mono-<ᵇ-ψΩ≤-lex` (`<ᵇ-ψΩ≤`) under a single dispatch.
59+
-- Deferred to the consumer-side umbrella refresh.
60+
--
61+
-- ## Headlines (pinned in `Ordinal/Buchholz/Smoke.agda`)
62+
--
63+
-- * `RankLex` / `mkLex` -- the carrier
64+
-- * `_<lex_` / `<lex-first` / `<lex-second` -- the strict order
65+
-- * `rank-lex` -- the lex rank
66+
-- * `rank-lex-bzero`, `rank-lex-bOmega`,
67+
-- `rank-lex-bplus`, `rank-lex-bpsi` -- definitional sanity
68+
-- * `rank-mono-<ᵇ-ψΩ≤-lex` -- the slice's headline
69+
70+
module Ordinal.Buchholz.RankLex where
71+
72+
open import Data.Sum.Base using (inj₁; inj₂)
73+
open import Relation.Binary.PropositionalEquality using (_≡_; refl)
74+
75+
open import Ordinal.OmegaMarkers using
76+
( OmegaIndex
77+
; _≤Ω_
78+
; _<Ω_
79+
; ≤Ω-split
80+
)
81+
open import Ordinal.Brouwer using (Ord; oz; osuc)
82+
open import Ordinal.Brouwer.Phase13 using (_<′_; _≤′_)
83+
open import Ordinal.Buchholz.Syntax using
84+
( BT
85+
; bzero
86+
; bOmega
87+
; bplus
88+
; bpsi
89+
)
90+
open import Ordinal.Buchholz.RankPow using
91+
( rank-pow
92+
; ω-rank-pow
93+
; ω-rank-pow-mono
94+
)
95+
96+
----------------------------------------------------------------------
97+
-- The lex-pair carrier
98+
----------------------------------------------------------------------
99+
100+
record RankLex : Set where
101+
constructor mkLex
102+
field
103+
first : Ord
104+
second : Ord
105+
106+
open RankLex public
107+
108+
----------------------------------------------------------------------
109+
-- Lex strict order
110+
----------------------------------------------------------------------
111+
112+
-- Two constructors. `<lex-first` covers the strict-on-first case.
113+
-- `<lex-second` covers the same-first-strict-on-second case; the
114+
-- shared implicit `a` on both sides makes the equality syntactic,
115+
-- so callers do not need to thread an `_≡_` witness.
116+
117+
data _<lex_ : RankLex RankLex Set where
118+
<lex-first : {a₁ a₂ b₁ b₂}
119+
a₁ <′ a₂
120+
mkLex a₁ b₁ <lex mkLex a₂ b₂
121+
<lex-second : {a b₁ b₂}
122+
b₁ <′ b₂
123+
mkLex a b₁ <lex mkLex a b₂
124+
125+
infix 4 _<lex_
126+
127+
----------------------------------------------------------------------
128+
-- The lex rank
129+
----------------------------------------------------------------------
130+
131+
-- Diverges from `rank-pow` and `rank-adm` only in how it records
132+
-- the boundary information. For `bOmega ν` the second-component
133+
-- placeholder is `ω-rank-pow ν` itself — large enough to dominate
134+
-- any admissible `rank-pow α` (which the admissibility predicate
135+
-- bounds by `<′ ω-rank-pow ν`).
136+
137+
rank-lex : BT RankLex
138+
rank-lex bzero = mkLex oz oz
139+
rank-lex (bOmega ν) = mkLex (ω-rank-pow ν) (ω-rank-pow ν)
140+
rank-lex (bpsi ν α) = mkLex (ω-rank-pow ν) (rank-pow α)
141+
rank-lex (bplus x y) = mkLex (rank-pow (bplus x y)) oz
142+
-- The `bplus` case uses scalar `rank-pow` on the first component
143+
-- and `oz` on the second; we have no lex headline that fires on
144+
-- the `bplus` constructor in this slice (the `<ᵇ-+1` joint-bplus
145+
-- gap is unchanged). Consumers wanting a lex bplus-mono primitive
146+
-- would extend this case to `mkLex (rank-pow (bplus x y)) (...)`
147+
-- with their chosen second-component bound.
148+
149+
----------------------------------------------------------------------
150+
-- Definitional sanity
151+
----------------------------------------------------------------------
152+
153+
rank-lex-bzero : rank-lex bzero ≡ mkLex oz oz
154+
rank-lex-bzero = refl
155+
156+
rank-lex-bOmega : ν rank-lex (bOmega ν) ≡ mkLex (ω-rank-pow ν) (ω-rank-pow ν)
157+
rank-lex-bOmega _ = refl
158+
159+
rank-lex-bpsi : ν α rank-lex (bpsi ν α) ≡ mkLex (ω-rank-pow ν) (rank-pow α)
160+
rank-lex-bpsi _ _ = refl
161+
162+
rank-lex-bplus : x y rank-lex (bplus x y) ≡ mkLex (rank-pow (bplus x y)) oz
163+
rank-lex-bplus _ _ = refl
164+
165+
----------------------------------------------------------------------
166+
-- Headline: `<ᵇ-ψΩ≤` rank-mono under `rank-lex`
167+
----------------------------------------------------------------------
168+
169+
-- The boundary-case constructor. Hypotheses are exactly what
170+
-- `<ᵇ-ψΩ≤` carries (`ν ≤Ω μ`) plus the admissibility predicate's
171+
-- rank bound on ψ-arguments (`rank-pow α <′ ω-rank-pow ν`, which
172+
-- `WfAdm (bpsi ν α)` supplies via its `wf-adm-bpsi` constructor).
173+
--
174+
-- Both sub-cases close:
175+
-- * `inj₁ ν<μ` — strict on first component via `ω-rank-pow-mono`.
176+
-- * `inj₂ refl` — ν = μ; first components are syntactically equal,
177+
-- so `<lex-second` fires with the admissibility bound on the
178+
-- second component.
179+
180+
rank-mono-<ᵇ-ψΩ≤-lex : {ν μ α}
181+
ν ≤Ω μ
182+
rank-pow α <′ ω-rank-pow ν
183+
rank-lex (bpsi ν α) <lex rank-lex (bOmega μ)
184+
rank-mono-<ᵇ-ψΩ≤-lex {ν} {μ} {α} ν≤μ adm with ≤Ω-split ν≤μ
185+
... | inj₁ ν<μ = <lex-first (ω-rank-pow-mono ν<μ)
186+
... | inj₂ refl = <lex-second adm

proofs/agda/Ordinal/Buchholz/Smoke.agda

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,3 +361,23 @@ open import Ordinal.Buchholz.RankAdm using
361361
; rank-pow≤rank-adm
362362
; rank-mono-<ᵇ⁺-ψα-from-pow
363363
)
364+
365+
-- Lane 3 follow-on slice 2026-05-27 (own block per CLAUDE.md
366+
-- Working rules): lex-pair rank `rank-lex` discharging the
367+
-- `<ᵇ-ψΩ≤` ν=μ boundary case that `rank-adm` left structurally
368+
-- open. Option (A) from `RankAdm.agda` §"<ᵇ-ψΩ≤-still-open"
369+
-- (lex pair over `Ord × Ord`). Headline
370+
-- `rank-mono-<ᵇ-ψΩ≤-lex` covers both ν<μ and ν=μ sub-cases.
371+
open import Ordinal.Buchholz.RankLex using
372+
( RankLex
373+
; mkLex
374+
; _<lex_
375+
; <lex-first
376+
; <lex-second
377+
; rank-lex
378+
; rank-lex-bzero
379+
; rank-lex-bOmega
380+
; rank-lex-bpsi
381+
; rank-lex-bplus
382+
; rank-mono-<ᵇ-ψΩ≤-lex
383+
)

tutorial/All.agda

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
-- Tutorial-track aggregator. Mirrors `proofs/agda/All.agda` for the
55
-- Lane 5 walkthrough track.
66
--
7-
-- Only Walkthrough 1 (`tutorial.region_exit_audit`) is currently
8-
-- realised in Agda. Walkthroughs 2 (epistemic erasure) and 3
9-
-- (provenance / debugging) remain at scaffold/design-doc level per
10-
-- `tutorial/README.adoc` — they should be registered here when they
11-
-- land.
7+
-- Walkthroughs 1 (`tutorial.region_exit_audit`) and 2
8+
-- (`tutorial.epistemic_erasure`) are currently realised in Agda.
9+
-- Walkthrough 3 (provenance / debugging) remains at scaffold/
10+
-- design-doc level per `tutorial/README.adoc` — it should be
11+
-- registered here when it lands.
1212
--
1313
-- Build:
1414
-- agda --library-file=/tmp/agda-libs -i . -i proofs/agda \
@@ -18,3 +18,4 @@
1818
module tutorial.All where
1919

2020
import tutorial.region_exit_audit.All
21+
import tutorial.epistemic_erasure.All

0 commit comments

Comments
 (0)