---
id: ATS-CRM-DQ-014
scope: CAP-CRM-DQ-014
product_area: crm
module: data-quality
revision: 1
status: proposed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CRM-DQ-014-01
    title: Consent is combined without an override choice
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-01
    preconditions: Participants differ on contact prohibitions and subscriptions.
    steps: Compute the preview.
    expected: >-
      The strictest flags and subscription remain, no question permits
      relaxation and discarded choices identify the consent rule.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        true on the survivor when any participant holds it
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        never offered as a choice
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#combines
        two preferences of one type to the most restrictive status, and offers
        no choice about it
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#attributes
        the wider status it did not keep to the rule that would not widen
        consent
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
      true on the survivor when any participant holds it
    category: invariant
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        true on the survivor when any participant holds it
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        never offered as a choice
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#combines
        two preferences of one type to the most restrictive status, and offers
        no choice about it
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#attributes
        the wider status it did not keep to the rule that would not widen
        consent
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-02
    title: Same-type details compete for one slot
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-02
    preconditions: Two participants hold different work addresses.
    steps: Plan and select the alternative address.
    expected: >-
      One slot question selects the written address and explains the discarded
      one.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#writes
        the other address when staff choose it, and attributes the survivor’s to
        the slot conflict
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#writes
      the other address when staff choose it, and attributes the survivor’s to
      the slot conflict
    category: rule
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#writes
        the other address when staff choose it, and attributes the survivor’s to
        the slot conflict
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-03
    title: E-mail choices respect count and primary uniqueness
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-03
    preconditions: >-
      Four distinct addresses compete and an outsider reserves a possible
      primary.
    steps: Build the plan.
    expected: >-
      Selection limits retention to three, requires a primary and blocks the
      reserved primary.
    negative: true
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#asks
        which three to keep when the participants hold more
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#offers
        no way to leave the kept addresses without a primary
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#blocks
        the merge when the primary address belongs to a contact outside the
        merge
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#asks
      which three to keep when the participants hold more
    category: boundary
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#asks
        which three to keep when the participants hold more
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#offers
        no way to leave the kept addresses without a primary
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#blocks
        the merge when the primary address belongs to a contact outside the
        merge
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-04
    title: Preferred addresses exclude seasonal choices
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-04
    preconditions: 'Two preferred addresses compete, including a seasonal address.'
    steps: Compute their plan.
    expected: >-
      The selected preference follows the survivor default and cannot be
      seasonal.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#writes
        exactly one preferred address when two participants each flagged one
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#defaults
        the preferred address to the survivor’s own
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#never
        prefers a seasonal address, which the table refuses
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#writes
      exactly one preferred address when two participants each flagged one
    category: validation
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#writes
        exactly one preferred address when two participants each flagged one
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#defaults
        the preferred address to the survivor’s own
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#never
        prefers a seasonal address, which the table refuses
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-05
    title: Deceased status needs a deliberate answer
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-05
    preconditions: One participant is deceased and another is living.
    steps: Build the plan.
    expected: >-
      An unanswered required status question has no default and prevents
      readiness.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#asks
        a required question when one participant is deceased and another is not
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        that question no default, because neither state may be assumed
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#holds
        the plan at needs_decisions until that question is answered
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#asks
      a required question when one participant is deceased and another is not
    category: validation
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#asks
        a required question when one participant is deceased and another is not
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        that question no default, because neither state may be assumed
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#holds
        the plan at needs_decisions until that question is answered
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-06
    title: Participant spouse links cannot become self-links
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-06
    preconditions: An absorbed participant names the survivor as spouse.
    steps: Compute the preview.
    expected: The spouse reference clears with its responsible rule identified.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        cleared when the survivor itself is the spouse a participant names,
        which no contact may be
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#attributes
        the cleared spouse to the rule that cleared it
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
      cleared when the survivor itself is the spouse a participant names, which
      no contact may be
    category: edge
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        cleared when the survivor itself is the spouse a participant names,
        which no contact may be
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#attributes
        the cleared spouse to the rule that cleared it
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-07
    title: Equivalent employment stays combine without collapsing distinct stays
    level: api
    proves:
      - BR-CAP-CRM-DQ-014-07
    preconditions: Prepare overlapping Acme affiliations and two separate stays elsewhere.
    steps: Run the planned contact combination.
    expected: >-
      The Acme stay uses its earliest start and both role sets while distinct
      stays remain separate.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-181
    provenance: test
    source: >-
      services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js#combines
      the two Acme affiliations into one, from the earliest start, open, with
      the survivor’s title and both roles
    category: rule
    execution_sources:
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js#combines
        the two Acme affiliations into one, from the earliest start, open, with
        the survivor’s title and both roles
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js#keeps
        Z’s two affiliations apart, their periods neither overlapping nor
        touching
  - id: ATS-CRM-DQ-014-08
    title: Primary affiliations use only effective choices
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-08
    preconditions: >-
      Prepare competing primaries, a survivor without one and ended or future
      affiliations.
    steps: Build previews.
    expected: >-
      Competing primaries create an optional defaulted choice, a sole absorbed
      primary fills the gap and ineffective affiliations are excluded.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#shows
        the primary organization for review as a defaulted, optional decision
        when two participants hold one at different organizations
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#keeps
        the merged contact’s primary as the primary organization when the
        survivor has none, without asking
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#never
        offers an ended affiliation as the primary organization
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#shows
      the primary organization for review as a defaulted, optional decision when
      two participants hold one at different organizations
    category: edge
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#shows
        the primary organization for review as a defaulted, optional decision
        when two participants hold one at different organizations
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#keeps
        the merged contact’s primary as the primary organization when the
        survivor has none, without asking
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-collections.spec.js#never
        offers an ended affiliation as the primary organization
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-09
    title: Linked details preserve their usable source
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-09
    preconditions: >-
      Prepare identical organization-source links, an unresolved link and a link
      losing its affiliation.
    steps: Compute the plan.
    expected: >-
      Identical sources collapse, unresolved details are dropped as replaced and
      the detached affiliation's detail becomes a described copy.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/linked-contact-information.spec.js#treats
        two items linked to the same record as one item, so the slot asks
        nothing
      - >-
        services-crm:modules/merges/tests/unit/services/planning/linked-contact-information.spec.js#lists
        a linked item that does not resolve and is replaced under
        linked_value_replaced
      - >-
        services-crm:modules/merges/tests/unit/services/planning/linked-contact-information.spec.js#turns
        a linked item whose affiliation the merged contact does not keep into a
        copy of its value
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/linked-contact-information.spec.js#treats
      two items linked to the same record as one item, so the slot asks nothing
    category: rule
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/linked-contact-information.spec.js#treats
        two items linked to the same record as one item, so the slot asks
        nothing
      - >-
        services-crm:modules/merges/tests/unit/services/planning/linked-contact-information.spec.js#lists
        a linked item that does not resolve and is replaced under
        linked_value_replaced
      - >-
        services-crm:modules/merges/tests/unit/services/planning/linked-contact-information.spec.js#turns
        a linked item whose affiliation the merged contact does not keep into a
        copy of its value
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-10
    title: Computed presentation is outside merge choices
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-10
    preconditions: 'Participants differ on sort names, automatic regions and record numbers.'
    steps: Build the plan.
    expected: >-
      Name and number are not questions, and region is recalculated unless
      manually assigned.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        no choice about the computed sort name
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        no choice about the contact number, which stays the survivor’s
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#recalculates
        the region rather than choosing between two, and says so
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#keeps
        a region a participant set by hand, because an overridden region is not
        recalculated
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
      no choice about the computed sort name
    category: rule
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        no choice about the computed sort name
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        no choice about the contact number, which stays the survivor’s
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#recalculates
        the region rather than choosing between two, and says so
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#keeps
        a region a participant set by hand, because an overridden region is not
        recalculated
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-11
    title: Archived custom values receive no merge write
    level: api
    proves:
      - BR-CAP-CRM-DQ-014-12
    preconditions: Both participants hold an archived custom field.
    steps: Prepare the preview and run its combination.
    expected: >-
      No choice appears for that field and execution succeeds without updating
      it.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-183
      - TST-CRM-DQ-181
    provenance: test
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#offers no
      conflict about the archived field
    category: edge
    execution_sources:
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#offers no
        conflict about the archived field
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#succeeds with
        no failure at all, where it used to fail and roll back
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js#writes
        no value of the archived field onto the survivor, which the save would
        refuse
  - id: ATS-CRM-DQ-014-12
    title: Custom validation applies only to changed values
    level: api
    proves:
      - BR-CAP-CRM-DQ-014-13
    preconditions: >-
      One survivor lacks a later-required value and another plan clears an
      existing required value.
    steps: Execute both plans.
    expected: >-
      The first succeeds; the second identifies the required field and leaves
      the survivor unchanged.
    negative: true
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-181
    provenance: test
    source: >-
      services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js#merges,
      a field the merge changes nothing about not standing in its way
    category: failure
    execution_sources:
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js#merges,
        a field the merge changes nothing about not standing in its way
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js#refuses
        the merge that would clear a required field a record does hold a value
        for
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js#names
        the field the save refused in what it recorded about that failure
  - id: ATS-CRM-DQ-014-13
    title: Discarded information retains a reason and source
    level: unit
    proves:
      - BR-CAP-CRM-DQ-014-14
    preconditions: >-
      Use a snapshot containing every difference type and the four-contact
      example.
    steps: Compute previews.
    expected: >-
      Each omitted value identifies its original records and responsible
      question, default or rule.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#names
        a conflict, a default or a rule for every value it drops, over a
        snapshot of every kind of difference
      - >-
        services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#says
        which records held every value it drops
      - >-
        services-crm:modules/merges/tests/unit/services/planning/worked-example.spec.js#attributes
        every value the survivor will not hold to the conflict or the rule that
        dropped it
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#names
      a conflict, a default or a rule for every value it drops, over a snapshot
      of every kind of difference
    category: invariant
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#names
        a conflict, a default or a rule for every value it drops, over a
        snapshot of every kind of difference
      - >-
        services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#says
        which records held every value it drops
      - >-
        services-crm:modules/merges/tests/unit/services/planning/worked-example.spec.js#attributes
        every value the survivor will not hold to the conflict or the rule that
        dropped it
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-014-14
    title: The wizard exposes automatic and exceptional outcomes
    level: browser
    proves:
      - BR-CAP-CRM-DQ-014-01
      - BR-CAP-CRM-DQ-014-05
      - BR-CAP-CRM-DQ-014-06
      - BR-CAP-CRM-DQ-014-14
    preconditions: >-
      Prepare a sparse/full pair, four e-mails and deceased records with spouse
      connections.
    steps: Merge through the wizard and acknowledge omissions.
    expected: >-
      Automatic results are visible, chosen values remain, deceased status is
      answered and internal spouse links clear.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-176
    provenance: test
    source: >-
      react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0254.spec.ts#CRM-ACC-0254
    category: interaction
    execution_sources:
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0254.spec.ts#CRM-ACC-0254
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0255.spec.ts#CRM-ACC-0255
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0256.spec.ts#CRM-ACC-0256
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0257.spec.ts#CRM-ACC-0257
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0280.spec.ts#CRM-ACC-0280
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0281.spec.ts#CRM-ACC-0281
  - id: ATS-CRM-DQ-014-15
    title: The chosen photo attaches to the retained contact
    category: transition
    level: api
    proves:
      - BR-CAP-CRM-DQ-014-11
    preconditions: Two participants with different managed photos and a fixed clock.
    steps: >-
      Choose the absorbed participant’s photo, execute and inspect both managed
      assets.
    expected: >-
      The chosen photo attaches to the survivor and the unused photo is detached
      with its thirty-day retirement deadline.
    negative: true
    data_needs: Run-owned records and caller permissions that distinguish the two cases.
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#says
      so when the survivor keeps its own photo and a participant’s is dropped
    design_sources:
      - CAP-CRM-DQ-014
    bound_to: []
    provenance: proposed
    execution_sources: []
  - id: ATS-CRM-DQ-014-16
    title: Contact details remain usable after organization and relationship changes
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-DQ-014-01
      - BR-CAP-CRM-DQ-014-02
      - BR-CAP-CRM-DQ-014-03
      - BR-CAP-CRM-DQ-014-04
      - BR-CAP-CRM-DQ-014-05
      - BR-CAP-CRM-DQ-014-06
      - BR-CAP-CRM-DQ-014-07
      - BR-CAP-CRM-DQ-014-08
      - BR-CAP-CRM-DQ-014-09
      - BR-CAP-CRM-DQ-014-10
      - BR-CAP-CRM-DQ-014-12
      - BR-CAP-CRM-DQ-014-13
      - BR-CAP-CRM-DQ-014-14
      - BR-CAP-CRM-DQ-014-11
    exercises:
      - CAP-CRM-DQ-014
      - CAP-CRM-DQ-015
      - CAP-CRM-DQ-017
      - CAP-CRM-ENT-005
      - CAP-CRM-ENT-009
    workflow_sources:
      - WF-CRM-DQ-005
      - WF-CRM-DQ-006
    preconditions: >-
      Run-owned contact and organization records, the relevant staff permissions
      and the related state described by the sequence.
    steps: >-
      Choose contact detail slots and affiliations, merge the contacts, then
      merge their source organizations with a different retained slot. Read the
      surviving linked details and consent.
    expected: >-
      The linked values, affiliation ownership and consent remain consistent
      with the named rules.
    negative: false
    data_needs: >-
      An isolated workspace with related records and fixed timestamps; owned
      participant failure injection where requested.
    source: >-
      CAP-CRM-DQ-014; CAP-CRM-DQ-015; CAP-CRM-DQ-017; CAP-CRM-ENT-005;
      CAP-CRM-ENT-009; WF-CRM-DQ-005; WF-CRM-DQ-006
    note: >-
      This cumulative seam scenario remains proposed until one executable
      sequence establishes all of its outcomes.
    bound_to: []
    provenance: proposed
    workflow_coverage_note: >-
      The workflows identify the handoffs under review. Separate assertions
      leave recovery and failure ordering unproved; the capability coverage
      finding records that limit.
    execution_sources: []
