ADR-093: lean4export + nanoda Independent-Checker Pilot

Field Value
Decision ID ADR-093
Initiative verification capacity / decentralisation (Phase 3, Track B)
Proposed By unsorry maintainers
Date 2026-06-24
Status Proposed

Context

Discussion #5656 and the roadmap (#5678 / #5684) frame the verification-throughput problem as three tracks. Track A (capacity/latency) is shipping — D1a sharded the Gate A axiom audit (ADR-091, v1.33.0), and its production measurement confirmed the predicted result: Track A buys latency, not slope. Median per-PR audit wall-clock fell ~34%, but steady-state throughput stayed flat because it is bounded by Namespace runner-minute capacity, which sharding parallelises rather than reduces. The only path that changes the slope — making the central gate scale with the swarm instead of the Namespace bill — is Track B / Phase 3: a cheap, portable, mathlib-free re-check.

ADR-049 / SPEC-049-A §6 specify Phase 3 as pilot-gated behind two empirical open questions, deliberately not decided until measured:

These are empirical — they cannot be answered by analysis, only by running the tools on real unsorry declaration closures. No pilot harness exists yet.

A feasibility scout (2026-06-24) confirms the pilot is viable: the project pins Lean v4.30.0, and lean4export ships a v4.30.0 tag — an exact match, so Q2 is directly testable; nanoda_lib is actively maintained (last push 2026-06-03), and its compatibility with the current export format is itself part of what Q3 measures.

WH(Y) Decision Statement

In the context of Track A (D1a) having shipped and confirmed that sharding buys latency but not throughput-slope (the ceiling is Namespace capacity), so the only slope-changer is a cheap mathlib-free central re-check (Phase 3), which ADR-049 / SPEC-049-A §6 deliberately left pilot-gated behind two unanswered empirical questions (Q2 export determinism, Q3 independent-checker wall-clock),

facing the fact that these questions cannot be settled by reasoning — only by running lean4export + an independent checker on real unsorry closures and measuring — and that committing to a Phase-3 rebuild before the data would risk the documented “>100× slower” definitional-equality pathology and the cross-machine non-determinism failure mode,

we decided for running a non-merge-gating, observe-only research pilot (SPEC-093-A): a driver exports a sample of library modules with lean4export (pinned v4.30.0, matching the toolchain), hashes the exports, re-exports on a second runner to measure cross-machine determinism (Q2), and runs nanoda against the exports under a timeout to measure wall-clock + the nanoda/ leanchecker ratio and timeout-hit rate (Q3) — emitting a data report that feeds a future Phase-3 ADR. The pilot gates nothing, admits no content, and leaves the authoritative gate (leanchecker-on-locally-rebuilt-environment) unchanged,

and neglected (a) skipping straight to a Phase-3 rebuild without the data (rejected — it would lean on unproven determinism / wall-clock assumptions ADR-049 explicitly flagged as open); (b) making the export re-check merge-gating now (rejected — SPEC-049-A §4: any non-kernel signal is advisory until proven, and this is unproven); (c) lowering the central re-check below p = 1 (explicitly out of scope — a separate ADR amending ADR-049, gated on this pilot’s data); and (d) TEE/hardware attestation (rejected by ADR-049),

to achieve the empirical evidence that decides whether Phase 3 (the only throughput-slope-changer) is real, before any soundness-surface change is designed — turning ADR-049’s two open questions from speculation into measured fact,

accepting that the pilot spends some real compute on research that admits no proofs; that a negative result (non-deterministic export, or an unbounded nanoda wall-clock) is a valid and valuable outcome that keeps leanchecker authoritative and redirects effort to Track A levers (e.g. the per-shard rebuild de-dup, #5751); and that nanoda may not support the current export format, in which case the deliverable is to report that blocker, not to force it.

What ships in this ADR

Ships (this ADR / SPEC-093-A) Out of scope (separate decisions)
Decision to run an observe-only pilot answering Q2 + Q3 A Phase-3 rebuild / making the export re-check merge-gating
A pilot driver (tools/pilot/) + a non-required workflow_dispatch workflow Lowering central p < 1 (amends ADR-049)
A data report (export determinism, nanoda wall-clock/ratio/timeout rate) TEE/hardware attestation (rejected, ADR-049)

Consequences

References

Reference ID Title Type Location
REF-1 lean4export + nanoda pilot spec Specification specs/SPEC-093-A-Lean4export-Nanoda-Independent-Checker-Pilot.md
REF-2 Decentralised CI Runner Architecture Decision ADR-049-Decentralised-CI-Runner-Architecture.md
REF-3 Decentralised CI Runner — Tiered Split (Phase 3 open questions) Specification specs/SPEC-049-A-Decentralised-CI-Runner-Architecture.md
REF-4 Sharded Gate A Axiom Audit (Track A, shipped) Decision ADR-091-Sharded-Gate-A-Axiom-Audit.md
REF-5 Verification-throughput roadmap Discussion GitHub discussion #5656
REF-6 D2 — lean4export + nanoda pilot Issue GitHub issue #5684 (roadmap #5678)
REF-7 lean4export External https://github.com/leanprover/lean4export
REF-8 nanoda independent Lean checker External https://github.com/ammkrn/nanoda_lib

Status History

Status Approver Date
Proposed unsorry maintainers 2026-06-24