---
source_sha:
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
finding_evidence:
  - finding: FND-CRM-DQ-001
    source: 'specs/PRODUCT-AREAS.md (MOD-CRM-DQ row); react-console:components/duplicates, components/console/duplicates, lib/duplicates, components/records/create/duplicate-block-refusal.tsx, acceptance/crm/playwright/journeys/merging, acceptance/crm/inventory; services-crm:tests/integration/db/merge-coverage.integration.spec.ts, tests/aws/duplicate-rescans.synth.ts, tests/aws/record-merges.synth.ts, docs/milestones/CRM-M6-access-and-audit.md#D-21'
  - finding: FND-CRM-DQ-002
    source: 'react-console:acceptance/crm/journeys/merging/*.json (automation); acceptance/crm/playwright/journeys/merging/*.spec.ts'
  - finding: FND-CRM-DQ-003
    source: 'react-console:acceptance/crm/inventory/business-rules.json#RUL-CRM-MRG-016, RUL-CRM-MRG-073, RUL-CRM-MRG-074, RUL-CRM-MRG-076; capabilities.json#CAP-CRM-MRG-003; services-crm:modules/merges/services/jobs/record-merge-job.ts:recordMergeWorkflow'
  - finding: FND-CRM-DQ-004
    source: 'services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md (Status, Plan); docs/merging/README.md#Status; docs/merging/experience/README.md#Status; docs/merging/architecture.md, conflict-resolution.md, duplicate-detection.md, implementation-plan.md (Status lines); docs/merging/experience/functional-requirements.md (Status)'
  - finding: FND-CRM-DQ-005
    source: 'services-crm:docs/merging/architecture.md#4.4 Plan lifetime; modules/merges/aws/api/merges.routes.ts:requireAccessToPlan; react-console:acceptance/crm/inventory/business-rules.json#RUL-CRM-MRG-075'
  - finding: FND-CRM-DQ-006
    source: 'services-crm:docs/merging/architecture.md#4.4 Plan lifetime and #C.4; modules/merges/db/record-merges.table.ts (header); modules/merges/services/persistence/record-merge-plans.ts:expireRecordMergePlans'
  - finding: FND-CRM-DQ-007
    source: 'services-crm:docs/merging/architecture.md#1. Where the capabilities live; docs/merging/api.md#POST /merges/{tenantId}/plans/{planId}/executions; react-console:acceptance/crm/journeys/merging/CRM-ACC-0264.json'
  - finding: FND-CRM-DQ-008
    source: 'services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#CRM-Q3; modules/merges/services/planning/merge-engine.ts:planReferences'
  - finding: FND-CRM-DQ-009
    source: 'services-crm:modules/merges/services/merges/merge-events.ts:publishMergeEvent; modules/merges/tests/e2e/business-events.e2e.spec.js; docs/merging/architecture.md#7.3 Downstream effects of the deletes and the survivor update'
  - finding: FND-CRM-DQ-010
    source: 'services-crm:docs/merging/decisions.md#D4; modules/merges/db/record-merges.table.ts (header); modules/merges/tests/integration/db/record-merges.table.integration.spec.js#may not erase a merge, which holds the only copy left of the records it deleted'
  - finding: FND-CRM-DQ-011
    source: 'services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#Requests from other applications'
  - finding: FND-CRM-DQ-012
    source: 'services-crm:docs/merging/experience/functional-requirements.md#DQ-10, MAN-7, REV-6; react-console:lib/duplicates/crm-adapter.ts (listRescans has no screen caller); acceptance/crm/journeys/merging/CRM-ACC-0245.json, CRM-ACC-0246.json, CRM-ACC-0252.json (blocked_reason)'
  - finding: FND-CRM-DQ-013
    source: 'services-crm:docs/merging/api.md (Status line); modules/duplicates/aws/api/duplicates.routes.ts; modules/duplicates/tests/e2e/*.e2e.spec.js'
  - finding: FND-CRM-DQ-014
    source: 'services-crm:docs/merging/api.md#6. Changes to existing routes; specs/crm/entities/MODULE.md (listOrganizationHistory)'
  - finding: FND-CRM-DQ-015
    source: 'services-crm:docs/merging/architecture.md#4.1 Inputs; docs/merging/conflict-resolution.md#8. Which record the system recommends keeping'
  - finding: FND-CRM-DQ-016
    source: 'services-crm:modules/duplicates/services/detection/duplicate-change-events.ts:importJobIdOf; detectForRecords callers (rescan worker and change-event handler only)'
  - finding: FND-CRM-DQ-017
    source: 'services-crm:modules/duplicates/attention/open-duplicate-groups.attention.ts; modules/duplicates/services/persistence/duplicate-group-attention-items.ts'
  - finding: FND-CRM-DQ-018
    source: 'services-crm:docs/merging/duplicate-detection.md#3. Match keys (D-47); docs/merging/api.md#2. Authorization (D-21, D-45); docs/milestones/CRM-M6-access-and-audit.md#D-21; docs/milestones/*.md (no D-45, no D-47)'
  - finding: FND-CRM-DQ-019
    source: 'services-crm:modules/duplicates/db/duplicate-rules.table.ts (check_portal); modules/tenant-lifecycle/services/participants/duplicate-rule-seeds.ts; docs/merging/duplicate-detection.md#15'
  - finding: FND-CRM-DQ-020
    source: 'services-crm:docs/merging/decisions.md#D5; docs/merging/duplicate-detection.md#9. Calibration and #13 (What is not measured)'
  - finding: FND-CRM-DQ-021
    source: 'react-console:acceptance/crm/journeys/merging/CRM-ACC-0242.json (blocked_reason); components/records/create/duplicate-block-refusal.tsx; services-crm:docs/milestones/CRM-M1-contacts-and-organizations.plan.md#CRM-ACC-0042'
  - finding: FND-CRM-DQ-022
    source: 'services-crm:docs/merging/architecture.md#14.1 Non-negotiable invariants (2); react-console:acceptance/crm/journeys/merging/CRM-ACC-0268.json (story)'
  - finding: FND-CRM-DQ-023
    source: 'react-console:app/(console)/console/[tenantId]/crm/merges/new/page.tsx and plans/[planId]/page.tsx (RequirePermission any-of); lib/authz/guard.tsx'
  - finding: FND-CRM-DQ-024
    source: 'services-crm:modules/merges/tests/unit/services/planning/merge-decisions.spec.js#is blocked when Platform answers that two participants hold logins'
    additional_sources:
      - 'react-console:acceptance/crm/journeys/merging/CRM-ACC-0260.json'
  - finding: FND-CRM-DQ-025
    source: 'rhythm-v2-docs:briefs/planning/crm-data-quality.brief.md (absent at 88ab0e84d1a54e6d01cd481a02038fcdee3736e2 and fetched origin/master)'
  - finding: FND-CRM-DQ-026
    source: 'services-crm:modules/merges/services/planning/merge-engine.ts:dependentsOf; services-crm:modules/merges/services/planning/merge-engine.ts:materialPlanHash; services-crm:modules/merges/tests/unit/services/planning/organization-decisions.spec.js#keeps the material plan hash when only more affiliations move without combining'
  - finding: FND-CRM-DQ-027
    source: 'services-crm:modules/duplicates/tests/integration/services/detection/duplicate-change-events.integration.spec.js#fails every event of the group, so the queue delivers the whole group again'
  - finding: FND-CRM-DQ-028
    source: 'services-crm:modules/duplicates/aws/api/duplicates.routes.ts:getDuplicateRescan'
  - finding: FND-CRM-DQ-029
    source: 'services-crm:modules/merges/services/planning/plan-changes.ts:describeOne; services-crm:modules/merges/services/planning/merge-labels.ts; services-crm:modules/merges/services/planning/merge-plan.ts:MergeSnapshot'
  - finding: FND-CRM-DQ-030
    source: 'services-crm:modules/merges/services/merges/merge-plans.ts:readMergePlan; services-crm:modules/merges/services/merges/merge-plans.ts:queueMergeExecution'
  - finding: FND-CRM-DQ-031
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0245.spec.ts:11; react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0246.spec.ts:11; react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0247.spec.ts:10; react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0262.spec.ts:118; react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0283.spec.ts:176; react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0271.spec.ts:124'
  - finding: FND-CRM-DQ-032
    source: specs/crm/data-quality/planning/capabilities (must_prove flags compared with rule behavior)
  - finding: FND-CRM-DQ-033
    source: 'react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0241.spec.ts:116; react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0241.spec.ts:127; services-crm:docs/milestones/CRM-M4-duplicates-and-merge.md#D-32'
  - finding: FND-CRM-DQ-034
    source: specs/PRODUCT-AREAS.md#MOD-CRM-DQ
  - finding: FND-CRM-DQ-035
    source: 'services-platform (not checked out for this job); services-crm:modules/duplicates/db/duplicate-rescans.table.ts and docs/change-events.md (citations of docs/queued-work.md, docs/jobs.md, docs/record-history.md and the standards)'
  - finding: FND-CRM-DQ-036
    source: 'specs/PRODUCT-AREAS.md#MOD-CRM-DQ; services-crm:aws/lambda/JOB_RECONCILER.ts, aws/crm.record-merges.names.ts, aws/crm.duplicate-rescans.names.ts, db/migrations/0077_portal_sign_up_contacts.sql, modules/tenant-lifecycle/services/participants/duplicates-participant.ts, merges-participant.ts, duplicate-rule-seeds.ts, modules/entities/services/persistence/contacts.ts (exception and regroup calls)'
  - finding: FND-CRM-DQ-037
    source: specs/CONVENTIONS.md#9.8 Inference Operation; specs/crm/data-quality/MODULE.md
  - finding: FND-CRM-DQ-038
    source: 'services-crm:modules/merges/services/merges/merge-plans.ts:readMergePlan, replanned, assertPlanIsTheOneLastShown; modules/merges/aws/api/merges.routes.ts:getMergePlan (GET, PLAN_AUTHORIZATION)'
  - finding: FND-CRM-DQ-039
    source: 'services-crm:modules/duplicates/services/persistence/duplicate-rescans.ts:claimDuplicateRescanBatches; modules/duplicates/services/queue/rescan-dispatch.ts (claim_seconds 600); aws/crm.duplicate-rescans.names.ts (DUPLICATE_RESCAN_VISIBILITY_TIMEOUT_SECONDS 1800, MAX_RECEIVE_COUNT 3); modules/duplicates/services/queue/rescan-worker.ts'
  - finding: FND-CRM-DQ-040
    source: 'services-crm:modules/duplicates/services/persistence/duplicate-rescans.ts:claimDuplicateRescanBatches, completeDuplicateRescanBatch, runningDuplicateRescanObjectTypes (comment); db/duplicate-rescans.table.ts (no unique index)'
  - finding: FND-CRM-DQ-041
    source: 'services-crm:modules/merges/services/persistence/record-merge-plans.ts:defaultExpiry, updateRecordMergePlan, expireRecordMergePlans (SETTLED_PLAN_STATUSES); modules/merges/services/merges/merge-plans.ts (no expires_at passed)'
  - finding: FND-CRM-DQ-042
    source: 'services-crm:modules/merges/services/jobs/record-merge-job.ts:registerRecordMergeJobType (submitPermission)'
  - finding: FND-CRM-DQ-043
    source: 'rhythm-v2-docs:briefs/design/crm-data-quality.brief.md (absent at 0d19295a5cdfa9bf398be6f0e0032d54bd840ede)'
  - finding: FND-CRM-DQ-044
    source: 'services-crm:modules/duplicates/services/detection/duplicate-detection.ts:detectForRecords; modules/duplicates/services/persistence/duplicate-candidates.ts:upsertDuplicateCandidates'
  - finding: FND-CRM-DQ-045
    source: 'services-crm:modules/duplicates/services/detection/duplicate-detection.ts:detectForRecords; modules/duplicates/tests/integration/services/detection/duplicate-change-events.integration.spec.js#left the records unkeyed, which is what makes delivering the group again the right answer'
  - finding: FND-CRM-DQ-046
    source: 'services-crm:modules/merges/services/merges/merge-execution.ts:executeMerge; modules/merges/services/jobs/record-merge-job-tasks.ts:executeRecordMergeOperation'
  - finding: FND-CRM-DQ-047
    source: 'react-console:components/duplicates/data-quality/overview.tsx:metricsFor; components/duplicates/history/use-merge-history.ts; components/console/duplicates/merge-details-screen.tsx; app/(console)/console/[tenantId]/crm/dataQuality/merges/[mergeId]/page.tsx; lib/duplicates/crm-adapter.ts:listMerges; react-console:lib/duplicates/crm-adapter.ts:decidePairs; react-console:lib/configuration/duplicate-rules.ts:reorder'
  - finding: FND-CRM-DQ-048
    source: 'services-crm:modules/merges/db/record-merge-plans.table.ts; modules/merges/db/record-merge-jobs.table.ts; modules/merges/services/persistence/record-merge-plans.ts'
  - finding: FND-CRM-DQ-049
    source: 'services-crm:modules/merges/services/merges/merge-execution.ts:mergeInOneTransaction; modules/merges/services/persistence/merge-executions.ts'
  - finding: FND-CRM-DQ-050
    source: 'services-crm:modules/duplicates/services/persistence/duplicate-rescans.ts:readDuplicateRescanBatchRecordIds; modules/duplicates/db/duplicate-rescans.table.ts:duplicate_rescans_progress_check'
  - finding: FND-CRM-DQ-051
    source: 'services-crm:db/migrations/0077_portal_sign_up_contacts.sql; modules/tenant-lifecycle/services/participants/duplicates-participant.ts; modules/tenant-lifecycle/services/participants/merges-participant.ts'
