---
id: STATE-PFM-INT-014
title: Customization registry standing
object: DOM-PFM-INT-005
product_area: platform
module: integrations
revision: 1
status: draft
design_intent: proposed
implementation_evidence: observed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
states:
  - name: absent
    meaning: No application declaration has created the registry entry.
  - name: active
    meaning: >-
      The owning declaration makes the point or event type active; version rows separately use current or
      supported status.
  - name: deprecated
    meaning: >-
      The declaration marks a point deprecated, or an omitted contract version remains referenced by enabled
      bindings.
  - name: retired
    meaning: 'The declaration omitted the point or an unused version, retaining a retired registry record.'
transitions:
  - from: absent
    to: active
    trigger: Register a new customization declaration
    guard: The manifest validates and no different supplied service owns the key
    side_effects:
      - Save the point or event with its version declarations.
    who: Registration intake
    provenance: test
    source: >-
      services-platform:modules/extensions/tests/integration/services/registration/register-service-extensions.integration.spec.js#refuses
      a malformed fragment as ObjectInvalid, naming the path
  - from: active
    to: deprecated
    trigger: Withdraw a referenced contract version
    guard: The omitted version has an enabled binding in at least one workspace
    side_effects:
      - Record deprecated version status and time.
    who: Registration intake
    provenance: test
    source: >-
      services-platform:modules/extensions/tests/integration/services/registration/register-service-extensions.integration.spec.js#deprecates
      a version no longer declared that an enabled binding still names
  - from: active
    to: retired
    trigger: Withdraw a point or unused version
    guard: The manifest omits the point or an omitted version has no enabled binding
    side_effects:
      - Retire affected versions and orphan bindings when the point is removed.
    who: Registration intake
    provenance: test
    source: >-
      services-platform:modules/extensions/tests/integration/services/registration/register-service-extensions.integration.spec.js#orphans
      every binding of a retired point, in every tenant, whatever its status
  - from: deprecated
    to: retired
    trigger: Withdraw a deprecated point
    guard: The supplied owner manifest omits its point
    side_effects:
      - Retire versions and orphan all remaining bindings.
    who: Registration intake
    provenance: inferred
    source: 'services-platform:modules/extensions/services/registration/register-service-extensions.ts'
    note: An omitted point is retired regardless of the standing of its numbered contracts.
  - from: retired
    to: active
    trigger: Redeclare a retired point
    guard: A valid declaration names the point again
    side_effects:
      - Restore the declared point status while keeping bindings orphaned.
    who: Registration intake
    provenance: observed
    source: 'services-platform:modules/extensions/services/registration/register-service-extensions.ts'
invalid: []
concurrency: >-
  A supplied service fragment commits within one registry transaction, without a declared application-wide
  exclusion lock. Its service name is not authenticated against the caller. Version-reference checks cross
  workspace records within the registration scope.
invariants:
  - INV-DOM-PFM-INT-005-01
  - INV-DOM-PFM-INT-005-02
  - INV-DOM-PFM-INT-005-03
evidence:
  - >-
    services-platform at ad3f6a65: modules/extensions/db/extension-points.table.ts,
    extension-contract-versions.table.ts, event-types.table.ts;
    services/registration/register-service-extensions.ts; docs/extensions.md (The registration intake)
---

# Customization registry standing

## The Lifecycle

```mermaid
stateDiagram-v2
  state "absent" as s0
  state "active" as s1
  state "deprecated" as s2
  state "retired" as s3
  s0 --> s1: Register a new customization declaration
  s1 --> s2: Withdraw a referenced contract version
  s1 --> s3: Withdraw a point or unused version
  s2 --> s3: Withdraw a deprecated point
  s3 --> s1: Redeclare a retired point
```

## Transitions Explained

This model summarizes registry and version standing, whose stored vocabularies differ. Point declarations use active, deprecated and retired; contract versions additionally distinguish current and supported. Withdrawal deprecates an omitted version in enabled use or retires it otherwise. Removing a point retires versions and orphans bindings.

## What Cannot Happen

Registry standing follows valid declarations rather than a fixed forward-only transition rule. An omitted point does not silently regain its orphaned customer attachments when redeclared.

## Concurrency and Timing

A supplied service fragment commits within one registry transaction, without a declared application-wide exclusion lock. Its service name is not authenticated against the caller. Version-reference checks cross workspace records within the registration scope.
