Anatomy of a receipt
| Field | What it binds |
|---|---|
schema | cain42.keystone.codeguard-decision.v1: what kind of object this is. Verifiers refuse anything else. |
action_sha256 | SHA-256 of the canonical action (tool, command or path, working folder, workspace). The command text is not in the receipt. |
decision | ALLOW, DENY or REQUIRE_APPROVAL |
findings_sha256 | SHA-256 of every finding with its severity and detail |
checks | The names of the rules that fired, readable without the findings |
engine_version, at | Which rules decided, and when (UTC) |
kid | SHA-256 fingerprint of the signing key (since 2026-11-02), so a receipt says which key to check it with |
signature_b64 | Ed25519 over the canonical JSON of every field above (sorted keys, no spaces, UTF-8) |
public_key_b64 | A convenience copy. Never trust it: pin the key you fetched yourself. |
Recompute the action hash yourself
canon = json.dumps({"tool": "Bash", "command": CMD, "cwd": CWD, "workspace": CWD}, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
sha256(canon) == receipt["action_sha256"]
FIRME AI CORPORATION · CAIN-42 is a Byzantine trust fabric. Numbers marked "our own check" were run by us, not by an independent party. Nothing on these pages is a certification.