Governed Action Receipt v1

v1 Frozen Envelope format — April 2026

A Governed Action Receipt is portable cryptographic proof that an AI agent action was evaluated by deterministic policy and decided by the stated authority. Anyone with the public key can verify. No platform access required.

Format frozen. The v1 schema is committed. Changes require a version bump to v2. See ADR-007 for the decision record.

Design Principles

Envelope Structure

{
  "v":       1,
  "id":      "69d3c106c939654ef325...",
  "kid":     "88aaeeaca05eba4d",
  "iat":     1712412000,
  "type":    "governed-action",
  "payload": "eyJ0b29sIjoiQmFzaCIs...",
  "sig":     "qpAqou278Yks...",
  "prev":    null
}
FieldTypeDescription
vintegerFormat version. 1 = Ed25519 + SHA-256 + ZLAR canonical JSON. Reject unknown versions.
idstringUnique receipt identifier. Hex timestamp + random bytes.
kidstringKey identifier. First 16 chars of SHA-256 of the public key file.
iatintegerIssued-at as Unix epoch seconds.
typestringReceipt type. v1 supports "governed-action" only.
payloadstringBase64url-encoded (no padding) UTF-8 bytes of canonical JSON payload.
sigstringBase64url-encoded Ed25519 signature.
prevstring|nullSHA-256 of previous receipt for chain linking, or null.

Payload Structure

The payload is canonical JSON (per Canonicalization Spec v1.0) containing all governance fields:

FieldTypeRequired
toolstringYes
domainstringYes
detail_hashstring (hex64)Yes
outcomeenumYes
rulestringYes
authorizerenumYes
tsstring (ISO 8601)Yes
policy_versionstringYes
manifest_agent_idstring|nullYes
manifest_principalstring|nullYes
delegation_chainarrayYes
audit_event_idstringYes
audit_prev_hashstringYes

Verification Protocol

  1. Parse the envelope JSON. Check v === 1.
  2. Base64url-decode the payload field to get raw UTF-8 bytes.
  3. SHA-256 hash those bytes. Output as lowercase hex string (64 characters).
  4. Base64url-decode sig to get the 64-byte Ed25519 signature.
  5. Verify: Ed25519 over the hex string bytes using the public key identified by kid.
  6. If valid, parse the payload bytes as JSON to read the governance fields.

No re-canonicalization. The verifier hashes the stored payload bytes directly. It never needs to know the canonicalization rules. This eliminates the cross-language canonicalization divergence that is the primary failure mode of inline-signed JSON formats.

Verify a Receipt

# Clone the repo
git clone https://github.com/ZLAR-AI/ZLAR.git

# Verify any receipt (v0 or v1)
node bin/zlar-verify receipt.json --pubkey key.pub --verbose

What a Valid Receipt Proves

  1. A specific action was attempted by an AI agent
  2. Deterministic policy was evaluated against that action
  3. The decision was made by the stated authority (policy rule or human)
  4. The record has not been tampered with since creation
  5. The receipt is anchored to the ZLAR audit hash chain

Permanent URL: https://zlar.ai/specs/receipt-v1
Schema: etc/receipt-v1.schema.json
Payload schema: etc/receipt-v1-payload.schema.json
Decision record: ADR-007
License: Apache 2.0 — ZLAR Inc.