stella vex — Command Guide

The stella vex command group works with Vulnerability Exploitability eXchange (VEX) data in Stella Ops: it explains the consensus of one issue from the statements the vulnerabilities hub holds, generates VEX statements from facet-drift analysis, and groups the verdict and unknowns commands.

Audience: release operators, security engineers, and CI/CD pipelines that gate deployments on VEX status.

Command summary

CommandPurpose
stella vex explain <vulnerability-id> --product-key <product-key>Explain the consensus of one issue from the hub’s live statements.
stella vex gen --from-drift --image <IMAGE>Generate VEX statements from facet drift.
stella vex verdict ...Verify, list and push verdict attestations for container images.
stella vex unknowns ...Unknowns registry operations.

The consensus listing, simulation and export commands, the observation and linkset commands, the provider commands and the gate-scan commands were withdrawn on 2026-09-30: they called routes that no service serves.


stella vex explain

Explain the VEX consensus for one vulnerability and product. The command reads the live statements behind the issue from the vulnerabilities hub (GET /api/vulnerabilities/v1/issues/{vulnerabilityId}/{productKey}/facts, scope advisory:read) and evaluates them with the shared consensus evaluator that the Scanner’s matcher and Policy’s gate projection also use.

Usage

stella vex explain <vulnerability-id> --product-key <product-key> [--json]
OptionAliasDescription
--product-key <KEY>-pRequired. Canonical product key: the package URL without a version (for example pkg:npm/lodash).
--jsonWrite the explanation as JSON.

Scope of the evaluation

Output

The explanation carries the effective status, justification and severity, the winning issuers, whether any statement disagrees (contested), the affected ranges of the winning statements, the evaluation’s decision hash, and every statement with its issuer, status, justification, applicability and fact id. The hub resolves a fact id’s provenance with GET /api/vulnerabilities/v1/facts/{factId}/evidence.

stella vex explain CVE-2024-1234 --product-key pkg:npm/lodash
stella vex explain CVE-2024-1234 --product-key pkg:npm/lodash --json

Exit codes

CodeDescription
0The explanation was written.
1Missing input, no hub URL configured, the hub refused or failed the read, or the hub’s answer broke the contract. Nothing is written to standard output.

The hub URL is StellaOps:VulnerabilitiesUrl (or STELLAOPS_VULNERABILITIES_URL); without it the command uses StellaOps:BackendUrl, because the gateway forwards /api/vulnerabilities/v1 to the hub.


stella vex gen --from-drift

Sprint: SPRINT_20260105_002_004_CLI

Generate VEX statements from facet drift analysis. This command analyzes drift between a baseline seal and the current image state, then generates OpenVEX documents for facets that require authorization.

Usage

stella vex gen --from-drift --image <IMAGE> [OPTIONS]

Required Options

OptionAliasDescription
--from-driftEnable drift-based VEX generation
--image <REF>-iImage reference or digest to analyze

Optional Options

OptionAliasDescriptionDefault
--baseline <ID>-bBaseline seal ID for comparisonlatest seal
--output <PATH>-oOutput file pathstdout
--format <FMT>-fVEX format: openvex, csafopenvex
--status <STATUS>-sVEX status: under_investigation, not_affected, affectedunder_investigation
--verbose-vEnable verbose outputfalse

Examples

Generate VEX from drift

stella vex gen --from-drift --image sha256:abc123

Specify baseline seal

stella vex gen --from-drift --image myregistry.io/app:v2.0 --baseline seal-xyz789

Output to file with specific status

stella vex gen --from-drift --image sha256:abc123 \
  --output vex-authorization.json \
  --status not_affected

Output Format (OpenVEX)

{
  "@context": "https://openvex.dev/ns",
  "@id": "https://stellaops.io/vex/abc123-def456",
  "author": "StellaOps CLI",
  "timestamp": "2026-01-05T10:30:00Z",
  "version": 1,
  "statements": [
    {
      "@id": "vex:statement-1",
      "status": "under_investigation",
      "timestamp": "2026-01-05T10:30:00Z",
      "products": [
        {
          "@id": "sha256:abc123...",
          "identifiers": {
            "facet": "runtime"
          }
        }
      ],
      "justification": "Facet drift authorization for runtime. Churn: 15.50% (3 added, 1 removed, 2 modified)",
      "action_statement": "Review required before deployment"
    }
  ]
}

Exit Codes

CodeDescription
0Success
1Error or no baseline seal found
2Image resolution failed

Workflow Integration

The vex gen --from-drift command is typically used in a release pipeline:

  1. Build — the container image is built.
  2. Seal — stella seal creates a baseline seal at build time.
  3. Deploy — the release is submitted through the release control plane.
  4. Drift detection — if facet drift exceeds quota, the release is blocked.
  5. VEX generation — stella vex gen --from-drift creates an authorization document.
  6. Review — the security team reviews and signs the VEX.
  7. Retry — with the VEX in place, the release proceeds.
# After a release is blocked due to drift
stella vex gen --from-drift --image $IMAGE_DIGEST \
  --output vex-authorization.json

Review the document, sign it as a DSSE envelope with the issuer’s key, and push it to the vulnerabilities hub (POST /api/vulnerabilities/v1/issuers/{issuerId}/vex; the issuer must be allowlisted). The CLI has no VEX sign or ingest command. Then retry the release.