{
  "format": "vercy-enterprise-allocation-fixtures/v1",
  "candidateName": "Dependency Type Registry",
  "cases": [
    {
      "id": "inverse-permission",
      "kind": "positive",
      "input": {
        "directionality": "directed",
        "inverseOfTypeRef": "uses"
      },
      "expect": "Inverse derivation uses the declared pairing.",
      "expectedCode": "OK_DECLARED_INVERSE"
    },
    {
      "id": "stored-inverse-duplicate",
      "kind": "negative",
      "input": {
        "storedBothDirections": true
      },
      "expect": "Duplicate inverse fact rejected.",
      "expectedCode": "E-TYPE-INVERSE-DUPLICATE"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "type-stable-identity-across-releases",
      "kind": "positive",
      "input": "A published dependency type is refined and re-released in a later registry release.",
      "expect": "The type retains its dependencyTypeId, gains a new typeVersion, and edges pinned to the prior typeVersion continue to resolve to the prior semantics."
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "type-defined-only-inside-release-blob",
      "kind": "negative",
      "input": "A dependency type is declared solely as an element of RegistryRelease.typeDefinitions with no dependencyTypeId of its own.",
      "expect": "The declaration is rejected because per-type supersession and deprecation cannot be expressed.",
      "expectedCode": "ERR_TYPE_IDENTITY_MISSING"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "undeclared-release-status-enum",
      "kind": "negative",
      "input": "A RegistryRelease carries status 'effective' with no declared status enumeration and no published-to-effective transition rule.",
      "expect": "The release is rejected until status enumerations and transition rules are declared at registry, release and type level.",
      "expectedCode": "ERR_LIFECYCLE_ENUM_UNDECLARED"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "inverse-pairing-declared",
      "kind": "positive",
      "input": "A type declares directionality 'directed' and inverseOfTypeRef pointing at its converse term.",
      "expect": "Inverse assertions are derivable on demand and a stored converse edge is detectable as a duplicate."
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "duplicate-inverse-without-pairing",
      "kind": "negative",
      "input": "Canonical and converse edges are stored as independent facts using two type terms with no declared inverse pairing or symmetry flag.",
      "expect": "The duplication rule is unenforceable and the registry state is rejected until an inverse pairing is declared.",
      "expectedCode": "ERR_INVERSE_PAIRING_UNDECLARED"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "nary-edge-rejected",
      "kind": "negative",
      "input": "A single dependency edge is asserted with three endpoints under a type declaring arity 3.",
      "expect": "The edge is rejected as invalid, not recorded as low-confidence.",
      "expectedCode": "ERR_ARITY_NOT_BINARY"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "composite-prerequisite-group",
      "kind": "positive",
      "input": "A dependent requires one prerequisite and either of two alternatives.",
      "expect": "A PrerequisiteGroup with groupSemantics 'all' containing a nested 'any' group is recorded, with every member expressed as a binary edge."
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "cross-type-composition-rule",
      "kind": "positive",
      "input": "An interface type and a package type are declared composition-eligible with a recorded basis.",
      "expect": "A TypeCompositionRule for the ordered pair is published and multi-hop paths across the two types compose."
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "colocation-as-dependency-type",
      "kind": "negative",
      "input": "A co-location relation is registered as a dependency type with a canonical dependent-to-prerequisite direction.",
      "expect": "The registration is rejected; co-location requires relationClass 'adjacency', which carries no canonical direction.",
      "expectedCode": "ERR_NON_DEPENDENCY_RELATION"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "propagation-profile-release",
      "kind": "positive",
      "input": "A propagation profile is published with typeFilter, phaseWindow, traversalDirection, depthLimit, lagBound, unknownEdgePolicy, stopConditions and evidenceThreshold.",
      "expect": "An immutable versioned PropagationProfile release is created and is pinnable by reference."
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "epistemic-state-collapse",
      "kind": "negative",
      "input": "not-assessed and unresolved are mapped onto unknown in the registry state vocabulary.",
      "expect": "The mapping is rejected; all five states remain distinct and unresolved carries its own definition.",
      "expectedCode": "ERR_EPISTEMIC_COLLAPSE"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "forward-supersession-discovery",
      "kind": "negative",
      "input": "A consumer holding registry release n must discover release n+1 using only supersedesRelease, which is recorded on n+1.",
      "expect": "The discovery path is rejected as structurally impossible; a ReleaseSupersession link record is required.",
      "expectedCode": "ERR_SUPERSESSION_UNDISCOVERABLE"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "lag-calendar-zone-tzdb-pin",
      "kind": "positive",
      "input": "A type declaring lag is published with lagCalendarRef, ianaZone and tzdbRelease.",
      "expect": "The lag semantics are resolvable and reproducible across evaluations."
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "lag-without-time-basis",
      "kind": "negative",
      "input": "A type declares a lag duration with no calendar, zone or timezone database release.",
      "expect": "The type is rejected; the lag invariant is unenforceable without a pinned time basis.",
      "expectedCode": "ERR_LAG_TIME_BASIS_MISSING"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "release-validity-time-axis",
      "kind": "positive",
      "input": "A registry release records validFrom, validTo and retiredAt.",
      "expect": "Each timestamp declares its time axis and zone, and event, observation and ingestion times remain distinct."
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "residual-impact-ownership-in-reference",
      "kind": "negative",
      "input": "The registry references WM-XCT-037 with purpose 'Dependency edge and impact semantics'.",
      "expect": "The purpose string is rejected; impact semantics belong to Impact Scenario and must not be re-asserted inside the edge work item.",
      "expectedCode": "ERR_RESIDUAL_IMPACT_OWNERSHIP"
    },
    {
      "target": "DependencyTypeRegistry",
      "id": "unjustified-reference-padding",
      "kind": "negative",
      "input": "A dependency-type vocabulary declares references to a risk record, an observation and a citation while excluding ownership of all three and consuming none.",
      "expect": "The references are rejected as unjustified coupling introduced to satisfy a reference-count minimum.",
      "expectedCode": "ERR_REFERENCE_NOT_JUSTIFIED"
    }
  ]
}
