Skip to content

CAP-CRM-ENT-014Remove records and their owned information

Markdown

CAP-CRM-ENT-014

Remove records and their owned information

Markdown
  • DocumentApproved
  • Product intentConfirmed
  • ImplementationPartially observed

KindCapabilityProduct areaCRMModuleEntitiesRevision1Approved byAndrewApproved at2026-10-22

Read atservices-crm 7ea48a41react-console da630758

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

Outcomes
A deleted contact's collections, affiliations and roles move with it and its history remains readable.An organization others depend on cannot be deleted.A rejected delete removes nothing.
Surfaces
consoleapijob
Intent sources
services-crm:docs/milestones/CRM-M1-contacts-and-organizations.md#CRM-Q10services-crm:docs/milestones/CRM-M1-contacts-and-organizations.md#CRM-Q10 amendmentservices-crm:docs/milestones/CRM-M1-contacts-and-organizations.plan.md#A19

Controls

27 controls apply, from the corpus control catalogue.

TC-AZ-001 TC-AZ-002 TC-AZ-003 TC-AZ-004 TC-AZ-005 TC-AZ-006 TC-DAT-001 TC-DAT-002 TC-DAT-003 TC-DAT-004 TC-LOG-001 TC-LOG-002 TC-LOG-003 TC-LOG-004 TC-LOG-005 TC-MON-001 TC-MON-002 TC-PI-001 TC-PI-003 TC-PI-004 TC-PI-005 TC-PRV-001 TC-PRV-002 TC-PRV-003 TC-TEN-001 TC-TEN-002 TC-TEN-003

Repositories Read

RepositoryPaths
undefined:app/(console)/console/[tenantId]/crm/contacts/
undefined:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0046.spec.ts
undefined:acceptance/crm/playwright/journeys/organizations/CRM-ACC-0116.spec.ts
undefined:modules/entities/
undefined:docs/milestones/CRM-M1-contacts-and-organizations.md
undefined:modules/entities/tests/e2e/contacts-history.e2e.spec.js
undefined:modules/entities/tests/e2e/organizations.e2e.spec.js
undefined:modules/entities/tests/integration/services/assets/retire-entity-assets.integration.spec.js
undefined:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js
undefined:modules/entities/tests/unit/services/persistence/endpoint-deletions.spec.js

Where It Lives

Permissions

KeyChecked atScope
crm.contacts.deleteapitenant
crm.organizations.deleteapitenant
crm.contacts.bulkapitenant
crm.organizations.bulkapitenant
crm.contacts.mergeapitenant
crm.organizations.mergeapitenant

Business Rules

8 rules, 7 to be proved before approval. A rule's product intent is derived from its origin: 8 confirmed by a product decision, the rest inheriting this capability's confirmed.

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Contact and organization deletion requires the administrator-tier delete permission for that record kind and rejects standard users.
permissionapitest
02must prove
Confirmed
Contact deletion transactionally removes its owned details, preferences, custom values, affiliations and roles, immediately releases the primary e-mail, preserves history and number nonreuse, and leaves subsequent id reads not found.
lifecycleservice, databasetest
03must prove
Confirmed
Deleting a spouse contact clears the surviving contact’s spouse reference and advances its version with system attribution.
lifecycleservicetest
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)
04must prove
Confirmed
Any record or owned-element lock blocks deletion, identifies the blocking element and leaves the complete record intact.
validationservicetest
services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses the delete as IllegalOperation, naming the element that is locked
05must prove
Confirmed
An organization cannot be deleted while it has child organizations or any current, historical or upcoming affiliation; the refusal identifies its dependants.
validationservice, databasetest
services-crm:modules/entities/tests/e2e/organizations.e2e.spec.js#answers 409 to a delete while the contact is affiliated with it
06must prove
Confirmed
Deletion detaches a contact photo or organization logo in its transaction, and cleanup later moves the asset to deleted storage with a 30-day expiry.
lifecycleservicetest
07must prove
Confirmed
When enabled, deletion applies Platform’s associated custom-record ownership rules to detach, cascade or refuse within the record’s transaction; the disabled mode makes no such call.
policyservicetest
08
Confirmed
API and bulk-job hard deletion remain available until safe delete, while record-page console actions offer archive.
policyconsole, apidocumented

Scenarios

IdGivenWhenThenProvenance
01A contact whose spouse is another contact.An administrator deletes it.The contact and everything it owns are gone, the spouse's link is cleared, and the history is still readable.test
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
02A firm that closed years ago, named by a contact's ended affiliation.An administrator deletes it.The delete is rejected; archive is the way.test

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.