{
  "format": "vercy-world-model-fixtures/v1",
  "modelId": "WM-SFT-018",
  "version": "0.1.0-candidate.2",
  "semantics": {
    "positive": "admissible input with expected derivation",
    "negative": "input must be rejected"
  },
  "cases": [
    {
      "id": "address-reassignment",
      "kind": "positive",
      "input": "Address A moves from E1 to E2 at T2.",
      "expect": "Distinct endpoints and non-overlapping rows preserve history.",
      "satisfies": [
        "INV-SFT018-03",
        "INV-SFT018-12"
      ]
    },
    {
      "id": "unscoped-concurrent-address",
      "kind": "negative",
      "input": "Two address rows overlap in the same environment without scope.",
      "expect": "Reject overlap.",
      "violates": [
        "INV-SFT018-04"
      ]
    },
    {
      "id": "blue-green",
      "kind": "positive",
      "input": "One endpoint has explicit blue and green scopes.",
      "expect": "Accept concurrent scoped bindings.",
      "satisfies": [
        "INV-SFT018-04"
      ]
    },
    {
      "id": "endpoint-merge",
      "kind": "negative",
      "input": "Two endpoints are edited into one identity.",
      "expect": "Reject merge; use tombstone and successor.",
      "violates": [
        "INV-SFT018-03"
      ]
    },
    {
      "id": "runtime-replacement",
      "kind": "positive",
      "input": "Runtime resource changes while logical exposure continues.",
      "expect": "Preserve endpoint identity.",
      "satisfies": [
        "INV-SFT018-08"
      ]
    },
    {
      "id": "url-change",
      "kind": "positive",
      "input": "URL changes with no semantic contract change.",
      "expect": "Append successor address binding; contract unaffected.",
      "satisfies": [
        "INV-SFT018-01"
      ]
    },
    {
      "id": "port-protocol-change",
      "kind": "positive",
      "input": "Port and protocol change.",
      "expect": "Append binding/connectivity rows; preserve endpoint identity.",
      "satisfies": [
        "INV-SFT018-01",
        "INV-SFT018-02"
      ]
    },
    {
      "id": "zone-change",
      "kind": "positive",
      "input": "Endpoint moves zone without address change.",
      "expect": "Append ZoneMembership only.",
      "satisfies": [
        "INV-SFT018-02"
      ]
    },
    {
      "id": "declared-not-observed",
      "kind": "positive",
      "input": "Declared route has no current telemetry.",
      "expect": "Keep declaration with observation unknown.",
      "satisfies": [
        "INV-SFT018-05",
        "INV-SFT018-13"
      ]
    },
    {
      "id": "telemetry-contradiction",
      "kind": "positive",
      "input": "Telemetry contradicts declared connectivity.",
      "expect": "Preserve both facts and expose conflict.",
      "satisfies": [
        "INV-SFT018-13"
      ]
    },
    {
      "id": "secret-leak",
      "kind": "negative",
      "input": "Credential value is offered as endpoint metadata.",
      "expect": "Reject secret material.",
      "violates": [
        "INV-SFT018-07"
      ]
    },
    {
      "id": "retroactive-edit",
      "kind": "negative",
      "input": "Past binding is edited in place.",
      "expect": "Reject and append superseding correction.",
      "violates": [
        "INV-SFT018-09"
      ]
    },
    {
      "id": "successor-cycle",
      "kind": "negative",
      "input": "Endpoint successors form a cycle.",
      "expect": "Reject cyclic succession.",
      "violates": [
        "INV-SFT018-03"
      ]
    },
    {
      "id": "aggregate-inventory",
      "kind": "negative",
      "input": "Full exposure inventory is returned above strictest member classification.",
      "expect": "Reject projection.",
      "violates": [
        "INV-SFT018-11"
      ]
    }
  ]
}
