---
id: CAP-CRM-DQ-008
title: Dismiss false matches and reopen review
feature: FEAT-CRM-DQ-02
product_area: crm
module: data-quality
revision: 1
status: draft
product_intent: confirmed
implementation_evidence: observed
supersedes:
  - CAP-CRM-MRG-008
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
intent_sources:
  - 'services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#D-34'
  - >-
    services-crm:docs/merging/experience/functional-requirements.md#DIS-1 to DIS-7 (package approved by Andrew
    2026-10-13)
purpose: Reviewers can record that records describe different identities and revisit that decision when needed.
outcomes:
  - Dismissals preserve review decisions until explicit restoration or new strong evidence.
  - Concurrent repeated dismissals retain one attributed decision.
  - Mistaken decisions can be restored immediately or from dismissed work.
concepts:
  - CON-CRM-DQ-001
actors:
  - ACT-CRM-008
  - ACT-CRM-005
surfaces:
  - console
  - api
permissions:
  - key: crm.duplicates.review
    where_checked: api
    scope: tenant
rules:
  - id: BR-CAP-CRM-DQ-008-01
    proved_by: [ATS-CRM-DQ-008-01, ATS-CRM-DQ-008-08, ATS-CRM-DQ-008-09, ATS-CRM-DQ-008-12, ATS-CRM-DQ-008-18, TST-CRM-DQ-176, TST-CRM-DQ-182]
    statement: >-
      Pair dismissal retains the reviewer, time, optional trimmed note up to 1,000 characters and current
      strong evidence, moving the pair into dismissed grouping.
    kind: lifecycle
    enforced_at:
      - api
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/e2e/duplicates.e2e.spec.js#records the evidence the dismissal was
      made against, which a later score is compared with
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#DIS-1'
  - id: BR-CAP-CRM-DQ-008-02
    proved_by: [ATS-CRM-DQ-008-02, ATS-CRM-DQ-008-10, ATS-CRM-DQ-008-18, TST-CRM-DQ-180, TST-CRM-DQ-182]
    statement: >-
      Repeating a pair or group dismissal succeeds without changing it and returns the earlier author as
      visibility permits, time and note.
    kind: policy
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-candidates.integration.spec.js#answers
      the second reviewer the EARLIER dismissal: its who, its name as visibility permits, its when and its
      note
    origin: 'services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#D-34'
  - id: BR-CAP-CRM-DQ-008-03
    proved_by: [ATS-CRM-DQ-008-03, ATS-CRM-DQ-008-08, ATS-CRM-DQ-008-09, ATS-CRM-DQ-008-13, ATS-CRM-DQ-008-18, TST-CRM-DQ-176, TST-CRM-DQ-180]
    statement: >-
      Group dismissal atomically settles every open pair using one author, time and note with each pair's
      evidence, then returns the dismissed group's identity.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-candidates.integration.spec.js#leaves
      no pair of the group dismissed, a group being decided about whole or not at all
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#DIS-2'
  - id: BR-CAP-CRM-DQ-008-04
    proved_by: [ATS-CRM-DQ-008-04, ATS-CRM-DQ-008-08, ATS-CRM-DQ-008-14, ATS-CRM-DQ-008-18, TST-CRM-DQ-176, TST-CRM-DQ-180]
    statement: >-
      Undoing a group dismissal reopens only pairs changed by that decision, preserves independent dismissals
      and rejects a group with nothing to restore.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-candidates.integration.spec.js#leaves
      the pair somebody dismissed on its own dismissed, that being a decision of its own
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#DIS-3'
  - id: BR-CAP-CRM-DQ-008-05
    proved_by: [ATS-CRM-DQ-008-05, ATS-CRM-DQ-008-11, ATS-CRM-DQ-008-18, TST-CRM-DQ-180]
    statement: >-
      Pair restoration clears author, time, note and dismissal evidence while retaining current score and
      reasons; no earlier dismissal history remains.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-candidates.integration.spec.js#takes
      the whole dismissal off: who, when, why and on what evidence
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#DIS-5'
  - id: BR-CAP-CRM-DQ-008-06
    proved_by: [ATS-CRM-DQ-008-06, ATS-CRM-DQ-008-08, ATS-CRM-DQ-008-11, ATS-CRM-DQ-008-18, TST-CRM-DQ-176, TST-CRM-DQ-180]
    statement: >-
      Later record edits preserve dismissal unless new shared e-mail, phone, origin, birth-date or street
      evidence appears, or organization domain, phone or address evidence appears; reopening explains the new
      evidence, and name corrections alone do not reopen it.
    kind: lifecycle
    enforced_at:
      - service
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/unit/services/matching/fingerprint.spec.js#leaves a pair dismissed
      when a name typo is fixed and nothing strong changes
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#DIS-7'
  - id: BR-CAP-CRM-DQ-008-07
    proved_by: []
    statement: Changing the scoring version preserves dismissals while open pairs receive updated scores.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: documented
    source: 'services-crm:docs/merging/duplicate-detection.md#8. Dismiss, confirm, reconsider'
    origin: 'services-crm:docs/merging/README.md#Status (architecture and plan approved by Andrew 2026-10-11)'
  - id: BR-CAP-CRM-DQ-008-08
    proved_by: []
    statement: A dismissal applies only to its two records and does not exclude either from comparisons with others.
    kind: policy
    enforced_at:
      - service
    must_prove: false
    provenance: inferred
    source: 'services-crm:modules/duplicates/services/persistence/duplicate-candidates.ts'
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#DIS-6'
  - id: BR-CAP-CRM-DQ-008-09
    proved_by: [ATS-CRM-DQ-008-07, ATS-CRM-DQ-008-08, ATS-CRM-DQ-008-18, TST-CRM-DQ-176, TST-CRM-DQ-182]
    statement: >-
      Dismissal and restoration require duplicate-review authority, with readers refused by the API and
      decision controls hidden in the console.
    kind: permission
    enforced_at:
      - api
      - console
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/e2e/duplicates.e2e.spec.js#answers 403 to that reader dismissing a
      pair, which is a decision and not a read
    origin: 'services-crm:docs/merging/architecture.md#9. Security and tenant isolation'
  - id: BR-CAP-CRM-DQ-008-10
    proved_by: [ATS-CRM-DQ-008-16, ATS-CRM-DQ-008-18]
    statement: >-
      Notes exceeding 1,000 characters are rejected, and unavailable workspace pairs or groups return not
      found.
    kind: validation
    enforced_at:
      - api
    must_prove: true
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/e2e/duplicates.e2e.spec.js#refuses a dismissal note longer than a
      note may be (400)
    origin: none
  - id: BR-CAP-CRM-DQ-008-11
    proved_by: [ATS-CRM-DQ-008-17, ATS-CRM-DQ-008-18]
    statement: >-
      Removing a record from a displayed group dismisses its pairs with the other members without dismissing
      the remaining group.
    kind: policy
    enforced_at:
      - console
    must_prove: true
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0234.spec.ts#CRM-ACC-0234'
    origin: 'services-crm:docs/merging/experience/functional-requirements.md#REV-5'
