---
id: CAP-CRM-DQ-011
title: Understand the duplicate-review workload
feature: FEAT-CRM-DQ-02
product_area: crm
module: data-quality
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: partially-observed
supersedes:
  - CAP-CRM-MRG-011
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - >-
    services-crm:docs/merging/experience/functional-requirements.md#DQ-1 (package approved by Andrew
    2026-10-13)
purpose: Reviewers can see the scale and confidence of waiting work for contacts and organizations.
outcomes:
  - The overview makes waiting duplicate work understandable.
  - Capped large totals are identified as lower bounds.
concepts:
  - CON-CRM-DQ-001
actors:
  - ACT-CRM-008
  - ACT-CRM-009
surfaces:
  - console
  - api
permissions:
  - key: crm.duplicates.read
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-CRM-DQ-011-01
    proved_by: [ATS-CRM-DQ-011-01, ATS-CRM-DQ-011-05, TST-CRM-DQ-180]
    statement: >-
      For each type the overview reports open groups by confidence, their records, open/dismissed/confirmed
      pairs, latest group detection, active re-check status and successful merges within 30 days.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/summary/duplicate-summary.integration.spec.js#counts
      the contact groups, the records in them and the pairs of each status
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#DQ-1'
  - id: BR-CAP-CRM-DQ-011-02
    proved_by: [ATS-CRM-DQ-011-01, ATS-CRM-DQ-011-05, TST-CRM-DQ-180]
    statement: A group contributes to the confidence band of its highest-scoring pair.
    kind: calculation
    enforced_at:
      - service
      - database
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/summary/duplicate-summary.integration.spec.js#breaks
      the open groups down by band, the group taking the band of its strongest pair
    origin: none
  - id: BR-CAP-CRM-DQ-011-03
    proved_by: [ATS-CRM-DQ-011-02, ATS-CRM-DQ-011-05, TST-CRM-DQ-180]
    statement: >-
      Counts remain exact through 10,000, then return 10,000 with type-level and overall capped flags
      indicating a lower bound.
    kind: calculation
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/summary/duplicate-summary.integration.spec.js#answers
      the CAP rather than the count, so no reader waits for a number nobody reads
    origin: none
  - id: BR-CAP-CRM-DQ-011-04
    proved_by: []
    statement: Record types without duplicate activity still appear with zero totals.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/summary/duplicate-summary.integration.spec.js#counts
      nothing for the record type nothing was written about, rather than leaving it out
    origin: none
  - id: BR-CAP-CRM-DQ-011-05
    proved_by: [ATS-CRM-DQ-011-03, ATS-CRM-DQ-011-05, TST-CRM-DQ-182]
    statement: Overview access requires duplicate-read permission in both the API and console.
    kind: permission
    enforced_at:
      - api
      - console
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/e2e/duplicate-groups.e2e.spec.js#refuses a caller without the
      duplicates read permission
    origin: 'services-crm:docs/merging/architecture.md#9. Security and tenant isolation'
  - id: BR-CAP-CRM-DQ-011-06
    proved_by: [ATS-CRM-DQ-011-04, ATS-CRM-DQ-011-05]
    statement: >-
      The overview links type counts to filtered review queues, renders capped totals as 10,000+ and uses
      counts consistent with open, dismissed and confirmed work.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0283.spec.ts#CRM-ACC-0283'
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#DQ-1'
  - id: BR-CAP-CRM-DQ-011-07
    proved_by: []
    statement: >-
      The product should notify duplicate-management responsibility of open groups and resolve that attention
      as groups close; the declaration is currently held and sends no notifications.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: false
    provenance: observed
    source: 'services-crm:modules/duplicates/attention/open-duplicate-groups.attention.ts:OpenDuplicateGroups'
    origin: none
scenarios:
  - id: SC-CAP-CRM-DQ-011-01
    given: >-
      A workspace has two open contact groups, a dismissed pair, a confirmed pair and a running contact
      re-check.
    when: A reviewer visits Data Quality.
    then: 'Contacts show the corresponding totals and active run, while organizations show zeros.'
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/summary/duplicate-summary.integration.spec.js#says
      a rescan of the contacts is under way, so a reader knows the counts are being rebuilt
edge_cases: []
constraints: []
depends_on:
  - CAP-CRM-DQ-007
related:
  - CAP-CRM-DQ-005
  - CAP-CRM-DQ-019
journeys:
  - JNY-CRM-DQ-001
open_questions: []
evidence:
  - repository: services-crm
    source_sha: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
    paths:
      - docs/merging/architecture.md
      - docs/merging/experience/functional-requirements.md
      - modules/duplicates/attention/open-duplicate-groups.attention.ts
      - modules/duplicates/services/summary/duplicate-summary.ts
      - modules/duplicates/tests/e2e/duplicate-groups.e2e.spec.js
      - modules/duplicates/tests/integration/services/summary/duplicate-summary.integration.spec.js
    note: 'Static examination connects rule claims to implementation, declared checks and the cited tests.'
  - repository: react-console
    source_sha: baf6dae382d6f41dce976c7f848667ccc37e076f
    paths:
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0283.spec.ts
    note: 'Static examination connects rule claims to implementation, declared checks and the cited tests.'
preconditions: []
postconditions: []
controls: [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-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003]
exercised_by: [FAS-CRM-DQ-02-01, FAS-CRM-DQ-02-02]
suites: [TST-CRM-DQ-180, TST-CRM-DQ-182]
---

# Understand the duplicate-review workload

## Purpose

Reviewers can see the scale and confidence of waiting work for contacts and organizations.

## How It Works

The Data Quality overview summarizes each record type. It distinguishes groups, records and pair decisions so staff can understand what each count represents. Confidence counts follow the strongest pair in a group. Zero activity remains visible as a zero-valued section. Counts stop at a stated ceiling and are displayed as a floor once capped. The summary also identifies a running re-check and recent successful merges. Reviewers follow count links into the appropriate queue. Duplicate-read authority controls both page and API access. The attention declaration is held and currently not delivered. The product should complete the object registration before relying on responsibility-based notifications.

## Relationships

Group and candidate storage supply the counts. Re-checks supply running status and merge history supplies recent success totals. Platform owns attention delivery.
