---
id: ATS-CRM-ENT-014
scope: CAP-CRM-ENT-014
product_area: crm
module: entities
revision: 1
status: proposed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CRM-ENT-014-01
    title: Only administrators delete
    level: browser
    proves:
      - BR-CAP-CRM-ENT-014-01
    preconditions: Prepare a standard user and an administrator.
    steps: >-
      Attempt contact and organization deletion through the API with standard
      and administrator callers. Open the contact’s actions as the standard
      caller.
    expected: >-
      The standard caller’s API deletion is refused and the records remain
      readable. Administrator API deletion succeeds for eligible records. The
      standard caller has no administrator archive action.
    negative: true
    data_needs: Use personas by tier.
    bound_to:
      - TST-CRM-ENT-774
      - TST-CRM-ENT-775
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0046.spec.ts#CRM-ACC-0046
    category: permission
    action_evidence:
      provenance: test
      source: >-
        react-console:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0046.spec.ts#CRM-ACC-0046
    assertion_evidence:
      provenance: test
      source: >-
        react-console:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0046.spec.ts#CRM-ACC-0046
    test_anchors:
      - >-
        react-console:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0046.spec.ts#CRM-ACC-0046
      - >-
        react-console:acceptance/crm/playwright/journeys/organizations/CRM-ACC-0132.spec.ts#CRM-ACC-0132
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-014-02
    title: a contact delete takes everything it owns and preserves its history
    level: api
    proves:
      - BR-CAP-CRM-ENT-014-02
    preconditions: Prepare a contact with one of each collection and a primary e-mail.
    steps: >-
      Delete it; read it; delete again; create another with its e-mail; read its
      history.
    expected: Gone with every element; 404; 404; accepted; history marked deleted.
    negative: false
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-787
      - TST-CRM-ENT-786
    provenance: test
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
      every owned element with it, the foreign keys cascading
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
        every owned element with it, the foreign keys cascading
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
        every owned element with it, the foreign keys cascading
    test_anchors:
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
        every owned element with it, the foreign keys cascading
      - >-
        services-crm:modules/entities/tests/e2e/contacts.e2e.spec.js#leaves
        nothing to read: a later GET answers 404
      - >-
        services-crm:modules/entities/tests/e2e/contacts.e2e.spec.js#answers 404
        to a second delete of the same id
      - >-
        services-crm:modules/entities/tests/integration/db/contact-email-addresses.table.integration.spec.js#frees
        its primary address at once: its addresses went with it
      - >-
        services-crm:modules/entities/tests/e2e/contacts-history.e2e.spec.js#keeps
        a deleted contact's history readable, with the record marked deleted and
        when
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-014-03
    title: Deleting a spouse clears the link
    level: api
    proves:
      - BR-CAP-CRM-ENT-014-03
    preconditions: Prepare a contact named as another's spouse.
    steps: Delete it.
    expected: The other contact's spouse cleared and its version moved under the system.
    negative: false
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-787
    provenance: test
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#bumps
      the version of that contact and stamps the system, not the caller that
      deleted (M1-D6)
    category: interaction
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#bumps
        the version of that contact and stamps the system, not the caller that
        deleted (M1-D6)
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#bumps
        the version of that contact and stamps the system, not the caller that
        deleted (M1-D6)
    test_anchors:
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#clears
        the spouse of the contact that named it
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#bumps
        the version of that contact and stamps the system, not the caller that
        deleted (M1-D6)
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-014-04
    title: Locks refuse a delete
    level: browser
    proves:
      - BR-CAP-CRM-ENT-014-04
    preconditions: >-
      Prepare a contact locked against deletes; one with a locked element; an
      organization with a locked address.
    steps: Delete each.
    expected: Rejected naming the lock or element; nothing removed.
    negative: true
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-787
      - TST-CRM-ENT-789
      - TST-CRM-ENT-776
    provenance: test
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
      the delete as IllegalOperation, naming the element that is locked
    category: failure
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
        the delete as IllegalOperation, naming the element that is locked
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
        the delete as IllegalOperation, naming the element that is locked
    test_anchors:
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
        the delete as IllegalOperation
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
        the delete as IllegalOperation, naming the element that is locked
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#deletes
        nothing: the contact and every element are still there
      - >-
        services-crm:modules/entities/tests/integration/services/persistence/organizations.integration.spec.js#refuses
        the delete as IllegalOperation, naming the element that is locked
      - >-
        react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0209.spec.ts#CRM-ACC-0209
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-014-05
    title: Organizations others depend on cannot be deleted
    level: browser
    proves:
      - BR-CAP-CRM-ENT-014-05
      - INV-DOM-CRM-ENT-002-10
    preconditions: >-
      Prepare a parent with a child; an organization a contact is tied to, and
      one only an ended affiliation names.
    steps: Delete each; delete the leaf; delete after the contact has gone.
    expected: 409 naming child organizations or contacts; deleted; deleted.
    negative: true
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-786
      - TST-CRM-ENT-775
    provenance: test
    source: >-
      services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
      409 to a delete while the contact is affiliated with it
    category: validation
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
        409 to a delete while the contact is affiliated with it
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
        409 to a delete while the contact is affiliated with it
    test_anchors:
      - >-
        services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
        409 for an organization that other organizations name as their parent
      - >-
        services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
        409 to a delete while the contact is affiliated with it
      - >-
        services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#accepts
        the delete once the contact has gone
      - >-
        react-console:acceptance/crm/playwright/journeys/organizations/CRM-ACC-0115.spec.ts#CRM-ACC-0115
      - >-
        react-console:acceptance/crm/playwright/journeys/organizations/CRM-ACC-0116.spec.ts#CRM-ACC-0116
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-014-06
    title: a deleted record's files are retired
    level: api
    proves:
      - BR-CAP-CRM-ENT-014-06
    preconditions: Prepare a contact with a photo.
    steps: Delete it; run the cleanup; roll back another delete.
    expected: >-
      Detached in the delete; moved to the deleted folder; still attached after
      the rollback.
    negative: false
    data_needs: No additional fixtures.
    bound_to:
      - TST-CRM-ENT-793
    provenance: test
    source: >-
      services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#detaches
      the photo in the delete's own transaction
    category: transition
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#detaches
        the photo in the delete's own transaction
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#detaches
        the photo in the delete's own transaction
    test_anchors:
      - >-
        services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#detaches
        the photo in the delete's own transaction
      - >-
        services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#moves
        the photo into the deleted folder
      - >-
        services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#leaves
        the photo attached, the delete never having committed
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-014-07
    title: Owner-deletion rules apply when switched on
    level: unit
    proves:
      - BR-CAP-CRM-ENT-014-07
    preconditions: 'Prepare the switch off, then on, and a restricting association.'
    steps: Delete the owner.
    expected: >-
      No statement while off; on, a refusal maps to a conflict and rolls back
      the delete.
    negative: true
    data_needs: No additional fixtures.
    bound_to: []
    provenance: test
    source: >-
      services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#never
      runs a statement when it is off
    category: edge
    action_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#never
        runs a statement when it is off
    assertion_evidence:
      provenance: test
      source: >-
        services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#never
        runs a statement when it is off
    test_anchors:
      - >-
        services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#is
        on only for the word on
      - >-
        services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#never
        runs a statement when it is off
      - >-
        services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#maps
        AE409 to an IllegalOperation carrying the function message
    binding_scope: >-
      contributions: the cited executable assertions collectively support only
      the observations they contain; additional matrix and journey checks remain
      proposed.
  - id: ATS-CRM-ENT-014-08
    title: A refused delete retains the locked aggregate
    category: invariant
    level: api
    proves:
      - BR-CAP-CRM-ENT-014-04
      - BR-CAP-CRM-ENT-015-05
    preconditions: >-
      A person has several contact points and one element carrying a deletion
      lock.
    steps: >-
      Attempt deletion and reread the person, its contact points and its
      affiliations.
    expected: >-
      The lock refusal leaves the aggregate readable with all original owned
      information.
    negative: true
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
      the delete as IllegalOperation, naming the element that is locked
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
        the delete as IllegalOperation, naming the element that is locked
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
        the delete as IllegalOperation, naming the element that is locked
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
  - id: ATS-CRM-ENT-014-09
    title: Removing a holder changes organizational coverage
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-ENT-012-04
      - BR-CAP-CRM-ENT-014-02
    preconditions: An organization’s minimum is met by one contact’s effective role.
    steps: >-
      Delete that person; process its deletion reaction and read the
      organization.
    expected: The person is gone and recalculation records the resulting missing holder.
    negative: false
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/entities/tests/integration/services/organizations/compliance/compliance-change-events.integration.spec.js#a
      contact saved with the notes DISABLE_CONTACT_ROLE_COMPLIANCE_CHECK:
      nothing (its delete still records);
      services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
      every owned element with it, the foreign keys cascading
    exercises:
      - CAP-CRM-ENT-012
      - CAP-CRM-ENT-014
    workflows: []
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/organizations/compliance/compliance-change-events.integration.spec.js#a
        contact saved with the notes DISABLE_CONTACT_ROLE_COMPLIANCE_CHECK:
        nothing (its delete still records);
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
        every owned element with it, the foreign keys cascading
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/organizations/compliance/compliance-change-events.integration.spec.js#a
        contact saved with the notes DISABLE_CONTACT_ROLE_COMPLIANCE_CHECK:
        nothing (its delete still records);
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
        every owned element with it, the foreign keys cascading
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
  - id: ATS-CRM-ENT-014-10
    title: Archive does not erase deletion dependencies
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-ENT-013-08
      - BR-CAP-CRM-ENT-014-05
    preconditions: An archived organization still has an ended person affiliation.
    steps: Attempt organization deletion and read the retained affiliation.
    expected: >-
      Deletion is refused and the ended relationship still identifies the
      archived body.
    negative: false
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/organizations.archive.integration.spec.js#keeps
      the ended affiliation naming the organization's id, with its name and its
      archive instant;
      services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
      409 to a delete while the contact is affiliated with it
    exercises:
      - CAP-CRM-ENT-013
      - CAP-CRM-ENT-014
    workflows: []
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/organizations.archive.integration.spec.js#keeps
        the ended affiliation naming the organization's id, with its name and
        its archive instant;
        services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
        409 to a delete while the contact is affiliated with it
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/organizations.archive.integration.spec.js#keeps
        the ended affiliation naming the organization's id, with its name and
        its archive instant;
        services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
        409 to a delete while the contact is affiliated with it
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
  - id: ATS-CRM-ENT-014-11
    title: Unlock the blocking element before deletion
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-ENT-014-04
      - BR-CAP-CRM-ENT-015-06
    preconditions: >-
      A person has an element carrying a deletion lock and an administrator has
      delete and unlock authority.
    steps: >-
      Try deleting; release the specific element lock at the current version;
      retry deletion.
    expected: >-
      The first attempt retains the person; the audited release allows deletion
      if no other dependency blocks it.
    negative: false
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
      the delete as IllegalOperation, naming the element that is locked;
      services-crm:modules/entities/tests/integration/services/persistence/record-locks.integration.spec.js#refuses
      an element id the organization does not have, releasing nothing
    exercises:
      - CAP-CRM-ENT-014
      - CAP-CRM-ENT-015
    workflows:
      - WF-CRM-ENT-009
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
        the delete as IllegalOperation, naming the element that is locked;
        services-crm:modules/entities/tests/integration/services/persistence/record-locks.integration.spec.js#refuses
        an element id the organization does not have, releasing nothing
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
        the delete as IllegalOperation, naming the element that is locked;
        services-crm:modules/entities/tests/integration/services/persistence/record-locks.integration.spec.js#refuses
        an element id the organization does not have, releasing nothing
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
  - id: ATS-CRM-ENT-014-12
    title: Deleted-record history survives the ordinary record
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-ENT-014-02
      - BR-CAP-CRM-ENT-016-02
    preconditions: A person has saved revisions and an authorized history reader.
    steps: Delete the person; read its ordinary record and its timeline.
    expected: >-
      The ordinary read is not found while history remains readable and
      identifies the deleted subject.
    negative: false
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
      every owned element with it, the foreign keys cascading;
      services-crm:modules/entities/tests/e2e/organizations-history.e2e.spec.js#answers
      a caller with the history key but no read of organizations 404, as the
      organization itself would
    exercises:
      - CAP-CRM-ENT-014
      - CAP-CRM-ENT-016
    workflows:
      - WF-CRM-ENT-009
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
        every owned element with it, the foreign keys cascading;
        services-crm:modules/entities/tests/e2e/organizations-history.e2e.spec.js#answers
        a caller with the history key but no read of organizations 404, as the
        organization itself would
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
        every owned element with it, the foreign keys cascading;
        services-crm:modules/entities/tests/e2e/organizations-history.e2e.spec.js#answers
        a caller with the history key but no read of organizations 404, as the
        organization itself would
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
  - id: ATS-CRM-ENT-014-13
    title: Exercise every declared authority independently
    category: permission
    level: api
    proves:
      - BR-CAP-CRM-ENT-014-01
    preconditions: >-
      An eligible record and configuration fixture exist for each operation; the
      caller can reach only the run’s workspace.
    steps: >-
      For each declared permission, execute its matching operation with that
      permission, then without it while retaining the other required grants.
      Read affected records after every refused mutation.
    expected: >-
      The authorized case reaches the operation; the missing-grant case is
      refused and preserves saved data. Record access alone does not authorize
      the other declared actions.
    negative: true
    data_needs: Run-owned records and configuration in an isolated workspace.
    bound_to: []
    provenance: proposed
    source: >-
      services-crm:aws/crm.service.ts:ApplicationPermissions;
      services-crm:modules/entities/aws/api/entities.routes.ts
    permission_keys:
      - crm.contacts.delete
      - crm.organizations.delete
      - crm.contacts.bulk
      - crm.organizations.bulk
      - crm.contacts.merge
      - crm.organizations.merge
    test_anchors: []
    action_evidence:
      provenance: proposed
      source: >-
        services-crm:aws/crm.service.ts:ApplicationPermissions;
        services-crm:modules/entities/aws/api/entities.routes.ts
    assertion_evidence:
      provenance: proposed
      source: >-
        services-crm:aws/crm.service.ts:ApplicationPermissions;
        services-crm:modules/entities/aws/api/entities.routes.ts
    binding_scope: 'unbound: the detailed scenario still needs executable proof.'
