---
id: ATS-PFM-TNL-005
scope: CAP-PFM-TNL-005
product_area: platform
module: tenant-lifecycle
revision: 3
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  services-commerce: c8b66a98e2490617aec38ba5c8165dd9bd0a8f9b
  services-committees: 36129c24daeaadcdb339218c38cdeaff9861359d
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  services-submissions: 64236c19be89579ef5897aad7de3925ed3ce03bf
  services-websites: 5fc6823c69d5e6f208c21dba8c0eb3132f8bdc4c
  services-marketing: d071a159fe9782bb71ff246d5c67d5bbfe07fbfa
  rhythm-v2-docs: d318a948692343e2f0a7ecc2e11c50db179a8c95
scenarios:
  - id: ATS-PFM-TNL-005-01
    title: Closed workspaces share the unavailable response
    level: api
    proves:
      - BR-CAP-PFM-TNL-005-01
    preconditions: 'Platform and CRM fixtures cover active, disabled, provisioning and deleting workspaces.'
    steps: Call ordinary workspace routes as a customer user.
    expected: Only the active enabled fixture is admitted; closed fixtures use the unavailable response.
    negative: true
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is served a
        tenant-scoped route in an active tenant (the premise every refusal below is read against)
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant whose customer has been cut off
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant that is still being provisioned
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant whose destruction has begun
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is told only that the
        tenant is not available
      - >-
        services-crm:modules/tenant-lifecycle/tests/e2e/tenant-availability.e2e.spec.js#is refused 403
        TenantUnavailable in the disabled tenant
      - >-
        services-crm:modules/tenant-lifecycle/tests/e2e/tenant-availability.e2e.spec.js#is refused 403
        TenantUnavailable in a tenant still being provisioned
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is served a
      tenant-scoped route in an active tenant (the premise every refusal below is read against)
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is served a
        tenant-scoped route in an active tenant (the premise every refusal below is read against)
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is served a
        tenant-scoped route in an active tenant (the premise every refusal below is read against)
    binding_note: >-
      The original test-title references contribute separate assertions from several files. No suite receives
      an implements link for the complete combined scenario; a full executable mapping remains
      FND-PFM-TNL-084.
    binding_gap: FND-PFM-TNL-084
  - id: ATS-PFM-TNL-005-02
    title: System staff access has its own boundary
    level: api
    proves:
      - BR-CAP-PFM-TNL-005-02
    preconditions: The workspace is disabled.
    steps: Call system and console routes using the corresponding staff contexts.
    expected: The system exception admits authorized staff while console context receives no exception.
    negative: false
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is past the gate in a
        tenant its own customer could not reach, because staff reach every tenant
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused the same
        way in a tenant being deleted, so the exemption is not a console route’s to grant
      - TST-PFM-TNL-050
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is past the gate in a
      tenant its own customer could not reach, because staff reach every tenant
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is past the gate in a
        tenant its own customer could not reach, because staff reach every tenant
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is past the gate in a
        tenant its own customer could not reach, because staff reach every tenant
    binding_note: >-
      All cited checks for this scenario occur in the registered file. The link establishes inspected
      executable source rather than a passing run.
  - id: ATS-PFM-TNL-005-03
    title: Destruction limits staff to reads
    level: api
    proves:
      - BR-CAP-PFM-TNL-005-03
    preconditions: The workspace is deleting.
    steps: Issue staff read and write requests.
    expected: Read is admitted and mutation is refused.
    negative: true
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is reads only
        for staff once destruction has begun, so support can still inspect it
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#may not write to a
        tenant being deleted, which the same caller being served above is the premise for
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is reads only
      for staff once destruction has begun, so support can still inspect it
    category: permission
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is reads only
        for staff once destruction has begun, so support can still inspect it
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is reads only
        for staff once destruction has begun, so support can still inspect it
    binding_note: >-
      The original test-title references contribute separate assertions from several files. No suite receives
      an implements link for the complete combined scenario; a full executable mapping remains
      FND-PFM-TNL-084.
    binding_gap: FND-PFM-TNL-084
  - id: ATS-PFM-TNL-005-04
    title: Loading preserves route and staff exceptions
    level: api
    proves:
      - BR-CAP-PFM-TNL-005-04
    preconditions: The workspace is loading.
    steps: 'Call an ordinary customer route, a data-job route and an authorized staff system route.'
    expected: Ordinary customer use is refused while data jobs and the staff exception remain admitted.
    negative: true
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant whose initial data import is open
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is past the gate in a
        tenant whose initial data import is open, which is what lets the import run at all
      - >-
        services-crm:modules/tenant-lifecycle/tests/e2e/tenant-availability.e2e.spec.js#is served the
        submission of a bulk contact job, which is what the import is made of
      - >-
        services-crm:modules/tenant-lifecycle/tests/e2e/tenant-availability.e2e.spec.js#is refused the contact
        list 403 TenantUnavailable, because nothing but the import may touch the tenant
      - >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#serves the
        upload protocol, which is what the load is made of
      - >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#serves staff,
        who reach every tenant on a system route
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
      tenant whose initial data import is open
    category: interaction
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant whose initial data import is open
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant whose initial data import is open
    binding_note: >-
      The original test-title references contribute separate assertions from several files. No suite receives
      an implements link for the complete combined scenario; a full executable mapping remains
      FND-PFM-TNL-084.
    binding_gap: FND-PFM-TNL-084
  - id: ATS-PFM-TNL-005-05
    title: Absence refuses every caller
    level: unit
    proves:
      - BR-CAP-PFM-TNL-005-05
    preconditions: The requested workspace does not exist.
    steps: Evaluate availability for staff and customer identities.
    expected: Both answers are unavailable.
    negative: true
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is
        unavailable to everybody when there is no such tenant
      - >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is
        unavailable to staff too when there is no such tenant
      - TST-PFM-TNL-091
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is unavailable
      to everybody when there is no such tenant
    category: edge
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is
        unavailable to everybody when there is no such tenant
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is
        unavailable to everybody when there is no such tenant
    binding_note: >-
      All cited checks for this scenario occur in the registered file. The link establishes inspected
      executable source rather than a passing run.
  - id: ATS-PFM-TNL-005-06
    title: Cache expiry prompts a fresh lifecycle read
    level: unit
    proves:
      - BR-CAP-PFM-TNL-005-06
    preconditions: A process has cached lifecycle facts.
    steps: 'Read before expiry, at expiry and after explicit invalidation.'
    expected: Fresh entries are reused; expired or forgotten entries cause another database read.
    negative: false
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#still answers
        from the cache one millisecond before the window closes
      - >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#reads again
        once the window has closed
      - >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#reads a
        forgotten tenant again at once, which is how the process that changed it stays right
      - TST-PFM-TNL-091
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#still answers
      from the cache one millisecond before the window closes
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#still answers
        from the cache one millisecond before the window closes
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#still answers
        from the cache one millisecond before the window closes
    binding_note: >-
      All cited checks for this scenario occur in the registered file. The link establishes inspected
      executable source rather than a passing run.
  - id: ATS-PFM-TNL-005-07
    title: Background enumeration selects operational records
    level: api
    proves:
      - BR-CAP-PFM-TNL-005-07
    preconditions: Fixtures cover lifecycle states and disabled business status.
    steps: List Platform’s operational workspaces.
    expected: 'The result contains only active, non-disabled workspaces.'
    negative: false
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
        no tenant that is still provisioning
      - >-
        services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
        no tenant whose provisioning failed
      - >-
        services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
        no tenant awaiting deletion
      - >-
        services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
        no tenant being deleted
      - >-
        services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
        no disabled tenant, active though its lifecycle is
      - TST-PFM-TNL-078
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
      no tenant that is still provisioning
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
        no tenant that is still provisioning
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
        no tenant that is still provisioning
    binding_note: >-
      All cited checks for this scenario occur in the registered file. The link establishes inspected
      executable source rather than a passing run.
  - id: ATS-PFM-TNL-005-08
    title: Opening changes ordinary availability
    level: api
    proves:
      - AS-JNY-PFM-TNL-001-01
    preconditions: The construction journey includes a before-and-after gate fixture.
    steps: Read ordinary availability around activation.
    expected: Provisioning refuses customer access and active enabled lifecycle admits it.
    negative: false
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant that is still being provisioned
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-provisioning.e2e.spec.js#leaves the tenant usable
        once the job has run
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
      tenant that is still being provisioned
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant that is still being provisioned
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant that is still being provisioned
    binding_note: >-
      The original test-title references contribute separate assertions from several files. No suite receives
      an implements link for the complete combined scenario; a full executable mapping remains
      FND-PFM-TNL-084.
    binding_gap: FND-PFM-TNL-084
  - id: ATS-PFM-TNL-005-09
    title: Loading journey retains its staff exception
    level: api
    proves:
      - AS-JNY-PFM-TNL-003-03
    preconditions: The import journey’s workspace is loading.
    steps: 'Exercise ordinary customer, data-job and staff system access.'
    expected: Customer routes close except for data-job work and staff system access remains possible.
    negative: false
    data_needs: >-
      Use the run-owned records and caller contexts created by the cited tests; use their provider and clock
      seams only where declared.
    bound_to:
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant whose initial data import is open
      - >-
        services-crm:modules/tenant-lifecycle/tests/e2e/tenant-availability.e2e.spec.js#is refused the contact
        list 403 TenantUnavailable, because nothing but the import may touch the tenant
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
      tenant whose initial data import is open
    category: interaction
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant whose initial data import is open
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
        tenant whose initial data import is open
    binding_note: >-
      The original test-title references contribute separate assertions from several files. No suite receives
      an implements link for the complete combined scenario; a full executable mapping remains
      FND-PFM-TNL-084.
    binding_gap: FND-PFM-TNL-084
  - id: ATS-PFM-TNL-005-10
    title: Import admission follows the load lifecycle
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-TNL-005-04
    interacts_with:
      - CAP-PFM-TNL-011
      - CAP-PFM-TNL-006
    preconditions: An active implementation workspace has ordinary customer and import-engine callers.
    steps: 'Open loading, try an ordinary route and an import route, then activate and repeat the ordinary route.'
    expected: >-
      Ordinary access closes while import access remains available; activation restores ordinary access
      without moving the business status to live.
    negative: true
    data_needs: >-
      Create a separate run-owned workspace for each decision branch and an unaffected comparison workspace.
      Use a controlled clock, paused task or injected fault at the boundary named in the scenario.
    bound_to: []
    provenance: proposed
    source: >-
      rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-005-keep-people-and-background-work-out-of-a-workspace-that-is.md;
      rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-011-open-a-workspace-for-its-initial-import-and-let-its-people.md;
      rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-006-keep-every-workspace-s-lifecycle-state-truthful.md
    action_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-005-keep-people-and-background-work-out-of-a-workspace-that-is.md;
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-011-open-a-workspace-for-its-initial-import-and-let-its-people.md;
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-006-keep-every-workspace-s-lifecycle-state-truthful.md
    assertion_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-005-keep-people-and-background-work-out-of-a-workspace-that-is.md;
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-011-open-a-workspace-for-its-initial-import-and-let-its-people.md;
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-006-keep-every-workspace-s-lifecycle-state-truthful.md
evidence:
  - >-
    services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is served a tenant-scoped
    route in an active tenant (the premise every refusal below is read against)
  - >-
    services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is past the gate in a
    tenant its own customer could not reach, because staff reach every tenant
  - >-
    services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is reads only for
    staff once destruction has begun, so support can still inspect it
  - >-
    services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
    tenant whose initial data import is open
  - >-
    services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#is unavailable to
    everybody when there is no such tenant
  - >-
    services-platform:modules/tenants/tests/unit/services/access/tenant-availability.spec.js#still answers
    from the cache one millisecond before the window closes
  - >-
    services-platform:modules/tenants/tests/integration/services/persistence/tenants.queries.integration.spec.js#answers
    no tenant that is still provisioning
  - >-
    services-platform:modules/tenants/tests/e2e/tenant-availability-gate.e2e.spec.js#is refused 403 in a
    tenant that is still being provisioned
  - >-
    rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-005-keep-people-and-background-work-out-of-a-workspace-that-is.md;
    rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-011-open-a-workspace-for-its-initial-import-and-let-its-people.md;
    rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-006-keep-every-workspace-s-lifecycle-state-truthful.md
