{
  "registry": "https://opencontinuity.org/registries/0.4/lifecycles.json",
  "version": "0.4-working-draft",
  "common_rule": "Only listed transitions are legal. Each transition is atomic, revision-checked, idempotent under the same idempotency key, and emits the named audit event.",
  "lifecycles": [
    {
      "object": "accepted_context_item",
      "initial": "active",
      "terminal": [
        "withdrawn",
        "tombstoned"
      ],
      "transitions": [
        [
          "active",
          "superseded",
          "ocp.context.superseded"
        ],
        [
          "superseded",
          "tombstoned",
          "ocp.context.tombstoned"
        ],
        [
          "active",
          "withdrawn",
          "ocp.context.withdrawn"
        ]
      ],
      "note": "Accepted state is scoped and never asserts universal truth. Baseline core review status is candidate or accepted; dispute and reaffirmation require a registered profile and do not add record-lifecycle states."
    },
    {
      "object": "artifact",
      "initial": "active",
      "terminal": [
        "lost",
        "withdrawn"
      ],
      "transitions": [
        [
          "active",
          "unavailable",
          "ocp.artifact.unavailable"
        ],
        [
          "active",
          "synchronization_degraded",
          "ocp.artifact.sync_degraded"
        ],
        [
          "unavailable",
          "active",
          "ocp.artifact.available"
        ],
        [
          "unavailable",
          "lost",
          "ocp.artifact.lost"
        ],
        [
          "synchronization_degraded",
          "active",
          "ocp.artifact.sync_restored"
        ],
        [
          "synchronization_degraded",
          "unavailable",
          "ocp.artifact.unavailable"
        ],
        [
          "active",
          "withdrawn",
          "ocp.artifact.withdrawn"
        ]
      ]
    },
    {
      "object": "artifact",
      "initial": "active",
      "terminal": [
        "lost",
        "withdrawn"
      ],
      "transitions": [
        [
          "active",
          "unavailable",
          "ocp.artifact.unavailable"
        ],
        [
          "active",
          "synchronization_degraded",
          "ocp.artifact.sync_degraded"
        ],
        [
          "unavailable",
          "active",
          "ocp.artifact.available"
        ],
        [
          "unavailable",
          "lost",
          "ocp.artifact.lost"
        ],
        [
          "synchronization_degraded",
          "active",
          "ocp.artifact.sync_restored"
        ],
        [
          "synchronization_degraded",
          "unavailable",
          "ocp.artifact.unavailable"
        ],
        [
          "active",
          "withdrawn",
          "ocp.artifact.withdrawn"
        ]
      ]
    },
    {
      "object": "artifact",
      "initial": "active",
      "terminal": [
        "lost",
        "withdrawn"
      ],
      "transitions": [
        [
          "active",
          "unavailable",
          "ocp.artifact.unavailable"
        ],
        [
          "active",
          "synchronization_degraded",
          "ocp.artifact.sync_degraded"
        ],
        [
          "unavailable",
          "active",
          "ocp.artifact.available"
        ],
        [
          "unavailable",
          "lost",
          "ocp.artifact.lost"
        ],
        [
          "synchronization_degraded",
          "active",
          "ocp.artifact.sync_restored"
        ],
        [
          "synchronization_degraded",
          "unavailable",
          "ocp.artifact.unavailable"
        ],
        [
          "active",
          "withdrawn",
          "ocp.artifact.withdrawn"
        ]
      ]
    },
    {
      "object": "artifact",
      "initial": "active",
      "terminal": [
        "lost",
        "withdrawn"
      ],
      "transitions": [
        [
          "active",
          "unavailable",
          "ocp.artifact.unavailable"
        ],
        [
          "active",
          "synchronization_degraded",
          "ocp.artifact.sync_degraded"
        ],
        [
          "unavailable",
          "active",
          "ocp.artifact.available"
        ],
        [
          "unavailable",
          "lost",
          "ocp.artifact.lost"
        ],
        [
          "synchronization_degraded",
          "active",
          "ocp.artifact.sync_restored"
        ],
        [
          "synchronization_degraded",
          "unavailable",
          "ocp.artifact.unavailable"
        ],
        [
          "active",
          "withdrawn",
          "ocp.artifact.withdrawn"
        ]
      ]
    },
    {
      "object": "context_package",
      "initial": "built",
      "terminal": [
        "expired",
        "invalidated",
        "rejected"
      ],
      "transitions": [
        [
          "built",
          "available",
          "ocp.package.available"
        ],
        [
          "built",
          "rejected",
          "ocp.package.rejected"
        ],
        [
          "available",
          "delivered",
          "ocp.package.delivered"
        ],
        [
          "available",
          "expired",
          "ocp.package.expired"
        ],
        [
          "delivered",
          "expired",
          "ocp.package.expired"
        ],
        [
          "available",
          "invalidated",
          "ocp.package.invalidated"
        ],
        [
          "delivered",
          "invalidated",
          "ocp.package.invalidated"
        ]
      ],
      "note": "The package bytes are immutable; lifecycle is represented by events/status service, not mutation of the manifest."
    },
    {
      "object": "context_request",
      "initial": "submitted",
      "terminal": [
        "approved",
        "denied",
        "expired",
        "withdrawn",
        "superseded"
      ],
      "transitions": [
        [
          "submitted",
          "awaiting_decision",
          "ocp.request.awaiting_decision"
        ],
        [
          "submitted",
          "withdrawn",
          "ocp.request.withdrawn"
        ],
        [
          "awaiting_decision",
          "partially_approved",
          "ocp.request.partially_approved"
        ],
        [
          "awaiting_decision",
          "approved",
          "ocp.request.approved"
        ],
        [
          "awaiting_decision",
          "denied",
          "ocp.request.denied"
        ],
        [
          "awaiting_decision",
          "expired",
          "ocp.request.expired"
        ],
        [
          "partially_approved",
          "approved",
          "ocp.request.approved"
        ],
        [
          "partially_approved",
          "denied",
          "ocp.request.denied"
        ],
        [
          "partially_approved",
          "expired",
          "ocp.request.expired"
        ],
        [
          "submitted",
          "superseded",
          "ocp.request.superseded"
        ],
        [
          "awaiting_decision",
          "superseded",
          "ocp.request.superseded"
        ]
      ]
    },
    {
      "object": "conversation",
      "initial": "active",
      "terminal": [
        "withdrawn",
        "tombstoned"
      ],
      "transitions": [
        [
          "active",
          "superseded",
          "ocp.conversation.superseded"
        ],
        [
          "active",
          "withdrawn",
          "ocp.conversation.withdrawn"
        ],
        [
          "superseded",
          "tombstoned",
          "ocp.conversation.tombstoned"
        ],
        [
          "withdrawn",
          "tombstoned",
          "ocp.conversation.tombstoned"
        ]
      ]
    },
    {
      "object": "erasure_status_record",
      "initial": "requested",
      "terminal": [
        "rejected",
        "legal_retention_exception",
        "independently_verified"
      ],
      "transitions": [
        [
          "requested",
          "acknowledged",
          "ocp.erasure.acknowledged"
        ],
        [
          "acknowledged",
          "reported_complete",
          "ocp.erasure.reported_complete"
        ],
        [
          "acknowledged",
          "partially_complete",
          "ocp.erasure.partially_complete"
        ],
        [
          "acknowledged",
          "rejected",
          "ocp.erasure.rejected"
        ],
        [
          "acknowledged",
          "legal_retention_exception",
          "ocp.erasure.legal_retention_exception"
        ],
        [
          "reported_complete",
          "independently_verified",
          "ocp.erasure.independently_verified"
        ],
        [
          "partially_complete",
          "independently_verified",
          "ocp.erasure.independently_verified"
        ]
      ]
    },
    {
      "object": "grant_receipt",
      "initial": "active",
      "terminal": [
        "expired",
        "revoked",
        "superseded"
      ],
      "transitions": [
        [
          "active",
          "suspended",
          "ocp.grant.suspended"
        ],
        [
          "suspended",
          "active",
          "ocp.grant.reactivated"
        ],
        [
          "active",
          "expired",
          "ocp.grant.expired"
        ],
        [
          "suspended",
          "expired",
          "ocp.grant.expired"
        ],
        [
          "active",
          "revoked",
          "ocp.grant.revoked"
        ],
        [
          "suspended",
          "revoked",
          "ocp.grant.revoked"
        ],
        [
          "active",
          "superseded",
          "ocp.grant.superseded"
        ],
        [
          "suspended",
          "superseded",
          "ocp.grant.superseded"
        ]
      ]
    },
    {
      "object": "import_job",
      "initial": "received",
      "terminal": [
        "accepted",
        "rejected",
        "aborted"
      ],
      "transitions": [
        [
          "received",
          "quarantined",
          "ocp.import.quarantined"
        ],
        [
          "quarantined",
          "parsed",
          "ocp.import.parsed"
        ],
        [
          "parsed",
          "mapped",
          "ocp.import.mapped"
        ],
        [
          "mapped",
          "review_required",
          "ocp.import.review_required"
        ],
        [
          "review_required",
          "accepted",
          "ocp.import.accepted"
        ],
        [
          "review_required",
          "rejected",
          "ocp.import.rejected"
        ],
        [
          "quarantined",
          "rejected",
          "ocp.import.rejected"
        ],
        [
          "received",
          "aborted",
          "ocp.import.aborted"
        ],
        [
          "quarantined",
          "aborted",
          "ocp.import.aborted"
        ]
      ]
    },
    {
      "object": "message",
      "initial": "active",
      "terminal": [
        "withdrawn",
        "tombstoned"
      ],
      "transitions": [
        [
          "active",
          "superseded",
          "ocp.message.superseded"
        ],
        [
          "active",
          "withdrawn",
          "ocp.message.withdrawn"
        ],
        [
          "superseded",
          "tombstoned",
          "ocp.message.tombstoned"
        ],
        [
          "withdrawn",
          "tombstoned",
          "ocp.message.tombstoned"
        ]
      ]
    },
    {
      "object": "revocation",
      "initial": "requested",
      "terminal": [
        "effective",
        "failed"
      ],
      "transitions": [
        [
          "requested",
          "acknowledged",
          "ocp.revocation.acknowledged"
        ],
        [
          "acknowledged",
          "effective",
          "ocp.revocation.effective"
        ],
        [
          "requested",
          "failed",
          "ocp.revocation.failed"
        ],
        [
          "acknowledged",
          "failed",
          "ocp.revocation.failed"
        ]
      ],
      "note": "Effectiveness stops future authorized access; it does not recall delivered plaintext."
    },
    {
      "object": "transfer_manifest",
      "initial": "prepared",
      "terminal": [
        "validated",
        "validated_with_exceptions",
        "rejected",
        "aborted"
      ],
      "transitions": [
        [
          "prepared",
          "delivered",
          "ocp.transfer.delivered"
        ],
        [
          "delivered",
          "importing",
          "ocp.transfer.importing"
        ],
        [
          "importing",
          "validated",
          "ocp.transfer.validated"
        ],
        [
          "importing",
          "validated_with_exceptions",
          "ocp.transfer.validated_with_exceptions"
        ],
        [
          "importing",
          "rejected",
          "ocp.transfer.rejected"
        ],
        [
          "prepared",
          "aborted",
          "ocp.transfer.aborted"
        ],
        [
          "delivered",
          "aborted",
          "ocp.transfer.aborted"
        ]
      ]
    },
    {
      "object": "update_proposal",
      "initial": "submitted",
      "terminal": [
        "accepted",
        "accepted_with_changes",
        "rejected",
        "withdrawn",
        "expired",
        "superseded"
      ],
      "transitions": [
        [
          "submitted",
          "under_review",
          "ocp.proposal.under_review"
        ],
        [
          "submitted",
          "withdrawn",
          "ocp.proposal.withdrawn"
        ],
        [
          "under_review",
          "deferred",
          "ocp.proposal.deferred"
        ],
        [
          "deferred",
          "under_review",
          "ocp.proposal.under_review"
        ],
        [
          "under_review",
          "accepted",
          "ocp.proposal.accepted"
        ],
        [
          "under_review",
          "accepted_with_changes",
          "ocp.proposal.accepted_with_changes"
        ],
        [
          "under_review",
          "rejected",
          "ocp.proposal.rejected"
        ],
        [
          "under_review",
          "disputed",
          "ocp.proposal.disputed"
        ],
        [
          "disputed",
          "under_review",
          "ocp.proposal.under_review"
        ],
        [
          "submitted",
          "expired",
          "ocp.proposal.expired"
        ],
        [
          "under_review",
          "expired",
          "ocp.proposal.expired"
        ],
        [
          "deferred",
          "rejected",
          "ocp.proposal.rejected"
        ],
        [
          "deferred",
          "withdrawn",
          "ocp.proposal.withdrawn"
        ],
        [
          "deferred",
          "expired",
          "ocp.proposal.expired"
        ],
        [
          "submitted",
          "superseded",
          "ocp.proposal.superseded"
        ]
      ]
    }
  ]
}