evidence:
  - >-
    react-console:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0046.spec.ts#CRM-ACC-0046
  - >-
    react-console:acceptance/crm/playwright/journeys/organizations/CRM-ACC-0132.spec.ts#CRM-ACC-0132
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
    every owned element with it, the foreign keys cascading
  - >-
    services-crm:modules/entities/tests/e2e/contacts.e2e.spec.js#leaves nothing
    to read: a later GET answers 404
  - >-
    services-crm:modules/entities/tests/e2e/contacts.e2e.spec.js#answers 404 to
    a second delete of the same id
  - >-
    services-crm:modules/entities/tests/integration/db/contact-email-addresses.table.integration.spec.js#frees
    its primary address at once: its addresses went with it
  - >-
    services-crm:modules/entities/tests/e2e/contacts-history.e2e.spec.js#keeps a
    deleted contact's history readable, with the record marked deleted and when
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#bumps
    the version of that contact and stamps the system, not the caller that
    deleted (M1-D6)
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#clears
    the spouse of the contact that named it
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
    the delete as IllegalOperation, naming the element that is locked
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
    the delete as IllegalOperation
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#deletes
    nothing: the contact and every element are still there
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/organizations.integration.spec.js#refuses
    the delete as IllegalOperation, naming the element that is locked
  - >-
    react-console:acceptance/crm/playwright/journeys/affiliations/CRM-ACC-0209.spec.ts#CRM-ACC-0209
  - >-
    services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
    409 to a delete while the contact is affiliated with it
  - >-
    services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
    409 for an organization that other organizations name as their parent
  - >-
    services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#accepts
    the delete once the contact has gone
  - >-
    react-console:acceptance/crm/playwright/journeys/organizations/CRM-ACC-0115.spec.ts#CRM-ACC-0115
  - >-
    react-console:acceptance/crm/playwright/journeys/organizations/CRM-ACC-0116.spec.ts#CRM-ACC-0116
  - >-
    services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#detaches
    the photo in the delete's own transaction
  - >-
    services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#moves
    the photo into the deleted folder
  - >-
    services-crm:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js#leaves
    the photo attached, the delete never having committed
  - >-
    services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#never
    runs a statement when it is off
  - >-
    services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#is
    on only for the word on
  - >-
    services-crm:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js#maps
    AE409 to an IllegalOperation carrying the function message
  - >-
    services-crm:modules/entities/tests/integration/services/organizations/compliance/compliance-change-events.integration.spec.js#a
    contact saved with the notes DISABLE_CONTACT_ROLE_COMPLIANCE_CHECK: nothing
    (its delete still records);
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
    every owned element with it, the foreign keys cascading
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/organizations.archive.integration.spec.js#keeps
    the ended affiliation naming the organization's id, with its name and its
    archive instant;
    services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers
    409 to a delete while the contact is affiliated with it
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses
    the delete as IllegalOperation, naming the element that is locked;
    services-crm:modules/entities/tests/integration/services/persistence/record-locks.integration.spec.js#refuses
    an element id the organization does not have, releasing nothing
  - >-
    services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#removes
    every owned element with it, the foreign keys cascading;
    services-crm:modules/entities/tests/e2e/organizations-history.e2e.spec.js#answers
    a caller with the history key but no read of organizations 404, as the
    organization itself would
  - >-
    services-crm:aws/crm.service.ts:ApplicationPermissions;
    services-crm:modules/entities/aws/api/entities.routes.ts
