---
id: ATS-CRM-DQ-013
scope: CAP-CRM-DQ-013
product_area: crm
module: data-quality
revision: 1
status: proposed
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-CRM-DQ-013-01
    title: Preview questions represent incompatible retained values
    level: unit
    proves:
      - BR-CAP-CRM-DQ-013-01
      - BR-CAP-CRM-DQ-013-02
    preconditions: 'Prepare identical, sole and conflicting field values.'
    steps: Compute a plan.
    expected: >-
      Identical and sole values need no question; optional conflicts offer
      existing values and clearing.
    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
        no conflict when every participant holds the same value
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        no conflict when only one participant holds a value, which the survivor
        then takes
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        clearing the field as well as each value held
    provenance: test
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
      no conflict when every participant holds the same value
    category: rule
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        no conflict when every participant holds the same value
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        no conflict when only one participant holds a value, which the survivor
        then takes
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        clearing the field as well as each value held
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-013-02
    title: Default selection explains its ranking
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-03
    preconditions: >-
      Prepare survivor-held values, a survivor gap with a majority and a gap
      without a majority.
    steps: Build previews.
    expected: >-
      Defaults select the survivor, then explain the majority count or latest
      field change.
    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/unit/services/planning/contact-fields.spec.js#is
      a conflict defaulting to the survivor's value when two participants differ
    category: rule
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#is
        a conflict defaulting to the survivor's value when two participants
        differ
      - >-
        services-crm:modules/merges/tests/integration/services/merges/default-basis-and-recency.integration.spec.js#is
        the majority, with the records that agree counted, where more records
        hold one value than any other
      - >-
        services-crm:modules/merges/tests/integration/services/merges/default-basis-and-recency.integration.spec.js#is
        the revision that changed the field, for the record whose field was
        changed
  - id: ATS-CRM-DQ-013-03
    title: Required unanswered questions prevent execution
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-04
    preconditions: A plan contains an open required conflict.
    steps: Request execution.
    expected: The plan needs decisions and execution reports not ready.
    negative: true
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-183
    provenance: test
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#plans it as
      needing a decision rather than ready
    category: transition
    execution_sources:
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#plans it as
        needing a decision rather than ready
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#refuses the
        execution request as a plan that is not ready
  - id: ATS-CRM-DQ-013-04
    title: Decision updates merge and clear independently
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-05
    preconditions: A preview contains two questions.
    steps: >-
      Answer each separately, clear one and then try answering and clearing
      together.
    expected: >-
      Answers accumulate, clearing affects only its question and the conflicting
      request fails.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-183
    provenance: test
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#keeps the first
      answer when the second request answers only the other conflict
    category: invariant
    execution_sources:
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#keeps the first
        answer when the second request answers only the other conflict
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#takes back only
        the decision clear_resolutions names
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#refuses a
        request that decides a conflict and clears it at once, naming that
        conflict
  - id: ATS-CRM-DQ-013-05
    title: Unknown resolution leaves the saved plan intact
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-06
    preconditions: An existing plan has earlier answers.
    steps: Submit an answer for an unavailable question.
    expected: >-
      The refusal identifies the invalid resolution and preserves earlier
      answers.
    negative: true
    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#refuses it as an
      invalid resolution rather than storing a decision nobody can apply
    category: validation
    execution_sources:
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#refuses it as
        an invalid resolution rather than storing a decision nobody can apply
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-plan-decisions.integration.spec.js#leaves
        the decisions the plan already held untouched
  - id: ATS-CRM-DQ-013-06
    title: Old plan versions cannot overwrite decisions
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-07
    preconditions: Read a plan before another update changes it.
    steps: Submit an update with the earlier version.
    expected: The service refuses it without a write.
    negative: true
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-181
      - TST-CRM-DQ-183
    provenance: test
    source: >-
      services-crm:modules/merges/tests/integration/services/merges/merge-plan-decisions.integration.spec.js#leaves
      both decisions on the plan, at the version it was refused against
    category: concurrency
    execution_sources:
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-plan-decisions.integration.spec.js#leaves
        both decisions on the plan, at the version it was refused against
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#moves the
        plan’s version on, so a second editor is told rather than overwriting
        the first
      - >-
        services-crm:modules/merges/tests/integration/services/persistence/record-merge-plans.integration.spec.js#refuses
        the version that has been written past, as StaleObject
  - id: ATS-CRM-DQ-013-07
    title: Changed source values require another approval
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-08
    preconditions: A chosen job title changes after preview approval.
    steps: 'Execute, reopen the plan and attempt execution again.'
    expected: >-
      The refusal explains old and new values; the new source value appears but
      cannot execute until confirmed.
    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/approval-binding.integration.spec.js#refuses
      the approved execution as plan_stale, naming the old value and the new one
    category: failure
    execution_sources:
      - >-
        services-crm:modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js#refuses
        the approved execution as plan_stale, naming the old value and the new
        one
      - >-
        services-crm:modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js#shows
        the record’s new value as what the merge would take, and proposes it as
        the choice to confirm
      - >-
        services-crm:modules/merges/tests/integration/services/merges/approval-binding.integration.spec.js#refuses
        to execute until the new value is confirmed, naming the conflict and
        what changed
  - id: ATS-CRM-DQ-013-08
    title: Workspace labels make preview choices readable
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-10
    preconditions: Prepare referenced types and states including an archived type.
    steps: Read their plan.
    expected: >-
      Values use names and archive markings; internal terms and identities do
      not appear in ordinary preview sentences.
    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/lookup-labels.integration.spec.js#offers
      the same names as the choices of the conflict, so no choice is drawn from
      an id
    category: rule
    execution_sources:
      - >-
        services-crm:modules/merges/tests/integration/services/merges/lookup-labels.integration.spec.js#offers
        the same names as the choices of the conflict, so no choice is drawn
        from an id
      - >-
        services-crm:modules/merges/tests/integration/services/merges/lookup-labels.integration.spec.js#marks
        a type the tenant has archived, so a plan never offers one as though it
        were in use
      - >-
        services-crm:modules/merges/tests/integration/services/merges/plain-language.integration.spec.js#holds
        an id of any shape, a reader having nothing to look one up in
      - >-
        services-crm:modules/merges/tests/integration/services/merges/plain-language.integration.spec.js#names
        a column
  - id: ATS-CRM-DQ-013-09
    title: Validation returns the current preview
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-12
    preconditions: An open plan already holds decisions.
    steps: Request explicit validation.
    expected: The service returns the recomputed plan for current records.
    negative: false
    data_needs: The existing scenario setup supplies the required records.
    bound_to:
      - TST-CRM-DQ-183
    provenance: test
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#answers the
      validation with the plan as it is now, ready to execute
    category: transition
    execution_sources:
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#answers the
        validation with the plan as it is now, ready to execute
  - id: ATS-CRM-DQ-013-10
    title: Concurrent decision work fails visibly when stale
    level: browser
    proves:
      - BR-CAP-CRM-DQ-013-05
      - BR-CAP-CRM-DQ-013-07
    preconditions: A preview has several questions.
    steps: >-
      Answer separately, clear, submit an unknown question, save an old version
      and refresh as another administrator.
    expected: >-
      Valid answers remain, clear is explicit, invalid answers write nothing and
      stale changes prompt a reload.
    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-0249.spec.ts#CRM-ACC-0249
    category: concurrency
    execution_sources:
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0249.spec.ts#CRM-ACC-0249
      - >-
        react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0250.spec.ts#CRM-ACC-0250
  - id: ATS-CRM-DQ-013-11
    title: >-
      Observe needs_decisions becoming ready after answers or current data
      remove the last required question
    category: transition
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-04
    transition:
      model: STATE-CRM-DQ-004
      index: 1
      from: needs_decisions
      to: ready
      guard: Changes use a current version and valid participant choices.
      side_effects:
        - 'persist refreshed preview, material hash and standing'
    preconditions: >-
      Arrange needs_decisions standing with the transition guard satisfied:
      Changes use a current version and valid participant choices.
    steps: Answers or current data remove the last required question.
    expected: >-
      Read the ready standing and inspect the associated changes: persist
      refreshed preview, material hash and standing.
    negative: false
    data_needs: >-
      Fixtures for needs_decisions, the guard and the affected records; a fixed
      clock for time-dependent changes.
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#refuses the
      execution request as a plan that is not ready
    design_sources:
      - STATE-CRM-DQ-004
    note: >-
      The design supplies this transition obligation. A runtime binding requires
      assertions for its guard, destination and associated writes in one
      sequence.
    bound_to: []
    provenance: proposed
    execution_sources: []
  - id: ATS-CRM-DQ-013-12
    title: >-
      Observe ready becoming needs_decisions after changed participants or data
      introduce an unanswered question
    category: transition
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-12
    transition:
      model: STATE-CRM-DQ-004
      index: 2
      from: ready
      to: needs_decisions
      guard: Recomputation discovers the new conflict.
      side_effects:
        - persist the recomputed preview
        - report decisions that no longer apply
    preconditions: >-
      Arrange ready standing with the transition guard satisfied: Recomputation
      discovers the new conflict.
    steps: Changed participants or data introduce an unanswered question.
    expected: >-
      Read the needs_decisions standing and inspect the associated changes:
      persist the recomputed preview; report decisions that no longer apply.
    negative: false
    data_needs: >-
      Fixtures for ready, the guard and the affected records; a fixed clock for
      time-dependent changes.
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#is
      dropped and reported when the plan is simply read again after the data
      moved on
    design_sources:
      - STATE-CRM-DQ-004
    note: >-
      The design supplies this transition obligation. A runtime binding requires
      assertions for its guard, destination and associated writes in one
      sequence.
    bound_to: []
    provenance: proposed
    execution_sources: []
  - id: ATS-CRM-DQ-013-13
    title: >-
      Observe ready becoming blocked after current planning discovers a blocking
      condition
    category: transition
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-12
      - INV-DOM-CRM-DQ-003-08
    transition:
      model: STATE-CRM-DQ-004
      index: 3
      from: ready
      to: blocked
      guard: Recomputation identifies a blocker.
      side_effects:
        - persist the blocked preview
    preconditions: >-
      Arrange ready standing with the transition guard satisfied: Recomputation
      identifies a blocker.
    steps: Current planning discovers a blocking condition.
    expected: >-
      Read the blocked standing and inspect the associated changes: persist the
      blocked preview.
    negative: false
    data_needs: >-
      Fixtures for ready, the guard and the affected records; a fixed clock for
      time-dependent changes.
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#blocks
      the merge for a column the registry declares no policy for
    design_sources:
      - STATE-CRM-DQ-004
    note: >-
      The design supplies this transition obligation. A runtime binding requires
      assertions for its guard, destination and associated writes in one
      sequence.
    bound_to: []
    provenance: proposed
    execution_sources: []
  - id: ATS-CRM-DQ-013-14
    title: >-
      Observe blocked becoming ready after a blocking condition clears and no
      required question remains
    category: transition
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-12
      - INV-DOM-CRM-DQ-003-08
    transition:
      model: STATE-CRM-DQ-004
      index: 4
      from: blocked
      to: ready
      guard: No blocker or required unanswered conflict remains.
      side_effects:
        - persist the ready preview
    preconditions: >-
      Arrange blocked standing with the transition guard satisfied: No blocker
      or required unanswered conflict remains.
    steps: A blocking condition clears and no required question remains.
    expected: >-
      Read the ready standing and inspect the associated changes: persist the
      ready preview.
    negative: false
    data_needs: >-
      Fixtures for blocked, the guard and the affected records; a fixed clock
      for time-dependent changes.
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#answers the
      validation with the plan as it is now, ready to execute
    design_sources:
      - STATE-CRM-DQ-004
    note: >-
      The design supplies this transition obligation. A runtime binding requires
      assertions for its guard, destination and associated writes in one
      sequence.
    bound_to: []
    provenance: proposed
    execution_sources: []
  - id: ATS-CRM-DQ-013-15
    title: >-
      Observe needs_decisions becoming blocked after planning discovers a
      blocker before questions are settled
    category: transition
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-12
      - INV-DOM-CRM-DQ-003-08
    transition:
      model: STATE-CRM-DQ-004
      index: 5
      from: needs_decisions
      to: blocked
      guard: Recomputation identifies a blocker.
      side_effects:
        - persist the blocked preview
    preconditions: >-
      Arrange needs_decisions standing with the transition guard satisfied:
      Recomputation identifies a blocker.
    steps: Planning discovers a blocker before questions are settled.
    expected: >-
      Read the blocked standing and inspect the associated changes: persist the
      blocked preview.
    negative: false
    data_needs: >-
      Fixtures for needs_decisions, the guard and the affected records; a fixed
      clock for time-dependent changes.
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#blocks
      the merge for a column the registry declares no policy for
    design_sources:
      - STATE-CRM-DQ-004
    note: >-
      The design supplies this transition obligation. A runtime binding requires
      assertions for its guard, destination and associated writes in one
      sequence.
    bound_to: []
    provenance: proposed
    execution_sources: []
  - id: ATS-CRM-DQ-013-16
    title: >-
      Observe blocked becoming needs_decisions after a blocker clears while
      unanswered questions remain
    category: transition
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-12
      - INV-DOM-CRM-DQ-003-08
    transition:
      model: STATE-CRM-DQ-004
      index: 6
      from: blocked
      to: needs_decisions
      guard: Recomputation still needs a required answer.
      side_effects:
        - persist the preview awaiting decisions
    preconditions: >-
      Arrange blocked standing with the transition guard satisfied:
      Recomputation still needs a required answer.
    steps: A blocker clears while unanswered questions remain.
    expected: >-
      Read the needs_decisions standing and inspect the associated changes:
      persist the preview awaiting decisions.
    negative: false
    data_needs: >-
      Fixtures for blocked, the guard and the affected records; a fixed clock
      for time-dependent changes.
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#answers the
      validation with the plan as it is now, ready to execute
    design_sources:
      - STATE-CRM-DQ-004
    note: >-
      The design supplies this transition obligation. A runtime binding requires
      assertions for its guard, destination and associated writes in one
      sequence.
    bound_to: []
    provenance: proposed
    execution_sources: []
  - id: ATS-CRM-DQ-013-17
    title: A stale answer preserves both saved decisions
    category: invariant
    level: api
    proves:
      - INV-DOM-CRM-DQ-003-03
    preconditions: A plan already changed by another administrator.
    steps: Submit an answer at the earlier version and read the saved plan.
    expected: The refusal leaves the current version and both decisions unchanged.
    negative: false
    data_needs: >-
      Records, versions and caller contexts owned by the run; transaction
      failure injection when the invariant concerns rollback.
    bound_to:
      - TST-CRM-DQ-181
    source: >-
      services-crm:modules/merges/tests/integration/services/merges/merge-plan-decisions.integration.spec.js#leaves
      both decisions on the plan, at the version it was refused against
    design_sources:
      - DOM-CRM-DQ-003
    execution_sources:
      - >-
        services-crm:modules/merges/tests/integration/services/merges/merge-plan-decisions.integration.spec.js#leaves
        both decisions on the plan, at the version it was refused against
    provenance: test
  - id: ATS-CRM-DQ-013-18
    title: A second answer retains the first answer
    category: invariant
    level: api
    proves:
      - INV-DOM-CRM-DQ-003-04
    preconditions: A plan with two answerable conflicts.
    steps: >-
      Answer the first and then the second in a request naming only that
      conflict.
    expected: The plan contains both saved answers.
    negative: false
    data_needs: >-
      Records, versions and caller contexts owned by the run; transaction
      failure injection when the invariant concerns rollback.
    bound_to:
      - TST-CRM-DQ-183
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#keeps the first
      answer when the second request answers only the other conflict
    design_sources:
      - DOM-CRM-DQ-003
    execution_sources:
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#keeps the first
        answer when the second request answers only the other conflict
    provenance: test
  - id: ATS-CRM-DQ-013-19
    title: An optional field offers only retained source values or clearing
    category: invariant
    level: unit
    proves:
      - INV-DOM-CRM-DQ-003-05
    preconditions: A preview with two distinct values for one optional field.
    steps: Inspect available choices and submit an invented value.
    expected: >-
      The displayed choices are the participant values and clearing; the
      invented choice is refused.
    negative: false
    data_needs: >-
      Records, versions and caller contexts owned by the run; transaction
      failure injection when the invariant concerns rollback.
    bound_to:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        clearing the field as well as each value held
    source: >-
      services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
      clearing the field as well as each value held
    design_sources:
      - DOM-CRM-DQ-003
    execution_sources:
      - >-
        services-crm:modules/merges/tests/unit/services/planning/contact-fields.spec.js#offers
        clearing the field as well as each value held
    provenance: test
    binding_note: >-
      The exact unit-test references remain bound as engineering evidence; unit
      files are not executable suite artifacts.
  - id: ATS-CRM-DQ-013-20
    title: Validation returns the recomputed ready preview
    category: invariant
    level: api
    proves:
      - INV-DOM-CRM-DQ-003-07
    preconditions: An open preview whose relevant source data has changed.
    steps: Validate and inspect the returned plan and saved preview.
    expected: The response reflects current records and its ready standing is persisted.
    negative: false
    data_needs: >-
      Records, versions and caller contexts owned by the run; transaction
      failure injection when the invariant concerns rollback.
    bound_to:
      - TST-CRM-DQ-183
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#answers the
      validation with the plan as it is now, ready to execute
    design_sources:
      - DOM-CRM-DQ-003
    execution_sources:
      - >-
        services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#answers the
        validation with the plan as it is now, ready to execute
    provenance: test
  - id: ATS-CRM-DQ-013-21
    title: Choice recency uses field history before record age
    category: rule
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-11
    preconditions: >-
      Two participants with conflicting values, only one carrying a captured
      change of that field.
    steps: >-
      Read the displayed timestamps and defaults, then repeat with neither
      participant carrying field history.
    expected: >-
      The history-backed choice reports its field-change instant; the fallback
      reports each record’s creation instant.
    negative: true
    data_needs: Run-owned records and caller permissions that distinguish the two cases.
    source: >-
      services-crm:modules/merges/tests/e2e/merges.e2e.spec.js#says when each
      competing value last changed, so a reader can see which is freshest (gap
      G9)
    design_sources:
      - CAP-CRM-DQ-013
    bound_to: []
    provenance: proposed
    execution_sources: []
  - id: ATS-CRM-DQ-013-22
    title: Retained values become the approved execution input
    category: interaction
    level: api
    proves:
      - BR-CAP-CRM-DQ-013-01
      - BR-CAP-CRM-DQ-013-02
      - BR-CAP-CRM-DQ-013-03
      - BR-CAP-CRM-DQ-013-04
      - BR-CAP-CRM-DQ-013-05
      - BR-CAP-CRM-DQ-013-06
      - BR-CAP-CRM-DQ-013-07
      - BR-CAP-CRM-DQ-013-08
      - BR-CAP-CRM-DQ-013-10
      - BR-CAP-CRM-DQ-013-12
      - BR-CAP-CRM-DQ-013-11
    exercises:
      - CAP-CRM-DQ-013
      - CAP-CRM-DQ-014
      - CAP-CRM-DQ-016
    workflow_sources:
      - WF-CRM-DQ-005
    preconditions: >-
      Run-owned contact and organization records, the relevant staff permissions
      and the related state described by the sequence.
    steps: >-
      Resolve a deceased-status disagreement, clear another answer, validate,
      then change a source value and submit the previously reviewed preview.
    expected: >-
      Validation and stale refusal agree with the named rules and no unapproved
      value is written.
    negative: false
    data_needs: >-
      An isolated workspace with related records and fixed timestamps; owned
      participant failure injection where requested.
    source: CAP-CRM-DQ-013; CAP-CRM-DQ-014; CAP-CRM-DQ-016; WF-CRM-DQ-005
    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/approval-binding.integration.spec.js
      - >-
        modules/merges/tests/integration/services/merges/default-basis-and-recency.integration.spec.js
      - >-
        modules/merges/tests/integration/services/merges/lookup-labels.integration.spec.js
      - >-
        modules/merges/tests/integration/services/merges/merge-plan-decisions.integration.spec.js
      - >-
        modules/merges/tests/integration/services/merges/plain-language.integration.spec.js
      - >-
        modules/merges/tests/integration/services/persistence/record-merge-plans.integration.spec.js
      - modules/merges/tests/unit/services/planning/contact-fields.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-0249.spec.ts
      - acceptance/crm/playwright/journeys/merging/CRM-ACC-0250.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-064'
  edge: 'gap: FND-CRM-DQ-064'
  failure: covered
  boundary: 'gap: FND-CRM-DQ-064'
  concurrency: covered
  invariant: covered
  interaction: covered
