# Tombstone: lifeloop.v0.1

**Superseded by:** lifeloop.v0.2
**Date:** 2026-05-15
**Reason:** add minimal payload receipt provenance fields to payload_receipts

## Removal criteria

This tombstone may be deleted once **all** of the following hold:

- `lifeloop.v1` has been frozen,
- every known `lifeloop.v0.1` consumer has migrated to `lifeloop.v0.2` or
  later,
- two consecutive Lifeloop conformance fixture runs have observed zero
  `lifeloop.v0.1` literals in committed fixtures, receipts, or live evidence,
  and
- durable receipt stores known to contain `lifeloop.v0.1` receipts have either
  been retired or are explicitly schema-scoped so `lifeloop.v0.1` idempotency
  entries are not replayed as `lifeloop.v0.2` receipts.

## Migration

Consumers moving from `lifeloop.v0.1` to `lifeloop.v0.2` must:

1. **Schema string.** Update any pinned `schema_version` or
   `contract_version` literal from `"lifeloop.v0.1"` to
   `"lifeloop.v0.2"`.
2. **Payload receipts.** Add `payload_kind` to every `payload_receipts[]`
   entry. The value must be copied from the `PayloadEnvelope::payload_kind`
   that Lifeloop negotiated for that placement decision.
3. **Payload digest provenance.** When the negotiated payload carried
   `content_digest`, copy it into the matching `payload_receipts[]` entry.
   When the negotiated payload had no digest, omit `content_digest` from the
   serialized payload receipt. Do not serialize it as `null`.
4. **Receipt synthesis source.** Do not source `payload_kind` or
   `content_digest` from `CallbackResponse::client_payloads`. Response payloads
   are client output and may be sparse, derived, or intentionally different
   from the dispatched payloads.
5. **Validation.** Reject payload receipts with an empty `payload_kind`.
6. **Durable idempotency stores.** Treat `lifeloop.v0.1` and
   `lifeloop.v0.2` receipt bodies as different schemas. Schema-scope durable
   idempotency keys or migrate stored receipt bodies before replaying them
   under `lifeloop.v0.2`.

No CCD handoff, memory, repair-policy, digest-normalization, or receipt-ledger
semantics moved into Lifeloop in this schema bump. It only preserves minimal
payload provenance that Lifeloop already observed during placement
negotiation.
