{
  "@context": "https://schema.org",
  "@type": "Dataset",
  "name": "CRM deduplication review fixtures",
  "description": "24 original synthetic acceptance fixtures with explicit expected labels. No third-party product has been tested or ranked using this release.",
  "url": "https://konabayev.com/blog/crm-deduplication-test-dataset/",
  "slug": "crm-deduplication-test-dataset",
  "version": "1.0.0",
  "dateModified": "2026-10-04",
  "creator": {
    "@type": "Person",
    "name": "Tugelbay Konabayev",
    "url": "https://konabayev.com/about/"
  },
  "isAccessibleForFree": true,
  "measurementTechnique": "Manually authored synthetic fixtures and acceptance oracles; deterministic serialization, not an empirical benchmark.",
  "variableMeasured": [
    {
      "@type": "PropertyValue",
      "propertyID": "fixture_id",
      "name": "fixture_id",
      "description": "Stable authored case ID, not a customer or observation identifier."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "observation_type",
      "name": "observation_type",
      "description": "Always authored_test_fixture: synthetic inputs and author-defined expected labels."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "input",
      "name": "input",
      "description": "Nested test input. JSON object serialized as JSON text in the CSV cell; parse it before use."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "expected",
      "name": "expected",
      "description": "Author-defined acceptance oracle, not output observed from a vendor. Nested object serialized as JSON in CSV."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "rule_ids",
      "name": "rule_ids",
      "description": "Ordered IDs from dataset.rules explaining the applicable authored contract; JSON array in CSV."
    },
    {
      "@type": "PropertyValue",
      "propertyID": "rationale",
      "name": "rationale",
      "description": "Reason for the case and its limits; not an empirical performance claim."
    }
  ],
  "distribution": [
    {
      "@type": "DataDownload",
      "encodingFormat": "text/csv",
      "contentUrl": "https://konabayev.com/data/crm-deduplication-test-dataset.csv"
    },
    {
      "@type": "DataDownload",
      "encodingFormat": "application/json",
      "contentUrl": "https://konabayev.com/data/crm-deduplication-test-dataset.json"
    },
    {
      "@type": "DataDownload",
      "encodingFormat": "application/x-ndjson",
      "contentUrl": "https://konabayev.com/data/crm-deduplication-test-dataset.jsonl"
    }
  ],
  "row_count": 24,
  "observation_type": "authored_test_fixture",
  "product_performance_measured": false,
  "usage_scope": "Download and use locally for your own acceptance tests, and cite the dataset and version. No open redistribution license is asserted for this fixture release.",
  "rules": {
    "C-CANDIDATE": "Each pair is an independent fictional namespace; reused tokens across different cases must not be joined. Within that pair, a shared nonempty ID or exact syntactically valid verified non-role email on both records can propose linking, subject to conflicts. Email normalization trims surrounding space and lowercases domain only.",
    "C-CONFLICT": "Conflicting populated source IDs, emails or phone tokens require review when another identifier proposes a match. Explicit weak-review triggers are identical email with either verification flag false; email local-part case difference; plus-suffix difference; dot-placement difference; identical role mailbox; identical phone token alone; identical name, including a company difference; NFC/NFD-equivalent names; accent-only name difference; and identical malformed email despite verification flags. These signals propose review, not identity. Different names or email domains without another listed signal, different IDs alone, and empty pairs remain keep_separate. keep_separate means no linking evidence under this fixture contract, not proven distinct people.",
    "C-NO-DESTRUCTIVE-MERGE": "All outcomes prohibit automatic destructive merge. Candidate linking still needs field survivorship, suppression, provenance and reversible review. Missing values never constitute shared identifiers. All records are fictional; +999 numbers are intentionally invalid test tokens, not dialable E.164 examples."
  },
  "data_dictionary": {
    "fixture_id": "Stable authored case ID, not a customer or observation identifier.",
    "observation_type": "Always authored_test_fixture: synthetic inputs and author-defined expected labels.",
    "input": "Nested test input. JSON object serialized as JSON text in the CSV cell; parse it before use.",
    "expected": "Author-defined acceptance oracle, not output observed from a vendor. Nested object serialized as JSON in CSV.",
    "rule_ids": "Ordered IDs from dataset.rules explaining the applicable authored contract; JSON array in CSV.",
    "rationale": "Reason for the case and its limits; not an empirical performance claim."
  },
  "nested_dictionaries": {
    "input": {
      "left": "First fictional record; see contact dictionary.",
      "right": "Second fictional record; see contact dictionary.",
      "namespace": "Independent namespace for this pair only; never join IDs between cases.",
      "policy": "Versioned authored matching contract."
    },
    "contact": {
      "source_id": "Fictional source identifier, meaningful only in this case namespace.",
      "name": "Fictional display name, not a unique identifier.",
      "email": "Authored test-domain address or intentionally malformed value.",
      "email_verified": "Synthetic input flag, not an actual mailbox verification.",
      "phone_test_token": "Intentionally invalid +999 token for equality/conflict tests; not a dialable phone.",
      "company": "Fictional company label.",
      "role_mailbox": "Authored flag indicating a shared-role address."
    },
    "expected": {
      "decision": "link_candidate, review, or keep_separate under this contract.",
      "automatic_merge_allowed": "Always false; field survivorship and destructive operations are outside scope."
    }
  },
  "source_provenance": [
    {
      "type": "original_authorship",
      "authored_date": "2026-10-04",
      "scope": "All fixture inputs, expected outputs and decision rules are original synthetic constructions; methodological citations in the article do not supply these labels."
    }
  ],
  "reproduction": {
    "release_ref": "acceptance-fixtures-v1.0.0",
    "code_url": "https://konabayev.com/data/acceptance-fixtures-v1.0.0-generator.txt",
    "source_sha256": "b57bf52907f67efad945335b76a88cfdbdaa2d02f581efef9dde9f3b2a3446d1",
    "instructions": "Download the version 1.0.0 source from code_url and save it as generator.mjs. Verify its SHA-256 against source_sha256 and retain the source with your outputs; no repository access or package installation is required.",
    "command": "node ./generator.mjs --out ./fixture-data",
    "check_command": "node ./generator.mjs --out ./fixture-data --check",
    "csv_objects": "input, expected and rule_ids are JSON strings inside properly quoted CSV cells.",
    "note": "The generator reproduces datasets; it does not implement an extractor, CRM matcher or website monitor. compareResults emits pass, mismatch or missing, not automatic failure-type diagnoses."
  },
  "data": [
    {
      "fixture_id": "CRM-001",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "F001",
          "name": "Fiction A",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "F001",
          "name": "Fiction A",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-1",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "link_candidate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Same nonempty ID in the same fixture namespace; no conflicting populated identifier."
    },
    {
      "fixture_id": "CRM-002",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "F001",
          "name": "",
          "email": "a@example.test",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "F001",
          "name": "",
          "email": "b@example.test",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-2",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Same ID with conflicting populated emails must not silently merge."
    },
    {
      "fixture_id": "CRM-003",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "F001",
          "name": "",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "F002",
          "name": "",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-3",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "keep_separate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Different IDs and no corroborating attributes."
    },
    {
      "fixture_id": "CRM-004",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-4",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "link_candidate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Exact verified non-role email is a candidate signal, not proven person identity."
    },
    {
      "fixture_id": "CRM-005",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": " a@example.test ",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-5",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "link_candidate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Trim surrounding email whitespace under the explicit policy."
    },
    {
      "fixture_id": "CRM-006",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "a@EXAMPLE.TEST",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-6",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "link_candidate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Case-normalize only the domain for this policy."
    },
    {
      "fixture_id": "CRM-007",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "A@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-7",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Local-part case difference is not automatically collapsed."
    },
    {
      "fixture_id": "CRM-008",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "a+news@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-8",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Do not assume plus addressing denotes one mailbox for every domain."
    },
    {
      "fixture_id": "CRM-009",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "a.b@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "ab@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-9",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Do not apply a vendor-specific dot rule to arbitrary domains."
    },
    {
      "fixture_id": "CRM-010",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-10",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Unverified identical email is insufficient for candidate linking here."
    },
    {
      "fixture_id": "CRM-011",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-11",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Verification is required on both fixture records."
    },
    {
      "fixture_id": "CRM-012",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "sales@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": true
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "sales@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": true
        },
        "namespace": "fictional-case-12",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "A shared role address is not evidence of one person."
    },
    {
      "fixture_id": "CRM-013",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "Fiction A",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "Example North",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "Fiction A",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "Example North",
          "role_mailbox": false
        },
        "namespace": "fictional-case-13",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Name plus company is a weak match signal."
    },
    {
      "fixture_id": "CRM-014",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "Fiction A",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "Example North",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "Fiction A",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "Example South",
          "role_mailbox": false
        },
        "namespace": "fictional-case-14",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "A company difference does not disprove identity or establish a job change."
    },
    {
      "fixture_id": "CRM-015",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "Fiction A",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "Fiction B",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-15",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "keep_separate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Different names without a stronger shared identifier."
    },
    {
      "fixture_id": "CRM-016",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-16",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "keep_separate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Two empty records are not duplicates merely because every field equals blank."
    },
    {
      "fixture_id": "CRM-017",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "",
          "email_verified": false,
          "phone_test_token": "+999000000001",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "",
          "email_verified": false,
          "phone_test_token": "+999000000001",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-17",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Synthetic phone equality alone can represent a shared or reassigned number."
    },
    {
      "fixture_id": "CRM-018",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "+999000000001",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "+999000000002",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-18",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Conflicting populated phone identifiers require review even when email matches."
    },
    {
      "fixture_id": "CRM-019",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "F001",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "F002",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-19",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Different IDs in one namespace conflict with the email candidate signal."
    },
    {
      "fixture_id": "CRM-020",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "Fiction Café",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "Fiction Café",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-20",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "NFC and NFD code units differ but normalize to the same name; name equivalence is review evidence, not a unique identity."
    },
    {
      "fixture_id": "CRM-021",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "Fiction Cafe",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "Fiction Café",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-21",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "An absent versus present accent remains different after NFC normalization; accent stripping is only a weak review signal."
    },
    {
      "fixture_id": "CRM-022",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "a@example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "a@example.invalid",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-22",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "keep_separate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Different domains remain different addresses."
    },
    {
      "fixture_id": "CRM-023",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "F001",
          "name": "Fiction A",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "F001",
          "name": "Fiction A updated",
          "email": "",
          "email_verified": false,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-23",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "link_candidate",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "Same ID permits a candidate despite a changed display name; actual merge still needs a survivorship rule."
    },
    {
      "fixture_id": "CRM-024",
      "observation_type": "authored_test_fixture",
      "input": {
        "left": {
          "source_id": "",
          "name": "",
          "email": "fiction-at-example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "right": {
          "source_id": "",
          "name": "",
          "email": "fiction-at-example.test",
          "email_verified": true,
          "phone_test_token": "",
          "company": "",
          "role_mailbox": false
        },
        "namespace": "fictional-case-24",
        "policy": "conservative-link-review-v1"
      },
      "expected": {
        "decision": "review",
        "automatic_merge_allowed": false
      },
      "rule_ids": [
        "C-CANDIDATE",
        "C-CONFLICT",
        "C-NO-DESTRUCTIVE-MERGE"
      ],
      "rationale": "A verification flag does not repair malformed email syntax."
    }
  ]
}
