---
id: TST-CRM-DQ-180
title: Duplicate database integration
kind: integration
product_area: crm
module: data-quality
revision: 1
status: draft
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
  rhythm-v2-docs: 61315bb0538e230286687677da2b04b1d33f162b
repository: services-crm
files:
  - modules/duplicates/tests/integration/db/duplicate-detection.table.integration.spec.js
  - modules/duplicates/tests/integration/db/portal-sign-up-contacts.integration.spec.js
  - modules/duplicates/tests/integration/services/candidates/duplicate-candidate-view.integration.spec.js
  - modules/duplicates/tests/integration/services/detection/duplicate-change-events.integration.spec.js
  - modules/duplicates/tests/integration/services/detection/duplicate-checks.integration.spec.js
  - modules/duplicates/tests/integration/services/detection/duplicate-detection.integration.spec.js
  - modules/duplicates/tests/integration/services/groups/duplicate-group-view.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-block-overrides.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-block-overrides.queries.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-candidates.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-candidates.queries.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-group-attention-items.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-group-attention-items.queries.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-groups.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-groups.queries.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-rescans.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-rescans.queries.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-rules.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/duplicate-rules.queries.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/match-keys.integration.spec.js
  - modules/duplicates/tests/integration/services/persistence/match-keys.queries.integration.spec.js
  - modules/duplicates/tests/integration/services/queue/rescan-queue.integration.spec.js
  - modules/duplicates/tests/integration/services/summary/duplicate-summary.integration.spec.js
implements:
  - ATS-CRM-DQ-001-02
  - ATS-CRM-DQ-001-04
  - ATS-CRM-DQ-001-05
  - ATS-CRM-DQ-001-06
  - ATS-CRM-DQ-001-07
  - ATS-CRM-DQ-001-08
  - ATS-CRM-DQ-001-09
  - ATS-CRM-DQ-001-10
  - ATS-CRM-DQ-001-17
  - ATS-CRM-DQ-001-18
  - ATS-CRM-DQ-003-02
  - ATS-CRM-DQ-003-06
  - ATS-CRM-DQ-003-07
  - ATS-CRM-DQ-003-10
  - ATS-CRM-DQ-004-01
  - ATS-CRM-DQ-004-04
  - ATS-CRM-DQ-004-05
  - ATS-CRM-DQ-004-10
  - ATS-CRM-DQ-005-02
  - ATS-CRM-DQ-005-03
  - ATS-CRM-DQ-005-04
  - ATS-CRM-DQ-005-05
  - ATS-CRM-DQ-005-22
  - ATS-CRM-DQ-005-23
  - ATS-CRM-DQ-006-01
  - ATS-CRM-DQ-006-02
  - ATS-CRM-DQ-006-03
  - ATS-CRM-DQ-006-04
  - ATS-CRM-DQ-006-05
  - ATS-CRM-DQ-006-06
  - ATS-CRM-DQ-007-03
  - ATS-CRM-DQ-007-04
  - ATS-CRM-DQ-007-13
  - ATS-CRM-DQ-008-02
  - ATS-CRM-DQ-008-03
  - ATS-CRM-DQ-008-04
  - ATS-CRM-DQ-008-05
  - ATS-CRM-DQ-008-06
  - ATS-CRM-DQ-009-01
  - ATS-CRM-DQ-009-02
  - ATS-CRM-DQ-009-03
  - ATS-CRM-DQ-010-02
  - ATS-CRM-DQ-011-01
  - ATS-CRM-DQ-011-02
  - ATS-CRM-DQ-015-07
environment: local
command: npx mocha --timeout 60000 'modules/duplicates/tests/integration/db/*.integration.spec.js' 'modules/duplicates/tests/integration/services/**/*.integration.spec.js'
gate: Prepare the test database first. This selection belongs to the service integration tier.
implementation_state: implemented
implementation_evidence: observed
latest_result: not-run
conformance: not-verified
estimated_minutes: 10
isolation: Use the suite fixture workspace and remove its test identities; run database selections sequentially.
retries: none
proves_controls: []
evidence:
  - provenance: test
    source:
      - 'services-crm:modules/duplicates/tests/integration/db/duplicate-detection.table.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/db/portal-sign-up-contacts.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/candidates/duplicate-candidate-view.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/detection/duplicate-change-events.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/detection/duplicate-checks.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/detection/duplicate-detection.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/groups/duplicate-group-view.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-block-overrides.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-block-overrides.queries.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-candidates.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-candidates.queries.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-group-attention-items.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-group-attention-items.queries.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-groups.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-groups.queries.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-rescans.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-rescans.queries.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-rules.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/duplicate-rules.queries.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/match-keys.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/persistence/match-keys.queries.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/queue/rescan-queue.integration.spec.js'
      - 'services-crm:modules/duplicates/tests/integration/services/summary/duplicate-summary.integration.spec.js'
  - provenance: documented
    source: 'rhythm-v2-docs:specs/CONVENTIONS.md#10.6 Executable Test Suite'
---

# Duplicate database integration

## Verification Boundary

PostgreSQL and CRM persistence are real. Fixture contexts and controlled queue deliveries replace the deployed transport; the public dispatcher and browser are outside this boundary.

## What This Suite Proves

Detection, candidate and group persistence, draft checking, registration functions and re-check queue processing are exercised against database state. The scenario bindings identify the assertions inspected in this examination. No control claim is assigned without a check that fails when the control is removed.

## What It Does Not Prove

Local database assertions do not establish hosted console behavior, deployed message delivery or the policies of unavailable owner services.

## Level and Rationale

A real database is needed to check constraints, row visibility and transaction outcomes. In-memory doubles cannot establish those guarantees.

## Real Dependencies and Test Doubles

PostgreSQL and CRM persistence are real. Fixture contexts and controlled queue deliveries replace the deployed transport; the public dispatcher and browser are outside this boundary.

## Must Not Be Doubled

Keep PostgreSQL constraints and the production persistence or catalog operations real; replacing them would bypass the boundary this selection exists to check.

## Fixtures and Isolation

Use the suite fixture workspace and remove its test identities; run database selections sequentially. The test support constructs fixture contexts and test-specific identities. Failure-injection participants belong to the run and must be removed with its fixtures.

## Determinism and Retries

The register records no new runtime result. Existing polling and fixture clocks remain part of the authored tests; polling for completion is not a retry of a failed case. Run with at most three workers and diagnose a failure before rerunning it.

## How It Runs

The frontmatter records the scoped command and its runner tier. Run the test-database preparation command before invoking this selection.

## Coverage Gaps

Mapped scenarios retain their exact execution sources for review; combined multi-source scenarios can still leave an ordered handoff unproved. The capability gap records identify unbound obligations, and the grouped-suite finding records incomplete lifecycle and runtime coverage.
