Unfoolability — ARGUS and the pale ghost

The deepest guarantee is not "some valid state exists" — it is that the circuit witnesses the protocol's correct evolution, so a light client cannot be fooled about what actually happened. This is the ARGUS architecture, and it is what makes the pale ghost impossible.

What the badge in the explorer means

Objects in the explorer and playground carry a verification status. It is never hand-set: a receipt's witness status comes from actually checking the witness bundle, and a proof's trust tier names which proving path produced it — a real STARK from the effect VM, or an honest placeholder label where a surface seeded local data without proving it. A theorem badge in the Studio comes from Lean's own axiom audit (#assert_axioms), not from a list someone typed. When something is not proven, the badge says so; that honesty is the feature.

What is proven

The assurance case is organized by guarantee in Dregg2/AssuranceCase.lean: each names an apex theorem and the keystones that discharge it. Generated from that file:

A AUTHORITY

Every state change is justified by an unforgeable, non-amplified, fresh token chain.

apex: authority_guarantee · 19 axiom pins

floor: ed25519 (signature on the handoff), HMAC (caveat-chain tags), Poseidon2-CR (in-circuit cap-root openings). No trusted "this was authorized" premise survives.

B CONSERVATION

Per asset, the resource sum is IDENTICALLY ZERO — on every reachable state, always.

apex: conservation_guarantee · 23 axiom pins

floor: NONE beyond integer arithmetic. Conservation is a kernel theorem; the only crypto that touches it is Pedersen (DLog) IF values are committed rather than cleartext, and the case proves committed = cleartext via Spec.committed_iff_cleartext. DEPLOYMENT CORRESPONDENCE (named, not closed — the theorem's hypothesis vs the running node): reachable_total_zero quantifies over states reachable from a VALUE-EMPTY genesis (GenesisState: bal ≡ 0; live cells may pre-exist, value may not). Two deployed paths are TODAY outside that hypothesis, and this case does not claim them: 1. **Devnet genesis seeding** — node/src/genesis.rs mints the faucet (1,000,000) and demo agents (alice/bob/carol) with positive balances and NO issuer well carrying −supply, so the deployed genesis is not value-empty in the model's sense. The W1-faithful fix is to seed via issuer-moves from a genesis issuer cell (then genesis Σ=0 holds by construction). 2. **The legacy atomic-path fee epilogue** — turn/src/executor/atomic.rs (the fee deduct in execute_atomic) debits atomic_turn.fee from the agent with no crediting move: a burn OUTSIDE the issuer-move discipline (DREGG3 staged item: fees become moves to wells). Until both are reshaped, conservation_guarantee is a theorem about the kernel the node RUNS (execFullTurnA — every committed transaction preserves Σ exactly) but the deployed CHAIN's Σ is offset by its genesis seed and decremented by legacy fees. Reported here so the spec SAYS what it covers; the closure lane is the genesis/fee reshape, not a caveat to carry.

C INTEGRITY

A receipt binds the WHOLE post-state; a tampered input is rejected.

apex: integrity_guarantee · 24 axiom pins

floor: Poseidon2-permutation-CR (the recStateCommit/cellCommit/stateCommit injectivity portals reduce to it; the MMR discharge rests on the SAME Poseidon2SpongeCR). A second pre-image would be the only way to forge a receipt for a different state; that is exactly the CR assumption.

D FRESHNESS

No replay / double-spend; a committed spend's nullifier was fresh; revocation at finality.

apex: freshness_guarantee · 12 axiom pins

floor: Poseidon2-CR (the nullifier-set sorted-tree root openings). PostGSTProgress for the revocation-at-finality leg (consensus terminates after GST). KNOWN RESIDUAL (named, out-of-model): the node's MCP gateway binds biscuit-cap temporal caveats to the live attested consensus height (node/src/mcp.rs McpCapContext.block_height) — the height-expiry leg is real — but consults NO revocation registry for MCP-issued biscuit caps (the gateway's own doc names this). An MCP cap dies only by expiry caveat, never by explicit revocation, until a revocation feed is wired. That path is OUTSIDE this guarantee's statement; it is listed here so the case says so rather than implying coverage.

E UNFOOLABILITY

A light client verifying a Q-chain learns A–D for the WHOLE history; re-witnessing nothing.

apex: unfoolability_guarantee · 22 axiom pins

floor: FRI / STARK soundness (EngineSound.recursive_sound, the ONE recursion obligation), Poseidon2-CR (recStateCommit binds the seam roots), ed25519 (strand-block signatures), PostGSTProgress (a FINALIZED — not merely valid — chain, via the finality-cert leg).

R THE RUNNING ENTRY (A∧B∧C hold over what the node actually runs)

The five guarantees above are stated over the abstract kernel: the List Auth attenuation lattice (A), the multi-asset ledger recTransferBal (B), the Argus term IR (C/D), the aggregation fold (E). The honest question ember keeps pressing is: *do those guarantees hold over the executor the deployed node INVOKES* — execFullForestG, the body behind the dregg_exec_full_forest_auth FFI export (Exec.FFI), the one produce_via_lean / lean_shadow call? They do, and this section proves it in ONE statement rather than leaving it as a reader's inference.