coverage_notes:
  permission: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
  edge: >-
    No complete scenario currently isolates this category; the finding lists the
    remaining proof obligation.
  boundary: >-
    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-064
  - key: crm.organizations.merge
    scenario_ids: []
    finding: FND-CRM-DQ-064
proof_matrix:
  - rule: BR-CAP-CRM-DQ-013-01
    scenarios:
      - ATS-CRM-DQ-013-01
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-02
    scenarios:
      - ATS-CRM-DQ-013-01
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-03
    scenarios:
      - ATS-CRM-DQ-013-02
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-04
    scenarios:
      - ATS-CRM-DQ-013-03
      - ATS-CRM-DQ-013-11
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-05
    scenarios:
      - ATS-CRM-DQ-013-04
      - ATS-CRM-DQ-013-10
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-06
    scenarios:
      - ATS-CRM-DQ-013-05
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-07
    scenarios:
      - ATS-CRM-DQ-013-06
      - ATS-CRM-DQ-013-10
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-08
    scenarios:
      - ATS-CRM-DQ-013-07
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-10
    scenarios:
      - ATS-CRM-DQ-013-08
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-11
    scenarios:
      - ATS-CRM-DQ-013-21
      - ATS-CRM-DQ-013-22
  - rule: BR-CAP-CRM-DQ-013-12
    scenarios:
      - ATS-CRM-DQ-013-09
      - ATS-CRM-DQ-013-12
      - ATS-CRM-DQ-013-13
      - ATS-CRM-DQ-013-14
      - ATS-CRM-DQ-013-15
      - ATS-CRM-DQ-013-16
      - ATS-CRM-DQ-013-22
