---
id: JNY-CRM-DQ-003
title: An administrator renews approval after records change
feature: FEAT-CRM-DQ-03
product_area: crm
module: data-quality
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - CRM-ACC-0250
  - CRM-ACC-0251
  - CRM-ACC-0262
  - CRM-ACC-0263
  - CRM-ACC-0284
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
actor: ACT-CRM-009
goal: Execute only reviewed changes while colleagues continue maintaining participants and related work.
capabilities:
  - CAP-CRM-DQ-012
  - CAP-CRM-ENT-004
  - CAP-CRM-DQ-013
  - CAP-CRM-DQ-016
  - CAP-CRM-DQ-018
screens:
  - '/console/{tenantId}/crm/merges/plans/{planId}'
  - '/console/{tenantId}/crm/contacts/{id}/edit'
steps:
  - 'n': 1
    surface: createMergePlan
    action: Prepare the two-contact plan and settle its questions.
    capability: CAP-CRM-DQ-012
    expected: The preview becomes ready.
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0262.spec.ts#CRM-ACC-0262'
  - 'n': 2
    surface: '/console/{tenantId}/crm/contacts/{id}/edit'
    action: 'As a coordinator, edit the absorbed contact and attach a task.'
    capability: CAP-CRM-ENT-004
    expected: The ordinary edit succeeds.
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0262.spec.ts#CRM-ACC-0262'
  - 'n': 3
    surface: executeMergePlan
    action: Submit the earlier approval before refreshing.
    capability: CAP-CRM-DQ-016
    expected: Execution returns the changed preview and stale details without queuing work.
    provenance: test
    source: >-
      services-crm:modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js#refuses
      an execution that submits no hash too, because the stored plan is the one last shown
  - 'n': 4
    surface: getMergePlan
    action: Inspect the returned preview and differences.
    capability: CAP-CRM-DQ-013
    expected: The edited participant and new task are visible for renewed review.
    provenance: observed
    source: 'services-crm:modules/merges/services/merges/merge-plans.ts:readMergePlan'
  - 'n': 5
    surface: executeMergePlan
    action: Confirm the revised preview.
    capability: CAP-CRM-DQ-016
    expected: The job moves the task that the administrator reviewed.
    provenance: test
    source: >-
      services-crm:modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js#executes
      once the plan is looked at again and confirmed, moving the task the reviewer saw
  - 'n': 6
    surface: updateContact
    action: Attempt another coordinator save from the old participant screen.
    capability: CAP-CRM-DQ-018
    expected: The service identifies the survivor and does not write an absorbed record.
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0262.spec.ts#CRM-ACC-0262'
alternates:
  - from_step: 3
    condition: A chosen value changes on its source record.
    path: Inspect the replacement source value and pending confirmation.
    outcome: The administrator confirms it or selects another offered value.
    provenance: test
    source: >-
      services-crm:modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js#refuses
      to execute until the new value is confirmed, naming the conflict and what changed
  - from_step: 1
    condition: A colleague refreshes the same working plan.
    path: An older-version answer receives a conflict.
    outcome: The author reloads and submits against the current preview.
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0250.spec.ts#CRM-ACC-0250'
failures:
  - from_step: 5
    condition: Another merge shares a participant and runs concurrently.
    path: One combination succeeds and the other reports already merged.
    outcome: The shared record is absorbed only once.
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0263.spec.ts#CRM-ACC-0263'
  - from_step: 2
    condition: The coordinator deletes a participant.
    path: Planning reports the absent record and the approved attempt cannot complete.
    outcome: No combination is applied.
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0284.spec.ts#CRM-ACC-0284'
rules_in_play:
  - BR-CAP-CRM-DQ-013-07
  - BR-CAP-CRM-DQ-013-08
  - BR-CAP-CRM-DQ-016-02
  - BR-CAP-CRM-DQ-016-03
  - BR-CAP-CRM-DQ-016-06
  - BR-CAP-CRM-DQ-016-07
assertions:
  - id: AS-JNY-CRM-DQ-003-01
    statement: >-
      Approval identifies moved dependent rows and versions, preventing an unseen added task from moving under
      the earlier preview.
    provenance: test
    source: >-
      services-crm:modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js#leaves
      the late task on the record it was created on
  - id: AS-JNY-CRM-DQ-003-02
    statement: A display-label rename alone does not invalidate merge approval.
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0251.spec.ts#CRM-ACC-0251'
e2e_policy: required
e2e_reason: >-
  Browser review and concurrent service edits jointly determine whether stale approval and renewed
  confirmation are communicated correctly.
evidence:
  - repository: react-console
    source_sha: baf6dae382d6f41dce976c7f848667ccc37e076f
    paths:
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0250.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0251.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0262.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0263.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0284.spec.ts
    note: >-
      Static examination uses the cited records and implementation anchors; repository tests are not executed
      by this corpus check.
  - repository: services-crm
    source_sha: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
    paths:
      - modules/merges/services/merges/merge-plans.ts
      - modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js
    note: >-
      Static examination uses the cited records and implementation anchors; repository tests are not executed
      by this corpus check.
proved_by: []
---

# An administrator renews approval after records change

## Story

An administrator prepares a contact merge while a coordinator edits its records. A later task changes the work described by the approved preview. Submitting that earlier approval returns a stale response before any job is queued. The administrator inspects the changed record and task, then approves the revised work. After merging, the coordinator's old record screen receives the survivor destination when it tries another save.
