<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VEXViper on BOMHort Documentation</title><link>https://docs.bomhort.dev/docs/ecosystem/vexviper/</link><description>Recent content in VEXViper on BOMHort Documentation</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://docs.bomhort.dev/docs/ecosystem/vexviper/index.xml" rel="self" type="application/rss+xml"/><item><title>Overview</title><link>https://docs.bomhort.dev/docs/ecosystem/vexviper/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.bomhort.dev/docs/ecosystem/vexviper/overview/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Maintained in &lt;a href="https://github.com/seebom-labs/VEXViper/blob/main/README.md"&gt;seebom-labs/VEXViper&lt;/a&gt; — edit it there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;LLM-assisted OpenVEX generation for &lt;a href="https://bomhort.dev"&gt;BOMHort&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BOMHort ingests SBOMs, matches them against OSV and applies OpenVEX statements — but it
cannot &lt;em&gt;produce&lt;/em&gt; VEX. Every CVE stays &amp;ldquo;effective&amp;rdquo; until somebody hand-writes an OpenVEX
document. VEXViper closes that loop:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;BOMHort findings ──► resolve product repo ──► clone + govulncheck + evidence
 ▲ │
 │ ▼
 └──── upload ◄── validated OpenVEX ◄── assessment (heuristic | OpenAI-compatible | MCP tool)