interaction_coverage:
  related:
    - CAP-CRM-DQ-014
    - CAP-CRM-DQ-016
  workflow_sources:
    - WF-CRM-DQ-005
  scenarios:
    - ATS-CRM-DQ-013-22
---

# Resolve differences in the merge preview: 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-013-01` | `ATS-CRM-DQ-013-01`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-02` | `ATS-CRM-DQ-013-01`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-03` | `ATS-CRM-DQ-013-02`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-04` | `ATS-CRM-DQ-013-03`, `ATS-CRM-DQ-013-11`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-05` | `ATS-CRM-DQ-013-04`, `ATS-CRM-DQ-013-10`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-06` | `ATS-CRM-DQ-013-05`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-07` | `ATS-CRM-DQ-013-06`, `ATS-CRM-DQ-013-10`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-08` | `ATS-CRM-DQ-013-07`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-10` | `ATS-CRM-DQ-013-08`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-11` | `ATS-CRM-DQ-013-21`, `ATS-CRM-DQ-013-22` |
| `BR-CAP-CRM-DQ-013-12` | `ATS-CRM-DQ-013-09`, `ATS-CRM-DQ-013-12`, `ATS-CRM-DQ-013-13`, `ATS-CRM-DQ-013-14`, `ATS-CRM-DQ-013-15`, `ATS-CRM-DQ-013-16`, `ATS-CRM-DQ-013-22` |

## Interactions With Related Capabilities

Resolve a deceased-status disagreement, clear another answer, validate, then change a source value and submit the previously reviewed preview.

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.