testing_coverage_gaps:
  - finding: FND-CRM-DQ-052
    scope: CAP-CRM-DQ-001
    missing_categories:
      - validation
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-001-01
      - ATS-CRM-DQ-001-12
      - ATS-CRM-DQ-001-13
      - ATS-CRM-DQ-001-14
      - ATS-CRM-DQ-001-15
      - ATS-CRM-DQ-001-16
      - ATS-CRM-DQ-001-19
      - ATS-CRM-DQ-001-20
    permission_obligations: []
    workflow_sources:
      - WF-CRM-DQ-001
      - WF-CRM-DQ-002
    source: CAP-CRM-DQ-001; ATS-CRM-DQ-001; WF-CRM-DQ-001; WF-CRM-DQ-002
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: validation
        provenance: unknown
        source: FND-CRM-DQ-052
        obligation: 'Prove malformed inputs, unavailable identities and versions leave prior records intact at the capability boundary.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-052
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-001
        provenance: unknown
        source: FND-CRM-DQ-052
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-002
        provenance: unknown
        source: FND-CRM-DQ-052
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-053
    scope: CAP-CRM-DQ-002
    missing_categories:
      - transition
      - validation
      - permission
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-002-11
    permission_obligations:
      - key: crm.duplicates.read
        scenario_ids: []
        finding: FND-CRM-DQ-053
    workflow_sources:
      - WF-CRM-DQ-001
    source: CAP-CRM-DQ-002; ATS-CRM-DQ-002; WF-CRM-DQ-001
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: transition
        provenance: unknown
        source: FND-CRM-DQ-053
        obligation: Identify whether this read or calculation owns a lifecycle change; prove any affected-object transition or record why no transition applies.
      - category: validation
        provenance: unknown
        source: FND-CRM-DQ-053
        obligation: 'Prove malformed inputs, unavailable identities and versions leave prior records intact at the capability boundary.'
      - category: permission
        provenance: unknown
        source: FND-CRM-DQ-053
        obligation: 'Prove each named read, merge and administration permission independently, including wrong-type and missing-key contexts.'
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-053
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-053
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-001
        provenance: unknown
        source: FND-CRM-DQ-053
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-054
    scope: CAP-CRM-DQ-003
    missing_categories:
      - failure
    unbound_scenarios:
      - ATS-CRM-DQ-003-11
      - ATS-CRM-DQ-003-12
    permission_obligations:
      - key: crm.duplicates.configure
        scenario_ids:
          - ATS-CRM-DQ-003-08
        finding: FND-CRM-DQ-054
    workflow_sources:
      - WF-CRM-DQ-001
      - WF-CRM-DQ-002
      - WF-CRM-DQ-003
      - WF-CRM-DQ-009
    source: CAP-CRM-DQ-003; ATS-CRM-DQ-003; WF-CRM-DQ-001; WF-CRM-DQ-002; WF-CRM-DQ-003; WF-CRM-DQ-009
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-054
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
    workflow_obligations:
      - workflow: WF-CRM-DQ-001
        provenance: unknown
        source: FND-CRM-DQ-054
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-002
        provenance: unknown
        source: FND-CRM-DQ-054
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-003
        provenance: unknown
        source: FND-CRM-DQ-054
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-009
        provenance: unknown
        source: FND-CRM-DQ-054
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-055
    scope: CAP-CRM-DQ-004
    missing_categories:
      - transition
      - edge
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-004-11
      - ATS-CRM-DQ-004-12
    permission_obligations:
      - key: crm.duplicates.read
        scenario_ids:
          - ATS-CRM-DQ-004-03
          - ATS-CRM-DQ-004-06
          - ATS-CRM-DQ-004-11
        finding: FND-CRM-DQ-055
      - key: crm.contacts.create-despite-duplicate-block
        scenario_ids:
          - ATS-CRM-DQ-004-03
          - ATS-CRM-DQ-004-06
          - ATS-CRM-DQ-004-11
        finding: FND-CRM-DQ-055
      - key: crm.organizations.create-despite-duplicate-block
        scenario_ids:
          - ATS-CRM-DQ-004-03
          - ATS-CRM-DQ-004-06
          - ATS-CRM-DQ-004-11
        finding: FND-CRM-DQ-055
    workflow_sources:
      - WF-CRM-DQ-003
      - WF-CRM-DQ-009
    source: CAP-CRM-DQ-004; ATS-CRM-DQ-004; WF-CRM-DQ-003; WF-CRM-DQ-009
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: transition
        provenance: unknown
        source: FND-CRM-DQ-055
        obligation: Identify whether this read or calculation owns a lifecycle change; prove any affected-object transition or record why no transition applies.
      - category: edge
        provenance: unknown
        source: FND-CRM-DQ-055
        obligation: 'Specify empty, removed, locked or already-settled records and establish their visible outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-055
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-003
        provenance: unknown
        source: FND-CRM-DQ-055
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-009
        provenance: unknown
        source: FND-CRM-DQ-055
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-056
    scope: CAP-CRM-DQ-005
    missing_categories:
      - validation
    unbound_scenarios:
      - ATS-CRM-DQ-005-06
      - ATS-CRM-DQ-005-07
      - ATS-CRM-DQ-005-08
      - ATS-CRM-DQ-005-09
      - ATS-CRM-DQ-005-10
      - ATS-CRM-DQ-005-11
      - ATS-CRM-DQ-005-12
      - ATS-CRM-DQ-005-13
      - ATS-CRM-DQ-005-14
      - ATS-CRM-DQ-005-15
      - ATS-CRM-DQ-005-16
      - ATS-CRM-DQ-005-17
      - ATS-CRM-DQ-005-18
      - ATS-CRM-DQ-005-19
      - ATS-CRM-DQ-005-20
      - ATS-CRM-DQ-005-21
      - ATS-CRM-DQ-005-24
      - ATS-CRM-DQ-005-25
    permission_obligations:
      - key: crm.duplicates.configure
        scenario_ids:
          - ATS-CRM-DQ-005-01
        finding: FND-CRM-DQ-056
    workflow_sources:
      - WF-CRM-DQ-002
    source: CAP-CRM-DQ-005; ATS-CRM-DQ-005; WF-CRM-DQ-002
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: validation
        provenance: unknown
        source: FND-CRM-DQ-056
        obligation: 'Prove malformed inputs, unavailable identities and versions leave prior records intact at the capability boundary.'
    workflow_obligations:
      - workflow: WF-CRM-DQ-002
        provenance: unknown
        source: FND-CRM-DQ-056
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-057
    scope: CAP-CRM-DQ-006
    missing_categories:
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-006-07
      - ATS-CRM-DQ-006-08
    permission_obligations: []
    workflow_sources:
      - WF-CRM-DQ-008
    source: CAP-CRM-DQ-006; ATS-CRM-DQ-006; WF-CRM-DQ-008
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-057
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-057
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-008
        provenance: unknown
        source: FND-CRM-DQ-057
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-058
    scope: CAP-CRM-DQ-007
    missing_categories:
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-007-09
      - ATS-CRM-DQ-007-10
      - ATS-CRM-DQ-007-11
      - ATS-CRM-DQ-007-12
      - ATS-CRM-DQ-007-15
    permission_obligations:
      - key: crm.duplicates.read
        scenario_ids:
          - ATS-CRM-DQ-007-07
        finding: FND-CRM-DQ-058
    workflow_sources:
      - WF-CRM-DQ-001
      - WF-CRM-DQ-004
    source: CAP-CRM-DQ-007; ATS-CRM-DQ-007; WF-CRM-DQ-001; WF-CRM-DQ-004
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-058
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-058
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-001
        provenance: unknown
        source: FND-CRM-DQ-058
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-004
        provenance: unknown
        source: FND-CRM-DQ-058
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-059
    scope: CAP-CRM-DQ-008
    missing_categories:
      - failure
      - boundary
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-008-09
      - ATS-CRM-DQ-008-10
      - ATS-CRM-DQ-008-11
      - ATS-CRM-DQ-008-12
      - ATS-CRM-DQ-008-13
      - ATS-CRM-DQ-008-14
      - ATS-CRM-DQ-008-15
      - ATS-CRM-DQ-008-16
      - ATS-CRM-DQ-008-17
      - ATS-CRM-DQ-008-18
    permission_obligations:
      - key: crm.duplicates.review
        scenario_ids:
          - ATS-CRM-DQ-008-07
        finding: FND-CRM-DQ-059
    workflow_sources:
      - WF-CRM-DQ-001
      - WF-CRM-DQ-004
    source: CAP-CRM-DQ-008; ATS-CRM-DQ-008; WF-CRM-DQ-001; WF-CRM-DQ-004
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-059
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: boundary
        provenance: unknown
        source: FND-CRM-DQ-059
        obligation: 'Prove exact supported limits, one case on either side and independence between workspaces and record types.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-059
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-001
        provenance: unknown
        source: FND-CRM-DQ-059
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-004
        provenance: unknown
        source: FND-CRM-DQ-059
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-060
    scope: CAP-CRM-DQ-009
    missing_categories:
      - edge
      - failure
      - boundary
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-CRM-DQ-009-05
      - ATS-CRM-DQ-009-06
      - ATS-CRM-DQ-009-07
      - ATS-CRM-DQ-009-08
      - ATS-CRM-DQ-009-09
    permission_obligations:
      - key: crm.duplicates.review
        scenario_ids:
          - ATS-CRM-DQ-009-04
        finding: FND-CRM-DQ-060
    workflow_sources:
      - WF-CRM-DQ-004
    source: CAP-CRM-DQ-009; ATS-CRM-DQ-009; WF-CRM-DQ-004
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: edge
        provenance: unknown
        source: FND-CRM-DQ-060
        obligation: 'Specify empty, removed, locked or already-settled records and establish their visible outcome.'
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-060
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: boundary
        provenance: unknown
        source: FND-CRM-DQ-060
        obligation: 'Prove exact supported limits, one case on either side and independence between workspaces and record types.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-060
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
      - category: invariant
        provenance: unknown
        source: FND-CRM-DQ-060
        obligation: Link the capability outcome to the affected domain invariants and prove its refusal or repeated-operation case.
    workflow_obligations:
      - workflow: WF-CRM-DQ-004
        provenance: unknown
        source: FND-CRM-DQ-060
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-061
    scope: CAP-CRM-DQ-010
    missing_categories:
      - transition
      - validation
      - failure
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-CRM-DQ-010-04
      - ATS-CRM-DQ-010-07
    permission_obligations:
      - key: crm.duplicates.read
        scenario_ids:
          - ATS-CRM-DQ-010-05
        finding: FND-CRM-DQ-061
      - key: crm.contacts.merge
        scenario_ids:
          - ATS-CRM-DQ-010-05
        finding: FND-CRM-DQ-061
      - key: crm.organizations.merge
        scenario_ids:
          - ATS-CRM-DQ-010-05
        finding: FND-CRM-DQ-061
    workflow_sources:
      - WF-CRM-DQ-004
    source: CAP-CRM-DQ-010; ATS-CRM-DQ-010; WF-CRM-DQ-004
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: transition
        provenance: unknown
        source: FND-CRM-DQ-061
        obligation: Identify whether this read or calculation owns a lifecycle change; prove any affected-object transition or record why no transition applies.
      - category: validation
        provenance: unknown
        source: FND-CRM-DQ-061
        obligation: 'Prove malformed inputs, unavailable identities and versions leave prior records intact at the capability boundary.'
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-061
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-061
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
      - category: invariant
        provenance: unknown
        source: FND-CRM-DQ-061
        obligation: Link the capability outcome to the affected domain invariants and prove its refusal or repeated-operation case.
    workflow_obligations:
      - workflow: WF-CRM-DQ-004
        provenance: unknown
        source: FND-CRM-DQ-061
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-062
    scope: CAP-CRM-DQ-011
    missing_categories:
      - transition
      - validation
      - edge
      - failure
      - concurrency
      - invariant
    unbound_scenarios:
      - ATS-CRM-DQ-011-04
      - ATS-CRM-DQ-011-05
    permission_obligations:
      - key: crm.duplicates.read
        scenario_ids:
          - ATS-CRM-DQ-011-03
        finding: FND-CRM-DQ-062
    workflow_sources:
      - WF-CRM-DQ-001
    source: CAP-CRM-DQ-011; ATS-CRM-DQ-011; WF-CRM-DQ-001
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: transition
        provenance: unknown
        source: FND-CRM-DQ-062
        obligation: Identify whether this read or calculation owns a lifecycle change; prove any affected-object transition or record why no transition applies.
      - category: validation
        provenance: unknown
        source: FND-CRM-DQ-062
        obligation: 'Prove malformed inputs, unavailable identities and versions leave prior records intact at the capability boundary.'
      - category: edge
        provenance: unknown
        source: FND-CRM-DQ-062
        obligation: 'Specify empty, removed, locked or already-settled records and establish their visible outcome.'
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-062
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-062
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
      - category: invariant
        provenance: unknown
        source: FND-CRM-DQ-062
        obligation: Link the capability outcome to the affected domain invariants and prove its refusal or repeated-operation case.
    workflow_obligations:
      - workflow: WF-CRM-DQ-001
        provenance: unknown
        source: FND-CRM-DQ-062
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-063
    scope: CAP-CRM-DQ-012
    missing_categories:
      - validation
      - edge
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-012-08
      - ATS-CRM-DQ-012-09
      - ATS-CRM-DQ-012-10
      - ATS-CRM-DQ-012-11
      - ATS-CRM-DQ-012-12
      - ATS-CRM-DQ-012-13
      - ATS-CRM-DQ-012-14
      - ATS-CRM-DQ-012-15
      - ATS-CRM-DQ-012-17
      - ATS-CRM-DQ-012-18
    permission_obligations:
      - key: crm.contacts.merge
        scenario_ids:
          - ATS-CRM-DQ-012-02
        finding: FND-CRM-DQ-063
      - key: crm.contacts.read
        scenario_ids:
          - ATS-CRM-DQ-012-02
        finding: FND-CRM-DQ-063
      - key: crm.organizations.merge
        scenario_ids:
          - ATS-CRM-DQ-012-02
        finding: FND-CRM-DQ-063
      - key: crm.organizations.read
        scenario_ids:
          - ATS-CRM-DQ-012-02
        finding: FND-CRM-DQ-063
    workflow_sources:
      - WF-CRM-DQ-005
      - WF-CRM-DQ-007
    source: CAP-CRM-DQ-012; ATS-CRM-DQ-012; WF-CRM-DQ-005; WF-CRM-DQ-007
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: validation
        provenance: unknown
        source: FND-CRM-DQ-063
        obligation: 'Prove malformed inputs, unavailable identities and versions leave prior records intact at the capability boundary.'
      - category: edge
        provenance: unknown
        source: FND-CRM-DQ-063
        obligation: 'Specify empty, removed, locked or already-settled records and establish their visible outcome.'
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-063
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-063
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-005
        provenance: unknown
        source: FND-CRM-DQ-063
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-007
        provenance: unknown
        source: FND-CRM-DQ-063
        unqualified_hops:
          - 1
          - 2
          - 3
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-064
    scope: CAP-CRM-DQ-013
    missing_categories:
      - permission
      - edge
      - boundary
    unbound_scenarios:
      - ATS-CRM-DQ-013-11
      - 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-21
      - ATS-CRM-DQ-013-22
    permission_obligations:
      - key: crm.contacts.merge
        scenario_ids: []
        finding: FND-CRM-DQ-064
      - key: crm.organizations.merge
        scenario_ids: []
        finding: FND-CRM-DQ-064
    workflow_sources:
      - WF-CRM-DQ-005
    source: CAP-CRM-DQ-013; ATS-CRM-DQ-013; WF-CRM-DQ-005
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: permission
        provenance: unknown
        source: FND-CRM-DQ-064
        obligation: 'Prove each named read, merge and administration permission independently, including wrong-type and missing-key contexts.'
      - category: edge
        provenance: unknown
        source: FND-CRM-DQ-064
        obligation: 'Specify empty, removed, locked or already-settled records and establish their visible outcome.'
      - category: boundary
        provenance: unknown
        source: FND-CRM-DQ-064
        obligation: 'Prove exact supported limits, one case on either side and independence between workspaces and record types.'
    workflow_obligations:
      - workflow: WF-CRM-DQ-005
        provenance: unknown
        source: FND-CRM-DQ-064
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-065
    scope: CAP-CRM-DQ-014
    missing_categories:
      - permission
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-014-15
      - ATS-CRM-DQ-014-16
    permission_obligations:
      - key: crm.contacts.merge
        scenario_ids: []
        finding: FND-CRM-DQ-065
    workflow_sources:
      - WF-CRM-DQ-005
      - WF-CRM-DQ-006
    source: CAP-CRM-DQ-014; ATS-CRM-DQ-014; WF-CRM-DQ-005; WF-CRM-DQ-006
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: permission
        provenance: unknown
        source: FND-CRM-DQ-065
        obligation: 'Prove each named read, merge and administration permission independently, including wrong-type and missing-key contexts.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-065
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-005
        provenance: unknown
        source: FND-CRM-DQ-065
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-006
        provenance: unknown
        source: FND-CRM-DQ-065
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-066
    scope: CAP-CRM-DQ-015
    missing_categories:
      - rule
      - permission
      - boundary
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-015-10
      - ATS-CRM-DQ-015-11
      - ATS-CRM-DQ-015-12
      - ATS-CRM-DQ-015-15
    permission_obligations:
      - key: crm.contacts.merge
        scenario_ids: []
        finding: FND-CRM-DQ-066
      - key: crm.organizations.merge
        scenario_ids: []
        finding: FND-CRM-DQ-066
    workflow_sources:
      - WF-CRM-DQ-005
      - WF-CRM-DQ-006
    source: CAP-CRM-DQ-015; ATS-CRM-DQ-015; WF-CRM-DQ-005; WF-CRM-DQ-006
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: rule
        provenance: unknown
        source: FND-CRM-DQ-066
        obligation: Provide a dedicated scenario for the governing rule independently of the related seam sequence.
      - category: permission
        provenance: unknown
        source: FND-CRM-DQ-066
        obligation: 'Prove each named read, merge and administration permission independently, including wrong-type and missing-key contexts.'
      - category: boundary
        provenance: unknown
        source: FND-CRM-DQ-066
        obligation: 'Prove exact supported limits, one case on either side and independence between workspaces and record types.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-066
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-005
        provenance: unknown
        source: FND-CRM-DQ-066
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-006
        provenance: unknown
        source: FND-CRM-DQ-066
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-067
    scope: CAP-CRM-DQ-016
    missing_categories:
      - permission
      - edge
    unbound_scenarios:
      - ATS-CRM-DQ-016-13
      - ATS-CRM-DQ-016-15
      - ATS-CRM-DQ-016-16
      - ATS-CRM-DQ-016-17
      - ATS-CRM-DQ-016-18
      - ATS-CRM-DQ-016-19
      - ATS-CRM-DQ-016-20
      - ATS-CRM-DQ-016-21
      - ATS-CRM-DQ-016-22
      - ATS-CRM-DQ-016-23
      - ATS-CRM-DQ-016-28
      - ATS-CRM-DQ-016-29
      - ATS-CRM-DQ-016-34
      - ATS-CRM-DQ-016-35
      - ATS-CRM-DQ-016-36
      - ATS-CRM-DQ-016-37
      - ATS-CRM-DQ-016-38
    permission_obligations:
      - key: crm.contacts.merge
        scenario_ids: []
        finding: FND-CRM-DQ-067
      - key: crm.organizations.merge
        scenario_ids: []
        finding: FND-CRM-DQ-067
      - key: crm.merges.read
        scenario_ids: []
        finding: FND-CRM-DQ-067
    workflow_sources:
      - WF-CRM-DQ-006
      - WF-CRM-DQ-007
    source: CAP-CRM-DQ-016; ATS-CRM-DQ-016; WF-CRM-DQ-006; WF-CRM-DQ-007
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: permission
        provenance: unknown
        source: FND-CRM-DQ-067
        obligation: 'Prove each named read, merge and administration permission independently, including wrong-type and missing-key contexts.'
      - category: edge
        provenance: unknown
        source: FND-CRM-DQ-067
        obligation: 'Specify empty, removed, locked or already-settled records and establish their visible outcome.'
    workflow_obligations:
      - workflow: WF-CRM-DQ-006
        provenance: unknown
        source: FND-CRM-DQ-067
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-007
        provenance: unknown
        source: FND-CRM-DQ-067
        unqualified_hops:
          - 1
          - 2
          - 3
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-068
    scope: CAP-CRM-DQ-017
    missing_categories:
      - permission
      - failure
    unbound_scenarios:
      - ATS-CRM-DQ-017-08
      - ATS-CRM-DQ-017-09
      - ATS-CRM-DQ-017-10
      - ATS-CRM-DQ-017-11
    permission_obligations:
      - key: crm.organizations.merge
        scenario_ids: []
        finding: FND-CRM-DQ-068
      - key: crm.organizations.read
        scenario_ids: []
        finding: FND-CRM-DQ-068
    workflow_sources:
      - WF-CRM-DQ-005
      - WF-CRM-DQ-006
    source: CAP-CRM-DQ-017; ATS-CRM-DQ-017; WF-CRM-DQ-005; WF-CRM-DQ-006
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: permission
        provenance: unknown
        source: FND-CRM-DQ-068
        obligation: 'Prove each named read, merge and administration permission independently, including wrong-type and missing-key contexts.'
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-068
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
    workflow_obligations:
      - workflow: WF-CRM-DQ-005
        provenance: unknown
        source: FND-CRM-DQ-068
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-006
        provenance: unknown
        source: FND-CRM-DQ-068
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-069
    scope: CAP-CRM-DQ-018
    missing_categories:
      - validation
      - permission
      - edge
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-018-09
      - ATS-CRM-DQ-018-10
      - ATS-CRM-DQ-018-11
      - ATS-CRM-DQ-018-12
      - ATS-CRM-DQ-018-13
      - ATS-CRM-DQ-018-18
    permission_obligations:
      - key: crm.merges.read
        scenario_ids: []
        finding: FND-CRM-DQ-069
    workflow_sources:
      - WF-CRM-DQ-006
      - WF-CRM-DQ-009
    source: CAP-CRM-DQ-018; ATS-CRM-DQ-018; WF-CRM-DQ-006; WF-CRM-DQ-009
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: validation
        provenance: unknown
        source: FND-CRM-DQ-069
        obligation: 'Prove malformed inputs, unavailable identities and versions leave prior records intact at the capability boundary.'
      - category: permission
        provenance: unknown
        source: FND-CRM-DQ-069
        obligation: 'Prove each named read, merge and administration permission independently, including wrong-type and missing-key contexts.'
      - category: edge
        provenance: unknown
        source: FND-CRM-DQ-069
        obligation: 'Specify empty, removed, locked or already-settled records and establish their visible outcome.'
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-069
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-069
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-006
        provenance: unknown
        source: FND-CRM-DQ-069
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-009
        provenance: unknown
        source: FND-CRM-DQ-069
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
  - finding: FND-CRM-DQ-070
    scope: CAP-CRM-DQ-019
    missing_categories:
      - transition
      - validation
      - edge
      - failure
      - concurrency
    unbound_scenarios:
      - ATS-CRM-DQ-019-09
      - ATS-CRM-DQ-019-10
    permission_obligations:
      - key: crm.merges.read
        scenario_ids:
          - ATS-CRM-DQ-019-06
          - ATS-CRM-DQ-019-07
        finding: FND-CRM-DQ-070
      - key: crm.contacts.read
        scenario_ids:
          - ATS-CRM-DQ-019-06
          - ATS-CRM-DQ-019-07
        finding: FND-CRM-DQ-070
      - key: crm.organizations.read
        scenario_ids:
          - ATS-CRM-DQ-019-06
          - ATS-CRM-DQ-019-07
        finding: FND-CRM-DQ-070
    workflow_sources:
      - WF-CRM-DQ-006
      - WF-CRM-DQ-009
    source: CAP-CRM-DQ-019; ATS-CRM-DQ-019; WF-CRM-DQ-006; WF-CRM-DQ-009
    note: 'Covered denotes an authored scenario, including a proposed one; it does not denote executable or executed coverage. Permission scenario lists are candidates, not a claim that each listed key is independently proved.'
    category_obligations:
      - category: transition
        provenance: unknown
        source: FND-CRM-DQ-070
        obligation: Identify whether this read or calculation owns a lifecycle change; prove any affected-object transition or record why no transition applies.
      - category: validation
        provenance: unknown
        source: FND-CRM-DQ-070
        obligation: 'Prove malformed inputs, unavailable identities and versions leave prior records intact at the capability boundary.'
      - category: edge
        provenance: unknown
        source: FND-CRM-DQ-070
        obligation: 'Specify empty, removed, locked or already-settled records and establish their visible outcome.'
      - category: failure
        provenance: unknown
        source: FND-CRM-DQ-070
        obligation: 'Inject failure at each crossing workflow seam and verify the stated rollback, retained progress or recovery outcome.'
      - category: concurrency
        provenance: unknown
        source: FND-CRM-DQ-070
        obligation: Qualify simultaneous changes and repeated delivery at the enforcing boundary; serial or optimistic-version assertions alone do not establish every overlapping write.
    workflow_obligations:
      - workflow: WF-CRM-DQ-006
        provenance: unknown
        source: FND-CRM-DQ-070
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
      - workflow: WF-CRM-DQ-009
        provenance: unknown
        source: FND-CRM-DQ-070
        unqualified_hops:
          - 1
          - 2
          - 3
          - 4
        note: 'The complete ordered workflow, including each guard and failure path, is not bound by the component sources alone.'
