Verdicts and justifications
The term "verdict" is used deliberately to distinguish from automated scanner statuses: it reflects a deliberate human judgment about the impact of a vulnerability.
Each vulnerability entry answers up to four questions:
| Question | Field | Values |
|---|---|---|
Does it affect this release? |
|
absent (under investigation), |
How severe is it for us? |
|
|
What will we do about it? |
|
|
Was it remediated, and where? |
|
absent, or a resolution block |
Severity and disposition only carry meaning once the verdict is affected.
Resolution is independent of the verdict: it records the fact that the dependency was updated or the issue otherwise addressed.
Verdict values
| Value | Description |
|---|---|
|
The vulnerability impacts this release. Requires |
|
The vulnerability is present in a dependency but does not impact this release. Requires |
(absent) |
Not yet triaged. The entry is under investigation. |
"Fixed" is not a verdict.
Fixing a vulnerability is a resolution action, not a judgment about impact.
Use verdict: affected with a resolution block to record that a vulnerability was real and subsequently fixed.
Use verdict: not affected with an optional resolution to record that a vulnerability was not relevant but the dependency was updated anyway.
|
affected
The vulnerability is confirmed to impact the project.
Requires a severity assessment.
Typically paired with a resolution block once the fix is applied.
Once a resolution is recorded, the entry is automatically excluded from generated suppression files; the scanner is expected to stop reporting the finding after the dependency update.
Without a resolution, an explicit suppress block is required to suppress the finding.
verdict: affected
severity: high
resolution:
in: 2.0.1
at: 2026-03-03
note: "Updated image-lib from 3.1.0 to 3.2.0"
not affected
The vulnerable dependency is present but does not impact the project.
Requires a justification explaining why the vulnerability is not exploitable in this context.
Because the finding does not reflect a real risk to the project, entries with this verdict are included in generated suppression files without requiring an explicit suppress block.
If a resolution is also recorded, the entry is treated as resolved and excluded from generated suppression files; the dependency was updated, so the scanner is expected to stop reporting the finding.
verdict: not affected
justification: vulnerable code not in execute path
analysis: >
The vulnerable code path requires SVG input processing.
Our application only accepts PNG and JPEG formats.
Disposition values
The optional disposition field states what the project intends to do about an affected vulnerability.
It is only valid together with verdict: affected and has no default: absence means the intent has not been stated, which is distinct from both values.
| Value | Description |
|---|---|
|
The project intends to remediate the vulnerability. |
|
The project accepts the risk; no remediation is intended. |
Accepting a risk
A deliberate decision to accept a risk is expressed as verdict: affected with disposition: wont fix.
The vulnerable dependency remains in place and represents a live risk, so the scanner continues to report the finding.
Suppressing a live risk must be a deliberate decision separate from the triage, so an explicit suppress block on the report entry is required.
verdict: affected
severity: medium
disposition: wont fix
analysis: >
Vulnerability confirmed but only exploitable with
specially crafted input that our validation layer rejects.
A risk-accepted vulnerability may still be fixed passively, for example when an unrelated dependency update happens to contain the fix.
Record that with a resolution block; the wont fix disposition and the resolution coexist.
Migration from risk acceptable
Earlier versions expressed risk acceptance as a dedicated verdict, risk acceptable.
That verdict is deprecated: it combined the applicability judgment with the remediation intent, which are separate questions.
Files carrying the legacy verdict keep parsing until the 1.0 release; the entry behaves exactly like verdict: affected with disposition: wont fix, and vulnlog validate prints a deprecation warning.
Writing commands leave the legacy verdict as written; migrating is a deliberate step.
Reports never render risk acceptable either.
An accepted risk appears as verdict affected, its severity, disposition wont fix, and state accepted, which is exactly what the file records.
See Migrate from the 'risk acceptable' verdict for the migration guide.
Severity values
Required when verdict is affected.
| Value | Description |
|---|---|
|
Immediate action required. Exploitable with severe impact. |
|
Action required. Significant impact if exploited. |
|
Action recommended. Moderate impact. |
|
Low priority. Minimal impact or difficult to exploit. |
Accepting a critical risk with disposition: wont fix is valid but unusual; vulnlog validate points it out with an info finding.
|
Justification values
Required when verdict is not affected.
Values align with the OpenVEX justification vocabulary.
| Value | Description |
|---|---|
|
The vulnerable component is not included in the deliverable. |
|
The vulnerable code is present but the specific vulnerable function or code path is not included. |
|
The vulnerable code is present but cannot be reached during execution. |
|
The vulnerable code is reachable but cannot be triggered by an attacker. |
|
The vulnerability is mitigated by existing controls (e.g., WAF, input validation). |