diff --git a/README.md b/README.md
index 4591de8..4c9414b 100644
--- a/README.md
+++ b/README.md
@@ -1,36 +1,66 @@
-# scribe
+
-```
+
_ _
___ ___ _ __(_) |__ ___
/ __|/ __| '__| | '_ \ / _ \
\__ \ (__| | | | |_) | __/
|___/\___|_| |_|_.__/ \___|
-```
+
-an llm proof-completion loop for zk gadgets, with the lean kernel as oracle.
+### an LLM proof-completion loop for ZK circuit gadgets, with the Lean 4 kernel as the oracle
-## what it does
+[](https://github.com/LucidSamuel/scribe/actions/workflows/ci.yml)
+[](https://github.com/LucidSamuel/scribe/actions/workflows/docker.yml)
+[](./LICENSE-MIT)
+[](https://leanprover.github.io/)
+[](https://www.rust-lang.org/)
+[](#proven-gadgets)
-1. **gadget-ir**: a minimal IR for polynomial constraints over a prime field.
-2. **lean-emit**: reads the IR, emits a Lean 4 file with the theorem statement and `sorry`.
-3. **proof-pilot**: drives an LLM backend in a loop: edit proof → compile the target Lean file → read errors → repeat. stops when the kernel accepts or budget is exhausted.
-4. **halva-bridge**: combines Halva's halo2 extraction with a user specification and optionally sends the resulting theorem to proof-pilot.
-5. **scribe-cli**: top-level `scribe` binary with `verify` and `demo` subcommands (see below).
+[Getting Started](#getting-started) ·
+[Usage](#usage) ·
+[Proven Gadgets](#proven-gadgets) ·
+[Architecture](docs/architecture.md) ·
+[Why](docs/why.md)
-the lean kernel is the oracle. proof-pilot builds the Lake project and then compiles the exact target file, including files outside the default Lake target. the llm cannot fake acceptance with `sorry` or `axiom`, which are blocked by proof-pilot, the pre-commit hook, and CI.
+
-## quickstart
+---
-### docker (fastest)
+## Background
-the published image bundles Rust binaries, the Lean toolchain, and pre-cached Mathlib oleans.
+Zero-knowledge circuits are notoriously hard to get right: a single under-constrained gate is a soundness bug that no amount of testing reliably catches. **scribe** turns the soundness of a ZK gadget into a theorem and proves it using a large language model to *write* the proof and the **Lean 4 kernel** to *check* it.
-```
+> [!IMPORTANT]
+> The Lean kernel is the oracle, not the LLM. `proof-pilot` builds the Lake project and then compiles the exact target file. The model cannot fake acceptance with `sorry`, `axiom`, or `native_decide` — these are blocked in three independent places: `proof-pilot` itself, a pre-commit hook, and CI.
+
+Three properties make this trustworthy:
+
+- **Sound by construction.** Every proof in this repo is checked by the Lean 4 kernel. `#print axioms` on each theorem shows only the standard axioms: no `sorryAx`, no custom assumptions.
+- **Automated.** An LLM drives a closed feedback loop, edit the proof, compile, read the errors (or structured LSP goal states), repeat until the kernel accepts or the budget runs out.
+- **Real circuits.** The `halva-bridge` consumes actual Halva-style halo2 extraction output and proves soundness against a human-written specification.
+
+## How It Works
+
+scribe is a small Rust workspace. The pipeline runs IR → Lean scaffold → LLM proof loop → kernel-accepted `.lean`:
+
+1. **`gadget-ir`**: a minimal IR for polynomial constraints over a prime field (TOML → struct).
+2. **`lean-emit`**: reads the IR and emits a Lean 4 file with the theorem statement and a `sorry`.
+3. **`proof-pilot`**: drives an LLM backend in a loop: edit the proof → compile the target file → read the errors → repeat. Stops when the kernel accepts or the budget is exhausted.
+4. **`halva-bridge`**: combines a Halva halo2 extraction with a user specification and (optionally) sends the resulting theorem to `proof-pilot`.
+5. **`scribe-cli`**: the top-level `scribe` binary, with `verify`, `init`, and `demo` subcommands.
+
+## Getting Started
+
+### Docker (fastest)
+
+The published image bundles the Rust binaries, the Lean toolchain, and pre-cached Mathlib oleans, so there is no ~30-minute cold Mathlib build.
+
+```sh
# five-minute demo: dry-run the range-check gadget proof (no API key needed)
docker run --rm ghcr.io/lucidsamuel/scribe:latest scribe demo
-# verify a Halva extractor project against a user spec (requires ANTHROPIC_API_KEY)
+# verify a Halva extraction against a user spec (requires ANTHROPIC_API_KEY)
docker run --rm \
-e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
-v "$(pwd)":/workspace \
@@ -39,97 +69,37 @@ docker run --rm \
--halva-output /workspace/extracted.lean \
--spec-file /workspace/spec.lean \
--output /workspace/Proof.lean
-
-# build locally
-docker build -t scribe:dev .
```
-see the [docker section](#docker) below for more.
+See the [Docker](#docker) section for tags and local builds.
-### rust
+### From source
-```
-cargo check --workspace
-cargo test --workspace
-```
-
-### lean
-
-requires [elan](https://github.com/leanprover/elan) (lean version manager).
+> [!NOTE]
+> The Rust workspace builds with a stable toolchain. The Lean side requires [elan](https://github.com/leanprover/elan) (the Lean version manager); the pinned toolchain is `leanprover/lean4:v4.30.0-rc2`.
-```
-# install elan (mac)
-curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | sh
+```sh
+# Rust workspace
+cargo check --workspace
+cargo test --workspace
+# Lean proofs
+curl https://raw.githubusercontent.com/leanprover/elan/master/elan-init.sh -sSf | sh # install elan (mac/linux)
cd lean
-lake exe cache get
-lake build
+lake exe cache get # fetch pre-built Mathlib oleans
+lake build # should exit 0 with no warnings — every gadget proof is complete
```
-`lake build` should exit 0 with no warnings. all six gadget proofs are complete.
-
-### emit a scaffold
+> [!TIP]
+> Running `scribe`, `proof-pilot`, or `halva-bridge` against a live model needs a backend. The default backend shells out to the `claude` CLI; pass `--backend openai|anthropic|...` plus `--api-key` / `--model` to use a hosted API instead. Run any binary with `--help` for the full flag list.
-```
-cargo run -p lean-emit -- examples/poseidon-sbox/gadget.toml
-```
-
-### proof loop
+## Usage
-```
-cargo run -p proof-pilot -- lean/ZkGadgets/AutoProof.lean \
- --lake-dir lean \
- --max-iters 10 \
- --transcript transcript.log
-```
-
-proof-pilot calls `claude -p` with the file + build errors, extracts the proof from the response, patches the file, and repeats until both the project build and exact target compilation pass clean or the budget is exhausted.
-
-additional proof-pilot flags (v2):
-
-- `--notes NOTES.md` — write a `NOTES.md` learning log after the session; each iteration records concrete tactics tried and cites worked examples from `lean/ZkGadgets/`.
-- `--save-transcript session.json` — save a versioned JSON transcript recording the full iteration history, toolchain string, and Mathlib rev.
-- `--replay session.json` — deterministically replay a saved transcript; refuses on toolchain mismatch unless `--allow-toolchain-mismatch` is passed.
-- `--lsp` — use the Lean language server for structured diagnostics (goal states + hypotheses) instead of raw `lake build` text.
-
-by default it uses `prompts/lean-prover.md` as the system prompt; pass `--system-prompt