testing_binding_corrections:
  - scenario: ATS-CRM-DQ-012-06
    reason: The stored expiry deadline is tested; renewal after an edit and exclusion of executing plans are not proved and disagree with the design examination.
    source: FND-CRM-DQ-006; FND-CRM-DQ-042
    provenance: observed
unmapped_executable_suites:
  - id: TST-CRM-DQ-003
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0232.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-009
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0238.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-012
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0241.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-013
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0242.spec.ts
    legacy_status: blocked
  - id: TST-CRM-DQ-016
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0245.spec.ts
    legacy_status: blocked
  - id: TST-CRM-DQ-017
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0246.spec.ts
    legacy_status: blocked
  - id: TST-CRM-DQ-018
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0247.spec.ts
    legacy_status: blocked
  - id: TST-CRM-DQ-022
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0251.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-023
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0252.spec.ts
    legacy_status: blocked
  - id: TST-CRM-DQ-030
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0259.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-031
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0260.spec.ts
    legacy_status: blocked
  - id: TST-CRM-DQ-033
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0262.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-034
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0263.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-035
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0264.spec.ts
    legacy_status: blocked
  - id: TST-CRM-DQ-036
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0265.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-040
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0269.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-041
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0270.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-042
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0271.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-045
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0274.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-048
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0277.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-049
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0278.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-050
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0279.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-053
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0282.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-054
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0283.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-055
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0284.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-058
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0287.spec.ts
    legacy_status: blocked
  - id: TST-CRM-DQ-059
    repository: react-console
    file: acceptance/crm/playwright/journeys/merging/CRM-ACC-0288.spec.ts
    legacy_status: not_started
  - id: TST-CRM-DQ-061
    repository: react-console
    file: e2e/dev/duplicates.dev.spec.ts
    legacy_status: null
  - id: TST-CRM-DQ-062
    repository: react-console
    file: e2e/layout/data-quality.spec.ts
    legacy_status: null
  - id: TST-CRM-DQ-063
    repository: react-console
    file: e2e/mock/duplicates/entry-points.spec.ts
    legacy_status: null
  - id: TST-CRM-DQ-064
    repository: react-console
    file: e2e/mock/duplicates/merge.mock.spec.ts
    legacy_status: null
  - id: TST-CRM-DQ-065
    repository: react-console
    file: e2e/mock/duplicates/review.mock.spec.ts
    legacy_status: null
  - id: TST-CRM-DQ-069
    repository: services-crm
    file: modules/duplicates/tests/integration/db/duplicate-detection.table.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-075
    repository: services-crm
    file: modules/duplicates/tests/integration/services/groups/duplicate-group-view.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-077
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/duplicate-block-overrides.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-079
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/duplicate-candidates.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-080
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/duplicate-group-attention-items.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-081
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/duplicate-group-attention-items.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-083
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/duplicate-groups.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-085
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/duplicate-rescans.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-087
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/duplicate-rules.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-088
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/match-keys.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-089
    repository: services-crm
    file: modules/duplicates/tests/integration/services/persistence/match-keys.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-100
    repository: services-crm
    file: modules/duplicates/tests/unit/services/matching/jaro-winkler.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-102
    repository: services-crm
    file: modules/duplicates/tests/unit/services/matching/normalization.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-108
    repository: services-crm
    file: modules/merges/tests/integration/db/merge-purge-functions.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-113
    repository: services-crm
    file: modules/merges/tests/integration/services/jobs/organization-merge-job.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-114
    repository: services-crm
    file: modules/merges/tests/integration/services/jobs/record-merge-job.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-118
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/dismissal-carry.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-120
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/linked-contact-information.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-121
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/long-running-merge.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-123
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/merge-events.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-126
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/merge-owner-delete-guard.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-129
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/merge-plan-lists.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-130
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/merge-plan-records.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-131
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/merge-records.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-135
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/organization-merge-plans.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-138
    repository: services-crm
    file: modules/merges/tests/integration/services/merges/participant-summary.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-145
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/merge-executions.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-146
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/merge-links.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-147
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/merge-references.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-148
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/merge-references.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-149
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/merge-snapshots.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-152
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/portal-logins.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-153
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/record-merge-jobs.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-154
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/record-merge-jobs.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-156
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/record-merge-plans.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-157
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/record-merges.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-158
    repository: services-crm
    file: modules/merges/tests/integration/services/persistence/record-merges.queries.integration.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-159
    repository: services-crm
    file: modules/merges/tests/unit/api/merge-cursors.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-160
    repository: services-crm
    file: modules/merges/tests/unit/references/dismissal-carrying-tables.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-161
    repository: services-crm
    file: modules/merges/tests/unit/references/reference-labels.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-167
    repository: services-crm
    file: modules/merges/tests/unit/services/planning/normalize-address.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-168
    repository: services-crm
    file: modules/merges/tests/unit/services/planning/organization-collections.spec.js
    legacy_status: null
  - id: TST-CRM-DQ-172
    repository: services-crm
    file: modules/merges/tests/unit/services/planning/plain-language.spec.js
    legacy_status: null
