---
id: SCR-CRM-DQ-002
title: Duplicate review queue
route: '/console/{tenantId}/crm/dataQuality/duplicates/{objectType}'
surface: console
product_area: crm
module: data-quality
revision: 1
status: draft
design_intent: proposed
implementation_evidence: observed
inference: []
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
purpose: >-
  Work through one type’s duplicate groups using shareable filters, inspection
  and authorized decisions.
supports:
  - JNY-CRM-DQ-001
  - JNY-CRM-DQ-002
  - JNY-CRM-DQ-004
  - CAP-CRM-DQ-007
  - CAP-CRM-DQ-008
  - CAP-CRM-DQ-002
permission: >-
  crm.duplicates.read; decisions need crm.duplicates.review; merging needs the
  record type merge and read keys
entry_from:
  - Overview review entry
  - A saved or shared queue address
exits_to:
  - '/console/{tenantId}/crm/dataQuality/duplicates/{objectType}/groups/{groupId}'
  - The contact or organization page of a group record
displays:
  - field: >-
      Group members with numbers, labels, masked summaries and matching strength
      and reasons.
    source: listDuplicateGroups (DOM-CRM-DQ-001 group and pairs)
  - field: >-
      Address-backed confidence, evidence, search, ordering, cursor and
      selected-group state.
    source: The page address
actions:
  - label: Open a group
    operation_id: getDuplicateGroup
    permission: crm.duplicates.read
    confirm: false
  - label: Not A Duplicate (whole group)
    operation_id: dismissDuplicateGroup
    permission: crm.duplicates.review
    confirm: true
  - label: Undo
    operation_id: restoreDuplicateGroupDismissal
    permission: crm.duplicates.review
    confirm: false
  - label: Merge
    operation_id: 'createMergePlan (the workspace opens in place, SCR-CRM-DQ-008)'
    permission: 'crm.contacts.merge with crm.contacts.read, or the organization pair'
    confirm: false
states:
  - loading
  - empty
  - error
  - read-only
validation:
  - BR-CAP-CRM-DQ-007-05
  - BR-CAP-CRM-DQ-007-06
  - BR-CAP-CRM-DQ-007-10
  - BR-CAP-CRM-DQ-008-10
patterns:
  - PageLayout
  - RequirePermission
  - DataQualityAdapter
  - DataQualityHeader
  - DuplicateQueue
  - GroupQueue
  - GroupInspector
  - DismissDialog
component: >-
  components/console/duplicates/duplicate-queue-screen.tsx
  (DuplicateQueueScreen)
evidence:
  - >-
    react-console at baf6dae3:
    app/(console)/console/[tenantId]/crm/dataQuality/duplicates/[objectType]/page.tsx;
    components/console/duplicates/duplicate-queue-screen.tsx, routes.ts;
    components/duplicates/data-quality/duplicate-queue.tsx, group-queue.tsx,
    group-inspector.tsx.
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-001, TC-LOG-002, TC-LOG-003, TC-LOG-004, TC-LOG-005, TC-PI-001, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003]
---

# Duplicate Review Queue

## What the Screen Is For

The queue preserves a reviewer’s position while groups are inspected or merged. Its address tracks filters, sorting, paging and selected group.

## What It Shows and Lets People Do

Groups open beside the list. Review authority enables whole-group rejection and undo, while type-specific planning authority enables merging in place. The next group can be selected without unmounting the queue.

## States and Errors

Loading, empty and failed reads have explicit states. Failed decisions display their reason; unauthorized reviewers lack the corresponding controls.

## Patterns It Must Respect

The queue uses its existing list and inspector components with address state updated through browser history. Masked matching reasons come from the service.
