---
id: WF-PFM-MTD-004
title: Design, activate and own a custom object
trigger: The designer moves a custom category from draft to active and then applies ownership.
product_area: platform
module: metadata
revision: 1
status: draft
design_intent: proposed
implementation_evidence: observed
inference: []
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
implements:
- CAP-PFM-MTD-009
- CAP-PFM-MTD-010
- CAP-PFM-MTD-017
moves:
- STATE-PFM-MTD-003
- STATE-PFM-MTD-009
crosses:
- SVC-PFM-MTD-custom-objects
- SVC-PFM-MTD-associations
idempotency: Creates and activation reject completed identities or states. Owner setup reuses a discoverable type
  after partial failure, but separate calls and browser-local pending choices prevent whole-flow atomicity.
concurrency: Creates and activation reject completed identities or states. Owner setup reuses a discoverable type
  after partial failure, but separate calls and browser-local pending choices prevent whole-flow atomicity.
hops:
- n: 1
  actor_or_service: Console custom object designer
  action: The designer saves the draft definition and stores its intended owner locally for later activation.
  anchor: react-console:lib/custom-objects/designer/save.ts:saveObject
  seam: sync
  on_failure: Display a definition refusal; browser-storage failure can silently discard the pending owner.
  left_inconsistent: A saved draft can lack the owner choice in this browser.
  observer: The initiating person or service and its operation logs.
  provenance: observed
  source: react-console:lib/custom-objects/designer/pending-owner.ts:writePendingOwner
- n: 2
  actor_or_service: Custom objects service
  action: The service checks the draft version and naming, activates it, audits the action and writes Explorer recipes
    in one transaction.
  anchor: services-platform:modules/custom-objects/services/persistence/custom-objects.ts:activateCustomObject
  seam: sync
  on_failure: Refuse activation and report incomplete settings without changing status.
  left_inconsistent: The draft and recipes remain unchanged on refusal.
  observer: The initiating person or service and its operation logs.
  provenance: test
  source: services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses
    activating a draft whose display prop
- n: 3
  actor_or_service: Console custom object designer
  action: The client retrieves its local owner choice and reuses or creates a single-owner relationship type after
    activation.
  anchor: react-console:lib/custom-objects/designer/save.ts:applyOwner
  seam: sync
  on_failure: Show an ownership failure and retain the pending choice for another save.
  left_inconsistent: The object may already be active with no owner, or an unselected type may exist.
  observer: The initiating person or service and its operation logs.
  provenance: observed
  source: react-console:lib/custom-objects/designer/save.ts:activateObject
- n: 4
  actor_or_service: Relationship service
  action: Associations saves the owner type with endpoint, cardinality and deletion checks, its audit, query stamp
    and recipes.
  anchor: services-platform:modules/associations/services/persistence/association-types.ts:createAssociationType
  seam: sync
  on_failure: Reject the owner definition and let the designer report that activation already succeeded.
  left_inconsistent: The active object remains without completed ownership.
  observer: The initiating person or service and its operation logs.
  provenance: test
  source: services-platform:modules/associations/tests/integration/services/persistence/association-types.integration.spec.js#refuses
    a cascade that would delete a native
- n: 5
  actor_or_service: Console custom object designer
  action: The designer saves the owner selection on the object and then attempts to retire the former type.
  anchor: react-console:lib/custom-objects/designer/save.ts:retireFormerOwner
  seam: sync
  on_failure: Ignore retirement refused because another object still uses that type; report other failures after
    the object save.
  left_inconsistent: The former type and its links can remain active.
  observer: The initiating person or service and its operation logs.
  provenance: observed
  source: react-console:lib/custom-objects/designer/save.ts:retireFormerOwner
branches:
- Active-object ownership is configured before saving its selection, followed by retirement of the former type.
- Placement is included in object settings rather than a separate service write.
waits:
- Pending draft ownership remains local until activation reads it in the same browser.
evidence:
- 'react-console at baf6dae3: lib/custom-objects/designer/save.ts, pending-owner.ts, model.ts; components/configuration/custom-objects/custom-object-designer.tsx,
  lifecycle-dialogs.tsx'
- 'services-platform at ad3f6a65: modules/custom-objects/services/persistence/custom-objects.ts; modules/associations/services/persistence/association-types.ts;
  docs/custom-objects.md §1 and §25'
controls: [TC-AI-001, TC-AI-002, TC-AI-003, TC-AI-004, TC-AI-006, TC-AI-007, TC-AVL-005, TC-AZ-001, TC-AZ-002, TC-AZ-003, TC-AZ-004, TC-DAT-001, TC-DAT-003, TC-DAT-004, TC-IAM-001, TC-IAM-002, TC-IAM-004, TC-IAM-005, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-002, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003, TC-TEN-004, TC-VEN-001, TC-VEN-002, TC-VEN-003]
---

# Design, activate and own a custom object

## What It Does

The designer moves a custom category from draft to active and then applies ownership. Draft owner choices currently survive only in the browser that saved them.

## The Flow

```mermaid
sequenceDiagram
  participant Admin as Administrator
  participant UI as Object designer
  participant Store as Browser storage
  participant Obj as Custom objects service
  participant Rel as Relationship service
  Admin->>UI: save draft with owner choice
  UI->>Obj: create or replace draft
  UI->>Store: keep owner choice
  Admin->>UI: activate
  UI->>Obj: activate (checks, recipes)
  Obj-->>UI: active object
  UI->>Store: read owner choice
  alt choice kept
    UI->>Rel: reuse or create owner type
    UI->>Obj: replace object naming owner type
    UI->>Store: forget choice
  end
  UI-->>Admin: active, or active with owner error
```

## When Something Fails

Display a definition refusal; browser-storage failure can silently discard the pending owner. A saved draft can lack the owner choice in this browser. Refuse activation and report incomplete settings without changing status. The draft and recipes remain unchanged on refusal. Show an ownership failure and retain the pending choice for another save. The object may already be active with no owner, or an unselected type may exist. Reject the owner definition and let the designer report that activation already succeeded. The active object remains without completed ownership. Ignore retirement refused because another object still uses that type; report other failures after the object save. The former type and its links can remain active.

## Open Design Questions

Shared persistence for draft ownership is needed before activation can apply it reliably across browsers.