feature_execution_gaps:
  - suite: FAS-CRM-DQ-01
    unbound_scenarios:
      - FAS-CRM-DQ-01-02
      - FAS-CRM-DQ-01-04
      - FAS-CRM-DQ-01-06
  - suite: FAS-CRM-DQ-02
    unbound_scenarios:
      - FAS-CRM-DQ-02-01
      - FAS-CRM-DQ-02-02
      - FAS-CRM-DQ-02-04
      - FAS-CRM-DQ-02-05
  - suite: FAS-CRM-DQ-03
    unbound_scenarios:
      - FAS-CRM-DQ-03-04
      - FAS-CRM-DQ-03-05
  - suite: FAS-CRM-DQ-04
    unbound_scenarios:
      - FAS-CRM-DQ-04-01
      - FAS-CRM-DQ-04-04
  - suite: FAS-CRM-DQ-05
    unbound_scenarios:
      - FAS-CRM-DQ-05-02
      - FAS-CRM-DQ-05-03
      - FAS-CRM-DQ-05-04
control_gap_evidence:
  - finding: FND-CRM-DQ-052
    source_sha:
      services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
      react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
      rhythm-v2-docs: 74bec48899048f6472ba876a4c2f9da463bd071f
    controls:
      - TC-DAT-001
    provenance: observed
    source:
      - 'services-crm:aws/crm.service.ts:crmService.dataClassification'
      - 'services-crm:docs/merging/architecture.md#C.6 `record_merges` (history and audit)'
  - finding: FND-CRM-DQ-053
    source_sha:
      services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
      react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
      rhythm-v2-docs: 74bec48899048f6472ba876a4c2f9da463bd071f
    controls:
      - TC-LOG-002
      - TC-LOG-003
    provenance: observed
    source:
      - 'services-crm:modules/duplicates/services/persistence/duplicate-candidates.ts:restoreDuplicateCandidate'
      - 'rhythm-v2-docs:specs/crm/data-quality/planning/capabilities/CAP-CRM-DQ-008-record-that-records-are-not-duplicates-and-take-it-back.md'