coverage:
  rule: covered
  transition: 'gap: FND-PFM-TNL-070'
  validation: 'gap: FND-PFM-TNL-070'
  permission: covered
  edge: covered
  failure: 'gap: FND-PFM-TNL-070'
  boundary: covered
  concurrency: 'gap: FND-PFM-TNL-070'
  invariant: 'gap: FND-PFM-TNL-070'
  interaction: 'gap: FND-PFM-TNL-070'
coverage_notes:
  transition: >-
    The listed scenarios sample lifecycle changes. Complete transition, guard and side-effect proof is still
    owed for the state models named in the coverage finding.
  interaction: >-
    The added interaction is proposed. Related capabilities not included in that scenario remain named in the
    coverage finding.
transition_obligations:
  - state_model: STATE-PFM-TNL-001
    transition_n: 1
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/persistence/tenants.ts:activateProvisionedTenant'
  - state_model: STATE-PFM-TNL-001
    transition_n: 2
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: >-
      services-platform:modules/tenants/services/provisioning/provision-tenant-failure.ts:applyTenantProvisioningFailure
  - state_model: STATE-PFM-TNL-001
    transition_n: 3
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: >-
      services-platform:modules/tenants/services/provisioning/submit-tenant-provisioning.ts:retryTenantProvisioning
  - state_model: STATE-PFM-TNL-001
    transition_n: 4
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/deletion/request-deletion.ts:requestTenantDeletion'
  - state_model: STATE-PFM-TNL-001
    transition_n: 5
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/persistence/tenants.ts:enterTenantLoading'
  - state_model: STATE-PFM-TNL-001
    transition_n: 6
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/deletion/request-deletion.ts:requestTenantDeletion'
  - state_model: STATE-PFM-TNL-001
    transition_n: 7
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/persistence/tenants.ts:activateLoadedTenant'
  - state_model: STATE-PFM-TNL-001
    transition_n: 8
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/lifecycle/lifecycle-transitions.ts:SUCCESSORS'
  - state_model: STATE-PFM-TNL-001
    transition_n: 9
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/deletion/deletion-holds.ts:cancelTenantDeletion'
  - state_model: STATE-PFM-TNL-001
    transition_n: 10
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/deletion/begin-destruction.ts:beginTenantDestruction'
  - state_model: STATE-PFM-TNL-001
    transition_n: 11
    coverage: 'gap: FND-PFM-TNL-070'
    provenance: observed
    source: 'services-platform:modules/tenants/services/persistence/tenants.ts:forceTenantDeletingAfterRestore'
