How can I prove to a client what my AI agent did?
Answer: A log you control is your word against theirs. To make it checkable, record each action with a hash of the exact payload, chain every record to the one before it, publish the latest hash daily somewhere you don't control, and sign records with a key whose public half the client has. The client can then check a record without trusting you.
Why an execution log isn't proof
You can edit it, you can delete it, and it doesn't last: self-hosted n8n prunes execution data after 336 hours by default [1]. In a disagreement, the client can't tell an honest log from an edited one.
What each record needs
- Who approved or triggered it, as an ID rather than a name.
- What was done: the action type and a hash of the exact payload.
- When, in UTC.
- The decision: approved, rejected, expired or stopped.
- The hash of the previous record.
Chain, anchor, sign
- Chain. Each record stores the previous record's hash. Change or delete an old record, and every hash after it stops matching.
- Anchor. Once a day, publish the latest hash somewhere outside your control, such as a commit to a public git repository. Rewriting a published history is visible to anyone who has a copy.
- Sign. Sign each record with an Ed25519 key [2] kept off the automation host, and publish the public key. Anyone can then verify a record without asking you.
The idea isn't new. Certificate Transparency publicly logs TLS certificates so anyone can check what was issued [3]. RFC 9943, from the IETF's SCITT working group, defines an architecture for signed statements, a transparency service that maintains a verifiable log of them, and receipts, which are signed proofs from that log [4]. It was written for digital supply chains, but the pattern carries over to agent actions.
Keep personal data out
Store hashes of content, not the content. Names, email addresses and amounts don't belong in a record that will be public or long-lived. If you need to match a person later, hash their ID with a secret salt per client, so the hashes can't be matched to people by guessing.
FAQ
Do I need a blockchain?
No. A daily hash in a public repository that others can watch or copy gives you an outside reference you can't quietly change.
What does the client need to check a record?
The record, your public key and a small verifier. Nothing from you at the moment of checking.
Can I build this in n8n?
The recording and chaining fit in a sub-workflow that inserts into a database. Keep the signing key outside n8n, for example in a small signing service the workflow calls.
Sources
- n8n, Executions environment variables: https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables/executions
- IETF, RFC 8032, Edwards-Curve Digital Signature Algorithm (EdDSA): https://www.rfc-editor.org/info/rfc8032
- IETF, RFC 9162, Certificate Transparency Version 2.0: https://www.rfc-editor.org/info/rfc9162
- IETF, RFC 9943, An Architecture for Trustworthy and Transparent Digital Supply Chains: https://www.rfc-editor.org/rfc/rfc9943.html
Disclosure: this page is written by the team building Keelstamp, a tool for verifiable receipts. It isn't released yet, and everything above works without it.