coverage:
  rule: 'gap: FND-CRM-ENT-062'
  transition: covered
  validation: covered
  permission: covered
  edge: covered
  failure: covered
  boundary: 'gap: FND-CRM-ENT-062'
  concurrency: 'gap: FND-CRM-ENT-062'
  invariant: covered
  interaction: covered
previous_approval:
  revision: 1
  approved_by: Andrew
  approved_at: '2026-10-22T00:00:00.000Z'
transition_coverage:
  - state_model: STATE-CRM-ENT-001
    from: active
    to: deleted
    scenarios:
      - ATS-CRM-ENT-014-02
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/design/state-models/STATE-CRM-ENT-001-contact-record-lifecycle.md:transitions
  - state_model: STATE-CRM-ENT-001
    from: archived
    to: deleted
    scenarios:
      - ATS-CRM-ENT-014-02
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/design/state-models/STATE-CRM-ENT-001-contact-record-lifecycle.md:transitions
  - state_model: STATE-CRM-ENT-002
    from: active
    to: deleted
    scenarios:
      - ATS-CRM-ENT-014-05
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/design/state-models/STATE-CRM-ENT-002-organization-record-lifecycle.md:transitions
  - state_model: STATE-CRM-ENT-002
    from: archived
    to: deleted
    scenarios:
      - ATS-CRM-ENT-014-05
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/design/state-models/STATE-CRM-ENT-002-organization-record-lifecycle.md:transitions
coverage_notes:
  rule:
    reason: >-
      No detailed rule scenario currently specifies this aspect; the coverage
      finding records the required follow-through.
    provenance: unknown
    source: FND-CRM-ENT-062
  boundary:
    reason: >-
      No detailed boundary scenario currently specifies this aspect; the
      coverage finding records the required follow-through.
    provenance: unknown
    source: FND-CRM-ENT-062
  concurrency:
    reason: >-
      No detailed concurrency scenario currently specifies this aspect; the
      coverage finding records the required follow-through.
    provenance: unknown
    source: FND-CRM-ENT-062