---
# Data Quality Findings and Product Decisions

## Findings

| id | severity | statement | affects | evidence | kind |
|---|---|---|---|---|---|
| `FND-CRM-DQ-001` | medium | The draft scope registration excludes important console components, test inventories and shared merge checks. Its corrected source list includes the module entry points and the recorded permission decision. | `MOD-CRM-DQ` | Structured evidence | inconsistency |
| `FND-CRM-DQ-002` | low | Journey automation flags lag the accompanying Playwright files. File presence establishes an authored test, while runnable behavior must still be checked independently. | `JNY-CRM-DQ-001`, `JNY-CRM-DQ-002`, `JNY-CRM-DQ-003`, `JNY-CRM-DQ-004`, `JNY-CRM-DQ-005`, `JNY-CRM-DQ-006` | Structured evidence | inconsistency |
| `FND-CRM-DQ-003` | medium | The older acceptance inventory conflicts with current blocking, exception audit, confidence bands and transient-only retry behavior. The capabilities describe the pinned behavior and preserve the earlier inventory references. | `CAP-CRM-DQ-002`, `CAP-CRM-DQ-003`, `CAP-CRM-DQ-004`, `CAP-CRM-DQ-016` | Structured evidence | inconsistency |
| `FND-CRM-DQ-004` | high | The milestone remains proposed without an approved retroactive plan, while the architecture and experience overviews record earlier approval and acceptance and subordinate chapters still carry draft labels. Recorded decisions and explicit overview approvals support confirmed intent, but Product needs to settle the inconsistent authority trail. | `MOD-CRM-DQ`, `FEAT-CRM-DQ-01`, `FEAT-CRM-DQ-02`, `FEAT-CRM-DQ-03`, `FEAT-CRM-DQ-04`, `FEAT-CRM-DQ-05` | Structured evidence | inconsistency |
| `FND-CRM-DQ-005` | medium | The design restricts plan changes to the creator, whereas current read-and-merge authority permits any qualified workspace administrator to edit the plan. | `CAP-CRM-DQ-012`, `BR-CAP-CRM-DQ-012-11`, `OQ-CRM-DQ-001` | Structured evidence | inconsistency |
| `FND-CRM-DQ-006` | medium | Expiry closes overdue plans but does not delete them. The documented seven-day cleanup after expiry or execution is absent, leaving working snapshots of personal information retained indefinitely. | `CAP-CRM-DQ-012`, `BR-CAP-CRM-DQ-012-10` | Structured evidence | inconsistency |
| `FND-CRM-DQ-007` | low | The architecture describes five-minute settlement for a lost merge start, while the API description and journey describe fifteen minutes. The documents need one timing contract. | `CAP-CRM-DQ-016`, `BR-CAP-CRM-DQ-016-05` | Structured evidence | inconsistency |
| `FND-CRM-DQ-008` | low | The unknown-reference blocker computes affected counts but identifies a storage column instead of the application requested by the product decision. | `CAP-CRM-DQ-015`, `BR-CAP-CRM-DQ-015-02` | Structured evidence | debt |
| `FND-CRM-DQ-009` | medium | Contact merging publishes a committed business event despite an older architecture description saying it is absent. Organization merging has no equivalent event although the catalogue names one. | `CAP-CRM-DQ-016`, `BR-CAP-CRM-DQ-016-13`, `OQ-CRM-DQ-005` | Structured evidence | undocumented |
| `FND-CRM-DQ-010` | medium | The recorded retention decision includes removing individual originals on privacy request, but no operation provides that removal and ordinary application writes cannot alter or delete merge records. | `CAP-CRM-DQ-019`, `BR-CAP-CRM-DQ-019-06`, `OQ-CRM-DQ-002` | Structured evidence | debt |
| `FND-CRM-DQ-011` | medium | Accounting requests survivor resolution through record reads and datasets. The milestone records that request as planned, while the required query exposure remains absent. | `CAP-CRM-DQ-018`, `BR-CAP-CRM-DQ-018-10`, `OQ-CRM-DQ-003` | Structured evidence | debt |
| `FND-CRM-DQ-012` | medium | Planned console management for re-checks, manual confirmation and unfinished plans is missing. The corresponding service operations exist, but the cited journey surfaces cannot perform those flows. | `BR-CAP-CRM-DQ-005-11`, `BR-CAP-CRM-DQ-009-06`, `CAP-CRM-DQ-005`, `CAP-CRM-DQ-009`, `CAP-CRM-DQ-012`, `OQ-CRM-DQ-004` | Structured evidence | debt |
| `FND-CRM-DQ-013` | low | The duplicate API chapter retains a not-built draft label although the pinned routes expose the described operations and include end-to-end tests. | `CAP-CRM-DQ-007`, `CAP-CRM-DQ-008` | Structured evidence | inconsistency |
| `FND-CRM-DQ-014` | low | The API document assumes organizations have no record history. Their ordinary history exists, but absorbed-organization history still lacks an equivalent survivor route. | `CAP-CRM-DQ-018`, `CAP-CRM-ENT-016` | Structured evidence | inconsistency |
| `FND-CRM-DQ-015` | low | The architecture retains reference-count-then-age survivor ranking, while the later recorded ruling places a sole portal login and integration identity ahead of those signals. | `CAP-CRM-DQ-012`, `BR-CAP-CRM-DQ-012-03` | Structured evidence | inconsistency |
| `FND-CRM-DQ-016` | medium | Import-tagged events are skipped for a promised completion pass that has no caller. Current captured changes lack the marker and receive per-record detection; connecting the marker first would suppress detection without a replacement. | `CAP-CRM-DQ-001`, `BR-CAP-CRM-DQ-001-11` | Structured evidence | debt |
| `FND-CRM-DQ-017` | low | The duplicate-group attention declaration remains held because its target metadata object is unregistered, so responsibility holders currently receive no items. | `CAP-CRM-DQ-011`, `BR-CAP-CRM-DQ-011-07` | Structured evidence | debt |
| `FND-CRM-DQ-018` | medium | The documents cite later permission and common-key rulings without corresponding milestone entries. The recorded read-history ruling belongs to the access milestone, so unrecorded decision references do not independently establish approval. | `BR-CAP-CRM-DQ-001-05`, `BR-CAP-CRM-DQ-019-08`, `CAP-CRM-DQ-019` | Structured evidence | inconsistency |
| `FND-CRM-DQ-019` | low | The seeded portal flag is stored without affecting registration; portal matching does not read workspace duplicate settings. | `BR-CAP-CRM-DQ-003-10`, `CAP-CRM-DQ-006` | Structured evidence | undocumented |
| `FND-CRM-DQ-020` | medium | The initial scoring weights lack recorded calibration or demonstrated per-band precision against the planned targets. The cited performance evidence covers contacts rather than the complete scoring model. | `BR-CAP-CRM-DQ-002-11`, `CAP-CRM-DQ-002` | Structured evidence | debt |
| `FND-CRM-DQ-021` | low | The older exception journey declares its control missing although the current refusal dialog offers an authorized, explained exception. An earlier acceptance entry also omits the audit now required by the blocking decision. | `CAP-CRM-DQ-004`, `JNY-CRM-DQ-005`, `CAP-CRM-ENT-001` | Structured evidence | inconsistency |
| `FND-CRM-DQ-022` | medium | Hard deletion of a survivor leaves its aliases pointing to an absent record. Older identities still report merging, so the documented live-destination guarantee fails. | `BR-CAP-CRM-DQ-018-09`, `CAP-CRM-DQ-018`, `CAP-CRM-ENT-014` | Structured evidence | defect |
| `FND-CRM-DQ-023` | low | The console launcher admits duplicate readers alongside either merge permission, allowing a reviewer to enter before the service rejects missing type-specific planning authority. | `CAP-CRM-DQ-012` | Structured evidence | inconsistency |
| `FND-CRM-DQ-024` | low | CRM tests establish portal-login preview behavior, while Platform owns relinking and the multiple-login refusal. The full browser flow is blocked by unavailable login fixtures, and Platform execution lies outside this read scope. | `BR-CAP-CRM-DQ-015-06`, `CAP-CRM-DQ-015` | Structured evidence | debt |

