{
  "format": "vercy-world-model-candidate/v1",
  "contourId": "EM-DAT-02",
  "modelId": "WM-DAT-008",
  "registryId": "vr.wm-dat-008",
  "name": "Data Product",
  "version": "0.3.1-candidate.3",
  "entryKind": "aggregate",
  "status": "research-candidate",
  "canonicalPublishable": false,
  "purpose": "Represent a governed data product and immutable product versions, with a separately identified catalog record describing each product head or version, without absorbing dataset, distribution, interface, execution, observation, assessment, offering or agreement lifecycles.",
  "boundary": {
    "owns": [
      "stable data-product identity",
      "immutable published product versions and successor lineage",
      "product purpose, consumer scope and bounded use cases",
      "non-owning resource composition by role and resolution policy",
      "access-route declarations and pinned contract references",
      "measurable product promises and declared aggregation rules",
      "separately rooted product-scoped Catalog Record identity and lifecycle",
      "separately rooted effective-dated ConsumerEntitlementBinding objects that reference external terms and access authority"
    ],
    "delegates": [
      "dataset, dataset-version and distribution identity to WM-DAT-001",
      "schema and data-contract versions to WM-DAT-004",
      "quality assessments to WM-DAT-007",
      "observations and measurements to WM-MAT-008",
      "API and interface-contract revisions to WM-SFT-003",
      "pipeline and processing-run execution to WM-ACT-053",
      "market, channel, price and validity offering semantics to the shared Offering authority",
      "legal or commercial agreement lifecycle to the applicable agreement authority"
    ],
    "excludes": [
      "dataset bytes and storage",
      "distribution custody and fixity",
      "pipeline execution or retry state",
      "observation values and assessment verdicts",
      "authorization evaluation and credential material",
      "price, tariff, market and sales-channel lifecycle",
      "agreement, order, subscription, delivery or payment lifecycle"
    ]
  },
  "identities": {
    "product": [
      "productId",
      "mintingNamespace"
    ],
    "productVersion": [
      "productId",
      "productVersionId"
    ],
    "productCatalogRecord": [
      "catalogId",
      "catalogRecordId"
    ],
    "memberResource": "external identity only",
    "consumerEntitlementBinding": [
      "productId",
      "entitlementBindingId"
    ]
  },
  "catalogRecordBoundary": {
    "rule": "WM-DAT-008 owns catalog records only when the described resource is a data product or data-product version. WM-DAT-001 owns catalog records whose described resource is a dataset, dataset series or distribution. Record namespaces and described-resource types must make the two masters disjoint.",
    "recordLifecycle": [
      "draft",
      "listed",
      "hidden",
      "withdrawn",
      "tombstoned"
    ],
    "coexistenceRule": "ProductCatalogRecord is a separately rooted WM-DAT-008 object, not a contained DataProduct member. It may predate product completion and survives withdrawal while retaining independent identity and lifecycle.",
    "ruleStatus": "Declared boundary pending reciprocal WM-DAT-001 amendment; not yet enforced canonically."
  },
  "productVersion": {
    "required": [
      "purpose",
      "accountableOwnerRef",
      "stewardRef",
      "consumerScope",
      "boundedUseCases",
      "resourceComposition",
      "accessRoutes",
      "dataContractRefs",
      "qualityOrServiceTargets",
      "termsAndAuthorizationRefs",
      "lifecycleState",
      "deprecationPolicy",
      "measurablePromiseDefinitions",
      "publishedAt"
    ],
    "lifecycle": [
      "draft",
      "reviewed",
      "approved",
      "published",
      "deprecated",
      "withdrawn",
      "retired"
    ],
    "optional": [
      "deprecatedAt",
      "withdrawnAt",
      "retiredAt"
    ]
  },
  "resourceComposition": {
    "requiredPerMember": [
      "role",
      "resourceRef",
      "resourceType",
      "resolutionPolicy"
    ],
    "resolutionPolicies": [
      "pinned-version",
      "declared-series-head"
    ],
    "versionRule": "Rebinding a pinned member creates a successor. A declared-series-head advance does not, unless it breaches a promise; breach is asserted on the existing version and remediation by repinning or promise revision creates a successor.",
    "resourceTypes": [
      "dataset",
      "dataset-version",
      "distribution",
      "api-interface-contract",
      "other-governed-resource"
    ],
    "minimumMembers": 1
  },
  "consumerEntitlementBinding": {
    "classification": "separately rooted identified governed object mastered by WM-DAT-008; not contained in DataProduct, not a bare relation, agreement, authorization grant or new model identity",
    "required": [
      "entitlementBindingId",
      "consumerRef",
      "productVersionRef",
      "resourceRef",
      "contractVersionRef",
      "accessRouteRef",
      "permittedPurpose",
      "effectiveFrom",
      "accessAuthorityRef",
      "approvalRef",
      "status",
      "recordedAt",
      "termsBasis"
    ],
    "optional": [
      "effectiveTo",
      "revocationRef",
      "constraints",
      "suspendedAt",
      "expiredAt",
      "auditRefs",
      "agreementRef",
      "internalTermsRef",
      "offeringRef",
      "revokedAt"
    ],
    "effect": "Records the governed consumer-product-version-resource-purpose terms association; it neither creates external terms nor grants access.",
    "lifecycle": [
      "proposed",
      "approved",
      "active",
      "suspended",
      "expired",
      "revoked"
    ],
    "identityRule": "Identity is stable across status changes; external agreement and product-version references remain independently versioned.",
    "termsBasisValues": [
      "external-agreement",
      "authority-qualified-internal-terms"
    ],
    "termsRules": [
      "external-agreement requires agreementRef",
      "authority-qualified-internal-terms requires internalTermsRef",
      "terms references are authority-qualified pointers and never inline legal or commercial text",
      "accessAuthorityRef identifies a competent authority and never an access decision"
    ],
    "stateTimestampRules": {
      "suspended": "suspendedAt required",
      "expired": "expiredAt required",
      "revoked": "revokedAt and revocationRef required"
    },
    "productVersionRefShape": [
      "productId",
      "productVersionId"
    ]
  },
  "relations": [
    {
      "target": "WM-DAT-001",
      "relation": "REFERENCE",
      "purpose": "Resolve datasets, versions, series and distributions without importing their lifecycle.",
      "required": false,
      "condition": "Required when any resourceComposition member is dataset, dataset-version or distribution."
    },
    {
      "target": "WM-DAT-004",
      "relation": "REFERENCE",
      "purpose": "Pin schema and data-contract versions and consumer obligations.",
      "required": true
    },
    {
      "target": "WM-DAT-007",
      "relation": "REFERENCE",
      "purpose": "Resolve purpose-qualified quality assessments without copying verdict state.",
      "required": false
    },
    {
      "target": "WM-MAT-008",
      "relation": "REFERENCE",
      "purpose": "Resolve external measurements supporting product promises.",
      "required": false
    },
    {
      "target": "WM-SFT-003",
      "relation": "REFERENCE",
      "purpose": "Pin API or interface-contract revisions for access routes.",
      "required": false
    },
    {
      "target": "WM-ACT-053",
      "relation": "REFERENCE",
      "purpose": "Resolve execution evidence without importing run state.",
      "required": false
    }
  ],
  "operations": [
    {
      "id": "register-product",
      "effect": "Mint a stable product identity and draft version only after the promotion gate is complete.",
      "authority": "data-product owner or delegated steward"
    },
    {
      "id": "publish-product-version",
      "effect": "Freeze the product version, composition, contract pins, promises and deprecation policy.",
      "authority": "data-product approval authority"
    },
    {
      "id": "register-product-catalog-record",
      "effect": "Create or revise a separately rooted record describing a product or product version.",
      "authority": "catalog operator writes through the WM-DAT-008 record master boundary"
    },
    {
      "id": "bind-consumer-entitlement",
      "effect": "Record a separately rooted effective-dated binding to external terms and access authority.",
      "authority": "WM-DAT-008 steward records decisions supplied by the competent external authorities"
    },
    {
      "id": "transition-product",
      "effect": "Deprecate, withdraw or retire a Product Version under productLifecycle and notify holders per the deprecation policy.",
      "authority": "data-product owner"
    },
    {
      "id": "transition-product-catalog-record",
      "effect": "Apply an allowed Catalog Record transition with statusChangedAt and authority evidence.",
      "authority": "catalog operator through WM-DAT-008 record master"
    },
    {
      "id": "transition-consumer-entitlement-binding",
      "effect": "Apply an allowed binding transition with required timestamps and decision references.",
      "authority": "WM-DAT-008 steward recording external authority decisions"
    }
  ],
  "invariants": [
    {
      "id": "INV-001",
      "statement": "Catalog Record, Data Product and every composed resource have separate resolvable identities."
    },
    {
      "id": "INV-002",
      "statement": "A ProductCatalogRecord describes only a Product or Product Version; the reciprocal WM-DAT-001 dataset-record boundary remains held."
    },
    {
      "id": "INV-003",
      "statement": "Published Product Versions are immutable; any required-content change creates a linked successor."
    },
    {
      "id": "INV-004",
      "statement": "Every composition member declares role, resource identity, resource type and pinned-versus-head resolution policy."
    },
    {
      "id": "INV-005",
      "statement": "Rebinding a pinned member creates a successor Product Version."
    },
    {
      "id": "INV-006",
      "statement": "A declared-series-head advance does not version the Product while promises hold; breach is appended and repin or promise revision creates a successor."
    },
    {
      "id": "INV-007",
      "statement": "The Product stores no dataset bytes, distributions, pipeline runs, observations or assessment results."
    },
    {
      "id": "INV-008",
      "statement": "Every access route identifies its interface or distribution at a pinned revision and names its authorization requirement."
    },
    {
      "id": "INV-009",
      "statement": "Every promise identifies metric definition, target, unit, window, measurement point and aggregation rule."
    },
    {
      "id": "INV-010",
      "statement": "Consumer terms cite an authority-qualified external agreement or internal-terms reference plus an effective period."
    },
    {
      "id": "INV-011",
      "statement": "ConsumerEntitlementBinding is separately rooted with stable identity, approval, status history, interval and audit evidence."
    },
    {
      "id": "INV-012",
      "statement": "Listing, discoverability, availability, authorization, delivery, acceptance, fitness and use are independent assertions."
    },
    {
      "id": "INV-013",
      "statement": "Product withdrawal never cascades to datasets, services, agreements, Catalog Records or bindings."
    },
    {
      "id": "INV-014",
      "statement": "A subject missing any promotion-gate element is a catalogued resource, not a Data Product."
    },
    {
      "id": "INV-015",
      "statement": "One Product may have many Catalog Records; delisting one never retires the Product."
    },
    {
      "id": "INV-016",
      "statement": "Catalog Record and Product fields and transitions never overwrite across identities."
    },
    {
      "id": "INV-017",
      "statement": "ConsumerEntitlementBinding is neither agreement nor access grant and never authorizes access by itself."
    },
    {
      "id": "INV-018",
      "statement": "Distinct consumers may hold distinct bindings to the same Product Version under different external terms."
    },
    {
      "id": "INV-019",
      "statement": "Catalog Record, Product Version and binding validity intervals advance independently."
    },
    {
      "id": "INV-020",
      "statement": "Pipeline runs and quality observations never create Product Versions."
    },
    {
      "id": "INV-021",
      "statement": "Historical Catalog Records and expired bindings remain addressable after Product withdrawal or tombstoning."
    },
    {
      "id": "INV-022",
      "statement": "No price, tariff, SKU, market, channel, sales term or legal text is stored in WM-DAT-008; only references are held."
    },
    {
      "id": "INV-023",
      "statement": "Product identity is stable across accountability transfer because mintingNamespace is immutable and distinct from accountableOwnerRef."
    },
    {
      "id": "INV-024",
      "statement": "A binding productVersionRef always contains productId and productVersionId."
    },
    {
      "id": "INV-025",
      "statement": "Bindings may become active only for a published non-retired Product Version; later withdrawal does not erase binding history."
    },
    {
      "id": "INV-026",
      "statement": "Lifecycle transitions conform to the declared transition graphs and terminal-state timestamps are conditionally required."
    },
    {
      "id": "INV-027",
      "statement": "Deprecation names successor or no-successor, sunset, holder notice policy and notice evidence."
    },
    {
      "id": "INV-028",
      "statement": "Invariant identifiers are stable, never reused and remain attached to their statement."
    }
  ],
  "holds": [
    "Offering and agreement authorities remain identifier-unassigned and are referenced descriptively, never locally mastered.",
    "Metric-definition authority remains pending EM-DAT-05.",
    "Candidate relation rows confer no mutation or cascade authority.",
    "External standards and product projections are alignment mappings, not conformance claims.",
    "Grok accepted the boundary with an identified dependent entitlement object; final frozen audit remains to be reconciled.",
    "Catalog Record/Data Product coexistence requires registry-facing dual-identity presentation and must not become a merged type.",
    "Required and conditional relations resolve to models that are not canonically publishable; no canonical layer may rest on this candidate.",
    "The WM-DAT-001 relation and reciprocal Catalog Record boundary are unapproved; requiredness is conditional and provisional.",
    "Disjoint record mastership requires WM-DAT-001 to demote its catalogue-record facet to a reference; until amended this rule is declared, not enforced.",
    "Metric-definition authority is pending EM-DAT-05, so promise references cannot yet be satisfied canonically.",
    "Offering and agreement bindings remain external and identifier-unassigned; references are authority-qualified without placeholder IDs.",
    "Pipeline-definition mastership remains external; a WM-DAT-005 relation is not declared until registry approval."
  ],
  "offeringAgreementPlacement": {
    "offering": "external commercial master; effective-dated binding only",
    "consumerAgreement": "external legal/commercial master; effective-dated binding only",
    "rule": "No price, SKU or legal text is copied into WM-DAT-008."
  },
  "versionTriggers": {
    "rule": "Any change to required content of a published product version creates an immutable successor. Illustrative cases are non-exhaustive; exclusions are exhaustive.",
    "illustrativeSuccessorCases": [
      "pinned member rebinding",
      "pinned interface-contract revision change",
      "accountable owner or steward change",
      "purpose consumer-scope or bounded-use-case change",
      "access-route change",
      "quality or SLO promise change",
      "terms-reference or deprecation-policy change"
    ],
    "exhaustiveNoSuccessorCases": [
      "advance of a declared-series-head member while all promises remain satisfied",
      "catalog-record status change",
      "entitlement-binding status change",
      "pipeline run",
      "quality observation"
    ]
  },
  "rootObjects": {
    "DataProduct": {
      "masteredBy": "WM-DAT-008",
      "identity": "productId in immutable mintingNamespace",
      "lifecycle": "productLifecycle"
    },
    "ProductCatalogRecord": {
      "masteredBy": "WM-DAT-008 for records describing a Data Product or Data Product Version",
      "identity": "catalogId + catalogRecordId",
      "lifecycle": "catalogRecordLifecycle",
      "rule": "Separately rooted; references Product and may predate completion or survive withdrawal."
    },
    "ConsumerEntitlementBinding": {
      "masteredBy": "WM-DAT-008",
      "identity": "productId + entitlementBindingId",
      "lifecycle": "consumerEntitlementLifecycle",
      "rule": "Separately rooted; references Product Version, consumer and external terms/authorization authorities."
    }
  },
  "identityRules": {
    "mintingNamespace": "Immutable identity scope, distinct from current accountableOwnerRef; accountability transfer never changes product identity.",
    "productVersionLabel": "version is an immutable unique label scoped to productId and is not part of the key."
  },
  "promiseBreachRule": "A head advance that violates a declared promise never mutates the published version; append a promise-breach state and create a successor for any repin or promise revision.",
  "lifecycles": {
    "productLifecycle": {
      "states": [
        "draft",
        "reviewed",
        "approved",
        "published",
        "deprecated",
        "withdrawn",
        "retired"
      ],
      "transitions": [
        [
          "draft",
          "reviewed"
        ],
        [
          "reviewed",
          "approved"
        ],
        [
          "approved",
          "published"
        ],
        [
          "published",
          "deprecated"
        ],
        [
          "published",
          "withdrawn"
        ],
        [
          "deprecated",
          "withdrawn"
        ],
        [
          "withdrawn",
          "retired"
        ]
      ],
      "definitions": {
        "withdrawn": "No new use is offered; historical identity and obligations persist.",
        "retired": "Operational support has ended after withdrawal; records still resolve."
      }
    },
    "catalogRecordLifecycle": {
      "states": [
        "draft",
        "listed",
        "hidden",
        "withdrawn",
        "tombstoned"
      ],
      "transitions": [
        [
          "draft",
          "listed"
        ],
        [
          "listed",
          "hidden"
        ],
        [
          "hidden",
          "listed"
        ],
        [
          "listed",
          "withdrawn"
        ],
        [
          "hidden",
          "withdrawn"
        ],
        [
          "withdrawn",
          "tombstoned"
        ]
      ],
      "definitions": {
        "tombstoned": "Identifier remains resolvable while removed content and reason are recorded; never deletion."
      },
      "timestamps": [
        "listedAt",
        "statusChangedAt"
      ]
    },
    "consumerEntitlementLifecycle": {
      "states": [
        "proposed",
        "approved",
        "active",
        "suspended",
        "expired",
        "revoked"
      ],
      "transitions": [
        [
          "proposed",
          "approved"
        ],
        [
          "approved",
          "active"
        ],
        [
          "active",
          "suspended"
        ],
        [
          "suspended",
          "active"
        ],
        [
          "active",
          "expired"
        ],
        [
          "suspended",
          "expired"
        ],
        [
          "active",
          "revoked"
        ],
        [
          "suspended",
          "revoked"
        ]
      ]
    }
  },
  "deprecationPolicyShape": [
    "successorProductVersionRef or explicitNoSuccessor",
    "sunsetAt",
    "holderNoticePolicy",
    "noticeEvidenceRefs"
  ],
  "productVersionTermsRule": "termsAndAuthorizationRefs are descriptive external references and never substitute for a ConsumerEntitlementBinding or mint legal terms.",
  "invariantIdPolicy": "Stable and never reused; new invariants append."
}