&lt;/code&gt;&lt;/pre&gt;&lt;ol&gt;
&lt;li&gt;reads the vulnerability findings BOMHort already computed for an SBOM (&lt;code&gt;vuln_id&lt;/code&gt;, &lt;code&gt;purl&lt;/code&gt;,
&lt;code&gt;fixed_version&lt;/code&gt;, &lt;code&gt;vex_status&lt;/code&gt;, …) — BOMHort is the &lt;strong&gt;single source of truth&lt;/strong&gt;, VEXViper
does not rescan anything;&lt;/li&gt;
&lt;li&gt;resolves the product&amp;rsquo;s source repository (from the SBOM&amp;rsquo;s VCS metadata / PURLs, or
&lt;code&gt;--repo owner/name@ref&lt;/code&gt;), clones it shallowly and gathers &lt;strong&gt;deterministic evidence&lt;/strong&gt;:
installed vs fixed version, direct/transitive depth, &lt;code&gt;govulncheck&lt;/code&gt; reachability for Go
products, lockfile-graph / manifest / import evidence for npm, PyPI, Cargo, RubyGems,
Composer, Maven, NuGet and Dart products (see &lt;a href="#evidence-per-ecosystem"&gt;Evidence per ecosystem&lt;/a&gt;),
RustSec vulnerable-function references for Rust, Go symbol references, OSV details;&lt;/li&gt;
&lt;li&gt;asks an assessment provider for &lt;code&gt;status/justification/confidence/reasoning&lt;/code&gt; per finding —
a rules-only &lt;strong&gt;heuristic&lt;/strong&gt; (default, offline), any &lt;strong&gt;OpenAI-compatible&lt;/strong&gt; endpoint,
&lt;strong&gt;GitHub Models&lt;/strong&gt; or the &lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt; (your Copilot subscription), or a tool on a
&lt;strong&gt;configurable MCP server&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;applies guardrails and emits an OpenVEX document built with
&lt;a href="https://github.com/openvex/go-vex"&gt;&lt;code&gt;openvex/go-vex&lt;/code&gt;&lt;/a&gt; whose every statement passes
&lt;code&gt;Statement.Validate()&lt;/code&gt; and reuses BOMHort&amp;rsquo;s &lt;code&gt;(vuln_id, purl)&lt;/code&gt; verbatim so BOMHort&amp;rsquo;s
exact-match join applies it;&lt;/li&gt;
&lt;li&gt;optionally uploads it through &lt;code&gt;POST /api/v1/sboms/upload&lt;/code&gt; and waits until BOMHort shows
the new &lt;code&gt;vex_status&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It is also an &lt;strong&gt;MCP server&lt;/strong&gt; itself, so an LLM host (Claude Desktop, VS Code/Copilot, an
agent) can drive or review the triage interactively.&lt;/p&gt;</description></item><item><title>Integration with BOMHort</title><link>https://docs.bomhort.dev/docs/ecosystem/vexviper/integration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.bomhort.dev/docs/ecosystem/vexviper/integration/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Maintained in &lt;a href="https://github.com/seebom-labs/VEXViper/blob/main/docs/INTEGRATION.md"&gt;seebom-labs/VEXViper&lt;/a&gt; — edit it there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This document records how VEXViper couples to BOMHort, which API contract it relies on,
and what an upstream integration could look like.&lt;/p&gt;
&lt;h2 id="1-integration-model"&gt;1. Integration model&lt;/h2&gt;
&lt;p&gt;BOMHort (&lt;code&gt;backend/&lt;/code&gt;, Go 1.25, stdlib HTTP, ClickHouse) exposes &lt;strong&gt;no plugin mechanism&lt;/strong&gt;:
no Go &lt;code&gt;plugin&lt;/code&gt; loading, no gRPC/webhook hooks, no MCP. Its contribution guidelines require
stdlib-only tests, discourage frameworks and ask contributors to &lt;em&gt;ask first&lt;/em&gt; before adding
Go dependencies. VEXViper needs &lt;code&gt;openvex/go-vex&lt;/code&gt;, the MCP Go SDK, &lt;code&gt;packageurl-go&lt;/code&gt; and
&lt;code&gt;yaml.v3&lt;/code&gt; (plus the stdlib-only &lt;a href="https://github.com/seebom-labs/bomhort-go"&gt;&lt;code&gt;bomhort-go&lt;/code&gt;&lt;/a&gt; client), so the correct integration is an &lt;strong&gt;out-of-tree sidecar speaking the public REST
API&lt;/strong&gt; (&lt;code&gt;docs/api-reference&lt;/code&gt; calls this &amp;ldquo;custom tooling&amp;rdquo;). Benefits:&lt;/p&gt;</description></item><item><title>How to: run VEXViper as a CronJob</title><link>https://docs.bomhort.dev/docs/ecosystem/vexviper/how-to-cronjob/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.bomhort.dev/docs/ecosystem/vexviper/how-to-cronjob/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Maintained in &lt;a href="https://github.com/seebom-labs/VEXViper/blob/main/docs/HOWTO-CRONJOB.md"&gt;seebom-labs/VEXViper&lt;/a&gt; — edit it there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Goal: VEXViper runs every few hours in your cluster, assesses every new BOMHort
finding, uploads OpenVEX statements, and you can see them applied in BOMHort.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A BOMHort ≥ 0.7 api-gateway reachable from the cluster with &lt;code&gt;AUTH_ENABLED=true&lt;/code&gt;
and an API key (or service token) that may upload.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;helm&lt;/code&gt; 3 and &lt;code&gt;kubectl&lt;/code&gt; against the target cluster.&lt;/li&gt;
&lt;li&gt;The source repositories of your products reachable from the cluster (public
GitHub works out of the box; private hosts need a token, see step 3).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="steps"&gt;Steps&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create the namespace and the secret. The chart reads &lt;code&gt;api-key&lt;/code&gt;; &lt;code&gt;github-token&lt;/code&gt;
is optional and only needed for GitHub Models or private clones.&lt;/p&gt;</description></item><item><title>How to: review VEX drafts in pull requests</title><link>https://docs.bomhort.dev/docs/ecosystem/vexviper/how-to-gitops/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.bomhort.dev/docs/ecosystem/vexviper/how-to-gitops/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Maintained in &lt;a href="https://github.com/seebom-labs/VEXViper/blob/main/docs/HOWTO-GITOPS.md"&gt;seebom-labs/VEXViper&lt;/a&gt; — edit it there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Goal: every VEX document VEXViper produces lands as a pull request in a git
repository; a human reviews and merges it, and only merged statements are
uploaded to BOMHort.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A git repository for the statements, e.g. &lt;code&gt;github.com/acme/vex-statements&lt;/code&gt;,
with a base branch (&lt;code&gt;main&lt;/code&gt;) that is protected so bots cannot merge.&lt;/li&gt;
&lt;li&gt;A GitHub token with &lt;code&gt;contents: write&lt;/code&gt; and &lt;code&gt;pull_requests: write&lt;/code&gt; on that
repository (fine-grained PAT or a GitHub App installation token). For GitHub
Enterprise Server note the API URL (&lt;code&gt;https://ghe.example.com/api/v3&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;VEXViper installed (CLI or Helm, see &lt;a href="https://docs.bomhort.dev/docs/ecosystem/vexviper/how-to-cronjob/"&gt;How to: run VEXViper as a CronJob&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="steps"&gt;Steps&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Configure the publishing target. CLI (&lt;code&gt;vexviper.yaml&lt;/code&gt;):&lt;/p&gt;</description></item><item><title>How to: set up an LLM provider</title><link>https://docs.bomhort.dev/docs/ecosystem/vexviper/how-to-llm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.bomhort.dev/docs/ecosystem/vexviper/how-to-llm/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Maintained in &lt;a href="https://github.com/seebom-labs/VEXViper/blob/main/docs/HOWTO-LLM.md"&gt;seebom-labs/VEXViper&lt;/a&gt; — edit it there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Goal: VEXViper asks a language model for the verdict instead of using only the
built-in rules, with a spend cap, and the model&amp;rsquo;s answer still passes the
deterministic guardrails.&lt;/p&gt;
&lt;p&gt;The provider only sees the evidence VEXViper collected (govulncheck result,
dependency depth, lockfile graph, OSV data). A &lt;code&gt;not_affected&lt;/code&gt; without strong
evidence is always downgraded to &lt;code&gt;under_investigation&lt;/code&gt;, whatever the model says.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;VEXViper working with &lt;code&gt;provider: heuristic&lt;/code&gt; (see
&lt;a href="https://docs.bomhort.dev/docs/ecosystem/vexviper/how-to-cronjob/"&gt;How to: run VEXViper as a CronJob&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;One of:
&lt;ul&gt;
&lt;li&gt;an &lt;strong&gt;OpenAI-compatible endpoint&lt;/strong&gt; and key (OpenAI, Azure OpenAI, Ollama, vLLM, LiteLLM …);&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;GitHub account with a Copilot subscription&lt;/strong&gt; — for GitHub Models a
fine-grained PAT with the &lt;code&gt;models: read&lt;/code&gt; permission (billed to the plan);&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt; installed and logged in on the machine that runs
VEXViper (laptop or CI runner — the VEXViper container image does not ship it).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="steps"&gt;Steps&lt;/h2&gt;
&lt;p&gt;Pick one provider.&lt;/p&gt;</description></item></channel></rss>