A small proof protocol for real tool access
A receipt for every action that matters.
Bind the request, authority, outcome, and signing key into a hash-chained record—without retaining raw tool arguments or results.
Local-first · no prompts stored · no hosted ledger · MIT
“The tool may have succeeded. The audit log may have failed.”
Make that split explicit, instead of reconstructing it after an incident.The protocol
Two slips, one accountable action.
A prepared receipt is filed before the tool runs. A signed final receipt follows—or an unresolved outbox item does.
- 01
Prepare
Hash the authority and arguments; append a signed intent receipt before the side effect.
- 02
Execute
Run your tool unchanged. Results and failures become hashes, not raw payloads.
- 03
Finalize
Append the outcome. If persistence fails after success, surface a durable outbox item.
Browser-only sandbox
File a sample action.
Nothing leaves this page. The sample records only hashes in memory, then verifies the linked chain.
File a sample action to see its two linked slips.
Offline: this demo remains local. A production store should retain its outbox and retry when connectivity returns.
One small surface
Wrap the call—not your whole agent.
Bring your own Ed25519 signer backed by an OS keychain or KMS. The package never handles private-key storage.
npm install @sociobot/agent-action-receipt
const ledger = createReceiptLedger({ signer, actor });
const action = await ledger.execute({ tool, authority, args, run });
await ledger.drainOutbox();
verifyBundle(ledger.exportBundle());Honest boundaries
Evidence, not magic.
- One ledger, one order. Sequence numbers do not create global ordering across processes.
- No exactly-once claim. Remote tool state and receipt persistence are separate systems.
- Signed self-attestation. A receipt proves what its key recorded; pair it with an external witness where needed.