coverage_findings:
  - FND-CRM-ENT-062
  - FND-CRM-ENT-075
permission_coverage:
  - key: crm.contacts.delete
    where_checked: api
    scenario: ATS-CRM-ENT-014-13
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md
  - key: crm.organizations.delete
    where_checked: api
    scenario: ATS-CRM-ENT-014-13
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md
  - key: crm.contacts.bulk
    where_checked: api
    scenario: ATS-CRM-ENT-014-13
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md
  - key: crm.organizations.bulk
    where_checked: api
    scenario: ATS-CRM-ENT-014-13
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md
  - key: crm.contacts.merge
    where_checked: api
    scenario: ATS-CRM-ENT-014-13
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md
  - key: crm.organizations.merge
    where_checked: api
    scenario: ATS-CRM-ENT-014-13
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md
related_coverage:
  - capability: CAP-CRM-ENT-013
    scenarios:
      - ATS-CRM-ENT-014-10
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md:related
  - capability: CAP-CRM-ENT-015
    scenarios:
      - ATS-CRM-ENT-014-11
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md:related
  - capability: CAP-CRM-ENT-016
    scenarios:
      - ATS-CRM-ENT-014-12
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md:related
  - capability: CAP-CRM-ENT-012
    scenarios:
      - ATS-CRM-ENT-014-09
    provenance: documented
    source: >-
      rhythm-v2-docs:specs/crm/entities/planning/capabilities/CAP-CRM-ENT-014-delete-a-contact-or-an-organization.md:related
