# description
A neutral third-party WITNESS receipt for a single AI model inference. A profile of receipt/v1: the same flat, detached-Ed25519-signed envelope, so /verify.js and scripts/verify_awareness.py verify it unchanged. The caller hashes the prompt and response LOCALLY and sends only fixed-length sha256 hashes plus non-PII metadata (the model the provider's own response reported, the model the caller requested, latency, the provider's own fallback flag). Dynamic Feed never sees the prompt or response. The receipt proves this exact inference record EXISTED within a time window and is INTACT (tamper-evident), and which agent key (if any) co-signed. It does NOT independently verify which model actually ran, does NOT adjudicate that a downgrade occurred, and does NOT score answer quality — model_match is a literal comparison of the two caller-supplied strings, and the holder draws any further inference. Provenance is not truth.

# properties.issuer.description
The witness. Verify its key at GET /.well-known/keys.

# properties.data.properties.content_hash.description
sha256 of the canonical inference record (the commitment over claimed_model, requested_model, prompt_sha256, response_sha256, latency_ms, token_count, fallback_flag, provider, region).

# properties.data.properties.claimed_model.description
The model identifier the PROVIDER's own response reported (e.g. its response `model` field). Caller-supplied; Dynamic Feed does not independently verify which model ran.

# properties.data.properties.requested_model.description
The model the caller asked the provider for. Caller-supplied.

# properties.data.properties.model_match.description
A literal string comparison: requested_model == claimed_model (null when requested_model is absent). A mechanical fact about two caller-supplied strings — NOT a judgment that a downgrade occurred.

# properties.data.properties.prompt_sha256.description
sha256 of the prompt, computed by the caller. The prompt itself is never sent to Dynamic Feed.

# properties.data.properties.response_sha256.description
sha256 of the response, computed by the caller. The response itself is never sent to Dynamic Feed.

# properties.data.properties.latency_ms.description
Round-trip latency the caller observed, in milliseconds. Caller-supplied.

# properties.data.properties.token_count.description
Token usage the provider reported (e.g. {prompt, completion, total}). Caller-supplied, non-PII.

# properties.data.properties.fallback_flag.description
The PROVIDER's OWN fallback / degradation / routing indicator, if the provider exposed one. Caller-supplied; Dynamic Feed reports it verbatim and makes no claim about it.

# properties.data.properties.provider.description
Opaque provider label (e.g. an API host). Caller-supplied, non-PII.

# properties.data.properties.region.description
Opaque region label the inference was served from. Caller-supplied, non-PII.

# properties.data.properties.window.description
Two-sided time bound. The lower bound (a recent independent reference committed inside the signed record) is the NOT-BEFORE; an RFC 3161 timestamp from an independent timestamping authority over the notary log head (POST /v1/anchor) is the EXISTED-BY upper bound. Together they give a provable creation window no single party controls.

# properties.data.properties.agent.description
Optional BYO-key agent co-signature, verified BEFORE witnessing ('agent attested, Dynamic Feed witnessed').

# properties.data.properties.claim_boundary.description
The witness-only boundary, baked into the signed bytes so no log can strip it.

# properties.transparency.description
Linkage into the public append-only notary log (GET /v1/notary/log); the log head is RFC 3161 timestamped daily by an independent timestamping authority.

# properties.signature.description
Detached Ed25519 signature over the canonical bytes of this envelope with the `signature` field removed (json-sorted-compact: sort_keys, comma-colon separators, UTF-8). Verify against GET /.well-known/keys.