| `FND-CRM-DQ-025` | medium | The requested planning brief is absent from the starting checkout and fetched default branch, so the examination cannot check the draft against that brief. | `MOD-CRM-DQ` | Structured evidence | debt |

| `FND-CRM-DQ-026` | medium | The organization affiliation unit test omits dependent-row identities and preserves the preview when only the move count grows; the production planner includes those identities and versions, so adding a moved affiliation changes approval. | `BR-CAP-CRM-DQ-017-09`, `ATS-CRM-DQ-017` | Structured evidence | inconsistency |

| `FND-CRM-DQ-027` | medium | The handler-failure integration test verifies error results and unchanged keys, but does not assert a successful save response or queue redelivery; the acceptance scenario overstates that binding. | `ATS-CRM-DQ-001-01`, `BR-CAP-CRM-DQ-001-01`, `BR-CAP-CRM-DQ-001-10` | Structured evidence | debt |

| `FND-CRM-DQ-028` | low | Reading a re-check validates the requested record type but fetches the run by identity alone; a contact path can therefore return an organization run from the same workspace. | `CAP-CRM-DQ-005` | Structured evidence | undocumented |

| `FND-CRM-DQ-029` | medium | Preview labels are readable when names exist, but missing-label fallbacks and stale-change descriptions can expose internal references; the original blanket claim about every sentence is too strong. | `BR-CAP-CRM-DQ-013-10`, `ATS-CRM-DQ-013-08` | Structured evidence | debt |

