---
id: TST-CRM-DQ-181
title: Merge 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/merges/tests/integration/db/merge-purge-functions.integration.spec.js
  - modules/merges/tests/integration/db/merged-id-reuse.integration.spec.js
  - modules/merges/tests/integration/db/merged-record-aliases.table.integration.spec.js
  - modules/merges/tests/integration/db/record-merges.table.integration.spec.js
  - modules/merges/tests/integration/services/jobs/job-reconciliation.integration.spec.js
  - modules/merges/tests/integration/services/jobs/organization-merge-job.integration.spec.js
  - modules/merges/tests/integration/services/jobs/record-merge-job.integration.spec.js
  - modules/merges/tests/integration/services/merges/activity-links-merge.integration.spec.js
  - modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js
  - modules/merges/tests/integration/services/merges/default-basis-and-recency.integration.spec.js
  - modules/merges/tests/integration/services/merges/dismissal-carry.integration.spec.js
  - modules/merges/tests/integration/services/merges/duplicate-groups-after-merge.integration.spec.js
  - modules/merges/tests/integration/services/merges/linked-contact-information.integration.spec.js
  - modules/merges/tests/integration/services/merges/long-running-merge.integration.spec.js
  - modules/merges/tests/integration/services/merges/lookup-labels.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-events.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-outcome.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-owner-delete-guard.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-plan-decisions.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-plan-expiry.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-plan-lists.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-plan-records.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-records.integration.spec.js
  - modules/merges/tests/integration/services/merges/merge-settlement.integration.spec.js
  - modules/merges/tests/integration/services/merges/merged-from-history.integration.spec.js
  - modules/merges/tests/integration/services/merges/organization-merge-execution.integration.spec.js
  - modules/merges/tests/integration/services/merges/organization-merge-plans.integration.spec.js
  - modules/merges/tests/integration/services/merges/organization-merge-preferred-address.integration.spec.js
  - modules/merges/tests/integration/services/merges/overlapping-merges.integration.spec.js
  - modules/merges/tests/integration/services/merges/participant-summary.integration.spec.js
  - modules/merges/tests/integration/services/merges/plain-language.integration.spec.js
  - modules/merges/tests/integration/services/merges/required-participants.integration.spec.js
  - modules/merges/tests/integration/services/merges/survivor-recommendation.integration.spec.js
  - modules/merges/tests/integration/services/merges/tenant-merge-history.integration.spec.js
  - modules/merges/tests/integration/services/merges/toy-participant.integration.spec.js
  - modules/merges/tests/integration/services/merges/worked-example.integration.spec.js
  - modules/merges/tests/integration/services/persistence/merge-executions.queries.integration.spec.js
  - modules/merges/tests/integration/services/persistence/merge-links.queries.integration.spec.js
  - modules/merges/tests/integration/services/persistence/merge-references.integration.spec.js
  - modules/merges/tests/integration/services/persistence/merge-references.queries.integration.spec.js
  - modules/merges/tests/integration/services/persistence/merge-snapshots.queries.integration.spec.js
  - modules/merges/tests/integration/services/persistence/merged-record-aliases.integration.spec.js
  - modules/merges/tests/integration/services/persistence/merged-record-aliases.queries.integration.spec.js
  - modules/merges/tests/integration/services/persistence/portal-logins.queries.integration.spec.js
  - modules/merges/tests/integration/services/persistence/record-merge-jobs.integration.spec.js
  - modules/merges/tests/integration/services/persistence/record-merge-jobs.queries.integration.spec.js
  - modules/merges/tests/integration/services/persistence/record-merge-plans.integration.spec.js
  - modules/merges/tests/integration/services/persistence/record-merge-plans.queries.integration.spec.js
  - modules/merges/tests/integration/services/persistence/record-merges.integration.spec.js
  - modules/merges/tests/integration/services/persistence/record-merges.queries.integration.spec.js