examination_evidence:
  provenance: documented
  source: 'rhythm-v2-docs:specs/crm/entities/reports/EXAMINATION-2026-10-23.md'
  heading_conflict: FND-CRM-ENT-075
---

# Remove records and their owned information
## Coverage

The category map separates specified cases from recorded gaps. A proposed case describes proof to implement; a binding identifies the assertions supplied by an existing executable file. The permission and transition ledgers record the individual checks needed for the capability.

| Required rule | Scenario or finding |
|---|---|
| `BR-CAP-CRM-ENT-014-01` | `ATS-CRM-ENT-014-01`, `ATS-CRM-ENT-014-13` |
| `BR-CAP-CRM-ENT-014-02` | `ATS-CRM-ENT-014-02`, `ATS-CRM-ENT-014-09`, `ATS-CRM-ENT-014-12` |
| `BR-CAP-CRM-ENT-014-03` | `ATS-CRM-ENT-014-03` |
| `BR-CAP-CRM-ENT-014-04` | `ATS-CRM-ENT-014-04`, `ATS-CRM-ENT-014-08`, `ATS-CRM-ENT-014-11` |
| `BR-CAP-CRM-ENT-014-05` | `ATS-CRM-ENT-014-05`, `ATS-CRM-ENT-014-10` |
| `BR-CAP-CRM-ENT-014-06` | `ATS-CRM-ENT-014-06` |
| `BR-CAP-CRM-ENT-014-07` | `ATS-CRM-ENT-014-07` |

## Interactions With Related Capabilities

The interaction scenarios exercise set records aside and restore them; control record locks and system protection; inspect a record’s changes over time; review organization role compliance and prepare notices. They change one part of a prepared record and inspect the dependent outcome. Unbound interactions remain proposed rather than implying an existing end-to-end implementation.

## Source Evidence

The frontmatter pins the repositories and identifies the source anchors for each scenario. Bindings record inspected assertions, while unbound cases remain proposed. Source inspection supplies no execution result or product approval.
