VEX Decision Hashes and Provenance

Source-verified against commit 2021a48f6e (2026-10-05). Re-verify the named source contracts before applying this description to an installation. Re-verify: git show HEAD:src/Policy/StellaOps.Policy.Engine/Endpoints/VexEffectiveStatusEndpoints.cs.

The supported VEX decision path uses a deterministic consensus decision hash. The former VexLens proof object and consensus:withProof endpoint are withdrawn.

Effective-status response

POST /api/policy/vex/effective-status requires policy:read and an authenticated tenant. The request names at most 500 (vulnerabilityId, productKey) pairs. Each returned item has:

FieldMeaning
vulnerabilityId, productKeyThe issue identity; product keys carry no version.
status, justificationThe effective tenant decision and its justification.
winningIssuersIssuers behind the selected consensus status.
contestedLive statements disagree.
overlayAppliedA tenant overlay changed the consensus outcome.
decisionHashSHA-256 of canonical evaluation inputs, trust configuration, overlays and outcome.

An unavailable projection answers 503. An issue omitted from the response is not a proof that the component is unaffected.

Verification boundary

The hash binds a deterministic evaluation; it is not a signature, a transparency inclusion proof or a standalone offline replay bundle. Preserve the statements, their provenance, trust configuration and tenant overlays to explain the decision.

A signed Findings decision can carry an attestationDigest on its overlay state. That attestation and the consensus hash have separate meanings. Do not treat one as the other.

The canonical types and hashing implementation live in src/Vulnerabilities/__Libraries/StellaOps.Vulnerabilities.Consensus/ConsensusEvaluator.cs. The HTTP response is defined by VexEffectiveStatusEndpoints in Policy.

See the consensus runbook and the overlay feed contract.

The earlier design is frozen history. It does not describe the current runtime.