evidence:
  - repository: services-crm
    source_sha: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
    paths:
      - modules/merges/tests/e2e/merges.e2e.spec.js
      - >-
        modules/merges/tests/integration/services/merges/merge-execution.integration.spec.js
      - modules/merges/tests/unit/services/planning/contact-collections.spec.js
      - modules/merges/tests/unit/services/planning/contact-fields.spec.js
      - >-
        modules/merges/tests/unit/services/planning/linked-contact-information.spec.js
      - modules/merges/tests/unit/services/planning/merge-decisions.spec.js
      - modules/merges/tests/unit/services/planning/worked-example.spec.js
    note: >-
      Bindings identify authored proof; empty bindings remain proposed and
      findings record known limitations.
  - repository: react-console
    source_sha: baf6dae382d6f41dce976c7f848667ccc37e076f
    paths:
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0254.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0255.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0256.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0257.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0280.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0281.spec.ts
    note: >-
      Bindings identify authored proof; empty bindings remain proposed and
      findings record known limitations.
coverage:
  rule: covered
  transition: covered
  validation: covered
  permission: 'gap: FND-CRM-DQ-065'
  edge: covered
  failure: covered
  boundary: covered
  concurrency: 'gap: FND-CRM-DQ-065'
  invariant: covered
  interaction: covered
