Skip to content

CAP-CRM-DQ-018Resolve identities absorbed by a merge

Markdown

CAP-CRM-DQ-018

Resolve identities absorbed by a merge

Markdown
  • DocumentDraft
  • Product intentConfirmed
  • ImplementationPartially observed

KindCapabilityProduct areaCRMModuleDuplicate Review and Record MergingRevision1

Read atservices-crm a8d1364freact-console baf6dae3

The Formal Contract

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

Outcomes
Older references identify their destination rather than silently recreating an absorbed identity.Absorbed identities cannot be reassigned to new same-type workspace records.Console navigation explains the destination of an older record link.
Surfaces
apiconsole
Intent sources
services-crm:docs/merging/decisions.md#D3 (decided 2026-10-11: option 1)services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#D-20services-crm:docs/merging/experience/functional-requirements.md#IND-6, SUR-5 (package approved by Andrew 2026-10-13)

Controls

17 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-005 TC-PRV-001 TC-PRV-002 TC-TEN-001 TC-TEN-002 TC-TEN-003

Permissions

KeyChecked atScope
crm.merges.readapitenant

Business Rules

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

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Each deleted participant receives one alias atomically with its merge, retaining survivor, merge, time, original number, origin and external identity.
origin: services-crm:docs/merging/decisions.md#D3 (decided 2026-10-11: option 1)
invariantservice, databasetest
services-crm:modules/merges/tests/integration/db/merged-record-aliases.table.integration.spec.js#refuses a second alias of the same merged id, so following one is never a choice
02must prove
Confirmed
When a survivor is absorbed later, its inbound aliases redirect to the new survivor while preserving their original merge references, allowing direct resolution.
origin: services-crm:docs/merging/README.md#Status (architecture and plan approved by Andrew 2026-10-11)
lifecycleservicetest
services-crm:modules/merges/tests/integration/services/persistence/merged-record-aliases.integration.spec.js#leaves C holding both aliases, so the survivor can say what it is made of
03must prove
Confirmed
An absorbed identity cannot be reused for its record type in the same workspace, but remains independent of identities in other workspaces or record types.
origin: services-crm:docs/merging/README.md#Status (architecture and plan approved by Andrew 2026-10-11)
invariantdatabasetest
services-crm:modules/merges/tests/integration/db/merged-id-reuse.integration.spec.js#refuses the contact a client asks to create under it, which is the path a chosen id arrives by
04must prove
Confirmed
Alias lookup returns survivor, merge and time for either type with merge-read authority, and returns not found for identities never absorbed.
origin: services-crm:docs/merging/decisions.md#D3 (decided 2026-10-11: option 1)
policyapitest
services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#says where an id the merge took away went, and through which merge
05must prove
Confirmed
Alias reads and writes remain within their workspace; another workspace's absorbed identity returns not found.
invariantapi, databasetest
services-crm:modules/merges/tests/e2e/merged-records.e2e.spec.js#answers 404 in this tenant for an id merged away in another, whose merge is not ours to disclose
06must prove
Confirmed
Lookups using an absorbed record's number or origin identity resolve its survivor through the alias.
origin: services-crm:docs/merging/README.md#Status (architecture and plan approved by Andrew 2026-10-11)
policyservicetest
07must prove
Confirmed
The application cannot delete or rewrite aliases except to redirect survivors, and workspace purge removes them with the workspace.
origin: services-crm:docs/merging/decisions.md#D4 (decided 2026-10-11: option 1)
invariantdatabasetest
services-crm:modules/merges/tests/integration/db/merged-record-aliases.table.integration.spec.js#may not erase an alias, which would make a merged id answerable and reusable again
08must prove
Confirmed
Old console record links navigate to the survivor with a notice identifying both record numbers, while stale explorer, recent, bookmark, search and saved-view references resolve or report failure.
policyconsoletest
09must prove
Confirmed
The product should keep alias destinations live; hard-deleting a survivor currently leaves unresolved destinations.
origin: services-crm:docs/merging/architecture.md#14.1 Non-negotiable invariants
invariantserviceunknown
10
Confirmed
The product should expose survivor resolution to other applications' reports so retained absorbed identities can display the surviving name.
policyserviceunknown

Scenarios

IdGivenWhenThenProvenance
01A record merges into a second record, which later merges into a third.A client resolves the first identity.Its alias points directly to the third record while retaining the first merge reference.test
02An integration submits creation with an absorbed contact identity.The create reaches identity validation.That contact create fails, while the same identity remains independent for organizations and other workspaces.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.