---
id: ATS-CRM-DQ-010
scope: CAP-CRM-DQ-010
product_area: crm
module: data-quality
revision: 1
status: proposed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CRM-DQ-010-01
    title: Candidate reads distinguish connected and isolated records
    level: api
    proves:
      - BR-CAP-CRM-DQ-010-01
    preconditions: Prepare a candidate pair and an isolated record.
    steps: Read their per-record candidates.
    expected: >-
      The connected record returns its pair; the isolated record returns an
      empty list without a group.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-182
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/e2e/duplicates.e2e.spec.js#answers
      one record’s candidates, which is the banner its page shows
    category: boundary
    execution_sources:
      - >-
        services-crm:modules/duplicates/tests/e2e/duplicates.e2e.spec.js#answers
        one record’s candidates, which is the banner its page shows
      - >-
        services-crm:modules/duplicates/tests/e2e/duplicates.e2e.spec.js#answers
        nothing for a record in no pair at all
  - id: ATS-CRM-DQ-010-02
    title: Per-record results include indirect group members
    level: api
    proves:
      - BR-CAP-CRM-DQ-010-02
    preconditions: A chain connects four records through three pairs.
    steps: Read candidates from one end.
    expected: The response names all four group records.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-180
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/candidates/duplicate-candidate-view.integration.spec.js#answers
      the four records of that group, which is the banner a record page shows
    category: rule
    execution_sources:
      - >-
        services-crm:modules/duplicates/tests/integration/services/candidates/duplicate-candidate-view.integration.spec.js#answers
        the four records of that group, which is the banner a record page shows
  - id: ATS-CRM-DQ-010-03
    title: An absorbed record reports its destination
    level: api
    proves:
      - BR-CAP-CRM-DQ-010-03
    preconditions: A contact has been merged away.
    steps: Read candidates using its old identity.
    expected: >-
      The response identifies the survivor as a merge destination rather than
      returning an empty list.
    negative: true
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-183
    provenance: test
    source: >-
      services-crm:modules/merges/tests/e2e/merged-records.e2e.spec.js#answers
      410 to the old id’s duplicate candidates, rather than an empty list
    category: edge
    execution_sources:
      - >-
        services-crm:modules/merges/tests/e2e/merged-records.e2e.spec.js#answers
        410 to the old id’s duplicate candidates, rather than an empty list
  - id: ATS-CRM-DQ-010-04
    title: Record alerts omit weak evidence
    level: browser
    proves:
      - BR-CAP-CRM-DQ-010-04
    preconditions: 'A record has very-high, medium and low pairs.'
    steps: Open its page and an isolated record page.
    expected: >-
      Likely and possible sections include the stronger pairs, exclude low
      evidence and show no empty-record alert.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to: []
    provenance: proposed
    source: >-
      react-console:components/duplicates/indicator/use-record-duplicates.ts:useRecordDuplicates
    category: rule
    execution_sources: []
  - id: ATS-CRM-DQ-010-05
    title: Duplicate access is independent of ordinary record reading
    level: browser
    proves:
      - BR-CAP-CRM-DQ-010-05
    preconditions: Prepare a record reader without duplicate authority and a standard caller.
    steps: Open record and Data Quality pages and call duplicate APIs.
    expected: >-
      The restricted reader sees no duplicate indicator or Data Quality access,
      and unauthorized API requests fail.
    negative: true
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-176
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0239.spec.ts#CRM-ACC-0239
    category: permission
    execution_sources:
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0239.spec.ts#CRM-ACC-0239
  - id: ATS-CRM-DQ-010-06
    title: Record-page selections launch the same merge workspace
    level: browser
    proves:
      - BR-CAP-CRM-DQ-010-06
    preconditions: A record has detected look-alikes.
    steps: 'Select matches and launch Merge With Selected, then use the More action.'
    expected: >-
      Both launch the wizard with the intended records, no forced current-record
      survivor and a return to the entry location.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-176
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0286.spec.ts#CRM-ACC-0286
    category: interaction
    execution_sources:
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0286.spec.ts#CRM-ACC-0286
  - id: ATS-CRM-DQ-010-07
    title: All record-page entries use the current identity and group
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-DQ-010-01
      - BR-CAP-CRM-DQ-010-02
      - BR-CAP-CRM-DQ-010-03
      - BR-CAP-CRM-DQ-010-04
      - BR-CAP-CRM-DQ-010-05
      - BR-CAP-CRM-DQ-010-06
    exercises:
      - CAP-CRM-DQ-010
      - CAP-CRM-DQ-008
      - CAP-CRM-DQ-012
      - CAP-CRM-ENT-003
    workflow_sources:
      - WF-CRM-DQ-004
    preconditions: >-
      Run-owned contact and organization records, the relevant staff permissions
      and the related state described by the sequence.
    steps: >-
      Read a record with indirect group members, dismiss one comparison, launch
      the selected records and revisit the original record after absorption.
    expected: >-
      The changed comparison is consistent across entries and the absorbed
      identity reports its destination.
    negative: false
    data_needs: >-
      An isolated workspace with related records and fixed timestamps; owned
      participant failure injection where requested.
    source: >-
      CAP-CRM-DQ-010; CAP-CRM-DQ-008; CAP-CRM-DQ-012; CAP-CRM-ENT-003;
      WF-CRM-DQ-004
    note: >-
      This cumulative seam scenario remains proposed until one executable
      sequence establishes all of its outcomes.
    bound_to: []
    provenance: proposed
    workflow_coverage_note: >-
      The workflows identify the handoffs under review. Separate assertions
      leave recovery and failure ordering unproved; the capability coverage
      finding records that limit.
    execution_sources: []
