Skip to content

Commit 0cc2c13

Browse files
feat+docs: Lane 5 walkthrough 1 + Lane 3 ψα slice + N5 sharpened + Pillar E offline prep + packaging (#122)
## Summary Four follow-on workstreams from the four design decisions on 2026-05-26. Stacked onto PR #118's consolidation branch (lands with #118 on the final squash to main). **Lane 5 [UNPARKED] — Walkthrough 1 landed** - `tutorial/region_exit_audit/RegionExitAudit.agda`: ephapax-L3-style region exit. `LEcho linear` = LiveHandle, `LEcho affine` = AuditReceipt, `exit = weaken`, `audit-no-recovery = no-section-weaken` aliased per-region. Honest-bound disclosure (NOT a byte-zeroing claim) opens the file; matched-negative block at bottom names the four properties NOT proved. - Per-walkthrough Smoke + All; tutorial-track aggregator; `tutorial/README.adoc` unpark status updated. **Lane 3 [ACTIVE PUSH] — ψ-admissibility rank refinement slice** - `proofs/agda/Ordinal/Buchholz/RankAdm.agda`: admissibility-aware rank with α-discriminating bpsi shape `ω-rank-pow ν ⊕ rank-pow α`. Closes 1 of 2 deferred ψ constructors via `rank-mono-<ᵇ⁺-ψα-from-pow`. The `<ᵇ-ψΩ≤` ν=μ boundary case is *re-classified* from "admissibility" to "encoding mismatch" (a real structural gap surfaced by the slice); two design follow-ups documented inline. - Score in `buchholz-rank-obstruction.adoc`: 9/13 → 10/13. **Gate 2 N5 falsifier — sharpened & resolved** - `characteristic/N5Falsifier.agda`: unsolved metas resolved by pinning the implicit role+grade params at the four `applyRole`/`applyGrade` call sites. The 2026-05-18 broken status was *inference*, not content (Agda cannot recover the role from `RoleGEcho r keep = Echo (obs r) true` because `obs` is not injective). Now in `characteristic/All.agda` CI green closure. - `docs/characteristic.adoc` Rev 5b: N5-not-adopted decision UNCHANGED on the cosmetic-only-marginal-evidence logic. **Pillar E offline prep — all three sub-tasks** - `docs/echo-types/pillar-e-offline.adoc`: venue matrix (TYPES first recommended), Zenodo DOI mint plan, library packaging update, three outreach drafts (Granule/QTT, choreographic, Linear Haskell). - `echo-types.agda-lib`: include path extended to repo root (for tutorial tree). - `CITATION.cff` + `.zenodo.json`: pre-staged with placeholder DOIs and ORCID fields left blank (not invented) for author to add post-mint. ## Test plan - [x] `agda --library=echo-types proofs/agda/All.agda` → exit 0 - [x] `agda --library=echo-types proofs/agda/Smoke.agda` → exit 0 - [x] `agda --library=echo-types proofs/agda/characteristic/All.agda` → exit 0 (N5Falsifier now included) - [x] `agda --library=echo-types tutorial/All.agda` → exit 0 - [x] All under `--safe --without-K`, zero postulates / escape pragmas / funext - [x] GPG-signed - [ ] CI: governance + Hypatia + agda jobs green - [ ] Auto-merge enabled (squash, delete branch) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 6d9b74c commit 0cc2c13

17 files changed

Lines changed: 1216 additions & 64 deletions

File tree

.zenodo.json

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{
2+
"title": "echo-types: a definitionally-grounded, loss-graded reindexing modality (Agda)",
3+
"upload_type": "software",
4+
"description": "Constructive Agda formalisation of fibre-based \"structured loss\" types. Defines Echo f y := Σ (x : A) , (f x ≡ y), shows it is definitionally the homotopy fibre (echo↔fib), and develops a loss-graded reindexing modality on top with a pointwise (funext-relative) mediator property, a separating model, and a carrier-parametric abstraction over a fixed grade poset. Under --safe --without-K throughout with zero postulates and a falsifiable retraction discipline.",
5+
"creators": [
6+
{
7+
"name": "Jewell, Jonathan"
8+
}
9+
],
10+
"keywords": [
11+
"agda",
12+
"graded modality",
13+
"homotopy fibre",
14+
"structured loss",
15+
"reindexing modality",
16+
"formal methods",
17+
"mechanised metatheory",
18+
"echo types"
19+
],
20+
"access_right": "open",
21+
"license": "MPL-2.0",
22+
"related_identifiers": [
23+
{
24+
"relation": "isSupplementTo",
25+
"identifier": "https://github.com/hyperpolymath/echo-types",
26+
"resource_type": "software"
27+
}
28+
],
29+
"communities": []
30+
}

CITATION.cff

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
cff-version: 1.2.0
2+
title: "echo-types: a definitionally-grounded, loss-graded reindexing modality (Agda)"
3+
message: "If you cite this software, please cite the Zenodo DOI."
4+
type: software
5+
authors:
6+
- given-names: Jonathan
7+
family-names: Jewell
8+
email: jonathan.jewell@gmail.com
9+
# PLACEHOLDER: insert ORCID once registered, e.g.
10+
# orcid: "https://orcid.org/0000-0000-0000-0000"
11+
repository-code: "https://github.com/hyperpolymath/echo-types"
12+
url: "https://github.com/hyperpolymath/echo-types"
13+
abstract: >
14+
Constructive Agda formalisation of fibre-based "structured loss"
15+
types. Defines Echo f y := Σ (x : A) , (f x ≡ y), shows it is
16+
definitionally the homotopy fibre (echo↔fib), and develops a
17+
loss-graded reindexing modality on top with a pointwise
18+
(funext-relative) mediator property, a separating model, and a
19+
carrier-parametric abstraction over a fixed grade poset. Under
20+
--safe --without-K throughout with zero postulates and a
21+
falsifiable retraction discipline. See paper.adoc and
22+
types-abstract.adoc for the mechanised metatheory write-up.
23+
keywords:
24+
- agda
25+
- graded modality
26+
- homotopy fibre
27+
- structured loss
28+
- reindexing modality
29+
- formal methods
30+
- mechanised metatheory
31+
license: MPL-2.0
32+
# === PLACEHOLDER: paste concept DOI here after first Zenodo mint ===
33+
doi: 10.5281/zenodo.0000000
34+
# === END PLACEHOLDER ===
35+
preferred-citation:
36+
type: software
37+
title: "echo-types: a definitionally-grounded, loss-graded reindexing modality (Agda)"
38+
authors:
39+
- given-names: Jonathan
40+
family-names: Jewell
41+
url: "https://github.com/hyperpolymath/echo-types"
42+
doi: 10.5281/zenodo.0000000
43+
year: 2026

docs/characteristic.adoc

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,8 @@ withdrawn lemma can be left in place as a historical signpost.
524524
| 4 | Added `EchoLinear.degradeMode-compose` as N4 (per the Revision-3 recommendation; user-explicit). Built `characteristic.RoleGraded` and `choreo-grade-commute` (closes handoff Observation E). 4/4 surviving across three modules. Proposed adding `choreo-grade-commute` as N5 (left to integrator's discretion).
525525

526526
| 5 (2026-05-26) | Close-out re-audit per `roadmap.adoc` §Lane 2: re-checks the Revision-4 nominee table against everything that has landed since (EI-2 terminated negative; `characteristic.NonTruncatable` for Q2.1 received-`y` form is PARTIALLY REDUCIBLE; the broken `characteristic.N5Falsifier` is ledgered, not silently dropped). Verdict: 4/4 still surviving, *comfortable* threshold (≥3/4) met by margin of one. Candidate N5 (`choreo-grade-commute`) remains unadopted: the post-Rev-4 EI-2 termination shows its non-trivial content is the same single `(c⊑s, keep≤keep)` cell as before, so nominating it would not strengthen the count beyond cosmetic.
527+
528+
| 5b (2026-05-27) | Within-Rev-5 follow-up: `characteristic.N5Falsifier` *no longer broken* — unsolved metas around `EchoChoreo.obs` were resolved by pinning the implicit role and grade parameters at the four `applyRole`/`applyGrade` call sites (the blocker was inference, not content). The module is now in `characteristic/All.agda`'s CI green closure. Audit consequences are *recorded in-line in §"Evidence reviewed" item 3 above*: the SURVIVES verdict for the falsifier exhibit is now mechanised, but the N5-not-adopted decision is unchanged on the same Rev-4/Rev-5 cosmetic-only-marginal-evidence logic.
527529
|===
528530

529531
[[revision-5]]
@@ -568,16 +570,24 @@ comfortable bar?
568570
bare non-injectivity, carries echo-specific content but is not on
569571
the Revision-4 nominee table — it is closer to a Gate-3 example
570572
obligation than a Gate-2 nominee.
571-
. *`characteristic.N5Falsifier` — KNOWN BROKEN, DELIBERATELY EXCLUDED*
572-
from `characteristic/All.agda` and from any CI green closure
573-
(`UnsolvedConstraints` + `UnsolvedMetaVariables`). Status disclosed
574-
in the module's own broken banner and at
575-
`docs/echo-types/earn-back-plan.adoc` item C/N5; monitored by an
576-
expected-failure CI gate. *Crucially: nothing in N5Falsifier is
577-
cited as evidence in this audit, and its broken status does not
578-
count against any nominee. The fact that an attempted falsifier
579-
for N5 (= `choreo-grade-commute`) is not mechanised is exactly why
580-
N5 itself is not adopted in this revision.*
573+
. *`characteristic.N5Falsifier` — RESOLVED 2026-05-27, NOW GREEN AND IN CI CLOSURE.*
574+
Originally KNOWN BROKEN, deliberately excluded
575+
(`UnsolvedConstraints` + `UnsolvedMetaVariables`). The Lane-2
576+
N5-sharpening pass on 2026-05-27 closed the unsolved metas by
577+
making the implicit `r1`/`r2`/`g` parameters of `applyRole` /
578+
`applyGrade` explicit at the four call sites; the obstacle was
579+
*inference*, not *content* (Agda cannot recover the role from
580+
`RoleGEcho r keep = Echo (obs r) true` because `obs` is not
581+
injective, but supplying the role explicitly resolves it). The
582+
module is now imported in `characteristic/All.agda` and the
583+
broken-banner has been updated with the resolution record.
584+
*Crucially: the resolution does not change the Rev-4 conclusion
585+
about candidate N5* — the only non-trivial cell is still the
586+
`(c⊑s, keep≤keep)` Choreo content already credited to N3, so
587+
adoption would still be cosmetic. The cleaned-up green falsifier
588+
exhibit *does* tighten the audit story (the SURVIVES verdict is
589+
now mechanised instead of being a not-mechanised attempt-of-record)
590+
without changing the N5-not-adopted decision.
581591

582592
=== Per-nominee re-check
583593

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -303,22 +303,30 @@ constructors discharge by additive-principal closure.
303303
| `<ᵇ-ψ+` | ✓ closed | `rank-pow-via-left` plus the IH.
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 ν`.
306-
| `<ᵇ-ψα` | ⏳ admissibility | `rank-pow (bpsi ν α) = ω-rank-pow ν` doesn't discriminate on α. Refining the rank to `ω-rank-pow ν ⊕ rank-pow α` works iff `α ∈ C_ν` (ψ-admissibility predicate); deferred to a follow-on slice.
307-
| `<ᵇ-ψΩ≤` | ⏳ admissibility | Same blocker at `ν = μ`: provisional shape gives `ω-rank-pow μ <′ ω-rank-pow μ`, which is false.
306+
| `<ᵇ-ψα` | ✓ 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.
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: 9/13 constructors closed; 3 deferred under explicit blockers;
313-
1 closed conditionally with documented side condition.*
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.*
314318

315319
=== What remains open
316320

317-
* *ψ-admissibility predicate* (`WellFormedAdmissible.agda`, ~80 lines).
318-
Refines `WfCNF` with the constraint that ψ-arguments live in their
319-
binder's Ω-closure `C_ν`. Closes `<ᵇ-ψα` and `<ᵇ-ψΩ≤` once the
320-
rank-pow on `bpsi ν α` is refined to `ω-rank-pow ν ⊕ rank-pow α`
321-
under the admissibility carrier.
321+
* *ψ-admissibility predicate* (`WellFormedAdmissible.agda`, landed
322+
earlier; `RankAdm.agda` landed 2026-05-26 in the Lane 3 active-push
323+
slice). Refines `WfCNF` with the rank-bound on ψ-arguments.
324+
*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.
322330
* *`<ᵇ-+1` joint-bplus*. Needs either a coarser dominator (e.g., a
323331
function `BT → OmegaIndex` returning the leading Ω-index, then
324332
rank into `ω-rank-pow ∘ leading-index`) or a richer rank shape.

0 commit comments

Comments
 (0)