In-browser · offline · zero trust

Verify a record.
Trust no one.

A Sealed Evidence Record carries its own proof. Paste one below and this page re-derives the payload hash, the record commitment, and the evidence id from the record itself, then checks them against the values the record claims. If a single byte changed after sealing, the recomputed hash diverges and verification fails.

This runs entirely in your browser using @verdict/core — the record never touches a Verdict server. The point of a cryptographic seal is that you do not have to trust us to check it.

835 bytesverified in your browser · never sent to a server
What this checks
01
Re-hash the record

The record is canonicalized (deterministic JSON) and SHA-256 hashed. This recomputed payload hash is compared to the one the record claims.

02
Re-derive the commitment

The record commitment is sha256('verdict-ser-v0.1:' + recomputed hash). Because it derives from the recomputed hash — never the claimed one — an edited record that kept its old hash fails here. A record whose hashes were all recomputed after editing passes: that is why this result is called self-consistency, not authenticity.

03
Re-derive the id

The evidence record id is 'ser_' + the first 32 hex of the recomputed hash. Any mismatch across these checks means the record does not match the values it carries.

Self-consistency vs. historical authenticity

This check proves self-consistency — that the record matches the hash, commitment, and id it carries. It cannot prove when the record existed or who sealed it; new content with freshly computed values passes too. Historical authenticity comes from the record’s Sigstore Rekor anchor: open the entry, confirm the logged commitment equals the recomputed one, and read the log’s integrated time. Seal a fresh record at /live-seal to see an anchored record end to end.

Same check, everywhere

Verify from Claude.

The exact verification logic on this page also ships as an MCP tool, so Claude — or any MCP client — can verify a record mid-workflow. Byte-for-byte identical to the in-browser check and to the verdict-edge Rust crate that runs on edge inference nodes.

# Claude can call this on any sealed record:
verdict_verify_evidence_record({ evidence_record_id, schema, payload_hash, merkle_root, record })
# → { valid, verdict, failed_checks, checks[] }

Install the Verdict connector for Claude →