Agent logs your auditor can check without trusting you.
Chirindo signs each agent action into a hash-chained log. Witness signs a receipt saying when it saw each checkpoint of that log. If the log is later cut short, or rewritten by whoever holds the key, anywhere up to the last witnessed checkpoint, comparing it with the witness receipts shows it.
Checking is free, with open-source tools, and an auditor can fetch the receipts from Witness directly instead of taking them from the operator.
Free checkpoints need no account and come from a shared pool of 2,000 a UTC day. Paid plans get their own key and quota.
A real witness receipt, checked in this page
Demo log of a purchasing agent: five tool calls through the Chirindo gate.
Log entries, each signed and linked to the one before
Arguments and results are stored as hashes. The summaries are for reading.
This browser cannot check Ed25519 signatures with WebCrypto, so the receipt has not been checked here. Check the log offline with @headlessoracle/receipt-verify on npm, and the witness receipt with chirindo verify from the Chirindo repository.
Checks run by this page
Entries signed by the operator key and hash-linked
Checkpoint signed by the operator key
Receipt signed by Witness, naming this checkpoint
Log at the witnessed count matches what Witness saw
CHECKING
Running the four checks in your browser.
Show the data being checked
1
The problem
An agent's log is kept by the team that runs the agent. Signing each entry and chaining the hashes catches an edit in the middle, but not the last entries being cut off, and not a history rewritten and re-signed by whoever holds the key. An auditor handed the file cannot tell what it looked like before.
2
How it works
Every tool call becomes a signed entry
The Chirindo gate sits in front of your MCP server. Each call it allows or denies is written as an entry signed with your key, carrying the hash of the entry before it. Change one in the middle and the signature and the next link no longer match.
Checkpoints go to Witness
Every so often the gate signs a checkpoint, the entry count and the hash at the head of the log, and sends it to Witness. Witness keeps it and signs a receipt with the time it received it. Only the checkpoint is sent: never arguments, results or records.
Anyone compares, offline
An auditor checks the log against the witness receipts with open-source tools. A log shorter than a witnessed count, or different from what Witness saw at that count, fails, and the check names the count where it fails.
What a witness receipt is, and what it is not
A witness receipt is Headless Oracle's signed statement of what it was shown and when: at received_at, a checkpoint signed by the key with that thumbprint. It is only as reliable as Headless Oracle and its signing key. It does not prove that the records are true, who controls the key, or that the records were written at the times they carry.
Entries after the last witnessed checkpoint can still be cut off or rewritten without detection.
A history rewritten before it was first witnessed is not detected. The gap between an entry's time and received_at is that exposure window.
A session the operator never presents, or one restarted under a new key or session ID, starts with no receipts.
Witness is independent of the operator, not of Headless Oracle, which also publishes the gate.
The full list is in the Witness spec, under honest_limits.
3
Start in a minute
Witness accepts only a checkpoint signed with an Ed25519 key, so the request reads its body from a file. This script makes a key and a one-entry checkpoint and writes checkpoint.json. It needs Node 20 or later and nothing else.
Witness answers 201 with a receipt signed by Headless Oracle. The checkpoint's keys are written in sorted order, so JSON.stringify gives the exact bytes the spec signs. With the gate, the count and the head hash come from your log; here they stand in for one placeholder entry. Free checkpoints share a pool of 2,000 new ones a UTC day.
init makes the signing key. The second line is the command your MCP client launches in place of your server; policy.json lists the tools to deny, and {"deny": []} records everything and blocks nothing. verify checks every signature and link offline.
Sending checkpoints to Witness from the gate (chirindo checkpoint, proxy --checkpoint-every) is on the main branch of the Chirindo repository; the current npm release, 0.4.0, does not include it yet.
4
For auditors and insurers
Ask for the complete session log, then fetch its receipts from Witness yourself. A receipt file supplied by the operator relies on the operator; a query to api.headlessoracle.com does not.
Run the open-source verifier offline. A log cut short or rewritten anywhere up to the last witnessed checkpoint fails, and the check names the lowest failing count.
Compare each received_at with the entries' times. That gap is the window in which history could have been rewritten before anyone witnessed it.
Every commit in receipt-verify is SSH-signed. sh tools/verify-history.sh checks the whole history against the key in SIGNING_KEYS, fingerprint SHA256:KFZr0BiXIrvl/hsri0vzciGsj+suWiBqHYBwdnnyJXg.
Chirindo commits since 24 July 2026 are signed with the same key.