Evidence reference contract v1
This contract shares metadata about a logical evidence object. It never grants object access. owner_id identifies the service that owns resolution; evidence_id is opaque to every consumer. Neither field may be interpreted as a URL or local path.
State and degradation
pending: capture was accepted but no processing started.processing: capture or encoding is in progress.success: capture completed;content_typeand SHA-256integrityare required. Access authorization is negotiated outside this payload by the machine-identity/connector work.failed:failure.codeandretryableare required. Bell keeps the immutable Event and renders evidence unavailable; it must not reject or close the Alert because evidence failed.- HTTP
404means an unknown logical reference.410means expired evidence. Both degrade evidence only, not the Event.
The payload forbids arbitrary properties, so filesystem paths, camera credentials, bearer/user tokens, signed URLs, face templates and notification/Alert state fail schema validation. Do not add access URLs to v1. A short-lived download grant, if later required, needs a separately reviewed endpoint and security contract.
Ownership
- Brain may request evidence but maps only logical metadata it actually knows.
- Sense is the default evidence owner and advances the status monotonically for a given capture attempt:
pending -> processing -> success|failed. It must retain the sameevidence_idwhile status changes. - A relay transports the reference unchanged and must not resolve it into a path or URL.
- Bell stores the latest evidence metadata separately from its immutable Event. Evidence failure/expiry never changes Alert ack/close state.
Compatibility and rollback
v1 consumers ignore no unknown fields because the v1 schema is closed. Additive fields therefore require a new schema revision that producers enable only after consumers accept it. Changed meaning, removed fields, or new required fields require /v2. Rollback disables the new producer and continues resolving stored v1 references; it never deletes Event, Receipt, Outbox, or evidence audit facts.
Run the standalone contract check from the repository root:
python contracts/tests/evidence-v1/test_contract.py