theory: AntiEcho × IsArgmin tropical decomposition#72
Merged
Conversation
…sjointness)
Lands the first four obligations from the `coecho.md` design note as
`proofs/agda/AntiEcho.agda` (renamed `antiecho-*` per user namespace
decision 2026-05-20):
* `AntiEcho f y := Σ A (λ x → f x ≢ y)` — the carrier, the
minimal-edit-distance Σ-dual of `Echo`. Same Σ-shape, same
universe `a ⊔ b`, same proof-relevance posture as Echo; ≡ flips
to ≢ = · ≡ y → ⊥. (antiecho-def)
* `antiecho-intro : ∀ x → f x ≢ y → AntiEcho f y` — trivial pairing.
* `antiecho-disjoint : ∀ x → f x ≡ y → f x ≢ y → ⊥` — per-element
disjointness against Echo. The joint form
`Echo f y → AntiEcho f y → ⊥` with possibly distinct witnesses is
deliberately deferred (requires codomain decidability; lives in
the partition lemma).
* `antiecho-map-over : (g : A' → A) → AntiEcho (f ∘ g) y →
AntiEcho f y` — source-side covariance; misses propagate back to
the outer leg by re-applying g.
Naming decision (user, 2026-05-20). The new module is `AntiEcho`, NOT
`CoEcho`. The name `CoEcho` is already taken in
`EchoFiberTriangulation.agda` (lines 82–95) for the trivial
opposite-orientation fibre `∃ x . y ≡ f x` (Echo composed with `sym`).
That construction is a reorientation, not a dual. The negative dual
lands here under the distinct name `AntiEcho` so the two namespaces
stay fully separate. Both `EchoFiberTriangulation.CoEcho` and the new
`AntiEcho` are now pinned in `Smoke.agda`.
Deferred to follow-up slices (do NOT close anything):
* obligation 5 `antiecho-partition-dec` — needs `DecEq B` on the
codomain; lives in its own slice.
* obligation 6 `antiecho-tropical-decompose` — crosses module
boundaries (`EchoTropical.IsArgmin ≃ Echo × Π AntiEcho`) and
deserves its own slice; the design note flags this as the
structural-vs-quantitative payoff but the proof reaches beyond a
thin-slice introduction.
Build invariants held: `--safe --without-K`, zero postulates, zero
escape pragmas. New module wired into `All.agda` as `open import
AntiEcho`; headline names (`AntiEcho`, `antiecho-intro`,
`antiecho-disjoint`, `antiecho-map-over`) pinned in `Smoke.agda` via
`using` clause so a rename/deletion fails CI fast.
Verification: `agda -i proofs/agda proofs/agda/All.agda` exits 0;
the build trace lists `Checking AntiEcho` and `Checking Smoke`
without errors, confirming both the module itself and the pinned
headlines typecheck.
Refs: docs/echo-types/roadmap.md "Negative / co-echoes" entry (CoEcho
formulation). Does NOT close that entry — only the carrier + the
first three small lemmas land; the partition and tropical
decomposition obligations remain.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cashes the headline claim from `/tmp/echo-types-exploration/coecho.md`
§3 ("Resolution of the EchoTropical tension") at the structural level:
`TropEcho` / `IsArgmin` decompose as Echo evidence conjoined with a
Π-quantified complement bound, with the AntiEcho-flavoured corollary
exposing that bound as a Π of negative data over the candidate set
(Π-form AntiEcho, `coecho.md` §1(c)).
New module `proofs/agda/AntiEchoTropical.agda`.
Headline theorem (both directions definitional, both round-trips
`refl`, packaged as stdlib `Function.Bundles._↔_`):
antiecho-tropical-decompose :
∀ (y : ℕ) → TropEcho y ↔ (Echo score y × (∀ z → y ≤ score z))
`IsArgmin`-level restatement (identity on the Σ-shape):
isargmin-decompose :
∀ (x : Candidate) (y : ℕ) →
IsArgmin x y ↔ ((score x ≡ y) × (∀ z → y ≤ score z))
AntiEcho-flavoured corollary on the optimality factor — both
directions on ℕ (no abstract DecEq hypothesis; the candidate codomain
is `ℕ` concretely, so the order-conversion lemmas are constructive):
optimality-as-antiecho-flavour-to : (∀ z → y ≤ score z) → (∀ z → score z < y → ⊥)
optimality-as-antiecho-flavour-from : (∀ z → score z < y → ⊥) → (∀ z → y ≤ score z)
with order-conversion lemmas `≤⇒¬<` / `¬<⇒≤` ported in-module.
Composite map (Echo + Π-of-negation form) shipped both ways:
tropdecomp-antiecho-to : TropEcho y → Echo score y × (∀ z → score z < y → ⊥)
tropdecomp-antiecho-from : Echo score y × (∀ z → score z < y → ⊥) → TropEcho y
Scope: depends on `AntiEcho.agda` (from the AntiEcho thin slice,
PR #69); neither `AntiEcho.agda` nor `EchoTropical.agda` is modified
— the bridge module stays isolated. Specialised to the concrete
`Candidate → ℕ` setting (`EchoTropical.agda`); a generic-codomain
version would need a `≤`-bearing ordered codomain and is deferred
per `coecho.md` §3 closing remark.
Wiring: `proofs/agda/All.agda` opens the new module; `proofs/agda/Smoke.agda`
pins all 14 headlines via `using` so a silent rename or a slide back
to ad-hoc tropical decoration trips CI fast.
`--safe --without-K` clean. No postulates. No funext. No path algebra
beyond the constructor-driven trichotomy on `_≤_`/`_<_`.
Build verification: settings restrictions in this sandbox blocked
local `agda` invocation on this branch (the project's `Bash(agda *)`
allow rule didn't apply); CI must run `agda -i proofs/agda
proofs/agda/All.agda` and `agda -i proofs/agda proofs/agda/Smoke.agda`
to confirm both exit 0. Proofs are pure Σ-currying / pattern-matching
+ two small ℕ order-conversion lemmas — expected to typecheck on the
existing CI gate.
Refs PR #69 (depends on its `AntiEcho` module).
Refs `docs/echo-types/roadmap.md` CoEcho entry ("Possibly resolves
the quantitative / structural tension hinted at by `EchoTropical`").
Refs `/tmp/echo-types-exploration/coecho.md` §3 + §5 obligation 6.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Owner
Author
|
Build verified from parent session (sandbox quirk blocked the agent's local agda run; same workaround as PR #71):
|
4 tasks
hyperpolymath
added a commit
that referenced
this pull request
May 20, 2026
…eferred) (#75) ## Summary Extends `proofs/agda/EchoAccess.agda` (the PR #68 thin slice) with the join structure and per-decoration composition trio, completing the same recipe as `EchoGraded` and `EchoLinear` at the per-decoration composition rung. **Rung A — categorical join structure.** `_⊔a_` (componentwise max along `free ≤ decidable ≤ enum ≤ feasible ≤ infeasible`) + `≤a-⊔a-left` + `≤a-⊔a-right` + `≤a-⊔a-univ` (universal property). **Rung B — per-decoration composition trio.** * `degrade-access-comp` — two successive degrades along a factoring agree with one degrade along the composed proof. Closes `refl` on every reachable `(p12, p23)` constructor pair (the carriers reduce in lock-step with `≤a-trans`). * `degrade-access-compose` — factoring-free composition; corollary of `degrade-access-comp` + `≤a-prop`. * `degrade-access-via-join` — same law restated through the join. **Rung C — honest carriers — deferred with design note.** An honest `enum`-grade carrier needs an enumerator `Fin n → A` and a decider on `B`. Neither can be supplied without breaking the parametricity over `A` that `Echo f y` enjoys at the `free` grade. The two clean resolutions are (a) parameterise the whole `CEcho` family on `Decidable B` + an enumeration witness (forces every caller to supply them, even at `free` where they do nothing), or (b) bury both in an existential inside the `enum` / `feasible` / `infeasible` cases (loses the ability to extract from outside). Both are real architectural choices — the PR brief's Stop-condition explicitly flagged this as the design-decision case and instructed landing A + B with a written deferral. Importantly, the composition layer that lands here is **grade-indexed not carrier-indexed**, so it is unaffected by the eventual carrier choice. Module preamble carries the full deferral note. All new headlines pinned in `Smoke.agda`. Module preamble section list refreshed; `degrade-access` follow-up commentary updated. No new imports beyond `sym` from `Relation.Binary.PropositionalEquality`. No postulates. `--safe --without-K` preserved throughout. ## Build status **BUILD UNVERIFIED LOCALLY** — the sandbox repeatedly blocked `agda` invocations on positional file arguments (the known quirk that hit PRs #71 + #72). Parent session will verify (`LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/All.agda` and same for `Smoke.agda`, both expected to exit 0) and post a confirmation comment. The mathematical content is mechanical mirror of `EchoGraded.{degrade-comp, degrade-compose, degrade-via-join, ⊔g, ≤g-⊔g-*}` (with 5 grades instead of 3) and `EchoLinear.{degradeMode-comp, degradeMode-compose, degradeMode-via-join, ⊔m, ≤m-⊔m-*}` (with 5 grades instead of 2). Every clause closes `refl` modulo the `≤a-trans` reduction table that already ships in PR #68. ## Refs Refs PR #68 (the thin slice), `docs/echo-types/roadmap.md` Axis 8 entry, `/tmp/echo-types-exploration/axis8.md` §5 deferred list. ## Test plan - [ ] `LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/All.agda` exits 0. - [ ] `LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/Smoke.agda` exits 0. - [ ] No postulates / no escape pragmas / `--safe --without-K` preserved. - [ ] All seven new headline names resolve in `Smoke.agda`. Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7 tasks
hyperpolymath
added a commit
that referenced
this pull request
May 20, 2026
…-rot (#79) ## Summary Three independent bookkeeping items consolidated to avoid PR churn: 1. **CLAUDE.md "Current rung state (2026-05-20)"** — full session arc for the echo-types swarm (PRs #67-#72, #74-#77). §"Theory work — no proof assistant needed" is now essentially closed (Lane 2 BalancedTolerance is #78, awaiting review). Two patterns formalised (per-lemma Smoke pin for parameterised modules; `sandbox.excludedCommands` workaround for the agda positional-arg sandbox quirk). Plan for next Claude included. 2. **EchoAccess `Lift ⊤` carrier — design closure.** The post-#75 carrier-honesty work hit a structural wall on the owner-authorised existential design: `degrade-access` becomes uninhabitable because the access lattice tracks **decreasing** information as you climb, so degrading must drop info, never fabricate it. Conclusion: `Lift ⊤` IS the right honest carrier at the top of the lattice (same sense as `EchoGraded.forget = ⊤`). New `docs/echo-types/decisions/echo-access-trivial-carrier.adoc` captures the closure; `EchoAccess.agda` module header updated from "Deferred to follow-up" to "Resolved 2026-05-20" with the structural reasoning. 3. **Complete `≤a-⊔a-univ` baseline-rot** — 10 more wrong-RHS clauses in the same family as commit `a8ac211` (which fixed only some of the strict-inequality witnesses). Discovered by Agda 2.8.0 on a clean `.agdai` cache; previous "verified green" reports were spuriously passing because of stale incremental builds. Same diagnosis: when `c1 ⊔a c2 = c2` (strict `c1 < c2`), the universal property witness needs `c2≤c` shape (p2), not `c1≤c` shape (p1). Fixed clauses span the decidable/enum/feasible/infeasible rows. ## Test plan - [x] `LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/All.agda` exits 0 on Agda 2.8.0 - [x] `LC_ALL=C.UTF-8 agda -i proofs/agda proofs/agda/Smoke.agda` exits 0 on Agda 2.8.0 - [x] `--safe --without-K` invariants intact - [x] No postulates introduced - [x] No escape pragmas - [ ] CI Agda check passes - [ ] AsciiDoctor render of new decisions adoc (no asciidoctor in environment; hand-inspected against `decisions/no-2-cat.adoc` template) Refs CLAUDE.md "Rung-consolidation policy" §4 ("Update machine docs"). Does **not** close any issue. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 20, 2026
hyperpolymath
added a commit
that referenced
this pull request
May 20, 2026
…al decomposition (#91) ## Summary Lifts the concrete ℕ-scored tropical decomposition from `AntiEchoTropical.agda` to an arbitrary ordered codomain. Closes the "generic-codomain version is deferred (would need a \`≤\`-bearing ordered codomain)" remark that has lived in `AntiEchoTropical`'s preamble since #72. ## What lands ### `AntiEchoTropicalGeneric.agda` — new module ```agda record OrderedCodomain : Set₁ where field B : Set _≤_ : B → B → Set _<_ : B → B → Set ≤⇒¬< : ∀ {y n : B} → y ≤ n → n < y → ⊥ ¬<⇒≤ : ∀ {y n : B} → (n < y → ⊥) → y ≤ n ``` The first three fields are pure structure; the latter two are the order conversions. `≤⇒¬<` is always available; `¬<⇒≤` is the entire content of the "decidable order" hypothesis in the concrete ℕ case — factored out as a field rather than baked into the codomain. Three theorems in `module Generic (OC : OrderedCodomain)`: * **`antiecho-tropical-decompose-gen`** — pure Σ-reshape iso between `TropEchoG s y` and `Echo s y × (∀ z → y ≤ s z)`. `refl` round-trips, does NOT use the order at all (structural only). * **`optimality-as-antiecho-flavour-gen-to/from`** — `(∀ z → y ≤ s z)` ↔ `(∀ z → s z < y → ⊥)`. Uses `≤⇒¬<` / `¬<⇒≤` from the interface. * **`tropdecomp-antiecho-gen-to/from`** — composite `TropEchoG ↔ Echo × (Π-of-AntiEcho-flavoured-misses)`. Sanity instance `ℕ-ordered-codomain : OrderedCodomain` pinned in `Smoke.agda` so the interface is demonstrably inhabitable. ### Preamble updates (zero Agda content change) * `AntiEcho.agda` — obligation 6 line updated to point at both the concrete and generic landings * `AntiEchoTropical.agda` — "generic-codomain version is deferred" replaced by pointer to the new module ## Test plan * [x] `agda proofs/agda/AntiEchoTropicalGeneric.agda` exit 0 * [x] `agda proofs/agda/All.agda` exit 0 under `--safe --without-K` * [x] `agda proofs/agda/Smoke.agda` exit 0 under `--safe --without-K` * [x] `OrderedCodomain`, `ℕ-ordered-codomain`, `module Generic` pinned * [x] No postulates, no funext, no escape pragmas ## Scope The concrete `AntiEchoTropical.agda` module is **unchanged** (only its preamble comment updated). The two coexist: concrete remains the canonical landing for ℕ-scored tropical; generic is the abstract sibling for downstream users at other ordered codomains. ## Dependencies Depends on **#90** (antiecho-partition-dec). Branch based on `antiecho-partition-dec`; will rebase onto `main` once #90 lands. Disjoint from #88 (F3). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hyperpolymath
added a commit
that referenced
this pull request
May 20, 2026
…luster landed (#92) ## Summary Three small accuracy passes through `docs/echo-types/` after the earn-back programme, the §"Theory work — no proof assistant needed" section, and the canonical examples cluster (5/9/10) all closed in this session. Pure prose; no Agda changes. ### 1. `roadmap.md` §"Theory work" — two stale items refreshed * **Axis 8** line said the *decidability-respecting* candidate had shipped but listed the other three as still candidate refinements. All four have now shipped: `EchoDecidable`, `EchoCost` (#85), `EchoAccess` (#68 / #75), `EchoSearch` (#80). Updated to credit all four. * **Negative / co-echoes** line was `[unblocked]`; now `[landed]` — `AntiEcho` (#69), tropical decomposition concrete + generic (#72 + #91), `antiecho-partition-dec` (#90). Names the `coecho.md` §5 obligation-5 / obligation-6 closures explicitly. After these edits, every item in §"Theory work — no proof assistant needed" is either `[landed]` or `[ruled out]`/`[refreshed]` — the section is genuinely closed. ### 2. `roadmap.md` §"Example work" — three items landed * ex. 5 (`EchoExampleProvenance`, #81) → `[landed]` * ex. 9 (`EchoExampleParser`, #83) → `[landed]` * ex. 10 (`EchoExampleAbsInt`, #82) → `[landed]` Only ex. 6 (approximate-echo numeric example) remains `[unblocked]`. ### 3. `earn-back-plan.adoc` — stale `roadmap-gates.adoc` claim corrected * Header note used to say "the gate discipline was historically attributed to a `roadmap-gates.adoc`; that file does not exist in-tree". The file **does** exist (created 2026-05-18; see its preamble). Header rewritten to list `roadmap-gates.adoc` alongside `retractions.adoc` / this plan / `next-questions.adoc` as the four canonical loci. * Ledger row D (the "doesn't exist" entry) marked **CLOSED 2026-05-20** with the cite reflecting current reality. ## Test plan * [x] Pure docs / `.adoc` / `.md` edits — no Agda touched * [x] `agda proofs/agda/All.agda` exit 0 (confirms docs match code) * [x] `agda proofs/agda/Smoke.agda` exit 0 * [x] No retracted-claim language moved; no earned-back claim overclaimed; `paper.adoc` / `types-abstract.adoc` / `conservativity.adoc` untouched ## Scope Disjoint from all currently-open PRs: * #88 (F3) — touches Agda + `retractions.adoc` (different sections) + `earn-back-plan.adoc` Status (different section from header / ledger-D) * #90 (partition-dec) — touches Agda only * #91 (generic-codomain) — touches Agda + preamble comments No retracted claim is moved. No earned-back claim is overclaimed. `paper.adoc` / `types-abstract.adoc` / `conservativity.adoc` are intentionally untouched (owner-gated, per the posture set by #86 / #88). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
🔍 Hypatia Security ScanFindings: 10 issues detected
View findings[
{
"reason": "No test directory or test files found",
"type": "no_tests",
"file": "/home/runner/work/echo-types/echo-types",
"action": "flag",
"rule_module": "honest_completion",
"severity": "high",
"deduction": 20
},
{
"reason": "Issue in quality.yml",
"type": "missing_workflow",
"file": "quality.yml",
"action": "create",
"rule_module": "workflow_audit",
"severity": "high"
},
{
"reason": "Issue in security-policy.yml",
"type": "missing_workflow",
"file": "security-policy.yml",
"action": "create",
"rule_module": "workflow_audit",
"severity": "medium"
},
{
"reason": "Issue in secret-scanner.yml",
"type": "missing_workflow",
"file": "secret-scanner.yml",
"action": "create",
"rule_module": "workflow_audit",
"severity": "high"
},
{
"reason": "Action actions/cache@v4 needs attention",
"type": "unpinned_action",
"file": "agda.yml",
"action": "pin_sha",
"rule_module": "workflow_audit",
"severity": "medium"
},
{
"reason": "Action hyperpolymath/standards/.github/workflows/governance-reusable.yml@main needs attention",
"type": "unpinned_action",
"file": "governance.yml",
"action": "pin_sha",
"rule_module": "workflow_audit",
"severity": "high"
},
{
"reason": "No dependabot.yml or renovate.json found in echo-types",
"type": "DependencyUpdate",
"file": "/home/runner/work/echo-types/echo-types",
"action": "auto_fix",
"rule_module": "scorecard",
"severity": "high",
"remediation": "Add .github/dependabot.yml or renovate.json configuration.",
"scorecard_check": "Dependency-Update-Tool"
},
{
"reason": "Nominal-only SAST in echo-types: codeql.yml language matrix contains no language present in the repo and lacks `actions`, so CodeQL records zero results on every commit. Remediation: set the CodeQL matrix to `language: actions`.",
"type": "StaticAnalysis",
"file": "/home/runner/work/echo-types/echo-types",
"action": "auto_fix",
"rule_module": "scorecard",
"severity": "medium",
"remediation": "Add CodeQL or equivalent SAST workflow.",
"scorecard_check": "SAST"
},
{
"reason": "1 workflow(s) with tag-pinned (not SHA-pinned) actions in echo-types",
"type": "DependencyPinning",
"file": "/home/runner/work/echo-types/echo-types",
"action": "auto_fix",
"rule_module": "scorecard",
"severity": "medium",
"remediation": "Pin GitHub Actions and Docker base images by SHA hash.",
"scorecard_check": "Pinned-Dependencies"
},
{
"reason": "Repository has 1 non-main remote branch(es). Policy: single main branch only.",
"type": "GS007",
"file": ".",
"action": "delete_remote_branches",
"rule_module": "git_state",
"severity": "medium"
}
]Powered by Hypatia Neurosymbolic CI/CD Intelligence |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Cashes the headline claim from
/tmp/echo-types-exploration/coecho.md§3 ("Resolution of the EchoTropical tension") at the structural level:TropEcho/IsArgmindecompose into Echo evidence + a Π-quantified complement bound, with an AntiEcho-flavoured corollary exposing that bound as a Π of negative data over the candidate set.New module
proofs/agda/AntiEchoTropical.agda. NeitherAntiEcho.agda(from #69) norEchoTropical.agdais modified — the bridge stays isolated so PR scope is tight.Headline theorem (both directions, both round-trips
refl, packaged as_↔_)The forward direction projects
(x , p , bnd) ↦ ((x , p) , bnd)— pure Σ-re-association because the optimality factor∀ z → y ≤ score zdoesn't depend onx. The backward direction undoes it. Both round-trips are definitionallyrefl. No decidability, no funext, no path algebra. Packaged via stdlibFunction.Bundles._↔_andmk↔ₛ′, matching the convention fromEcho-comp-iso/cancel-iso.IsArgmin-level restatement (the per-element identity)IsArgminIS the product by definition, so the iso to the product is the identity. Pinned for callers thinking inIsArgmin-shaped terms.AntiEcho-flavoured corollary (the Π-bound as a Π of misses)
The optimality factor
∀ z → y ≤ score zis equivalent on ℕ to the AntiEcho-shaped statement "no candidate witnesses a value strictly belowy":with the small order-conversion lemmas
≤⇒¬</¬<⇒≤shipped in-module. Composite version (Echo + Π-of-negation):This is the Π-form AntiEcho variant from
coecho.md§1(c) (AntiEcho_Π = ¬ Echo), specialised to the strict-below stratum. The Σ-formAntiEchocarrier fromAntiEcho.agdais the witness-recording primitive; the Π-form above is the exhaustive global statement that names whatIsArgminwas carrying implicitly.Scope notes
Candidate → ℕsetting ofEchoTropical.agda. A generic-codomain version would need a≤-bearing ordered codomain and the decidability hypothesis fromcoecho.md§3 closing remark — deferred.Smoke.agdapins all 14 headlines viausingso silent renames or a slide back to ad-hoc tropical decoration trips CI fast.--safe --without-Kclean. No postulates. No funext. No path algebra beyond constructor-driven trichotomy on_≤_/_<_.PR base / stacking
Branched from
origin/theory/antiecho-thin-slice(soAntiEchois in scope) but PR base ismainper the stacked-PR-orphan-trap policy. The cumulative diff currently includes #69's content; when #69 merges the diff simplifies automatically.Test plan
agda -i proofs/agda proofs/agda/All.agda— exits 0.agda -i proofs/agda proofs/agda/Smoke.agda— exits 0.Smoke.agdaresolve.Note on local verification. Settings restrictions in this sandbox blocked local
agdainvocation on this worktree (the project'sBash(agda *)allow rule did not apply to this session). Proofs are pure Σ-currying / pattern-matching + two small ℕ order-conversion lemmas — expected to typecheck on the existing CI gate.Refs
AntiEchomodule from the AntiEcho thin slice.docs/echo-types/roadmap.mdCoEcho entry ("Possibly resolves the quantitative / structural tension hinted at byEchoTropical")./tmp/echo-types-exploration/coecho.md§3 ("Resolution of the EchoTropical tension") + §5 obligation 6 (coecho-tropical-decompose).Does NOT Close anything. The CoEcho roadmap entry stays open until decided by the owner; this PR cashes the structural half.
🤖 Generated with Claude Code