apex: running_entry_sound · 8 axiom pins

floor: unchanged from A–C.

6 guarantees, 108 #assert_axioms pins, generated from Dregg2/AssuranceCase.lean. Every pinned theorem rests on the Lean kernel triple {propext, Classical.choice, Quot.sound} and nothing else.

The proofs are about the node, not a model of it

The strongest thing this page can say: the guarantees above are not about a paper abstraction. The node's state producer is the verified Lean function execFullForestG — credential- and caveat-gated, proven sound — compiled and linked into the node over a C ABI (dregg-lean-ffi/). It is not a model of what the node does; it is the function the node calls. So Authority, Conservation and Integrity hold over execution itself. One theorem, running_entry_sound, proves over that exact function: conservation with no zero-net side condition, no amplification on every delegation edge, and per-node credential + caveat attestation — with fail-closed teeth (an unauthorized turn does not execute). A running node will tell you the same fact about itself:

curl -s https://devnet.dregg.fg-goose.online/status
# → "state_producer":"lean", "lean_producer":true, "full_turn_proving":true

And the integrity guarantee's load-bearing leg is constructive: the executor is a memory program. Every kernel field and the receipt log project onto one domain-tagged address space, and the executor's post-state equals the fold of the verb's emitted memory trace over the pre-state. "The receipt binds the whole post-state" is therefore a fact with a witness, not an assertion — every field has a universal address, and nothing is left off the map.

What it rests on

No proof rests on nothing. These are the only out-of-kernel carriers any guarantee depends on — they enter as explicit hypotheses, never as axioms, and there are no others:

  1. Poseidon2-permutation collision-resistance — the arithmetization-friendly hash; the sponge/Merkle/state-commitment/MMR collision-resistance is reduced to permutation-CR (Crypto.Poseidon2*, Crypto.Merkle, the recStateCommit injectivity portal, the receipt-index Lightclient.MMR.mroot_binds_position, and the sorted-set/queue Apps.QueueRoot.RootCR/LenBindCR and identity-keyset Apps.PreRotation.KeySetCR carriers — every one a named CR Prop over a Poseidon2/BLAKE3 image, NOT an axiom).
  2. BLAKE3 collision-resistance — the out-of-circuit content/transcript hash.
  3. ed25519 EUF-CMA — turn / strand-block signature unforgeability.
  4. HMAC (PRF/MAC) unforgeability — macaroon caveat-chain tags (Authority.CaveatChain).
  5. AEAD confidentiality+integrity — sealed-value / disclosure payloads.
  6. Discrete-log hardness — Pedersen value commitments (Crypto.Pedersen).
  7. FRI / the STARK soundness chain — a verifying proof attests its statement; the one recursion obligation RecursiveAggregation.EngineSound.recursive_sound.
  8. PostGSTProgress — the network is eventually synchronous (after GST); the consensus LIVENESS carrier (World.gst_liveness, derived from a DLS88/HotStuff Pacemaker).
The assumption floor (8 carriers), generated from Dregg2/AssuranceCase.lean. These enter as Prop-portals (typeclass fields / hypotheses), never as axioms; no other assumption is load-bearing anywhere in the case.

The full delimitation — including the named Rust components inside the trust base and the present limitations, stated plainly — is rung 7 · the trust boundary.

Why the badges stay honest

Assurance here is not a one-time audit; it is a discipline that runs on every change. lake build enforces it. Three layered mechanisms:

What is staged, not yet cut over

The proofs are strong and load-bearing; the deployment is a research-grade devnet with named gaps. A seam the case does not name is a seam the case launders — so these are stated, not hidden. They calibrate, not retract: the guarantees hold over whatever state the executor actually runs on.

Single-node devnet

Solo federation

The public devnet runs one node, no peers. Consensus is live in the single-machine sense; the Byzantine-fault-tolerant multi-node path, while modeled and proved, is not what the public devnet exercises. Many of dregg's strongest properties are single-machine properties that become topology-bounded under real distribution.

Per-turn proving

Staged, not auto-attached

On the shared devnet each turn's witness lands immediately, but automatic per-turn STARK attachment is the gap. The proving machinery is real — you can produce and self-verify an EffectVM STARK in the playground — the devnet's automatic attachment is what is staged.

Producer coverage

A named subset, not all effects

The verified Lean producer is authoritative for a named set of effect shapes (the node reports producer_covered_effects live). Shapes outside it fall back to the unverified Rust executor — logged, never silent — with the Lean verdict as a differential. The graduation lane burns the fallback set down.

From clone to a checked proof

1

Build the Lean development — every theorem on this page elaborates under the kernel, and the axiom pins fail the build if a proof smuggles in an assumption:

git clone https://github.com/emberian/dregg && cd dregg/metatheory
lake build
2

Read a guarantee's apex theorem where it lives — the names in the cards above are Lean declaration names resolvable in metatheory/Dregg2/.

3

Ask a running node which semantics produced each turn — the verified-producer split is live API, not documentation:

curl localhost:8420/api/node/producer | jq

Go deeper