{
  "schema_version": 1,
  "label": "Synthetic example; executed by the included Python simulation",
  "scope": "In-memory records, not a production CDC connector or a live cutover. The source remains authoritative in this rehearsal.",
  "versions": {
    "mapping": "mapping-1",
    "snapshot": "snapshot-1",
    "source": "source-v1",
    "target": "target-v1"
  },
  "checkpoint": {
    "snapshot_sequence": 3,
    "replayed_through_sequence": 4,
    "kind": "Illustrative sequence, not a vendor LSN"
  },
  "snapshot_reconciliation": {
    "source_count": 3,
    "target_count": 3,
    "source_amount_cents": 1100,
    "target_amount_cents": 1100,
    "source_digest": "6ebef541b2f506d2d4e2e703a9b9005cc7b7de9983284e85c1bd48077ebea704",
    "target_digest": "6ebef541b2f506d2d4e2e703a9b9005cc7b7de9983284e85c1bd48077ebea704",
    "passed": true
  },
  "tail_replay": {
    "applied": 1,
    "duplicates_ignored": 1,
    "reconciliation": {
      "source_count": 4,
      "target_count": 4,
      "source_amount_cents": 1600,
      "target_amount_cents": 1600,
      "source_digest": "1b118317734af0d6656c7aaa08bcc17da79b6109ed5de49f48d7ecb9349f2c68",
      "target_digest": "1b118317734af0d6656c7aaa08bcc17da79b6109ed5de49f48d7ecb9349f2c68",
      "passed": true
    }
  },
  "failure_injection": {
    "change": "event-2 changed from -200 to -201 cents in target",
    "reconciliation": {
      "source_count": 4,
      "target_count": 4,
      "source_amount_cents": 1600,
      "target_amount_cents": 1599,
      "source_digest": "1b118317734af0d6656c7aaa08bcc17da79b6109ed5de49f48d7ecb9349f2c68",
      "target_digest": "01f515da05f5c488e99c7699dbfa8ba9a1cf439a58cd1d700366c307ad64982f",
      "passed": false
    },
    "decision": "BLOCK_CUTOVER",
    "active_route": "source-v1",
    "rollback_check": "PASS: original source still authoritative"
  },
  "limits": [
    "Does not demonstrate rollback of writes accepted after a real cutover",
    "Does not validate a vendor CDC checkpoint or schema transformation",
    "Live acceptance requires business invariants and an approved route-back or forward-recovery plan"
  ],
  "signoff_roles": [
    "Data owner",
    "Application owner",
    "Migration operator"
  ]
}
