Evidence and AI-assisted triage
Vulkro's scan engine is fully deterministic and runs with no network access. It embeds no model. What it does instead is produce structured, machine-readable evidence that an external AI agent (or a human) can reason about with the scan result as ground truth. This guide ties together the four surfaces that make that possible: the evidence graph, proof harnesses, cross-repo aggregation, and the opt-in advisory triage lens.
The boundary is deliberate. Everything below except vulkro triage is offline
and deterministic. vulkro triage is the only command that calls a model, and
it never changes the deterministic finding output.
Evidence graph
--format evidence-graph emits a stable, versioned JSON document
(evidence-graph/1.0) that composes endpoints, taint source-to-sink flows,
reachability verdicts, findings, and the dependency SBOM into one graph:
vulkro scan . --format evidence-graph > graph.json
The graph is designed to be handed to an external AI agent as deterministic
ground truth: the agent brings its own model, and the graph tells it exactly
what the scanner saw. vulkro discover . --format evidence-graph produces the
same shape from the discovery pass when you only need the endpoint and flow
structure.
Proof harnesses
vulkro prove turns eligible findings into runnable test files that a developer
can execute to confirm a finding is a true positive:
vulkro prove .
For each injection or broken-authorization finding it emits a harness: a
fast-check property test plus a concrete proof-of-concept for JS/TS, a
Hypothesis and pytest harness for Python, and a generated @isTest class for
Apex (runnable inside a Salesforce org). Vulkro only writes the harness text.
It never compiles or runs it. Findings with no runnable proof shape (config,
inventory, code quality) or in a language without an emitter are listed with a
reason rather than dropped silently.
Cross-repo aggregation
A single repository rarely tells the whole story. vulkro aggregate links
evidence-graph exports from several repositories to surface candidate cross-repo
flows:
vulkro scan service-a . --format evidence-graph > a.json
vulkro scan service-b . --format evidence-graph > b.json
vulkro aggregate a.json b.json
The linker is deterministic: an outbound HTTP client call in one repo whose normalised route shape and method match an exposed endpoint in another repo is emitted as a candidate cross-repo link. The links are ground truth for an external agent to investigate, not a verdict.
Advisory triage
vulkro triage is the one command that calls a model, and it is opt-in. Every
verdict it prints is labelled advisory and non-deterministic, and none of it
mutates the finding severity or the JSON output the benchmark consumes.
export VULKRO_TRIAGE_API_KEY=<your-anthropic-key>
vulkro triage .
It brings your own key: VULKRO_TRIAGE_API_KEY is required (ANTHROPIC_API_KEY
is accepted as a fallback), and with neither set it exits 2 with guidance. Under
VULKRO_OFFLINE it refuses to run, because it makes an outbound call, and exits
2 with a message. The deterministic scan is unaffected and stays fully offline.
Exit codes: 0 when nothing needed triage, 1 when advisory verdicts were
reported, 2 on error.
Feed a scan to an agent live
vulkro mcp serve runs Vulkro as a Model Context Protocol server that Claude
Desktop, Cursor, Windsurf, Continue, and other JSON-RPC MCP clients can call as
a tool. This lets an agent request a scan and read the evidence during a coding
session rather than after the fact.
vulkro mcp serve
Related
- Exploitability and reachability - what the reachability verdict and exploitability grade mean.
vulkro prove,vulkro aggregate,vulkro triage,vulkro mcp serve.- Output formats - the full list including
evidence-graph.