coverage_notes:
  permission: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
  concurrency: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
permission_coverage:
  - key: crm.contacts.merge
    scenario_ids: []
    finding: FND-CRM-DQ-065
proof_matrix:
  - rule: BR-CAP-CRM-DQ-014-01
    scenarios:
      - ATS-CRM-DQ-014-01
      - ATS-CRM-DQ-014-14
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-02
    scenarios:
      - ATS-CRM-DQ-014-02
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-03
    scenarios:
      - ATS-CRM-DQ-014-03
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-04
    scenarios:
      - ATS-CRM-DQ-014-04
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-05
    scenarios:
      - ATS-CRM-DQ-014-05
      - ATS-CRM-DQ-014-14
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-06
    scenarios:
      - ATS-CRM-DQ-014-06
      - ATS-CRM-DQ-014-14
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-07
    scenarios:
      - ATS-CRM-DQ-014-07
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-08
    scenarios:
      - ATS-CRM-DQ-014-08
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-09
    scenarios:
      - ATS-CRM-DQ-014-09
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-10
    scenarios:
      - ATS-CRM-DQ-014-10
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-11
    scenarios:
      - ATS-CRM-DQ-014-15
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-12
    scenarios:
      - ATS-CRM-DQ-014-11
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-13
    scenarios:
      - ATS-CRM-DQ-014-12
      - ATS-CRM-DQ-014-16
  - rule: BR-CAP-CRM-DQ-014-14
    scenarios:
      - ATS-CRM-DQ-014-13
      - ATS-CRM-DQ-014-14
      - ATS-CRM-DQ-014-16
