Skip to content

CAP-CRM-ENT-018Organize the workspace’s record classifications

Markdown

CAP-CRM-ENT-018

Organize the workspace’s record classifications

Markdown
  • DocumentApproved
  • Product intentProposed
  • 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
Every type a record names is the tenant’s own.A type in use cannot be deleted.The tenant decides the order pickers and defaults follow.
Surfaces
consoleapi
Intent sources
OQ-CRM-ENT-002 decided 2026-10-22 by Andrew: B (classification types and the role catalogue stay in Entities)services-crm:docs/milestones/CRM-M1-contacts-and-organizations.md#M1-D2services-crm:docs/milestones/CRM-M1-contacts-and-organizations.md#M1-D8services-crm:docs/milestones/CRM-M1-contacts-and-organizations.md#D-08services-crm:docs/milestones/CRM-M1-contacts-and-organizations.plan.md#A17

Controls

19 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-003 TC-LOG-001 TC-LOG-002 TC-LOG-003 TC-LOG-004 TC-LOG-005 TC-PI-001 TC-PI-003 TC-PI-005 TC-TEN-001 TC-TEN-002 TC-TEN-003

Repositories Read

RepositoryPaths
undefined:modules/configuration-types/
undefined:modules/entities/
undefined:modules/entities/tests/e2e/address-types.e2e.spec.js
undefined:modules/entities/tests/e2e/contact-types.e2e.spec.js
undefined:modules/entities/tests/e2e/organization-types.e2e.spec.js
undefined:modules/entities/tests/e2e/phone-number-types.e2e.spec.js
undefined:components/configuration/
undefined:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0033.spec.ts
undefined:acceptance/crm/playwright/journeys/contacts/CRM-ACC-0062.spec.ts

Where It Lives

Permissions

KeyChecked atScope
crm.contact-types.readapitenant
crm.contact-types.createapitenant
crm.contact-types.updateapitenant
crm.contact-types.deleteapitenant
crm.organization-types.readapitenant
crm.organization-types.createapitenant
crm.organization-types.updateapitenant
crm.organization-types.deleteapitenant
crm.address-types.readapitenant
crm.address-types.createapitenant
crm.address-types.updateapitenant
crm.address-types.deleteapitenant
crm.phone-number-types.readapitenant
crm.phone-number-types.createapitenant
crm.phone-number-types.updateapitenant
crm.phone-number-types.deleteapitenant

Business Rules

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

IdRuleKindEnforced atProvenance
01must prove
Proposed
Contact, organization, address and phone types require trimmed nonblank names, and invalid creation writes no type.
validationapi, service, databasetest
services-crm:modules/entities/tests/e2e/contact-types.e2e.spec.js#answers 400 naming the field for a create whose name is nothing but spaces
02must prove
Proposed
Classification ids follow lowercase configuration-id grammar, can derive from names, cannot use API-reserved ids or duplicate a tenant id, and must match the path on replacement.
validationapi, service, databasetest
services-crm:modules/entities/tests/e2e/contact-types.e2e.spec.js#answers 400 for an id that is not a configuration id, saying what an id may hold
03must prove
Proposed
Classification types referenced by records cannot be deleted, including contact and organization classifications and types used by address or phone elements, with dependent records identified.
validationservice, databasetest
services-crm:modules/entities/tests/e2e/address-types.e2e.spec.js#says which records keep the type when it refuses the delete
04must prove
Confirmed
Type reorder assigns consecutive positions to the complete tenant list, rejects omissions, duplicates and unknown ids without changing order, permits locked-type movement, appends new address and phone types and alphabetizes never-ordered contact and organization types.
validationapi, servicetest
services-crm:modules/entities/tests/e2e/contact-types.e2e.spec.js#answers 400 for a reorder that leaves a type of the tenant out
05must prove
Confirmed
Address and phone types apply to contacts, organizations or both, default to contacts, support applicability filtering and may change applicability while still referenced.
policyapi, servicetest
services-crm:modules/entities/tests/e2e/phone-number-types.e2e.spec.js#answers only the types usable on organizations when the query asks for them
06must prove
Proposed
Type reads require reader permissions, contact and organization type creation and updates use user permissions, their deletes use administrator permissions, and all address and phone type writes including reorders require administrator permissions.
permissionapitest
services-crm:modules/entities/tests/e2e/address-types.e2e.spec.js#answers 403 to a read-only caller’s reorder
07must prove
Confirmed
Type replacement requires the read version, clears omitted replaceable values and preserves layout assignments; patches change named values, full locks block updates and deletes, and delete locks block deletes.
origin: Behaviour at the pinned commit; OQ-CRM-ENT-001 decided 2026-10-22 by Andrew: A (classification records follow the complete-payload rule too, see BR-CAP-CRM-ENT-004-13)
policyapi, servicetest
services-crm:modules/entities/tests/e2e/contact-types.e2e.spec.js#then, when the version is off, refuses the change (409)
08
Confirmed
Contacts retain inactive types, while creation offers only active types and preselects a sole available type.
policyconsole, servicetest

Scenarios

IdGivenWhenThenProvenance
01A tenant’s phone types in the order mobile, work, home.An administrator moves home first.New contacts without a marked number get the home number as preferred.test
02An organization type used by an organization.An administrator deletes it.The delete is rejected.test
services-crm:modules/entities/tests/e2e/organization-types.e2e.spec.js#refuses an organization of a type the tenant does not have (409), and the delete of a type an organization has (409)

Decision History

Product decisions recorded in this module's findings that bear on this specification, as recorded.

  1. OQ-CRM-ENT-001DecisionAndrew2026-10-22

    A: require complete payloads for whole-record saves of contacts, organizations and classification records, as Activities already do (reads state empty properties as null; an omitted property is refused; null clears). Affiliation and custom-field exceptions stay.

    Applied to: Structured decision update record

  2. OQ-CRM-ENT-002DecisionAndrew2026-10-22

    B: everything stays in Entities; no Configuration Types module. Entities owns contact, organization, address and phone number types, affiliation types and the contact-role catalogue and their rules.

    Applied to: Structured decision update record

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.