---
id: ATS-PFM-TNL-004
scope: CAP-PFM-TNL-004
product_area: platform
module: tenant-lifecycle
revision: 1
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-004-01
    title: Existing customers receive no first-admin invitation
    level: api
    proves:
      - BR-CAP-PFM-TNL-004-01
    preconditions: The request names a person for an existing customer.
    steps: Complete provisioning.
    expected: No first-administrator invitation is sent.
    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/integration/services/provisioning/provision-tenant.integration.spec.js#invites
        nobody when the request did not create the customer
      - TST-PFM-TNL-082
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
      nobody when the request did not create the customer
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
        nobody when the request did not create the customer
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
        nobody when the request did not create the customer
    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-004-02
    title: New-customer invitation establishes the intended role
    level: api
    proves:
      - BR-CAP-PFM-TNL-004-02
    preconditions: A new customer request names its first administrator.
    steps: Run the administration participant.
    expected: One invited console identity receives customer-scoped Administrator authority and one invitation.
    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/lifecycle/first-administrator.integration.spec.js#leaves
        an invited console user of the customer holding the address
      - >-
        services-platform:modules/tenants/tests/integration/services/lifecycle/first-administrator.integration.spec.js#grants
        that user the Administrator role at the customer, waiting on their acceptance
      - >-
        services-platform:modules/tenants/tests/integration/services/lifecycle/first-administrator.integration.spec.js#sends
        them one invitation
      - >-
        services-platform:modules/tenants/tests/unit/services/lifecycle/first-administrator.spec.ts#grants the
        built-in Administrator role, by the product key the catalog publishes it under
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/integration/services/lifecycle/first-administrator.integration.spec.js#leaves
      an invited console user of the customer holding the address
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/lifecycle/first-administrator.integration.spec.js#leaves
        an invited console user of the customer holding the address
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/lifecycle/first-administrator.integration.spec.js#leaves
        an invited console user of the customer holding the address
    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-004-03
    title: Administration invitation survives retry
    level: api
    proves:
      - BR-CAP-PFM-TNL-004-03
    preconditions: The original build recorded its administrator invitation.
    steps: Repeat the provisioning work.
    expected: The ledger retains that invitation without a second send.
    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/provisioning/provision-tenant.integration.spec.js#invites
        them once, and records the invitation in the ledger
      - >-
        services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#does
        not invite them a second time when the provisioning is run again
      - >-
        services-platform:modules/tenants/tests/integration/services/lifecycle/first-administrator.integration.spec.js#sends
        no second invitation
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
      them once, and records the invitation in the ledger
    category: invariant
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
        them once, and records the invitation in the ledger
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
        them once, and records the invitation in the ledger
    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-004-04
    title: Unusable administration authority is refused
    level: unit
    proves:
      - BR-CAP-PFM-TNL-004-04
    preconditions: 'Existing identities exercise suspension, incorrect role or scope and ineffective validity periods.'
    steps: Attempt to adopt each identity.
    expected: Each incompatible state reports a refusal that directs staff toward correction.
    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/lifecycle/first-administrator.spec.ts#refuses a
        SUSPENDED user, whatever they hold: an administrator nobody can use is none
      - >-
        services-platform:modules/tenants/tests/unit/services/lifecycle/first-administrator.spec.ts#refuses
        when the grant is of another role, which administers nothing
      - >-
        services-platform:modules/tenants/tests/unit/services/lifecycle/first-administrator.spec.ts#refuses
        when the Administrator grant is at tenant scope rather than the customer’s own
      - >-
        services-platform:modules/tenants/tests/unit/services/lifecycle/first-administrator.spec.ts#refuses a
        grant that has already ended
      - >-
        services-platform:modules/tenants/tests/integration/services/lifecycle/first-administrator.integration.spec.js#refuses
        the job rather than reporting an administrator the customer does not have
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/unit/services/lifecycle/first-administrator.spec.ts#refuses a
      SUSPENDED user, whatever they hold: an administrator nobody can use is none
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/lifecycle/first-administrator.spec.ts#refuses a
        SUSPENDED user, whatever they hold: an administrator nobody can use is none
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/lifecycle/first-administrator.spec.ts#refuses a
        SUSPENDED user, whatever they hold: an administrator nobody can use is none
    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-004-05
    title: Invalid sender inputs retain no workspace
    level: api
    proves:
      - BR-CAP-PFM-TNL-004-05
    preconditions: 'Sender variants violate strategy, domain or address requirements.'
    steps: Submit each request.
    expected: The response identifies invalid input and creation leaves no workspace.
    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/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
        the domain strategy without a domain when the tenant has none of its own to lend it
      - >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
        a domain under the address strategy, which proves the one mailbox and nothing else
      - >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
        an address outside the domain, because an identity proved for one domain may not send as another
      - >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
        a domain that is a URL rather than a hostname
      - >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
        a strategy outside the closed list
      - TST-PFM-TNL-085
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
      the domain strategy without a domain when the tenant has none of its own to lend it
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
        the domain strategy without a domain when the tenant has none of its own to lend it
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
        the domain strategy without a domain when the tenant has none of its own to lend it
    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-004-06
    title: Hostname identity supplies a sender domain
    level: api
    proves:
      - BR-CAP-PFM-TNL-004-06
    preconditions: A hostname workspace identifier accompanies a domain strategy with no supplied domain.
    steps: Submit the sender-bearing request.
    expected: The requested identity uses the workspace hostname as its domain.
    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/provisioning/tenant-email-strategy.integration.spec.js#proves
        the tenant’s id as the domain, the id being a hostname
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-email-sender.e2e.spec.js#proves the tenant’s own
        domain, because the request left the strategy’s domain to it
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#proves
      the tenant’s id as the domain, the id being a hostname
    category: boundary
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#proves
        the tenant’s id as the domain, the id being a hostname
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#proves
        the tenant’s id as the domain, the id being a hostname
    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-004-07
    title: Pending DNS does not block opening
    level: api
    proves:
      - BR-CAP-PFM-TNL-004-07
    preconditions: A domain sender request remains unverified.
    steps: Finish construction and inspect its sender.
    expected: The workspace opens while the pending identity exposes required DNS records.
    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/provisioning/tenant-email-strategy.integration.spec.js#opens
        the tenant anyway, which is what option A promises
      - >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#leaves
        its sender identity pending, for the customer to finish in their own time
      - >-
        services-platform:modules/tenants/tests/e2e/tenant-email-sender.e2e.spec.js#answers the DNS records
        the customer must publish, so a support person can read them out
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#opens
      the tenant anyway, which is what option A promises
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#opens
        the tenant anyway, which is what option A promises
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#opens
        the tenant anyway, which is what option A promises
    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-004-08
    title: Portal construction is deferred
    level: unit
    proves:
      - BR-CAP-PFM-TNL-004-09
    preconditions: The portal participant receives a workspace with recorded portal interest.
    steps: Invoke provisioning.
    expected: The response is not applicable and no pool is built.
    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/lifecycle/participants.spec.js#creates nothing
        when a tenant is provisioned, because the pool is built when Websites is enabled
      - TST-PFM-TNL-097
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/unit/services/lifecycle/participants.spec.js#creates nothing
      when a tenant is provisioned, because the pool is built when Websites is enabled
    category: rule
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/lifecycle/participants.spec.js#creates nothing
        when a tenant is provisioned, because the pool is built when Websites is enabled
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/unit/services/lifecycle/participants.spec.js#creates nothing
        when a tenant is provisioned, because the pool is built when Websites is enabled
    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-004-09
    title: First access and sender setup coexist
    level: api
    proves:
      - AS-JNY-PFM-TNL-001-04
    preconditions: The new-customer journey includes an administrator and domain sender.
    steps: Complete its provisioning fixture.
    expected: The invitation is recorded once and the workspace opens with verification pending.
    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/provisioning/provision-tenant.integration.spec.js#invites
        them once, and records the invitation in the ledger
      - >-
        services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#opens
        the tenant anyway, which is what option A promises
    provenance: test
    source: >-
      services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
      them once, and records the invitation in the ledger
    category: interaction
    action_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
        them once, and records the invitation in the ledger
    assertion_evidence:
      provenance: test
      source: >-
        services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
        them once, and records the invitation in the ledger
    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-004-10
    title: Refused first-access input leaves no accepted construction
    category: interaction
    level: api
    proves:
      - BR-CAP-PFM-TNL-004-04
    interacts_with:
      - CAP-PFM-TNL-001
      - CAP-PFM-TNL-003
    preconditions: >-
      A staff request creates a customer and names an administrator whose existing identity has incompatible
      authority.
    steps: >-
      Submit the request, let first-administrator provisioning reach its authority check and inspect the build
      and invitation records.
    expected: >-
      The participant refuses, the build remains failed for staff recovery and no second invitation is sent.
      This checks a build-stage refusal rather than submission rollback.
    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-004-give-a-new-customer-its-first-administrator-and-its-own-e.md;
      rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-001-ask-for-a-new-workspace-and-have-every-application-build-it.md;
      rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-003-follow-a-provisioning-retry-it-and-hear-how-it-ended.md
    action_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-004-give-a-new-customer-its-first-administrator-and-its-own-e.md;
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-001-ask-for-a-new-workspace-and-have-every-application-build-it.md;
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-003-follow-a-provisioning-retry-it-and-hear-how-it-ended.md
    assertion_evidence:
      provenance: proposed
      source: >-
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-004-give-a-new-customer-its-first-administrator-and-its-own-e.md;
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-001-ask-for-a-new-workspace-and-have-every-application-build-it.md;
        rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-003-follow-a-provisioning-retry-it-and-hear-how-it-ended.md