interaction_coverage:
  related:
    - CAP-CRM-DQ-015
    - CAP-CRM-DQ-017
    - CAP-CRM-ENT-005
    - CAP-CRM-ENT-009
  workflow_sources:
    - WF-CRM-DQ-005
    - WF-CRM-DQ-006
  scenarios:
    - ATS-CRM-DQ-014-14
    - ATS-CRM-DQ-014-16
---

# Preserve the right information on the surviving contact: Capability Test Specification

## Coverage

The rule matrix names the authored checks. A covered category means that a scenario exists; it does not report a passing execution. The coverage notes and findings identify missing checks, while execution sources retain the exact assertions inspected.

| Required Rule | Scenarios |
|---|---|
| `BR-CAP-CRM-DQ-014-01` | `ATS-CRM-DQ-014-01`, `ATS-CRM-DQ-014-14`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-02` | `ATS-CRM-DQ-014-02`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-03` | `ATS-CRM-DQ-014-03`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-04` | `ATS-CRM-DQ-014-04`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-05` | `ATS-CRM-DQ-014-05`, `ATS-CRM-DQ-014-14`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-06` | `ATS-CRM-DQ-014-06`, `ATS-CRM-DQ-014-14`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-07` | `ATS-CRM-DQ-014-07`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-08` | `ATS-CRM-DQ-014-08`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-09` | `ATS-CRM-DQ-014-09`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-10` | `ATS-CRM-DQ-014-10`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-11` | `ATS-CRM-DQ-014-15`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-12` | `ATS-CRM-DQ-014-11`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-13` | `ATS-CRM-DQ-014-12`, `ATS-CRM-DQ-014-16` |
| `BR-CAP-CRM-DQ-014-14` | `ATS-CRM-DQ-014-13`, `ATS-CRM-DQ-014-14`, `ATS-CRM-DQ-014-16` |

## Interactions With Related Capabilities

Merge through the wizard and acknowledge omissions. Choose contact detail slots and affiliations, merge the contacts, then merge their source organizations with a different retained slot. Read the surviving linked details and consent.

These sequences test the handoffs named in the interaction coverage record. A proposed sequence remains unbound until an executable run checks its combined outcome; component assertions alone leave that obligation open.