evidence:
  - repository: services-crm
    source_sha: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
    paths:
      - modules/duplicates/tests/e2e/duplicates.e2e.spec.js
      - >-
        modules/duplicates/tests/integration/services/candidates/duplicate-candidate-view.integration.spec.js
      - modules/merges/tests/e2e/merged-records.e2e.spec.js
    note: >-
      Bindings identify authored proof; empty bindings remain proposed and
      findings record known limitations.
  - repository: react-console
    source_sha: baf6dae382d6f41dce976c7f848667ccc37e076f
    paths:
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0239.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0286.spec.ts
      - components/duplicates/indicator/use-record-duplicates.ts
    note: >-
      Bindings identify authored proof; empty bindings remain proposed and
      findings record known limitations.
coverage:
  rule: covered
  transition: 'gap: FND-CRM-DQ-061'
  validation: 'gap: FND-CRM-DQ-061'
  permission: covered
  edge: covered
  failure: 'gap: FND-CRM-DQ-061'
  boundary: covered
  concurrency: 'gap: FND-CRM-DQ-061'
  invariant: 'gap: FND-CRM-DQ-061'
  interaction: covered
coverage_notes:
  transition: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
  validation: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
  failure: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
  concurrency: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
  invariant: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
permission_coverage:
  - key: crm.duplicates.read
    scenario_ids:
      - ATS-CRM-DQ-010-05
    finding: FND-CRM-DQ-061
  - key: crm.contacts.merge
    scenario_ids:
      - ATS-CRM-DQ-010-05
    finding: FND-CRM-DQ-061
  - key: crm.organizations.merge
    scenario_ids:
      - ATS-CRM-DQ-010-05
    finding: FND-CRM-DQ-061
proof_matrix:
  - rule: BR-CAP-CRM-DQ-010-01
    scenarios:
      - ATS-CRM-DQ-010-01
      - ATS-CRM-DQ-010-07
  - rule: BR-CAP-CRM-DQ-010-02
    scenarios:
      - ATS-CRM-DQ-010-02
      - ATS-CRM-DQ-010-07
  - rule: BR-CAP-CRM-DQ-010-03
    scenarios:
      - ATS-CRM-DQ-010-03
      - ATS-CRM-DQ-010-07
  - rule: BR-CAP-CRM-DQ-010-04
    scenarios:
      - ATS-CRM-DQ-010-04
      - ATS-CRM-DQ-010-07
  - rule: BR-CAP-CRM-DQ-010-05
    scenarios:
      - ATS-CRM-DQ-010-05
      - ATS-CRM-DQ-010-07
  - rule: BR-CAP-CRM-DQ-010-06
    scenarios:
      - ATS-CRM-DQ-010-06
      - ATS-CRM-DQ-010-07
interaction_coverage:
  related:
    - CAP-CRM-DQ-008
    - CAP-CRM-DQ-012
    - CAP-CRM-ENT-003
  workflow_sources:
    - WF-CRM-DQ-004
  scenarios:
    - ATS-CRM-DQ-010-06
    - ATS-CRM-DQ-010-07
---

# Review and merge from a record page: Capability Test Specification

## Coverage

The rule matrix names the authored checks. A covered category means that a scenario exists; it does not report a passing execution. The coverage notes and findings identify missing checks, while execution sources retain the exact assertions inspected.

| Required Rule | Scenarios |
|---|---|
| `BR-CAP-CRM-DQ-010-01` | `ATS-CRM-DQ-010-01`, `ATS-CRM-DQ-010-07` |
| `BR-CAP-CRM-DQ-010-02` | `ATS-CRM-DQ-010-02`, `ATS-CRM-DQ-010-07` |
| `BR-CAP-CRM-DQ-010-03` | `ATS-CRM-DQ-010-03`, `ATS-CRM-DQ-010-07` |
| `BR-CAP-CRM-DQ-010-04` | `ATS-CRM-DQ-010-04`, `ATS-CRM-DQ-010-07` |
| `BR-CAP-CRM-DQ-010-05` | `ATS-CRM-DQ-010-05`, `ATS-CRM-DQ-010-07` |
| `BR-CAP-CRM-DQ-010-06` | `ATS-CRM-DQ-010-06`, `ATS-CRM-DQ-010-07` |

## Interactions With Related Capabilities

Select matches and launch Merge With Selected, then use the More action. Read a record with indirect group members, dismiss one comparison, launch the selected records and revisit the original record after absorption.

These sequences test the handoffs named in the interaction coverage record. A proposed sequence remains unbound until an executable run checks its combined outcome; component assertions alone leave that obligation open.
