Evidence and the AI layer
The scan engine is deterministic and calls no model: the same input gives the same findings and exit code every time. On top sits an optional, advisory AI layer that runs on a local model by default.
vulkro scan . --format evidence-graph > graph.json # deterministic evidence
vulkro ai setup # opt in to the local AI layer
AI output is advisory. It never changes a finding, a severity, a JSON, SARIF or SBOM document, or an exit code. Published benchmark numbers are produced with the AI layer off.
Evidence graph
--format evidence-graph writes one versioned JSON document (evidence-graph/1.0) with endpoints, source-to-sink flows, reachability verdicts, findings and the dependency list. Hand it to your own AI coding agent as ground truth. Vulkro's AI commands are grounded in the same data, so the model answers about what the scan saw, not about the raw repository.
vulkro aggregate a.json b.json links evidence graphs from several repositories: an outbound HTTP call in one that matches a route in another becomes a candidate cross-repo link. See vulkro aggregate.
Setting up the AI layer
vulkro ai setup # pick a model, self-test
vulkro ai status
vulkro ai use <model>
vulkro ai off # deterministic only
The default runtime is local Ollama (http://127.0.0.1:11434/v1). Any OpenAI-compatible endpoint works. Settings resolve in this order: per-run flags (--ai-model, --ai-url, --no-ai), then VULKRO_AI_MODEL, VULKRO_AI_URL, VULKRO_AI_KEY, then the saved choice. VULKRO_AI_KEY is read from the environment only and never saved.
A local endpoint works under VULKRO_OFFLINE, since nothing leaves the machine. A cloud endpoint is your own key (vulkro ai setup --byok), sends code context off the machine, and is refused offline.
AI commands
| Command | What it does |
|---|---|
vulkro ai ask "<question>", vulkro ai chat | Answer questions from the current scan's endpoints, findings and dependencies. |
vulkro triage . | A second opinion on findings the engine cannot judge alone (business-logic bypass, data over-exposure, uncertain reachability). Its JSON is marked "advisory": true. See vulkro triage. |
vulkro fix --ai | Propose a diff where no deterministic fix template applies. --ai --write applies only verified diffs. |
vulkro explain <id> --ai | Plain-language narrative under the standard explanation. |
vulkro diff <base> --ai | Narrative of the security changes between two versions. |
vulkro slopcheck --ai | Why a flagged dependency name is risky. |
vulkro hunt | A model-driven search using Vulkro's checks as tools; a result counts as confirmed only when a deterministic check backs it. |
What "verified" means
An AI fix is verified when the patched file still parses and a fresh deterministic re-scan no longer reports the finding and reports nothing new. A second AI review can only reject a fix, never pass one. Verified does not mean your build or tests pass: review every diff.
Proof harnesses
vulkro prove . writes runnable test cases for injection and broken-authorization findings (fast-check for JavaScript and TypeScript, Hypothesis and pytest for Python, @isTest for Apex). Vulkro writes the files but never runs them, and no model is involved. See vulkro prove.
Live use from an AI coding agent
vulkro mcp serve runs Vulkro as an MCP server, so an AI coding agent can scan and read evidence while it works. See vulkro mcp serve.
See also: Dependencies & CVEs, Offline mode