| `FND-CRM-DQ-030` | medium | The original stale-preview journey refreshes the stored plan before requesting execution without an earlier submitted fingerprint, which removes the mismatch it expects; the corrected sequence submits the earlier approval before refreshing. | `JNY-CRM-DQ-003` | Structured evidence | inconsistency |

| `FND-CRM-DQ-031` | high | Several browser specifications deliberately stop before the claimed behavior because the harness lacks portal, re-check, manual-confirmation, security or database controls; their presence does not constitute a runnable proof. Composite lock-wait and thirty-day-boundary scenarios also exceed their bindings. | `ATS-CRM-DQ-005-06`, `ATS-CRM-DQ-011-04`, `ATS-CRM-DQ-016-13`, `ATS-CRM-DQ-017-09`, `JNY-CRM-DQ-004`, `SC-CAP-CRM-DQ-005-02`, `SC-CAP-CRM-DQ-006-02`, `SC-CAP-CRM-DQ-009-02`, `JNY-CRM-DQ-005` | Structured evidence | debt |

| `FND-CRM-DQ-032` | medium | Previously optional proof flags include calculations and refusal or record-change behavior; these rules now require acceptance proof, and any not covered by existing scenarios remain explicit proof gaps. | `BR-CAP-CRM-DQ-003-08`, `BR-CAP-CRM-DQ-004-11`, `BR-CAP-CRM-DQ-006-03`, `BR-CAP-CRM-DQ-008-10`, `BR-CAP-CRM-DQ-008-11`, `BR-CAP-CRM-DQ-013-11`, `BR-CAP-CRM-DQ-014-11`, `BR-CAP-CRM-DQ-016-11`, `BR-CAP-CRM-DQ-016-14`, `BR-CAP-CRM-DQ-017-08` | Structured evidence | debt |

| `FND-CRM-DQ-033` | high | The pinned blocking browser journey still expects candidates hidden by a blocking rule and organization creation to bypass blocking, contradicting the current service and recorded blocking decision. It also expects the old missing exception control, so those assertions cannot prove the current behavior. | `JNY-CRM-DQ-005`, `BR-CAP-CRM-DQ-003-02`, `BR-CAP-CRM-DQ-004-10` | Structured evidence | inconsistency |

| `FND-CRM-DQ-034` | medium | The registered console scope includes duplicate components and the data-quality and merge pages, but excludes the configuration page and ordinary record-page mounts. Their route guards and mounted entry behavior cannot be independently established here; service authority and scoped components remain verified. | `MOD-CRM-DQ`, `BR-CAP-CRM-DQ-003-09`, `CAP-CRM-DQ-010` | Structured evidence | debt |

| `FND-CRM-DQ-035` | low | The design layer cites the Platform queued-work, jobs, record-history and row-level-security standards through the CRM records that apply them, because the Platform repository was not available to this design job; the standard each mechanism follows is named but was not re-read at a pinned commit. | `SVC-CRM-DQ-duplicates`, `SVC-CRM-DQ-merges`, `ADR-CRM-DQ-014`, `ADR-CRM-DQ-008` | Structured evidence | debt |

| `FND-CRM-DQ-036` | medium | The module's registered source paths omit execution pieces the design depends on: the job reconciler and its schedule, the record-merge and re-check names, the portal sign-up migration, the workspace lifecycle participants and the Entities calls that record exceptions and regroup on delete. | `MOD-CRM-DQ`, `WF-CRM-DQ-007`, `WF-CRM-DQ-008`, `WF-CRM-DQ-009` | Structured evidence | inconsistency |

| `FND-CRM-DQ-037` | low | The module performs no inference and has no inference directory, but the module charter does not yet say so in the one sentence the conventions require; this design job may not edit the charter. | `MOD-CRM-DQ` | Structured evidence | inconsistency |

| `FND-CRM-DQ-038` | medium | Reading an open merge plan stores its recomputation and hash whenever records moved, so any qualified colleague opening the plan re-arms approval and can make another person's pending change stale; the read operation is not free of side effects. | `DOM-CRM-DQ-003`, `WF-CRM-DQ-005`, `ADR-CRM-DQ-007`, `BR-CAP-CRM-DQ-013-12`, `BR-CAP-CRM-DQ-016-02`, `OQ-CRM-DQ-006` | Structured evidence | undocumented |

| `FND-CRM-DQ-039` | medium | The re-check dispatcher re-offers a sent batch after a ten-minute claim while the queue hides a delivered message for thirty minutes, so a batch can be processed twice at once; a batch whose consumer dies on its final delivery is never marked failed and is re-sent indefinitely, leaving its run running. | `WF-CRM-DQ-002`, `STATE-CRM-DQ-003`, `BR-CAP-CRM-DQ-005-07`, `ADR-CRM-DQ-014` | Structured evidence | defect |

| `FND-CRM-DQ-040` | low | Batches of a failed re-check are still dispatched and processed and still move the run counters, so a failed run keeps loading the database and can overlap a new run of the same type; the persistence comment also claims a table uniqueness for unfinished runs that is in fact an advisory lock. | `WF-CRM-DQ-002`, `STATE-CRM-DQ-003`, `BR-CAP-CRM-DQ-005-02`, `BR-CAP-CRM-DQ-005-07` | Structured evidence | defect |

| `FND-CRM-DQ-041` | high | A merge plan's expiry instant is set seven days after it is started and no change extends it, contradicting the approved rule of seven days after the last change; the sweep also does not exclude executing plans, so a plan executed near its expiry can be marked expired while its merge runs and then cannot be reopened after a failure. | `BR-CAP-CRM-DQ-012-10`, `STATE-CRM-DQ-004`, `WF-CRM-DQ-007`, `ADR-CRM-DQ-018`, `DOM-CRM-DQ-003` | Structured evidence | defect |

| `FND-CRM-DQ-042` | low | The record-merge job type declares only the contact merge permission as its submit permission for both record types; routes enforce the right permission per type, but job-engine views and permission manifests show organization merges under the contact key. | `SVC-CRM-DQ-merges`, `ADR-CRM-DQ-008` | Structured evidence | inconsistency |

