---
id: JNY-CRM-ACT-006
title: Merge duplicate records while retaining related interactions and work
feature: FEAT-CRM-ACT-05
product_area: crm
module: activities-tasks
revision: 2
status: draft
product_intent: proposed
implementation_evidence: partially-observed
supersedes:
  - CRM-ACC-0719
  - CRM-ACC-0720
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
actor: ACT-CRM-003
goal: >-
  Consolidate record context without multiplying shared interactions or
  discarding related work.
capabilities:
  - CAP-CRM-ACT-018
  - CAP-CRM-ACT-005
  - CAP-CRM-ACT-010
screens:
  - '/console/{tenantId}/crm/contacts/{id}'
steps:
  - 'n': 1
    surface: '/console/{tenantId}/crm/contacts/{id}'
    action: Review each duplicate contact’s timeline and summary.
    capability: CAP-CRM-ACT-005
    expected: Each context includes its activities and their shared meeting.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
  - 'n': 2
    surface: executeMerge
    action: Merge the duplicate into the chosen survivor.
    capability: CAP-CRM-ACT-018
    expected: The merge completes its reference transfer.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
  - 'n': 3
    surface: '/console/{tenantId}/crm/contacts/{id}'
    action: Read the surviving record’s timeline.
    capability: CAP-CRM-ACT-005
    expected: >-
      The shared meeting appears once alongside the transferred call with
      primary context retained.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
  - 'n': 4
    surface: '/console/{tenantId}/tasks'
    action: Inspect the duplicate’s former task.
    capability: CAP-CRM-ACT-018
    expected: Its contact reference now identifies the survivor.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
  - 'n': 5
    surface: getContactTimeline
    action: Request the former record’s timeline.
    capability: CAP-CRM-ACT-018
    expected: The response reports Gone and identifies the survivor.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
alternates:
  - from_step: 2
    condition: An obsolete contact is deleted instead of merged.
    path: >-
      Its own links disappear; shared entries remain elsewhere, unlinked
      activities stay retained and task contact references clear.
    outcome: The activity without links remains stored but has no timeline context.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0719.spec.ts#CRM-ACC-0719
failures:
  - from_step: 2
    condition: The activity changed after merge preview.
    path: The plan requires a new preview before execution.
    outcome: Reference movement waits for a current plan.
    provenance: observed
    source: >-
      services-crm:modules/activities/services/persistence/activities.ts:listActivityLinkVersionsOfRecords
rules_in_play:
  - BR-CAP-CRM-ACT-018-01
  - BR-CAP-CRM-ACT-018-02
  - BR-CAP-CRM-ACT-018-05
  - BR-CAP-CRM-ACT-018-07
  - BR-CAP-CRM-ACT-018-08
  - BR-CAP-CRM-ACT-010-08
assertions:
  - id: AS-JNY-CRM-ACT-006-01
    statement: Merge represents both contacts’ activities once on the surviving context.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0720.spec.ts#CRM-ACC-0720
  - id: AS-JNY-CRM-ACT-006-02
    statement: >-
      Deleting the related contact preserves work with an empty contact
      reference.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0719.spec.ts#CRM-ACC-0719
  - id: AS-JNY-CRM-ACT-006-03
    statement: Deleting an activity’s final related contact leaves the activity retained.
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/cross-application/CRM-ACC-0719.spec.ts#CRM-ACC-0719
e2e_policy: required
e2e_reason: >-
  Record navigation, merge reference effects and former-record links require a
  browser journey across their API boundaries.
evidence:
  - >-
    Pinned browser evidence is identified by each journey step, alternate,
    failure and assertion.
  - >-
    Pinned service evidence is identified by each journey step, alternate,
    failure and assertion.
---

# Merge duplicate records while retaining related interactions and work

## Story

An administrator compares two duplicate people and selects the survivor. Merge consolidates their activities while collapsing the shared meeting’s duplicate links. Related work also points to the survivor. An older timeline address identifies the surviving person rather than presenting an empty history. Deletion follows a different route: it clears local relationships without transferring them, leaving retained orphan activity management as an open gap.
