VEX Evidence Playbook (Bench Repo Blueprint)
Status: Draft – aligns with the “provable vulnerability decisions” advisory (Nov 2025).
Owners: Policy Guild · VEX Lens Guild · CLI Guild · Docs Guild.
This playbook defines the public benchmark repository layout, artifact shapes, verification tooling, and metrics that prove Stella Ops VEX decisions are reproducible, portable, and superior to baseline scanners. Treat it as the contract for every guild contributing artifacts to bench/.
1. Repository layout
bench/
README.md # repo overview + quickstart
findings/
CVE-YYYY-NNNNN/ # one folder per advisory/product tuple
evidence/
reachability.json # static+runtime call graph for the finding
sbom.cdx.json # CycloneDX slice containing the involved components
decision.openvex.json # OpenVEX statement (status + justification)
decision.dsse.json # DSSE envelope wrapping the OpenVEX payload
rekor.txt # optional Rekor UUID/index/checkpoint
metadata.json # producer info (policy rev, analyzer digests, CAS URIs)
tools/
verify.sh # shell helper: dsse verify + optional rekor verification
verify.py # python verifier (offline) that recomputes digests
compare.py # baseline diff against Trivy/Syft/Grype/Snyk/Xray outputs
replay.sh # reruns reachability graphs via `stella replay`
results/
summary.csv # FP reduction, MTTD, reproducibility metrics
runs/2025-11-10/ # pinned scanner/policy versions + raw outputs
stella/
findings.json
runtime-facts.ndjson
reachability.manifest.json
trivy/
findings.json
...
File contracts
reachability.jsonis the canonical export fromcas://reachability/graphs/...with symbol IDs, call edges, runtime hits, analyzer fingerprints, and CAS references.decision.openvex.jsonfollows OpenVEX v1 with Stella Ops-specificstatus_notes,justification,impact_statement, andaction_statementtext.decision.dsse.jsonis the DSSE envelope returned by Signer (see §3). Always include the PEM cert chain (keyless) or KMS key id.rekor.txtcaptures{uuid, logIndex, checkpoint}from Attestor when the decision is logged to Rekor.metadata.jsonbinds the DSSE payload back to internal evidence:{policy_revision, reachability_graph_sha256, runtime_trace_sha256, evidence_cas_uri[], analyzer_versions[], createdBy, createdAt}.
2. Evidence production flow
- Scanner Worker
- Generate
reachability.json+sbom.cdx.jsonper prioritized CVE. - Store artifacts under CAS and surface URIs via
ReachabilityReplayWriter.
- Generate
- Policy Engine / VEXer
- Evaluate reachability states + policy lattice to produce an OpenVEX statement.
- Persist
decision.openvex.jsonand forward it to Signer.
- Signer & Attestor
- Sign the OpenVEX payload via DSSE (
payloadType: application/vnd.in-toto+json) and returndecision.dsse.json. - Optionally call Attestor to log the DSSE bundle to Rekor; write
{uuid, logIndex, checkpoint}torekor.txt.
- Sign the OpenVEX payload via DSSE (
- Bench harness
- Collect SBOM slice, reachability proof, OpenVEX, DSSE, Rekor metadata, and companion metrics into
bench/findings/CVE-.... - Record tool versions + CAS digests under
metadata.json.
- Collect SBOM slice, reachability proof, OpenVEX, DSSE, Rekor metadata, and companion metrics into
All steps must be deterministic: repeated scans with the same inputs produce identical artifacts and digests.
3. Signing & transparency requirements
| Artifact | Producer | Format | Notes |
|---|---|---|---|
| Reachability evidence | Scanner | Canonical JSON (sorted keys) | CAS URI recorded in metadata. |
| SBOM slice | Scanner | CycloneDX 1.6 JSON | Keep only components relevant to the finding. |
| OpenVEX decision | Policy/VEXer | OpenVEX v1 | One statement per (CVE, product) tuple. |
| DSSE bundle | Signer | DSSE envelope over OpenVEX payload | Include Fulcio cert or KMS key id. |
| Rekor record (optional) | Attestor | Rekor UUID/index/checkpoint | Store alongside DSSE for offline verification. |
Signer must expose a predicate alias stella.ops/vexDecision@v1 (see Sprint task SIGN-VEX-401-018). Payload = OpenVEX JSON. Rekor logging reuses the existing Attestor /rekor/entries pipeline.
4. Verification tooling
The repo ships two verifiers:
tools/verify.sh(bash) — wrapscosign verify-attestation/in-toto verify, Rekor inclusion checks (rekor-cli logproof), and digest comparison.tools/verify.py— pure-Python offline verifier for air-gapped environments:- Validates DSSE signature using the embedded Fulcio cert or configured root.
- Recomputes
sha256overreachability.json,sbom.cdx.json, anddecision.openvex.jsonto ensure the DSSE payload matches. - Optionally replays reachability by invoking
stella replay --manifest ... --finding CVE-....
CLI addition (stella decision verify) should shell out to these helpers when --from bench is provided.
5. Metrics & comparison harness
tools/compare.py ingests raw outputs from Stella Ops and baseline scanners (Trivy, Syft, Grype, Snyk, Xray) stored under results/runs/<date>/<scanner>/findings.json. For each target:
- False-positive reduction (FPR) =
1 - (# of findings confirmed true positives / # of baseline findings). - Mean time to decision (MTTD) = average wall-clock time between scan start and DSSE-signed OpenVEX emission.
- Reproducibility score =
1if re-running reachability produces identical digests for all artifacts, else0; aggregated per run.
results/summary.csv columns:
target,cve,baseline_scanner,baseline_hits,stella_hits,fp_reduction,mttd_seconds,reproducible,rekor_uuid
Automate collection via Makefile or bench/run.sh pipeline (task BENCH-AUTO-401-019).
6. Publication & README checklist
bench/README.md must include:
- High-level workflow diagram (scan → reachability → OpenVEX → DSSE → Rekor → bench).
- Prerequisites (
cosign,rekor-cli,stellaCLI). - Quickstart commands:
./tools/verify.sh CVE-2023-12345 pkg:purl/example@1.2.3 ./tools/compare.py --target sample/nginx --baseline trivy --run 2025-11-10 - How to recreate a finding:
stella replay --manifest results/runs/.../replay.yaml --finding CVE-.... - Contribution guide (where to place new findings, how to update metrics, required metadata).
7. Implementation tasks (see Sprint 401+)
POLICY-VEX-401-010— emit OpenVEX per finding and publish to bench repo.SIGN-VEX-401-018— add DSSE predicate + Rekor logging for decision payloads.CLI-VEX-401-011— newstella decisionverbs (export,verify,compare).BENCH-AUTO-401-019— automation to populatebench/findings/**, run baseline scanners, and updateresults/summary.csv.DOCS-VEX-401-012— maintain this playbook + README templates, document verification workflow.
Update docs/implplan/SPRINT_0401_0001_0001_reachability_evidence_chain.md whenever these tasks move state.