Verify a record
Every attested record gets a public verify code. The page it opens needs no account and lives on the customer's own stack. This is what it shows, using the example from the home page after a reviewer adjudicated claim three.
Standing at time T. The claims, grades, reason codes, explanations, and the source and tier each grade rested on, exactly as they were when the record was signed.
The proof. The Merkle root, the KMS signature, the hierarchy and policy versions, and the model and prompt identifiers. Recompute the root from the canonical record and it matches, or it does not.
The chain. Whether this attestation supersedes an earlier one and whether a later one supersedes it, with the reason each time: an adjudication, an invalidation, or a source that was superseded.
Evidence. The hash and fetch time of each evidence snapshot. Customers choose whether the snapshot content itself is public.
The old attestation still validates. It now also says it was superseded, by whom, and why.
Independent check
Fetch the attestation and the canonical record from the public endpoint. Recompute the Merkle root. Verify the signature against the stack's published KMS public key. If the customer enabled the optional public-chain anchor, confirm the root against the anchored batch. Every step is documented and none requires an account.
$ curl -s https://stack.example.com/v1/attest/att_01J8Q4M7 > att.json
$ curl -s https://stack.example.com/v1/attest/att_01J8Q4M7/chain
[ { "id": "att_01J8Q4M7", "superseded_by": "att_01J8Q6RT", "reason": "adjudication" },
{ "id": "att_01J8Q6RT", "supersedes": "att_01J8Q4M7" } ]
$ truthlock attest check att.json --pubkey stack.pem
root match
signature valid
chain superseded by att_01J8Q6RT (adjudication)