Skip to content

IDProva launches April 7 — Registry packages coming at launch. Build from source now.

Action Receipts

An Action Receipt is a signed record of an action performed by an agent. Receipts form a tamper-evident, hash-chained log.

{
"id": "rcpt_01HQ3P9LYCD8ZH3ENQWT6G7F0U",
"version": "0.1.0",
"timestamp": "2026-02-24T12:30:00.000Z",
"agent": "did:idprova:example.com:kai-lead-agent",
"delegation": "dat_01HQ3N8KXBC7YG2DMPVS5F6E9T",
"action": {
"type": "mcp:tool:filesystem:read",
"target": "/projects/idprova/README.md",
"method": "readFile",
"parameters": {
"path": "/projects/idprova/README.md",
"encoding": "utf-8"
},
"result": {
"status": "success",
"bytesRead": 4096,
"contentHash": "blake3:f8c3..."
}
},
"context": {
"sessionId": "sess_01HQ3P2KABC...",
"parentReceiptId": "rcpt_01HQ3P8KXBC...",
"traceId": "trace_01HQ3P1JABC...",
"environment": "production",
"runtimeVersion": "openclaw/v2.1"
},
"chain": {
"previousHash": "blake3:7a8b9c0d1e2f...",
"sequenceNumber": 42
},
"signature": {
"algorithm": "hybrid-ed25519-mldsa65",
"keyId": "did:idprova:example.com:kai-lead-agent#key-ed25519-1",
"value": "z4sK7qN2vR8wX1yT5uP3mJ6nB9cF0dA..."
}
}
FieldTypeRequiredDescription
idstringYesUnique receipt identifier. Format: rcpt_ + ULID.
versionstringYesIDProva protocol version.
timestampISO 8601YesWhen the action was performed. MUST include milliseconds.
agentDIDYesDID of the agent that performed the action.
delegationstringYesjti of the DAT that authorised this action.
actionobjectYesDetails of the action performed.
contextobjectNoContextual information about the action.
chainobjectYesHash chain linkage.
signatureobjectYesCryptographic signature over the receipt.
FieldTypeRequiredDescription
typestringYesScope string of the action (same grammar as DAT scopes).
targetstringYesThe resource acted upon.
methodstringNoThe specific method/function called.
parametersobjectNoInput parameters (sensitive values SHOULD be redacted).
resultobjectYesOutcome of the action.
result.statusstringYessuccess, failure, or error.

Action Receipts form a hash chain for tamper detection. Each receipt includes the hash of the previous receipt and a monotonically increasing sequence number.

Receipt[0]:
chain.previousHash = BLAKE3("GENESIS:" + agent_did)
chain.sequenceNumber = 0
Receipt[n]:
chain.previousHash = BLAKE3(CanonicalJSON(Receipt[n-1]))
chain.sequenceNumber = n

The input to the hash function is the receipt serialized using JSON Canonicalization Scheme (JCS, RFC 8785), with the signature field removed:

HashInput(receipt):
1. receipt_copy = DeepCopy(receipt)
2. delete receipt_copy.signature
3. canonical = JCS_Serialize(receipt_copy)
4. return BLAKE3(canonical)

The first receipt in a chain uses a deterministic genesis hash:

genesisHash = BLAKE3("GENESIS:" + agent_did)

This allows verifiers to identify the start of a chain without out-of-band information.


VerifyChain(receipts[]):
1. Sort receipts by sequenceNumber ascending
2. if receipts[0].chain.sequenceNumber != 0:
return INVALID("chain does not start at genesis")
3. expected_prev = BLAKE3("GENESIS:" + receipts[0].agent)
4. for each receipt in receipts:
a. if receipt.chain.previousHash != expected_prev:
return INVALID("hash chain break at seq " + receipt.chain.sequenceNumber)
b. if receipt.chain.sequenceNumber != expected_seq:
return INVALID("sequence gap at " + expected_seq)
c. agent_did = resolver.resolveDID(receipt.agent)
d. if not VerifySignature(receipt, agent_did):
return INVALID("invalid signature at seq " + receipt.chain.sequenceNumber)
e. expected_prev = HashInput(receipt)
f. expected_seq = receipt.chain.sequenceNumber + 1
5. return VALID(length=len(receipts))

Verifiers MAY verify a subset of the chain by accepting a trusted checkpoint (a known-good receipt hash and sequence number) and verifying only from that point forward.


Action Receipts satisfy existing compliance framework controls out of the box.

ControlReceipt FieldDescription
AU-2 (Auditable Events)action.typeEvery significant action produces a receipt
AU-3 (Content of Audit Records)All fieldsWho, what, when, where, outcome
AU-8 (Time Stamps)timestampISO 8601 with milliseconds
AU-9 (Protection of Audit Information)chain.*, signatureHash chaining + signatures
AU-10 (Non-repudiation)signatureAgent signs with own key
AU-12 (Audit Record Generation)agent, delegationAutomated on every action
IA-2 (Identification & Authentication)agent, delegationDID-based identity in every receipt
AC-6 (Least Privilege)delegation.scopeEnforceable scoped permissions
ISM ControlReceipt FieldDescription
ISM-0585agent, delegationIdentification of processes acting on data
ISM-0988action.type, action.targetLogging of privileged actions
ISM-0580chain.*, signatureIntegrity of audit logs
ISM-1405timestamp, context.sessionIdCentralised event logging
ISM-0859context.environmentSystem configuration logging
CriteriaReceipt FieldDescription
CC6.1agent, delegationLogical access security — identity of actor
CC6.2delegation, action.typeAuthorised scope of access
CC6.3chain.*Integrity of audit trail
CC7.2action.result.statusMonitoring of system operations
CC8.1context.runtimeVersionChange management tracking

Post-incident forensics: Walk the receipt chain backwards to trace exactly what happened, who authorised it, and when.

Real-time monitoring: Stream receipts to detect anomalies — unusual action frequency, actions outside normal scope, unexpected time patterns.

Compliance auditing: Map receipts directly to compliance controls. Assessors verify the chain and confirm control coverage.

Attribution: Trace any action back through the delegation chain to the authorising human principal. Complete accountability from action to human.