implements:
  - ATS-CRM-DQ-012-01
  - ATS-CRM-DQ-012-04
  - ATS-CRM-DQ-012-06
  - ATS-CRM-DQ-013-02
  - ATS-CRM-DQ-013-05
  - ATS-CRM-DQ-013-06
  - ATS-CRM-DQ-013-07
  - ATS-CRM-DQ-013-08
  - ATS-CRM-DQ-013-17
  - ATS-CRM-DQ-014-07
  - ATS-CRM-DQ-014-11
  - ATS-CRM-DQ-014-12
  - ATS-CRM-DQ-015-03
  - ATS-CRM-DQ-015-05
  - ATS-CRM-DQ-015-08
  - ATS-CRM-DQ-015-13
  - ATS-CRM-DQ-016-02
  - ATS-CRM-DQ-016-03
  - ATS-CRM-DQ-016-04
  - ATS-CRM-DQ-016-05
  - ATS-CRM-DQ-016-06
  - ATS-CRM-DQ-016-07
  - ATS-CRM-DQ-016-10
  - ATS-CRM-DQ-016-11
  - ATS-CRM-DQ-016-25
  - ATS-CRM-DQ-016-26
  - ATS-CRM-DQ-016-27
  - ATS-CRM-DQ-016-30
  - ATS-CRM-DQ-016-31
  - ATS-CRM-DQ-016-32
  - ATS-CRM-DQ-017-04
  - ATS-CRM-DQ-017-06
  - ATS-CRM-DQ-017-07
  - ATS-CRM-DQ-018-01
  - ATS-CRM-DQ-018-02
  - ATS-CRM-DQ-018-03
  - ATS-CRM-DQ-018-05
  - ATS-CRM-DQ-018-06
  - ATS-CRM-DQ-018-07
  - ATS-CRM-DQ-018-14
  - ATS-CRM-DQ-018-15
  - ATS-CRM-DQ-018-16
  - ATS-CRM-DQ-018-17
  - ATS-CRM-DQ-019-01
  - ATS-CRM-DQ-019-03
  - ATS-CRM-DQ-019-04
  - ATS-CRM-DQ-019-05
  - ATS-CRM-DQ-019-06
  - ATS-CRM-DQ-019-08
environment: local
command: npx mocha --timeout 60000 'modules/merges/tests/integration/db/*.integration.spec.js' 'modules/merges/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/merges/tests/integration/db/merge-purge-functions.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/db/merged-id-reuse.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/db/merged-record-aliases.table.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/db/record-merges.table.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/jobs/job-reconciliation.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/jobs/organization-merge-job.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/jobs/record-merge-job.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/activity-links-merge.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/default-basis-and-recency.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/dismissal-carry.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/duplicate-groups-after-merge.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/linked-contact-information.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/long-running-merge.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/lookup-labels.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-events.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-outcome.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-owner-delete-guard.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-plan-decisions.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-plan-expiry.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-plan-lists.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-plan-records.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-records.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merge-settlement.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/merged-from-history.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/organization-merge-execution.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/organization-merge-plans.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/organization-merge-preferred-address.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/overlapping-merges.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/participant-summary.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/plain-language.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/required-participants.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/survivor-recommendation.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/tenant-merge-history.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/toy-participant.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/merges/worked-example.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/merge-executions.queries.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/merge-links.queries.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/merge-references.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/merge-references.queries.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/merge-snapshots.queries.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/merged-record-aliases.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/merged-record-aliases.queries.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/portal-logins.queries.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/record-merge-jobs.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/record-merge-jobs.queries.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/record-merge-plans.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/record-merge-plans.queries.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/record-merges.integration.spec.js'
      - 'services-crm:modules/merges/tests/integration/services/persistence/record-merges.queries.integration.spec.js'
  - provenance: documented
    source: 'rhythm-v2-docs:specs/CONVENTIONS.md#10.6 Executable Test Suite'
---

# Merge database integration

## Verification Boundary

PostgreSQL, CRM planner and executor are real. Test participant functions deliberately supply blockers or failures; this is not evidence of every external application participant.

## What This Suite Proves

Plan decisions, approval material, participant writes, rollback, aliases, durable-job settlement and retained outcomes are asserted through CRM services and PostgreSQL. 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, CRM planner and executor are real. Test participant functions deliberately supply blockers or failures; this is not evidence of every external application participant.

## 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.