evidence:
  - >-
    services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
    nobody when the request did not create the customer
  - >-
    services-platform:modules/tenants/tests/integration/services/lifecycle/first-administrator.integration.spec.js#leaves
    an invited console user of the customer holding the address
  - >-
    services-platform:modules/tenants/tests/integration/services/provisioning/provision-tenant.integration.spec.js#invites
    them once, and records the invitation in the ledger
  - >-
    services-platform:modules/tenants/tests/unit/services/lifecycle/first-administrator.spec.ts#refuses a
    SUSPENDED user, whatever they hold: an administrator nobody can use is none
  - >-
    services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#refuses
    the domain strategy without a domain when the tenant has none of its own to lend it
  - >-
    services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#proves
    the tenant’s id as the domain, the id being a hostname
  - >-
    services-platform:modules/tenants/tests/integration/services/provisioning/tenant-email-strategy.integration.spec.js#opens
    the tenant anyway, which is what option A promises
  - >-
    services-platform:modules/tenants/tests/unit/services/lifecycle/participants.spec.js#creates nothing when
    a tenant is provisioned, because the pool is built when Websites is enabled
  - >-
    rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-004-give-a-new-customer-its-first-administrator-and-its-own-e.md;
    rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-001-ask-for-a-new-workspace-and-have-every-application-build-it.md;
    rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-003-follow-a-provisioning-retry-it-and-hear-how-it-ended.md
