Decisions you can verify.
Every routing decision gets an audit_idand a content-addressed proof hash. Each new audit record also commits to the hash of the record before it — a tamper-evident chain — and once a day the chain head is signed with our Ed25519 key and published. Change one historical decision and every hash after it breaks. You don't have to trust the tower; you can check its math.
Three layers, in plain language
- 01
Per-decision proof
Each route/preflight decision is hashed (sha256 over canonical JSON of the full decision record — candidates, per-factor scores, policy checks, verdict). The owning operator can replay it via
GET /v1/audits/{id}, which returns the methodology version used, every candidate's factor scores, the policy checks with results, and the chain link. - 02
Hash chain
Every chained record's hash includes the previous record's hash:
record_hash = sha256(seq|entry_type|ref_id|payload_hash|prev_hash). The chain runs from deployment forward (genesisprev_hashissha256("stackbroker-audit-chain-genesis")); records that predate chain genesis are not retroactively chained — we do not rewrite history, even to improve it.genesis prev_hash: 093e04316d48f5c5878f29688d6eb6ff7d18cde64371388b836fb141ced733c9
- 03
Daily signed anchors
At the end of each UTC day, the chain-head hash and entry count are signed (Ed25519) and published below and at
/v1/audits/anchors. Anchors carry hashes and counts only — never agent or operator data. Human review actions in the trust pipeline are chained the same way, so human judgment is part of the verifiable record too.
How to verify an anchor
Four steps, standard tooling, no Stackbroker account needed:
- Fetch
/.well-known/stackbroker-signing-keyand load the PEM public key. - Fetch
/v1/audits/anchorsand pick an anchor. Serialize itspayloadas canonical JSON (object keys sorted recursively). - Verify:
ed25519_verify(base64decode(signature), canonical_json_bytes, public_key)— for example in Node:crypto.verify(null, Buffer.from(canonicalJson), publicKey, Buffer.from(signature, "base64")). - To verify a specific decision against the chain: take
replay.chainfromGET /v1/audits/{id}, recomputesha256(seq|route|audit_id|payload_hash|prev_hash), and confirm it equalsrecord_hashand chains to a signed anchor head.
signature scheme: Ed25519 · key_id f5596e5a2e1e2158 · canonical JSON = recursively key-sorted JSON.stringify
Recent anchors
No anchors published yet — the chain anchors its first completed UTC day after deployment. The machine endpoint is live at /v1/audits/anchors.
What stays private
Public surfaces (this page, anchors, the signing key) carry hashes, counts, and versions only. Raw audit records — tasks, policies, candidates — remain authenticated: readable by the owning organization and Stackbroker admins, nobody else. See the privacy policy.