scenarios:
  - id: SC-CAP-CRM-DQ-008-01
    given: A reviewer dismisses a pair and records a note.
    when: The contacts later acquire a new shared mobile number.
    then: The pair reopens with a new-evidence explanation and the dismissal note is cleared.
    provenance: test
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0236.spec.ts#CRM-ACC-0236'
  - id: SC-CAP-CRM-DQ-008-02
    given: Two reviewers submit dismissal for the same group in sequence.
    when: The second submission reaches the service.
    then: It succeeds without changes and shows the first author and note.
    provenance: test
    source: >-
      services-crm:modules/duplicates/tests/e2e/duplicate-groups.e2e.spec.js#answers a second dismissal of the
      dismissed group 200, saying it was already dismissed (D-34)
edge_cases: []
constraints: []
depends_on:
  - CAP-CRM-DQ-007
related:
  - CAP-CRM-DQ-001
  - CAP-CRM-DQ-015
journeys:
  - JNY-CRM-DQ-001
open_questions: []
evidence:
  - repository: services-crm
    source_sha: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
    paths:
      - docs/merging/README.md
      - docs/merging/architecture.md
      - docs/merging/duplicate-detection.md
      - docs/merging/experience/functional-requirements.md
      - docs/milestones/CRM-M4-duplicates-and-merge.md
      - modules/duplicates/services/persistence/duplicate-candidates.ts
      - modules/duplicates/tests/e2e/duplicate-groups.e2e.spec.js
      - modules/duplicates/tests/e2e/duplicates.e2e.spec.js
      - modules/duplicates/tests/integration/services/persistence/duplicate-candidates.integration.spec.js
      - modules/duplicates/tests/unit/services/matching/fingerprint.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-0234.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0236.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-CRY-004, 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-002, TC-PI-003, TC-PI-005, TC-PRV-001, TC-PRV-002, TC-TEN-001, TC-TEN-002, TC-TEN-003]
exercised_by: [FAS-CRM-DQ-02-02, FAS-CRM-DQ-02-03, FAS-CRM-DQ-02-04]
suites: [TST-CRM-DQ-176, TST-CRM-DQ-180, TST-CRM-DQ-182]
---

# Dismiss false matches and reopen review

## Purpose

Reviewers can record that records describe different identities and revisit that decision when needed.

## How It Works

The reviewer marks a pair or a complete group as Not a Duplicate. Rhythm retains the author, time, optional note and evidence behind that decision. A group dismissal settles all its open pairs together. Another reviewer who repeats the dismissal receives success and attribution rather than replacing the earlier decision. Restoring a pair removes its dismissal details and makes it open again. Undoing a group dismissal restores the pairs changed by that group decision, preserving separate earlier dismissals. Ordinary name corrections do not reopen a settled pair. New strong identity evidence can reopen it and explain why. Read-only reviewers see suggestions without decision controls. Removing a member of a group in the console dismisses its connections to the other displayed records.

## Relationships

Group review provides the decision surface. Detection compares later evidence with the dismissal fingerprint. Merge execution carries applicable outside-pair dismissals to the survivor.