permission_obligations: []
evidence_note: >-
  The test-specific convention lists an Evidence body section, but the corpus checker rejects it. Sources and
  verification limits remain in frontmatter so this artifact conforms without changing the checker.
---
# Apply workspace availability consistently: Capability Test Specification

## Coverage

The category map separates defined scenarios from missing proof. A covered category has a scenario; a binding records inspected test assertions and carries no execution result. State-model completeness and untested interactions remain explicit gaps.

| Rule | Proved by |
|---|---|
| `BR-CAP-PFM-TNL-005-01` | `ATS-PFM-TNL-005-01` |
| `BR-CAP-PFM-TNL-005-02` | `ATS-PFM-TNL-005-02` |
| `BR-CAP-PFM-TNL-005-03` | `ATS-PFM-TNL-005-03` |
| `BR-CAP-PFM-TNL-005-04` | `ATS-PFM-TNL-005-04`, `ATS-PFM-TNL-005-10` |
| `BR-CAP-PFM-TNL-005-05` | `ATS-PFM-TNL-005-05` |
| `BR-CAP-PFM-TNL-005-06` | `ATS-PFM-TNL-005-06` |
| `BR-CAP-PFM-TNL-005-07` | `ATS-PFM-TNL-005-07` |

## Interactions With Related Capabilities

Import admission follows the load lifecycle. The combined scenario sets up the stated boundary, changes the upstream condition and observes its effect on the dependent outcome. Its steps and assertions are proposed; component tests do not establish this combined execution.

| Related capability | Combined coverage |
|---|---|
| `CAP-PFM-TNL-011` | `ATS-PFM-TNL-005-10` (proposed) |
| `CAP-PFM-TNL-013` | Gap: `FND-PFM-TNL-070` |
| `CAP-PFM-TNL-016` | Gap: `FND-PFM-TNL-070` |
