SPECIFICATION · AXIA.RECEIPT.V1

Verification Receipt (axia.receipt.v1)

Frozen normative specification of the Axia verification receipt: canonical payload, encoding, lifecycle semantics, and signature scope.

0. Status

This document is FROZEN. The on-the-wire receipt format described here is part of the public protocol surface. Any breaking change to the canonical payload, encoding, or signature scope MUST be released as a new profile identifier (e.g. axia.receipt.v2) and MUST NOT reuse axia.receipt.v1.

1. Definition

A verification receipt is a notarized observation produced by an Axia verifier at a specific point in time, recording the lifecycle state of an identity and signing key, the confidence band of the verification, and an optional Merkle checkpoint binding.

A receipt is NOT a claim of factual accuracy of the underlying content. It is a cryptographic statement of the form: "At time T, the verifier observed state S for content C, and signed that observation."

2. Fields

2.1 Wire schema

2.2 Encoding rules

3. Canonical payload

3.1 Form

The canonical payload is a single UTF-8 string built by joining the following fields in this exact order with the ASCII pipe character | (0x7C):

Where checkpoint_root_or_empty is the lowercase hex root if present, or the empty string if the receipt's checkpoint_root is null.

3.2 Null handling

Only checkpoint_root may be null. When null, the canonical form contributes an empty segment between the surrounding pipes (i.e. ...|none|). Verifiers MUST NOT emit the literal string "null".

3.3 Byte-perfect example

3.4 Hashing

The receipt's payload_hash MUST equal SHA-256 of the canonical payload's UTF-8 byte representation, encoded as 64-character lowercase hexadecimal.

4. Signature scope

The Ed25519 signature in signature MUST be computed over the raw bytes of payload_hash (32 bytes, the binary SHA-256 digest), NOT over the JSON document or the canonical payload string.

Verifiers MUST NOT include in the signed payload any of the following:

This scoping decision is intentional: a receipt commits exclusively to a minimal, machine-stable provenance state.

5. Lifecycle semantics

5.1 Temporal trust

A receipt encodes state at time of verification. A receipt that was valid when produced remains cryptographically valid forever, but the underlying lifecycle may change. Verifiers and consuming UIs SHOULD distinguish:

5.2 Status semantics

6. Verification procedure

The reference implementation lives in protocol/sdk/core.ts and is published as @axia/receipt-verify.

7. Test vectors

Conformance test vectors are published under /protocol/test-vectors/receipt-v1/ and MUST all pass for any implementation claiming compatibility:

8. Disclaimers

A receipt verifies provenance and signing history. It does not determine the factual accuracy of the underlying content, the human authorship of the content, or the absence of AI involvement. Implementations and consuming UIs MUST NOT use receipt data to assert any of those properties.