coverage:
  rule: covered
  transition: 'gap: FND-PFM-TNL-069'
  validation: covered
  permission: 'gap: FND-PFM-TNL-069'
  edge: 'gap: FND-PFM-TNL-069'
  failure: 'gap: FND-PFM-TNL-069'
  boundary: covered
  concurrency: 'gap: FND-PFM-TNL-069'
  invariant: covered
  interaction: covered
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-069'
    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-069'
    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-069'
    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-069'
    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-069'
    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-069'
    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-069'
    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-069'
    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-069'
    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-069'
    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-069'
    provenance: observed
    source: 'services-platform:modules/tenants/services/persistence/tenants.ts:forceTenantDeletingAfterRestore'
  - state_model: STATE-PFM-TNL-002
    transition_n: 1
    coverage: 'gap: FND-PFM-TNL-069'
    provenance: observed
    source: >-
      services-platform:modules/tenants/services/provisioning/provision-tenant-operations.ts:tenantProvisioningOperations
  - state_model: STATE-PFM-TNL-002
    transition_n: 2
    coverage: 'gap: FND-PFM-TNL-069'
    provenance: documented
    source: 'services-platform:docs/jobs.md#§2 step 8'
  - state_model: STATE-PFM-TNL-002
    transition_n: 3
    coverage: 'gap: FND-PFM-TNL-069'
    provenance: observed
    source: >-
      services-platform:modules/tenants/services/provisioning/provision-tenant-operations.ts:tenantProvisioningOperations
  - state_model: STATE-PFM-TNL-002
    transition_n: 4
    coverage: 'gap: FND-PFM-TNL-069'
    provenance: observed
    source: >-
      services-platform:modules/tenants/services/provisioning/provision-tenant-workflow.ts:tenantProvisioningWorkflow
permission_obligations:
  - key: hq.tenants.provision
    where_checked: api
    scenario_examples: []
    coverage: 'gap: FND-PFM-TNL-069'
    note: 'Examples do not establish the complete key-by-key grant, revoked-grant and staff-context matrix.'
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-004-give-a-new-customer-its-first-administrator-and-its-own-e.md
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.
---
# Prepare the customer’s first access and sender: 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-004-01` | `ATS-PFM-TNL-004-01` |
| `BR-CAP-PFM-TNL-004-02` | `ATS-PFM-TNL-004-02` |
| `BR-CAP-PFM-TNL-004-03` | `ATS-PFM-TNL-004-03` |
| `BR-CAP-PFM-TNL-004-04` | `ATS-PFM-TNL-004-04`, `ATS-PFM-TNL-004-10` |
| `BR-CAP-PFM-TNL-004-05` | `ATS-PFM-TNL-004-05` |
| `BR-CAP-PFM-TNL-004-06` | `ATS-PFM-TNL-004-06` |
| `BR-CAP-PFM-TNL-004-07` | `ATS-PFM-TNL-004-07` |
| `BR-CAP-PFM-TNL-004-09` | `ATS-PFM-TNL-004-08` |

## Interactions With Related Capabilities

Refused first-access input leaves no accepted construction. 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-001` | `ATS-PFM-TNL-004-10` (proposed) |
