{
  "format": "vercy-enterprise-allocation-fixtures/v1",
  "candidateName": "Impact Scenario",
  "cases": [
    {
      "id": "api-resource-diverge",
      "kind": "positive",
      "input": {
        "snapshot": "G1",
        "events": [
          "api-change",
          "resource-delay"
        ]
      },
      "expect": "Candidate exposure sets differ by type, phase and licence.",
      "expectedCode": "OK_DIVERGENT_PROJECTIONS"
    },
    {
      "id": "path-as-cause",
      "kind": "negative",
      "input": {
        "pathExists": true,
        "claim": true
      },
      "expect": "Causal promotion rejected.",
      "expectedCode": "E-SCENARIO-PATH-CAUSE"
    },
    {
      "target": "ImpactScenario",
      "id": "counter-canonical-licence-on-non-invertible-type",
      "kind": "negative",
      "input": "A propagation licence requests prerequisite-to-dependent traversal over a type whose pinned definition declares neither symmetry nor an inverse pairing.",
      "expect": "The traversal is rejected as unlicensed inverse derivation.",
      "expectedCode": "ERR_INVERSE_NOT_PERMITTED"
    },
    {
      "target": "ImpactScenario",
      "id": "api-change-reverse-traversal-licensed",
      "kind": "positive",
      "input": "An API change at a prerequisite propagates to its dependents over types that permit licensed inverse derivation at contract and runtime phase.",
      "expect": "The run proceeds, the counter-canonical direction is recorded on the licence, and no converse edge is stored."
    },
    {
      "target": "ImpactScenario",
      "id": "mixed-type-path-without-composition-rule",
      "kind": "negative",
      "input": "Traversal composes an interface edge with a package edge where no TypeCompositionRule exists for the pair.",
      "expect": "The path does not compose and traversal halts at the type boundary with a stop reason.",
      "expectedCode": "ERR_COMPOSITION_UNDECLARED"
    },
    {
      "target": "ImpactScenario",
      "id": "heterogeneous-cycle-permission",
      "kind": "negative",
      "input": "A cycle spans two types, one permitting cycles and one forbidding them, and traversal proceeds on the permissive rule.",
      "expect": "The traversal is rejected; heterogeneous cycle permission is the conjunction of all participating type rules.",
      "expectedCode": "ERR_CYCLE_RULE_CONFLICT"
    },
    {
      "target": "ImpactScenario",
      "id": "adjacency-edge-as-stop-condition",
      "kind": "positive",
      "input": "A resource-delay traversal reaches an adjacency-class co-location edge.",
      "expect": "Traversal halts with a stop reason code; the adjacency edge is reported and never propagates."
    },
    {
      "target": "ImpactScenario",
      "id": "unversioned-profile-pin",
      "kind": "negative",
      "input": "A scenario pins propagationProfileRef to a profile that has no version, no release state and no digest.",
      "expect": "The scenario is rejected because deny-by-default licensing cannot be evidenced against an unversioned profile.",
      "expectedCode": "ERR_PROFILE_PIN_UNVERSIONED"
    },
    {
      "target": "ImpactScenario",
      "id": "boolean-only-licence",
      "kind": "negative",
      "input": "A licence reduced to a single boolean is used for both the API-change and the resource-delay events on one frozen graph.",
      "expect": "The runs are rejected; a licence that cannot carry type, phase, lag and unknown-edge policy cannot separate the two events.",
      "expectedCode": "ERR_LICENCE_UNDERSPECIFIED"
    },
    {
      "target": "ImpactScenario",
      "id": "snapshot-minted-by-analysis",
      "kind": "negative",
      "input": "The scenario creates its own graph snapshot record rather than referencing one minted on the dependency-edge side.",
      "expect": "The snapshot is rejected; the analysis references snapshots and never masters them.",
      "expectedCode": "ERR_SNAPSHOT_MASTERSHIP"
    },
    {
      "target": "ImpactScenario",
      "id": "two-scenarios-same-graph-state",
      "kind": "positive",
      "input": "Two scenarios are executed over the identical frozen graph state.",
      "expect": "Both pin the same graphSnapshotRef and the same digest under a named digestAlgorithm and canonicalizationMethod, and their outputs are comparable."
    },
    {
      "target": "ImpactScenario",
      "id": "digest-without-algorithm",
      "kind": "negative",
      "input": "A snapshot digest is recorded with no digestAlgorithm and no canonicalizationMethod.",
      "expect": "The pin is rejected because immutability and staleness detection are not verifiable.",
      "expectedCode": "ERR_DIGEST_BASIS_MISSING"
    },
    {
      "target": "ImpactScenario",
      "id": "unknown-edge-on-candidate-path",
      "kind": "negative",
      "input": "A candidate path traverses an edge in the unknown state and the result is published as a completed exposure set.",
      "expect": "Traversal halts at the unknown edge, the edge is reported on the unexpanded frontier with a reason code, and completeness falls.",
      "expectedCode": "ERR_UNKNOWN_EDGE_TRAVERSED"
    },
    {
      "target": "ImpactScenario",
      "id": "absent-edge-terminates-branch",
      "kind": "positive",
      "input": "Traversal reaches an asserted-absent edge under a profile declaring unknownEdgePolicy.",
      "expect": "The branch terminates with a distinct reason code that does not collapse asserted-absent into unknown."
    },
    {
      "target": "ImpactScenario",
      "id": "successor-ref-written-into-released",
      "kind": "negative",
      "input": "A successorRef is written onto a released scenario when a correction is issued.",
      "expect": "The write is rejected; supersession is recorded in a separate link record.",
      "expectedCode": "ERR_RELEASED_MUTATION"
    },
    {
      "target": "ImpactScenario",
      "id": "status-overlay-on-stale-graph",
      "kind": "positive",
      "input": "A covering graph snapshot changes after release.",
      "expect": "A status evaluation overlay records evaluatedStatus 'stale' with its basis and timestamp; the released scenario record is byte-identical before and after."
    },
    {
      "target": "ImpactScenario",
      "id": "negative-conclusion-without-completeness",
      "kind": "negative",
      "input": "A scenario with no completenessRef publishes conclusionPolarity 'negative' for a subject.",
      "expect": "The conclusion is rejected; a scenario with no completeness pin is permanently indeterminate.",
      "expectedCode": "ERR_COMPLETENESS_REQUIRED"
    },
    {
      "target": "ImpactScenario",
      "id": "never-stale-safe-harbour",
      "kind": "negative",
      "input": "A released scenario that pinned no completeness declaration remains released while the underlying completeness declaration is withdrawn, and continues to be cited as evidence of no impact.",
      "expect": "The citation is rejected; absence of a completeness pin must make staleness unevaluable and the conclusion indeterminate, not durable.",
      "expectedCode": "ERR_STALENESS_UNEVALUABLE"
    },
    {
      "target": "ImpactScenario",
      "id": "coverage-predicate-applied",
      "kind": "positive",
      "input": "A completeness declaration covering subject set S, kinds K, phases P and interval I is pinned by a scenario whose exposure set falls inside S, K, P and whose execution time falls inside I.",
      "expect": "Coverage evaluates true and a negative conclusion is admissible."
    },
    {
      "target": "ImpactScenario",
      "id": "coverage-predicate-out-of-phase",
      "kind": "negative",
      "input": "A completeness declaration scoped to the build phase is pinned by a runtime-phase scenario drawing a negative conclusion.",
      "expect": "Coverage evaluates false and the negative conclusion is rejected.",
      "expectedCode": "ERR_COMPLETENESS_NOT_COVERING"
    },
    {
      "target": "ImpactScenario",
      "id": "executed-without-outputs",
      "kind": "negative",
      "input": "A scenario reaches status 'executed' with no exposureSet, no stopReasons and no unexpandedFrontier.",
      "expect": "The status transition is rejected; outputs are required from executed onward.",
      "expectedCode": "ERR_REQUIRED_OUTPUT_MISSING"
    },
    {
      "target": "ImpactScenario",
      "id": "suppressed-edges-reported",
      "kind": "positive",
      "input": "Edges are omitted from traversal by licence, depth limit and phase filter.",
      "expect": "Each omitted edge appears in suppressedEdges with a reason code resolved against a pinned code list."
    },
    {
      "target": "ImpactScenario",
      "id": "code-lists-unpinned",
      "kind": "negative",
      "input": "Stop reason and suppression reason codes are emitted with no codeListRefs pinned on the scenario.",
      "expect": "The output is rejected; reason codes must resolve against pinned code list versions.",
      "expectedCode": "ERR_CODELIST_UNPINNED"
    },
    {
      "target": "ImpactScenario",
      "id": "exposure-labelled-affected",
      "kind": "negative",
      "input": "The scenario output set is published as the affected set with no assessor determination.",
      "expect": "The label is rejected; the scenario may publish only a candidate exposure set.",
      "expectedCode": "ERR_UNDETERMINED_AFFECTEDNESS"
    },
    {
      "target": "ImpactScenario",
      "id": "two-events-differ-by-candidate-exposure",
      "kind": "positive",
      "input": "An API change and a resource delay are run on one frozen graph under different type filters, phase windows and licences.",
      "expect": "The candidate exposure sets differ by type, phase and licence rather than topology, and neither is labelled affected or not-affected."
    },
    {
      "target": "ImpactScenario",
      "id": "lag-grants-no-licence",
      "kind": "negative",
      "input": "A lag annotation on an edge is treated as authorisation to propagate across it.",
      "expect": "The propagation is rejected; lag is a temporal annotation and grants no propagation or causal licence.",
      "expectedCode": "ERR_LAG_NOT_A_LICENCE"
    },
    {
      "target": "ImpactScenario",
      "id": "path-is-cause",
      "kind": "negative",
      "input": "A licensed traversal path is promoted directly to a causal attribution.",
      "expect": "The promotion is rejected; causal attribution requires a separate WM-KNW-007 claim with evidence, scope, confidence and defeaters.",
      "expectedCode": "ERR_PATH_NOT_CAUSE"
    },
    {
      "target": "ImpactScenario",
      "id": "scenario-becomes-risk-determination",
      "kind": "negative",
      "input": "A released scenario output is recorded directly as a WM-KNW-015 risk determination.",
      "expect": "The recording is rejected; risk may consume a scenario but is never computed by the traversal.",
      "expectedCode": "ERR_RISK_BOUNDARY_LEAK"
    }
  ]
}
