{
  "format": "vercy-world-model-fixtures/v1",
  "modelId": "WM-DAT-008",
  "version": "0.3.1-candidate.3",
  "cases": [
    {
      "id": "promotion-gate-failure",
      "kind": "negative",
      "input": "A table lacks consumer scope, access route, pinned contract and measurable promise.",
      "expect": "Keep it a dataset, not a Data Product",
      "expectRule": [
        "INV-014"
      ]
    },
    {
      "id": "pinned-member-change",
      "kind": "negative",
      "input": "P pins A v3 and proposes A v4 in place.",
      "expect": "Reject in-place change and create successor",
      "expectRule": [
        "INV-003",
        "INV-005"
      ]
    },
    {
      "id": "series-head-advance",
      "kind": "positive",
      "input": "P follows B head and B advances while promises hold.",
      "expect": "Keep Product Version identity",
      "expectRule": [
        "INV-006"
      ]
    },
    {
      "id": "series-head-promise-breach",
      "kind": "negative",
      "input": "B head advances and violates the freshness promise.",
      "expect": "Append breach; repin or promise revision requires successor",
      "expectRule": [
        "INV-006"
      ]
    },
    {
      "id": "two-consumers-two-terms",
      "kind": "positive",
      "input": "X and Y use one Product Version under different terms.",
      "expect": "Keep two binding identities and external terms refs",
      "expectRule": [
        "INV-010",
        "INV-018"
      ]
    },
    {
      "id": "catalog-record-separation",
      "kind": "positive",
      "input": "A dataset and Product are listed in one catalog.",
      "expect": "Keep WM-DAT-001 and WM-DAT-008 record identities separate",
      "expectRule": [
        "INV-001",
        "INV-002"
      ]
    },
    {
      "id": "catalog-boundary-collision",
      "kind": "negative",
      "input": "One dataset is also a Product and one catalog record is claimed by both models.",
      "expect": "Report held mastership conflict; do not merge records",
      "expectRule": [
        "INV-002"
      ]
    },
    {
      "id": "availability-is-not-fitness",
      "kind": "negative",
      "input": "API is available but dataset fails fitness assessment.",
      "expect": "Keep predicates distinct",
      "expectRule": [
        "INV-012"
      ]
    },
    {
      "id": "withdrawal-no-cascade",
      "kind": "positive",
      "input": "Product is withdrawn while resources and duties persist.",
      "expect": "Preserve external lifecycles and notify holders",
      "expectRule": [
        "INV-013",
        "INV-027"
      ]
    },
    {
      "id": "two-catalog-records",
      "kind": "positive",
      "input": "P is listed in C1/C2 and C2 delists it.",
      "expect": "P and C1 survive",
      "expectRule": [
        "INV-015"
      ]
    },
    {
      "id": "record-product-field-overwrite",
      "kind": "negative",
      "input": "Record withdrawnAt overwrites Product withdrawnAt.",
      "expect": "Reject cross-root overwrite",
      "expectRule": [
        "INV-016"
      ]
    },
    {
      "id": "binding-bare-relation",
      "kind": "negative",
      "input": "Terms are placed on an unversioned edge.",
      "expect": "Require separately rooted binding",
      "expectRule": [
        "INV-011"
      ]
    },
    {
      "id": "binding-not-grant",
      "kind": "negative",
      "input": "Approved binding is treated as IAM authorization.",
      "expect": "Reject access inference",
      "expectRule": [
        "INV-017"
      ]
    },
    {
      "id": "two-consumers-same-version",
      "kind": "positive",
      "input": "X and Y bind to P v5 under different terms.",
      "expect": "Retain two bindings and one Product Version",
      "expectRule": [
        "INV-018"
      ]
    },
    {
      "id": "binding-suspension-no-product-change",
      "kind": "positive",
      "input": "Y is suspended while X stays active.",
      "expect": "Only Y binding changes",
      "expectRule": [
        "INV-019",
        "INV-026"
      ]
    },
    {
      "id": "quality-run-no-version",
      "kind": "negative",
      "input": "A failed run proposes a Product Version.",
      "expect": "Reject version creation",
      "expectRule": [
        "INV-020"
      ]
    },
    {
      "id": "withdraw-history",
      "kind": "positive",
      "input": "Product withdrawn with expired binding and old record.",
      "expect": "Keep all identities addressable",
      "expectRule": [
        "INV-021"
      ]
    },
    {
      "id": "offering-inline-price",
      "kind": "negative",
      "input": "Price and SKU are copied into Product.",
      "expect": "Reject copied commercial data",
      "expectRule": [
        "INV-022"
      ]
    },
    {
      "id": "floating-api-contract",
      "kind": "negative",
      "input": "API route has no pinned contract revision.",
      "expect": "Reject publication",
      "expectRule": [
        "INV-008"
      ]
    },
    {
      "id": "internal-use-binding",
      "kind": "positive",
      "input": "Internal consumer uses authority-qualified internal terms with no agreement.",
      "expect": "Accept binding with internalTermsRef",
      "expectRule": [
        "INV-010"
      ]
    },
    {
      "id": "ownership-transfer",
      "kind": "positive",
      "input": "Accountable owner changes after publication.",
      "expect": "Create successor version but preserve Product identity",
      "expectRule": [
        "INV-003",
        "INV-023"
      ]
    },
    {
      "id": "in-place-published-mutation",
      "kind": "negative",
      "input": "publishedAt exists and boundedUseCases are edited in place.",
      "expect": "Reject immutable-version mutation",
      "expectRule": [
        "INV-003"
      ]
    },
    {
      "id": "member-missing-policy",
      "kind": "negative",
      "input": "Member lacks resourceType or resolutionPolicy.",
      "expect": "Reject composition",
      "expectRule": [
        "INV-004"
      ]
    },
    {
      "id": "copied-observation",
      "kind": "negative",
      "input": "Latest quality score is copied into Product state.",
      "expect": "Reject copied observation",
      "expectRule": [
        "INV-007"
      ]
    },
    {
      "id": "promise-missing-metric",
      "kind": "negative",
      "input": "SLO has target and unit but no metric definition.",
      "expect": "Reject promise",
      "expectRule": [
        "INV-009"
      ]
    },
    {
      "id": "active-unpublished-binding",
      "kind": "negative",
      "input": "Binding activates against draft Product Version.",
      "expect": "Reject activation",
      "expectRule": [
        "INV-025"
      ]
    },
    {
      "id": "catalog-tombstone",
      "kind": "positive",
      "input": "Record is tombstoned for removal policy.",
      "expect": "Identifier resolves with removal reason",
      "expectRule": [
        "INV-021",
        "INV-026"
      ]
    }
  ]
}
