The node signs the digest of the whole receipt. Change the answer (level 0), one output token (level 1), or tamper with the Ed25519 signature, then verify — the same Rust verifier as the CLI checks the signature, the output binding, the M1 input/state binding and the M3 top-k execution audit.

Untrusted Node

as served

output (the answer it returned)

tokens: [200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, …]

signature (Ed25519) ccda436644126950…fb9a01
signer pubkey 197f6b23e16c8532…368d61
signed output digest cbb035b7f73eb917…ed195b
job: job-m1-demo model: mistral-7b-instruct-v0.2.Q4_K_M runtime: llama.cpp/511f9c13 precision: fp16

Verifier

receipt level 1
NOT VERIFIED

This ran entirely in your browser. No network calls. No server. Signature, output digest, M1 input/state binding and the M3 top-k containment check are all done by the simon-core Rust verifier compiled to WebAssembly.

level 1: receipt commits the exact prompt token ids (M1); tamper flips one output token; the M3 audit then checks the node's tokens against the verifier's top-k.

No analytics. No tracking. Verification runs in your browser.