| `FND-CRM-DQ-043` | medium | The requested module design brief is absent from the starting checkout. Examination uses the task instructions, templates and planning corpus, leaving comparison with that brief unavailable. | `MOD-CRM-DQ` | Structured evidence | debt |
| `FND-CRM-DQ-044` | medium | The draft wrongly excludes dismissed and confirmed pairs from rescoring. Detection upserts qualifying pairs without filtering their standing, preserving the decision fields while replacing scores and reasons; a manually confirmed pair can therefore lose its full score. | `STATE-CRM-DQ-001`, `DOM-CRM-DQ-001`, `BR-CAP-CRM-DQ-009-02` | Structured evidence | inconsistency |
| `FND-CRM-DQ-045` | medium | The detection pass writes keys before opening its pair-and-group transaction. The cited failure test throws on the first transaction and does not prove rollback after key replacement; pass-wide atomicity and comparison at commit are unsupported guarantees. | `WF-CRM-DQ-001`, `STATE-CRM-DQ-001` | Structured evidence | debt |
| `FND-CRM-DQ-046` | medium | The draft reports a rolled-back merge as running and implies lock-timeout retries. The running claim is uncommitted and rolls back to queued; executor errors normally settle failure and become a task refusal, including a caught lock timeout. Planning retry language exceeds this behavior. | `WF-CRM-DQ-006`, `STATE-CRM-DQ-005`, `ADR-CRM-DQ-005`, `BR-CAP-CRM-DQ-016-11` | Structured evidence | inconsistency |
| `FND-CRM-DQ-047` | medium | Several draft screens describe service response fields as visible controls and name generic or approved patterns without component evidence. The overview hides unused summary fields and its Review action needs review authority; the history adapter explicitly requests all attempt statuses although the service default is successful merges; the management details page requires merge-read even when its component can call a record-read operation. Member removal and rule reordering use separate requests, so a later failure can preserve partial changes. | `SCR-CRM-DQ-001`, `SCR-CRM-DQ-005`, `SCR-CRM-DQ-006`, `SCR-CRM-DQ-007`, `SCR-CRM-DQ-009` | Structured evidence | inconsistency |
| `FND-CRM-DQ-048` | low | Some invariant citations prove only part of the claimed guarantee. Plan participant uniqueness is enforced by the service rather than its table check, job uniqueness means at most one rather than database-mandated existence, and expiry and workspace-isolation citations need their actual persistence and policy sources. | `DOM-CRM-DQ-001`, `DOM-CRM-DQ-003`, `DOM-CRM-DQ-004` | Structured evidence | debt |
| `FND-CRM-DQ-049` | low | The draft makes Entities persistence the sole writer of every contact, organization and affiliation change. Merging also applies reference rewrites, moves affiliations and prepares the organization parent through merge-owned persistence; ordinary survivor save and participant deletion still call Entities. | `ADR-CRM-DQ-001`, `RESP-CRM`, `ADR-CRM-DQ-012` | Structured evidence | inconsistency |
| `FND-CRM-DQ-050` | medium | Re-checks store record windows rather than frozen membership. Processing reads current records within each window, so later inserted identities inside it can be included and deleted records disappear; initial totals remain fixed and excess processed records can violate the progress check. | `WF-CRM-DQ-002`, `STATE-CRM-DQ-003`, `BR-CAP-CRM-DQ-005-03` | Structured evidence | inconsistency |
| `FND-CRM-DQ-051` | medium | CRM-owned portal functions and lifecycle participants are verified, but the draft assigns unverified behavior to Platform: empty suggestions on candidate failure and automatic provisioning or purge retries. Those caller policies remain unknown without the pinned owner implementation. | `WF-CRM-DQ-008`, `WF-CRM-DQ-009` | Structured evidence | debt |
| `FND-CRM-DQ-052` | medium | Detect duplicate records after changes has validation, concurrency category obligations without a dedicated scenario and 8 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-001`, `ATS-CRM-DQ-001` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-053` | medium | Explain the strength of a duplicate suggestion has transition, validation, permission, failure, concurrency category obligations without a dedicated scenario and 1 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-002`, `ATS-CRM-DQ-002` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-054` | medium | Set the response to duplicate matches has failure category obligations without a dedicated scenario and 2 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-003`, `ATS-CRM-DQ-003` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-055` | medium | Check drafts and account for block overrides has transition, edge, concurrency category obligations without a dedicated scenario and 2 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-004`, `ATS-CRM-DQ-004` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-056` | medium | Refresh duplicate evidence across a record type has validation category obligations without a dedicated scenario and 18 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-005`, `ATS-CRM-DQ-005` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-057` | medium | Reuse a contact during portal registration has failure, concurrency category obligations without a dedicated scenario and 2 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-006`, `ATS-CRM-DQ-006` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-058` | medium | Review duplicate groups in a shared queue has failure, concurrency category obligations without a dedicated scenario and 5 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-007`, `ATS-CRM-DQ-007` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-059` | medium | Dismiss false matches and reopen review has failure, boundary, concurrency category obligations without a dedicated scenario and 10 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-008`, `ATS-CRM-DQ-008` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-060` | medium | Record a duplicate that matching missed has edge, failure, boundary, concurrency, invariant category obligations without a dedicated scenario and 5 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-009`, `ATS-CRM-DQ-009` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-061` | medium | Review and merge from a record page has transition, validation, failure, concurrency, invariant category obligations without a dedicated scenario and 2 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-010`, `ATS-CRM-DQ-010` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-062` | medium | Understand the duplicate-review workload has transition, validation, edge, failure, concurrency, invariant category obligations without a dedicated scenario and 2 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-011`, `ATS-CRM-DQ-011` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-063` | medium | Prepare a merge and choose its survivor has validation, edge, failure, concurrency category obligations without a dedicated scenario and 10 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-012`, `ATS-CRM-DQ-012` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-064` | medium | Resolve differences in the merge preview has permission, edge, boundary category obligations without a dedicated scenario and 8 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-013`, `ATS-CRM-DQ-013` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-065` | medium | Preserve the right information on the surviving contact has permission, concurrency category obligations without a dedicated scenario and 2 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-014`, `ATS-CRM-DQ-014` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-066` | medium | Keep related records consistent through a merge has rule, permission, boundary, concurrency category obligations without a dedicated scenario and 4 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-015`, `ATS-CRM-DQ-015` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-067` | medium | Execute the approved merge atomically has permission, edge category obligations without a dedicated scenario and 17 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-016`, `ATS-CRM-DQ-016` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-068` | medium | Combine organizations and their connections safely has permission, failure category obligations without a dedicated scenario and 4 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-017`, `ATS-CRM-DQ-017` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-069` | medium | Resolve identities absorbed by a merge has validation, permission, edge, failure, concurrency category obligations without a dedicated scenario and 6 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-018`, `ATS-CRM-DQ-018` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-070` | medium | Inspect merge outcomes and attribution has transition, validation, edge, failure, concurrency category obligations without a dedicated scenario and 2 scenarios without complete executable bindings; individual permission keys and workflow failure paths require the detailed qualification recorded above. | `CAP-CRM-DQ-019`, `ATS-CRM-DQ-019` | Structured testing coverage record and pinned scenario sources | coverage-gap |
| `FND-CRM-DQ-071` | medium | 75 existing suites have no mapped scenario; blocked and conditionally executed cases cannot be counted as complete proof. | MOD-CRM-DQ | Structured unmapped executable suite record | coverage-gap |
| `FND-CRM-DQ-072` | medium | 14 feature acceptance sequences remain proposed without an executable suite that asserts the whole handoff. | `FAS-CRM-DQ-01`, `FAS-CRM-DQ-02`, `FAS-CRM-DQ-03`, `FAS-CRM-DQ-04`, `FAS-CRM-DQ-05` | Structured feature execution gap record | coverage-gap |
| `FND-CRM-DQ-073` | medium | Existing multi-source scenarios combine component assertions that do not establish the complete sequence; stored-deadline expiry checks do not prove renewal after editing or protection of an executing plan. | `ATS-CRM-DQ-012`, `ATS-CRM-DQ-016` | Structured binding corrections; existing expiry and concurrency findings | coverage-gap |

## Open Questions

| id | question | why_it_matters | options | recommendation | affects |
|---|---|---|---|---|---|
| `OQ-CRM-DQ-001` | Should merge-plan edits be restricted to the creator or shared by qualified administrators? | Shared changes support handover but require a clear approval and attribution model. | A: creator edits and others read. B: all type-specific read-and-merge holders edit. C: creator and named delegates edit. | The product should adopt shared qualified editing and record that choice explicitly, using attributed decisions and existing plan ownership. | `CAP-CRM-DQ-012`, `FND-CRM-DQ-005` |
| `OQ-CRM-DQ-002` | How should privacy requests remove individual original values from retained merge outcomes? | Absorbed originals can remain as the only personal-data copy, and the recorded retention decision promises individual removal. | A: audited removal of personal original and discarded values while retaining merge metadata. B: amend the retention commitment to preserve complete outcomes until workspace purge. | The product should supply audited individual removal to fulfill the existing commitment. | `CAP-CRM-DQ-019`, `FND-CRM-DQ-010` |
| `OQ-CRM-DQ-003` | How should reports resolve records absorbed by a merge? | Historical accounting references retain absorbed identities and need a current destination for readable names. | A: publish an alias dataset. B: expose survivor fields on record datasets. C: resolve each alias through an API. | The product should publish a shared alias dataset with survivor-existence handling for reporting consumers. | `CAP-CRM-DQ-018`, `FND-CRM-DQ-011` |
| `OQ-CRM-DQ-004` | Which missing duplicate-management console controls belong in the milestone? | Re-checks and manual confirmation need API use today, and unfinished plans lack a console list for resumption. | A: deliver all three. B: deliver re-checks and confirmation first, then unfinished-plan listing. C: defer the controls. | The product should prioritize re-check management and manual confirmation, then deliver unfinished-plan listing. | `CAP-CRM-DQ-005`, `CAP-CRM-DQ-009`, `CAP-CRM-DQ-012`, `FND-CRM-DQ-012` |
| `OQ-CRM-DQ-005` | Should organization merges publish a committed outcome event? | Applications referencing organizations need the same opportunity to react that contact-event subscribers receive. | A: add a matching organization event. B: wait for a named subscriber request. | The product should add the organization event because current reporting requests already demonstrate downstream consequences. | `CAP-CRM-DQ-016`, `FND-CRM-DQ-009` |
| `OQ-CRM-DQ-006` | Should a colleague's read of a merge plan count as the renewed review that re-arms approval? | Approval binds to the plan last shown; today any qualified reader re-arms it, so the person who confirms may not be the person who looked at the change. | A: any qualified read re-arms approval (current). B: only the confirming person's own read or validation re-arms it. C: approval re-arms only through an explicit validation. | The product should adopt B, keeping shared plans while binding approval to the confirming administrator's last view. | `DOM-CRM-DQ-003`, `ADR-CRM-DQ-007`, `FND-CRM-DQ-038`, `CAP-CRM-DQ-016` |

## Entities implementation proof handoff

The Entities pass deletes misplaced executable registers. The owning module needs to inspect these files and register only the assertions within its own boundary. No execution result is claimed.

| Finding | kind | affects | source |
|---|---|---|---|
| `FND-CRM-ENT-096` | undocumented | crm/data-quality executable proof | `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0230.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0231.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0232.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0233.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0234.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0235.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0236.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0237.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0238.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0239.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0240.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0241.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0243.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0244.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0248.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0249.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0250.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0251.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0253.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0254.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0255.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0256.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0257.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0258.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0259.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0261.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0262.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0263.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0265.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0266.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0267.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0268.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0269.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0270.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0271.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0272.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0273.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0274.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0275.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0276.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0278.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0279.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0280.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0281.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0282.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0283.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0284.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0285.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0286.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0288.spec.ts`; `react-console:acceptance/crm/playwright/journeys/merging/CRM-ACC-0289.spec.ts` |
