v1.15.0 — a leaner, cheaper Gate A at scale + decentralised-runner groundwork
Headline: a leaner, cheaper Gate A at scale — plus groundwork for a decentralised runner — as proofs compound, Gate A is kept fast and memory-bounded instead of slowly OOM-ing: two more archive blocks (0003 and 0004, ADR-041) retire 58 proved goals and shrink the active library from 108 → 50 modules; archive validation switches to verify-on-ingest (git-blob provenance instead of a kernel re-replay, ADR-048) so archive PRs fit an 8 GB runner; push-to-main now kernel-replays incrementally with a daily full-replay backstop (ADR-048 Phase 2); the full-replay trigger narrows to olean-invalidating changes only; and a persistent Namespace .lake cache volume (ADR-046) removes the last constant per-job mathlib-restore cost. Soundness is unchanged throughout — every proof is still kernel-replayed once under its pinned toolchain. Alongside, ADR-049 lands the research + a Phase-0 conformance suite for a future decentralised CI runner, and the browser surfaces grow a proofs-over-time graph, a Top 5 view, and a shared home page.
Added
- ADR-049 Phase-0 conformance suite (
tools/gate_a/tests/test_decentralised_runner_conformance.py, #635) — locks the decentralised-runner soundness invariant: the central re-check feedsleancheckeronly locally-derived modules (never a contributor artifact), an untrusted diff fails closed to a full re-check, and a changed module always drags its*Binding+ reverse-import closure into scope. - ADR-049 research (#635) — a ranked options analysis (
docs/proposals/decentralised-ci-runner-architecture.md) and ADR-049 (Proposed) recommending a tiered split: push the expensivelake buildelaboration onto the contributor, keep a mandatory cheap central kernel re-check from canonical source as the sole load-bearing gate. - Leaderboard proofs-over-time view (#738) — a cumulative line graph of kernel-verified proofs by date, plus a shared Home · Leaderboard · Proof graph top nav and a new
docs/index.htmllanding page. - Leaderboard Top 5 view — a three-tab switcher (Leaderboard · Top 5 · Proofs over time), README links from the home page, and small-screen tuning.
- Persistent Namespace
.lakecache volume (nscloud-cache-action, ADR-046) — mathlib oleans + the local build survive across jobs/runs, eliminating the ~2–3.5-min GitHub-cache mathlib restore paid on every job. Advisory:leancheckerstill re-checks every olean.
Changed
- Amended ADR-041: archive closed proof families only — a decomposition family (parent + subs + proofs + metadata) is archived as one atomic unit, and only when every member is proved.
- Cut archive block 0003 (ADR-041) — retired 30 proved goals (whole trees + standalone) into
packages/unsorry-archive-0003/; active library 108 → 78 modules. - Cut archive block 0004 (ADR-041) — retired 28 proved goals into
packages/unsorry-archive-0004/; active library 78 → 50 modules. - Documented the archive-block cut as a repeatable runbook (SPEC-041-A §8/§9), including the "cut early and often, 40 is a ceiling not a goal" at-scale guidance.
- Corrected the archive-cut runbook after 0003/0004: archive whole decomposition trees only (Gate B GB008/GB016 atomicity) and never regenerate generated docs in the cut (they race main's refresh bot).
- Gate A push-to-
mainnow replays incrementally (ADR-048 Phase 2) with a dailygate-a-full-replay.ymlbackstop; routine Gate A (proof PRs and push tomain) routes to the 8 GBunsorry-1runner. Soundness unchanged — every proof still kernel-replayed once. - Narrowed the Gate A full-replay trigger to olean-invalidating changes only (
lean-toolchain,lakefile.*,lake-manifest.json), so gate/CI PRs no longer ride the memory-bound serial full replay that OOM-killed the 16 GB runner. - Gate A no longer rebuilds
UnsorryLibraryin the audit/replay jobs on an exact-sha cache hit (ADR-045 amendment) — the audit job drops from ~535 s to ~320 s. - Adopted verify-on-ingest for archive validation (ADR-048) — archived proofs are checked byte-identical to the already-verified version (git-blob provenance) instead of re-running
leanchecker, removing the archive-OOM class.
Fixed
gate-a-archivenow runs on the 16 GBunsorry-2runner (was routed to the 8 GB pool and OOM-killed, #764).- Archive-package replay now chunks at
REPLAY_CHUNK_SIZE, bounding peak memory — fixes the exit-137 OOM on memory-bound runners (#764). - Archive-package validation runs in its own parallel
gate-a-archivejob (own headroom + swap + 120-min budget) instead of insidegate-a-prepare(#764). - Gate B's advisory AISP validator now runs on Node.js 24.
Full changelog: https://github.com/agenticsnz/unsorry/blob/main/CHANGELOG.md
Compare: v1.14.0...v1.15.0