Skip to content

CAP-CRM-ENT-007Capture a person’s communication choices

Markdown

CAP-CRM-ENT-007

Capture a person’s communication choices

Markdown
  • DocumentApproved
  • Product intentConfirmed
  • ImplementationObserved

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
Each contact carries its three restrictions and at most one preference per communication type.The restrictions are visible on the Contact 360 header.
Surfaces
consoleapi
Intent sources
services-crm:docs/milestones/CRM-M1-contacts-and-organizations.md#D-01services-crm:docs/milestones/CRM-M1-contacts-and-organizations.plan.md#2. Scope

Controls

18 controls apply, from the corpus control catalogue.

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

Repositories Read

RepositoryPaths
undefined:modules/entities/
undefined:docs/milestones/CRM-M1-contacts-and-organizations.plan.md
undefined:modules/entities/db/contacts.table.ts
undefined:modules/entities/services/persistence/contacts.ts
undefined:modules/entities/tests/integration/db/contact-communication-preferences.table.integration.spec.js
undefined:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js
undefined:app/(console)/console/[tenantId]/crm/contacts/
undefined:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0025.spec.ts

Where It Lives

Permissions

KeyChecked atScope
crm.contacts.updateapitenant
crm.contacts.readapitenant

Business Rules

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

IdRuleKindEnforced atProvenance
01
Confirmed
Contacts default their do-not-mail, do-not-call and e-mail-opt-out flags to false.
invariantdatabaseobserved
02must prove
Confirmed
A contact stores one communication preference per communication type and rejects a repeated type at the second entry’s path.
validationservice, databasetest
services-crm:modules/entities/tests/integration/services/persistence/contacts.integration.spec.js#refuses a communication type listed twice, naming the second entry
03must prove
Confirmed
Subscription addresses are canonical valid e-mail addresses, with blanks treated as absent.
validationservice, databasetest
services-crm:modules/entities/tests/integration/db/contact-communication-preferences.table.integration.spec.js#refuses a subscription value that is not shaped like an address by the domain’s email_address_format_check
04must prove
Confirmed
Communication preferences include an enabled flag and allow subscribed, digest or unsubscribed as subscription status.
validationapi, databasetest
services-crm:modules/entities/tests/integration/db/contact-communication-preferences.table.integration.spec.js#refuses a subscription status outside the closed list by contact_communication_preferences_status_check
05
Confirmed
The service accepts communication type identifiers it does not recognize.
policyserviceobserved
06
Confirmed
The contacts-and-organizations milestone stores communication choices but leaves their application by message senders outside its scope.
policyservicedocumented

Scenarios

IdGivenWhenThenProvenance
01A member with Do Not Mail set.The staff member opens her Contact 360.Do Not Mail displays in the header.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.