Receipts
A receipt is a signed record of one agent action.
When an agent in Claude Code or Codex uses a tool, the harness runs a hook. The hook calls the euthyne CLI, which builds a receipt and signs it on your machine. Editing a file, running a shell command and calling an MCP tool each produce one receipt.
What a receipt contains
Metadata, in clear:
- Who: the organization, the fingerprint of the device key, and the human behind it as a forge account, for example
github:12345. - Which agent: the harness name and version, and the model ID.
- What happened: the hook event, the tool name, the outcome (
ok,errorordenied) and the duration. - Where: the repository remote, the branch, the
HEADcommit, and the paths of touched files with their git blob hash after the action. After agit commit, the new commit SHA. - Position in the session: the session ID, a sequence number, and the digest of the previous receipt. See Sessions.
Content, as salted hashes: the tool input and output, and the prompt. These hashes are called commitments. See What we store.
The receipt also says where the model ID came from: hook, transcript or unknown. Claude Code does not always include the model in its hook data. When it is missing, the CLI reads it from the local session transcript, and records unknown if that fails too. Codex includes the model in every hook.
Signed on your machine
The hook works locally and does not touch the network. It signs the receipt, writes it to a local queue and exits. A background euthyne sync uploads the queue. Receipts survive restarts and offline periods.
Receipts are signed with a short-lived session key. Your device key certifies that session key when the session starts. The device key lives in your OS keychain, and Euthyne issues a credential that binds it to you and your organization. See the action receipt format.
From signed to witnessed
After upload, Euthyne checks the receipt and appends its digest to a public, append-only log. Later, the log state is timestamped independently through OpenTimestamps. Each step raises the receipt's trust level. See Trust levels.
What a receipt does not prove
- It does not show that the action was correct, safe or intended.
- It does not show the content. The content is a salted hash. You can reveal one field to an auditor with
euthyne reveal. - It does not show that every action was recorded. A developer can turn hooks off. A gap inside a session breaks the session chain. A session that was never recorded shows on the forge side, as a merge without receipts.
- Its time comes from the device clock. The log and the independent timestamp give later bounds that do not depend on the device.