Common decision data lifecycle (v1)

decision-lifecycle/v1 is trusted host control data, not a model-selected state field.

Common decision data lifecycle (v1)

`decision-lifecycle/v1` is trusted host control data, not a model-selected state field. Every persistent/live deployment must declare classification, non-empty access scope, positive retention, export handling, deletion mode and backup handling for every surface below. `validateDecisionLifecyclePolicy` rejects omissions and unknown surfaces, rather than defaulting to permissive retention.

SurfaceContent erased on subject deletionNon-sensitive facts retained
stateProjected body and stored copiesOpaque tombstone
receiptAny body-bearing detail; preserve only necessary bounded audit identityOpaque tombstone, policy outcome
traceLinked content and referencesOpaque tombstone
debug-sidecarCiphertext, nonce and key accessOpaque tombstone, audited deletion
cachePrefix/result data and lookup keysOpaque tombstone
jobInput/output body and handle accessOpaque tombstone
reviewNotes, attachments and subject identifiersOpaque tombstone
calibrationSubject-bearing fixtures and samplesOpaque tombstone
evaluationSubject-bearing fixtures and samplesOpaque tombstone
exportExported body and pending download accessOpaque tombstone
preprocessing-lineageSource snippets and subject-bearing provenanceOpaque tombstone

`FileDecisionLifecycleStore` supplies a local, private, append-only metadata journal for links, tombstones and holds. It delegates each surface's content erasure to a required host handler and fails closed if none is registered. A restart can replay journal references and hold releases. The implementation is single-writer: multi-process deployments must provide a transactional journal and complete erasers for their own stores. The offline test uses a real encrypted debug backend to prove journal-driven cascading erasure.

`eraseDecisionSubject` resolves host-maintained reverse references and active holds before any mutation. It tombstones each reference before erasing content, so failure to erase does not allow backup restore to resurrect the record. Erasure failure is reported as a category only; the host must retry incomplete erasure, not claim completion. `mayRestoreDecisionReference` checks tombstones and primary TTL before backup contents become queryable. Opaque tombstones do not authorize reuse of removed identifiers.

Cross-surface references held by other subjects' records resolve through `FileDecisionLifecycleStore.resolveReference()`: an erased target is `{ state: 'tombstoned', deletedAt }` (without the erased subject), a live one `linked`, anything else `unknown`, so a deleted record never becomes a dangling link. Telemetry links are rewritten the same way by `deleteTelemetryReference` (`aiwg.link.state = deleted`), and that marker survives sanitized export.

`restoreDecisionSubjectBackup(backup, policy, tombstones, restore, now)` is the subject-level restore across surfaces. Each backup entry (subject, opaque reference, creation time) is refused as `tombstoned`, `not-persisted` (surface `backup` rule), `expired` (primary retention), `invalid` or `restore-unavailable` before the host's per-surface restore handler runs; unrelated subjects restore normally. A handler failure fails closed with a category-only error. After erasure, sanitized exports (`decisionResultForExport`, `sanitizedTelemetryExport`) carry only bounded audit facts (status, reason, pins, attempt counts, tombstones), which the offline tests verify against a canary.

The JSON contract is `schemas/decision/DecisionLifecyclePolicy.v1.schema.json`; projection policy is `schemas/decision/DecisionProjectionPolicy.v1.schema.json`. Runtime validators remain authoritative for cross-field rules (destination authorization, single subject, secret material).

Telemetry retention (M09) derives from this policy with `telemetryRetentionFromLifecyclePolicy(policy, holds, now)`: trace, debug-sidecar and export TTLs come from those surfaces, linked-record TTL is the shortest of review/job/cache/evaluation, and `legalHold` is true only while an authorized lifecycle hold covering a telemetry surface is active. The hand-set `DecisionRetentionPolicy.legalHold` boolean remains accepted but is deprecated.

The optional encrypted debug-sidecar constructor requires this entire policy and refuses a debug rule whose classification, TTL, export or deletion semantics disagree with the capture authorization. A sidecar cannot silently select a weaker lifecycle rule. `FileDebugSidecarBackend` provides a local private-directory implementation: ciphertext-only 0600 files, metadata-only 0600 audit log, no-follow reads, atomic no-replace publishing, expiry sweep and restart-time TTL checks. The encryption key is supplied only by a host callback, never written by this backend. Tests restart the service and prove expired ciphertext cannot be disclosed. Deployments still need independently controlled key access, backups, audit forwarding, filesystem access review and a scheduled sweep.

The durable batch receipt and result stores bind the `receipt` rule in the same way. `FileBatchReceiptStore.erase` is the `receipt` surface eraser. It cascades to the batch's encrypted result snapshots, leaves only body-free tombstones, and refuses re-acquisition, so an erased batch is never re-dispatched. See batch-receipts.md.

Holds require a subject, authorized actor, reason, surface scope and finite expiry. Placement persists the approved hold in the host store; release requires a separately authorized actor/reason and is recorded by the store. An active hold blocks deletion of linked in-scope surfaces; it does not grant access to held content. Expired holds do not block erasure. Real stores must enforce these constraints transactionally and audit administrative operations. A returned in-memory policy object alone is not proof that a deployment's cache, backup or export service obeys them.

Evidence limits

Offline tests cover all eleven surfaces, omissions, cascading tombstones, expiry, hold denial/release and restore rejection. They do not prove a deployed backing store has completed purge of snapshots/backups or access logs; operator approval and end-to-end tests against each configured backend remain necessary. Provider retention, region and ZDR are unknown until deployment evidence establishes them.