Effective Severity Selection

Audience: Policy authors, reviewers, and integrators who consume Stella Ops severity decisions via API, CLI, or Console.

Last updated: 2025-11-25 (Docs Tasks Md.V)

Goal

Provide a deterministic, explainable way to pick the effective severity for a vulnerability or VEX observation when multiple signals exist (CVSS, KEV, exploit intelligence, VEX status, asset criticality, and policy overrides). The output is fully replayable: the same inputs always yield the same band and score, and the rationale chain is recorded for audit. For the language used to express these rules, see the Policy DSL; for how severity flows through a verdict, see Verdict Rationale.

Inputs

Algorithm (deterministic)

  1. Normalize all scores to a 0–10 float with 3-decimal rounding; store provenance for each signal.
  2. VEX gate
    • not_affected → effective severity None (score 0). Short-circuit unless override force_evaluate=true.
    • fixed → keep score but add mitigation note.
  3. Exploit boost: if KEV=true or EPSS >= 0.7, set exploit_boost = +1.0 (cap at 10). Record reason.
  4. Exposure clamp
    • airgap → max score 7.0 unless override allow_airgap_breakglass.
    • intranet → no cap; internet → no cap.
  5. Criticality weight: multiply by asset criticality weight (default 1.0; high=1.2, medium=1.0, low=0.8). Clamp 0–10.
  6. Policy override: apply explicit tenant rules (force severity, waive to None, or constrain max). Overrides always log the applied rule id.
  7. Bucket into severity bands (stable mapping):
Score range (inclusive)Band
9.0–10.0Critical
7.0–8.9High
4.0–6.9Medium
0.1–3.9Low
0None

All arithmetic uses decimal and rounds only when persisted or returned (3 decimals) to stay replayable.

Examples

Observability

Determinism & Offline posture

Contract for consumers