You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
proofs(lean4): promote ET-2 to main — L1 conversion is decidable (#27)
Promotes the **ET-2 closure** (decidability of L1 conversion) onto
`main`.
## Why this PR exists
ET-2 was proven and merged in **PR #24** — but into
`proofs/lean4-l1-l2`, **not `main`**. PR #17 had squash-merged that
branch to `main` *before* ET-2 existed, so `main` holds the L1/L2
mechanization content while the ET-2 work sits only on the branch. No
second PR to `main` was ever opened.
Measured before this PR: `main...proofs/lean4-l1-l2` was **diverged, 4
ahead / 14 behind**, and all four ET-2 proof files returned **404 on
`main`**. Anything reading `main` today correctly concludes ET-2 is
still open.
## What lands on `main`
| File | Contents |
|---|---|
| `Systemet/L1/SubstLemmas.lean` | substitution/weakening exchange
family, incl. `nf_substTy` — normalization commutes with hereditary
substitution (the whole content of the β case) |
| `Systemet/L1/Soundness.lean` | `soundness : DefEq t (embNf (nf t))` |
| `Systemet/L1/Completeness.lean` | `completeness : DefEq t u → nf t =
nf u`; `defEq_iff_nf : DefEq t u ↔ nf t = nf u` |
| `Systemet/L1/Decidable.lean` | `decEqNf` / `decEqSp` (hand-rolled
mutual `DecidableEq` — `deriving` does not work across the `Nf`/`Sp`
pair); `decDefEq : (t u : Ty Γ k) → Decidable (DefEq t u)` |
Plus the `PROOF-STATUS.adoc` truth pass (`gated` 11 → 15, ET-2 row
proven, MECH-1 row landed, the satisfied `ET-2 (finish)` OPEN row
removed) and append-only `MANIFEST` / `Systemet.lean` / `Audit.lean`
entries.
## Conflict resolution — read this bit
The pre-PR sync merge (`0104c9c`) hit five conflicts. **Four were
`add/add` artefacts of the squash in #17**, which makes git treat both
sides as independent additions. None were resolved by a blanket
`--ours`/`--theirs`:
- `MANIFEST`, `Systemet.lean`, `Audit.lean` — verified `main`'s content
is **byte-identical** to the branch's and the branch is a **strict
superset** (adds exactly the four ET-2 entries). Branch side taken.
- `PROOF-STATUS.adoc` — every difference is this branch's ET-2 update;
`main` carried no independent edits. Branch side taken.
- **`.github/workflows/proofs.yml` — a genuine two-sided merge.** The
sides differed in *opposite* directions: `main` had the newer
`actions/checkout@3d3c42e` (v7.0.1, from dependabot #26) while the
branch had `curl --proto '=https' --tlsv1.2` (the Sonar S6506 fix). Took
main's newer pin **and** re-applied the branch's https hardening, so
neither is regressed. Both confirmed present post-resolution.
## Evidence (measured on the merged tree, not inherited from #24)
- Cold rebuild after `rm -rf .lake/build` → **Build completed
successfully (16 jobs)**
- `scripts/check-proofs.sh lean4` → **PASS** (real exit 0); audit
reports **20/20 headline items within the trusted base**
- `scripts/scan-dangerous.sh` → **PASS** (real exit 0)
- `scripts/check-proof-status.sh` → **PASS** (real exit 0) — 15 gated,
document agrees
- Forbidden-token scan on the four new proof files → clean
- `#print axioms` on `soundness`, `completeness`, `defEq_iff_nf`,
`decDefEq`, `decEqNf`, `decEqSp`, `nf_substTy` → **`[propext,
Quot.sound]` only**; no `sorryAx`, no user axioms, not even
`Classical.choice`
Real exit codes were checked directly — piping a gate through `tail` and
reading `$?` reports *tail's* status, which is how a red gate can look
green.
## Scope — what this does *not* claim
`DefEq` here is **β + equivalence + congruence. η is not included** and
remains an OPEN row. **ET-3 is unaffected** — its η and model directions
stay open. `PROOF-STATUS.adoc` marks ET-2 proven *for the L1 core
calculus*, under the core-vs-full-theory caveat that file already
carries.
**ET-14 (TEA erasure) is untouched and remains the headline open
problem**, gated on the owner's ET-16 / L0-lowering ADR.
## Merge notes
Per the base ruleset, **squash is the only merge that works** here
(rebase merges cannot be signed by GitHub bots), and the phantom
required `Dependabot` context means this will need `--admin`. Not merged
by me — that call is yours.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Copy file name to clipboardExpand all lines: .machine_readable/6a2/STATE.a2ml
-1Lines changed: 0 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -43,7 +43,6 @@ milestones = [
43
43
[blockers-and-issues]
44
44
issues = [
45
45
{ id = 18, title = "descriptiles/6a2 migration (blocked: contractiles.mjs needs Node, estate-denied here)" },
46
-
{ id = 19, title = "wire check-no-vlang.sh into lint after clearing template zig residue (owner: confirm the script's premise vs Zig-first directive)" },
0 commit comments