No-Network Local Findings Tutorial

This tutorial generates CycloneDX 1.6 VEX JSON from committed fixture files without contacting OSV or any other vulnerability service.

Use this path when you are evaluating Vexcalibur from a private environment, or when another trusted process already produced vulnerability and exploitability findings.

Prerequisites

  • Python 3.10 or newer

  • uv 0.11.17

  • Dependency installation access through PyPI, an internal package index, a populated uv cache, or a prebuilt environment.

Install the project and development dependencies from the repository root:

uv sync

After dependencies are installed, the generation command in this tutorial does not contact OSV or any other vulnerability service.

Confirm that the CLI starts:

uv run --frozen vexcalibur --help

Generate VEX Offline

Run generate with the fixture SBOM and fixture findings file:

uv run --frozen vexcalibur generate \
  tests/fixtures/sbom/cyclonedx-json-simple.json \
  --offline \
  --findings-file tests/fixtures/findings/all-analysis-states.json \
  --timestamp 2026-06-23T00:00:00Z \
  --output /tmp/vexcalibur-offline-vex.json

Expected success signal: the command exits with status 0 and writes /tmp/vexcalibur-offline-vex.json.

Verify The Output

Inspect the generated document:

python -m json.tool /tmp/vexcalibur-offline-vex.json | sed -n '1,120p'

Verify stable fields and the expected fixture vulnerability count:

python - <<'PY'
import json
from pathlib import Path

vex = json.loads(Path("/tmp/vexcalibur-offline-vex.json").read_text())
assert vex["bomFormat"] == "CycloneDX"
assert vex["specVersion"] == "1.6"
assert vex["metadata"]["timestamp"] == "2026-06-23T00:00:00+00:00"
assert len(vex["vulnerabilities"]) == 5
print("generated offline CycloneDX VEX")
PY

Expected success signal: the Python verification command prints generated offline CycloneDX VEX.

What The Command Did

--offline --findings-file selects the local findings source. Vexcalibur parses the SBOM locally, matches each finding to an SBOM component by component_ref or unique package URL, and renders CycloneDX VEX. It does not construct an OSV client or send package data to a network provider.

Use the local findings reference when writing your own findings file.