Skip to content

CAP-CRM-DQ-008Dismiss false matches and reopen review

Markdown

CAP-CRM-DQ-008

Dismiss false matches and reopen review

Markdown
  • DocumentDraft
  • Product intentConfirmed
  • ImplementationObserved

KindCapabilityProduct areaCRMModuleDuplicate Review and Record MergingRevision1

Read atservices-crm a8d1364freact-console baf6dae3

The Formal Contract

The narrative above explains; the sections below are authoritative — the rules, scenarios and tests this document binds.

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.
Surfaces
consoleapi
Intent sources
services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#D-34services-crm:docs/merging/experience/functional-requirements.md#DIS-1 to DIS-7 (package approved by Andrew 2026-10-13)

Controls

23 controls apply, from the corpus control catalogue.

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

Permissions

KeyChecked atScope
crm.duplicates.reviewapitenant

Business Rules

11 rules, 9 to be proved before approval. A rule's product intent is derived from its origin: 11 confirmed by a product decision, the rest inheriting this capability's confirmed.

IdRuleKindEnforced atProvenance
01must prove
Confirmed
Pair dismissal retains the reviewer, time, optional trimmed note up to 1,000 characters and current strong evidence, moving the pair into dismissed grouping.
no proof recorded yet
lifecycleapi, servicetest
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
02must prove
Confirmed
Repeating a pair or group dismissal succeeds without changing it and returns the earlier author as visibility permits, time and note.
no proof recorded yet
policyservicetest
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
03must prove
Confirmed
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.
no proof recorded yet
lifecycleservicetest
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
04must prove
Confirmed
Undoing a group dismissal reopens only pairs changed by that decision, preserves independent dismissals and rejects a group with nothing to restore.
no proof recorded yet
lifecycleservicetest
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
05must prove
Confirmed
Pair restoration clears author, time, note and dismissal evidence while retaining current score and reasons; no earlier dismissal history remains.
no proof recorded yet
lifecycleservicetest
06must prove
Confirmed
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.
no proof recorded yet
lifecycleservicetest
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
07
Confirmed
Changing the scoring version preserves dismissals while open pairs receive updated scores.
origin: services-crm:docs/merging/README.md#Status (architecture and plan approved by Andrew 2026-10-11)
policyservicedocumented
services-crm:docs/merging/duplicate-detection.md#8. Dismiss, confirm, reconsider
08
Confirmed
A dismissal applies only to its two records and does not exclude either from comparisons with others.
policyserviceinferred
09must prove
Confirmed
Dismissal and restoration require duplicate-review authority, with readers refused by the API and decision controls hidden in the console.
origin: services-crm:docs/merging/architecture.md#9. Security and tenant isolation
no proof recorded yet
permissionapi, consoletest
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
10must prove
Confirmed
Notes exceeding 1,000 characters are rejected, and unavailable workspace pairs or groups return not found.
no proof recorded yet
validationapitest
services-crm:modules/duplicates/tests/e2e/duplicates.e2e.spec.js#refuses a dismissal note longer than a note may be (400)
11must prove
Confirmed
Removing a record from a displayed group dismisses its pairs with the other members without dismissing the remaining group.
no proof recorded yet
policyconsoletest

Scenarios

IdGivenWhenThenProvenance
01A reviewer dismisses a pair and records a note.The contacts later acquire a new shared mobile number.The pair reopens with a new-evidence explanation and the dismissal note is cleared.test
02Two reviewers submit dismissal for the same group in sequence.The second submission reaches the service.It succeeds without changes and shows the first author and note.test
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)

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.