---
id: STATE-PFM-INT-016
title: Workflow registry entry standing
object: DOM-PFM-INT-006
product_area: platform
module: integrations
revision: 1
status: draft
design_intent: confirmed
implementation_evidence: observed
origin: docs/proposals/application-processes-and-workflow-actions/14-decisions.md D-03 (Andrew 2026-10-17)
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  macroservice-libraries: 54536a441935c6e09fdb7f96f0bec71c52ba4e03
states:
  - name: absent
    meaning: The registry has no entry for this declaration.
  - name: active
    meaning: The entry is current and available to configuration validation.
  - name: inactive
    meaning: The entry is declared with its active flag off and has not been retired.
  - name: retired
    meaning: The declaration was withdrawn and retains a retirement time for historical reads.
transitions:
  - from: absent
    to: active
    trigger: Register a new active entry
    guard: 'Manifest validation and ownership, host, execution and contract checks pass'
    side_effects:
      - Insert the trigger or action declaration.
    who: Workflow registry intake
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/integration/services/registry/register-manifest.integration.spec.js#retires
      what is absent, and answers its keys
  - from: absent
    to: inactive
    trigger: Register a deliberately inactive entry
    guard: Valid registration marks this action type inactive
    side_effects:
      - Insert its declaration without enabling it.
    who: Workflow registry intake
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/integration/services/registry/ensure-platform-registry.integration.spec.js#declares
      notifications.notify and keeps it switched off
  - from: active
    to: active
    trigger: Register an existing entry
    guard: Its immutable identity and contract compatibility checks pass
    side_effects:
      - Apply changed fields or retain the unchanged row.
    who: Workflow registry intake
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/integration/services/registry/register-manifest.integration.spec.js#retires
      what is absent, and answers its keys
  - from: active
    to: retired
    trigger: Withdraw an entry
    guard: The application’s manifest omits the declaration
    side_effects:
      - Record retirement time and return the retired key.
    who: Workflow registry intake
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/integration/services/registry/register-manifest.integration.spec.js#retires
      what is absent, and answers its keys
  - from: retired
    to: active
    trigger: Redeclare a retired entry
    guard: The ordinary registration checks pass again
    side_effects:
      - Clear retirement and reactivate the declaration.
    who: Workflow registry intake
    provenance: test
    source: >-
      services-platform:modules/workflow-actions/tests/integration/services/registry/register-manifest.integration.spec.js#retires
      what is absent, and answers its keys
  - from: active
    to: inactive
    trigger: Replace the application declaration
    guard: A compatible action declaration explicitly disables the active flag
    side_effects:
      - Apply declared fields and the corresponding retirement marker.
    who: Workflow registry intake
    provenance: observed
    source: 'services-platform:modules/workflow-actions/services/registry/register-manifest.ts:registerManifest'
  - from: inactive
    to: active
    trigger: Replace the application declaration
    guard: A compatible declaration sets the active flag
    side_effects:
      - Apply declared fields and the corresponding retirement marker.
    who: Workflow registry intake
    provenance: observed
    source: 'services-platform:modules/workflow-actions/services/registry/register-manifest.ts:registerManifest'
  - from: inactive
    to: retired
    trigger: Replace the application declaration
    guard: The manifest omits the previously declared inactive action
    side_effects:
      - Apply declared fields and the corresponding retirement marker.
    who: Workflow registry intake
    provenance: observed
    source: 'services-platform:modules/workflow-actions/services/registry/register-manifest.ts:registerManifest'
  - from: retired
    to: inactive
    trigger: Replace the application declaration
    guard: A compatible redeclaration retains an inactive flag
    side_effects:
      - Apply declared fields and the corresponding retirement marker.
    who: Workflow registry intake
    provenance: observed
    source: 'services-platform:modules/workflow-actions/services/registry/register-manifest.ts:registerManifest'
  - from: inactive
    to: inactive
    trigger: Replace the application declaration
    guard: A compatible inactive declaration is repeated
    side_effects:
      - Apply declared fields and the corresponding retirement marker.
    who: Workflow registry intake
    provenance: observed
    source: 'services-platform:modules/workflow-actions/services/registry/register-manifest.ts:registerManifest'
invalid:
  - from: active
    to: absent
    why: Withdrawal retains a retired entry so saved references remain readable.
concurrency: >-
  One manifest commits its compatible registry updates together. Platform declarations use the same mechanism
  during setup, including the inactive notification action. Retiring declarations does not mutate copied saved
  definitions.
invariants:
  - INV-DOM-PFM-INT-006-01
  - INV-DOM-PFM-INT-006-02
  - INV-DOM-PFM-INT-006-03
evidence:
  - >-
    services-platform at ad3f6a65: modules/workflow-actions/db/trigger-points.table.ts, action-types.table.ts;
    services/registry/*; contracts/platform-declarations.ts; docs/workflow-actions/README.md (How an
    application registers its manifest)
---

# Workflow registry entry standing

## The Lifecycle

```mermaid
stateDiagram-v2
  state "absent" as s0
  state "active" as s1
  state "inactive" as s2
  state "retired" as s3
  s0 --> s1: Register a new active entry
  s0 --> s2: Register a deliberately inactive entry
  s1 --> s1: Register an existing entry
  s1 --> s3: Withdraw an entry
  s3 --> s1: Redeclare a retired entry
  s1 --> s2: Replace the application declaration
  s2 --> s1: Replace the application declaration
  s2 --> s3: Replace the application declaration
  s3 --> s2: Replace the application declaration
  s2 --> s2: Replace the application declaration
```

## Transitions Explained

Registration derives standing from active flags and retirement timestamps rather than a single status enum. Declared inactive action types remain distinct from withdrawn entries. Compatible redeclaration can reactivate or keep an entry inactive, while immutable ownership and execution identity are protected.

## What Cannot Happen

Withdrawal retains a retired entry so saved references remain readable.

## Concurrency and Timing

One manifest commits its compatible registry updates together. Platform declarations use the same mechanism during setup, including the inactive notification action. Retiring declarations does not mutate copied saved definitions.
