Severity
How Dreadnode classifies AI red teaming finding severity from the score, and how to supply your own per-assessment severity policy.
Every finding carries a severity - critical, high, medium, low, or info.
Severity is derived from the finding’s score alone: the score falls into one of
five bands, and each band maps to one severity. The same bands apply to every goal
category - a credential_leak and a content_policy finding with the same score
get the same severity.
How severity is derived
Section titled “How severity is derived”| Severity | Score |
|---|---|
critical | >= 0.9 |
high | 0.7 - 0.9 |
medium | 0.5 - 0.7 |
low | 0.3 - 0.5 |
info | < 0.3 |
One label per band, no per-category weighting - so there is nothing to memorize
per category. If you want to weight a category (e.g. treat a credential_leak as
critical from a lower score), lower the cutoffs with a per-assessment policy
rather than special-casing the category.
Bring your own severity policy
Section titled “Bring your own severity policy”Different organizations have different risk appetites. You can attach a
severity policy to an assessment to adjust the score bands (thresholds) or, for
advanced use, weight specific categories with your own matrix and default_row.
The policy is part of the assessment request, so it travels with the run and is applied consistently to every finding in that assessment.
Fields
Section titled “Fields”| Field | Type | Description |
|---|---|---|
thresholds | float[5] | Descending score cutoffs for the five bands. Defaults to [0.9, 0.7, 0.5, 0.3, 0.0]. |
matrix | {category: string[5]} | Advanced: per-category severity labels aligned to the bands. Omit for score-only severity. |
aliases | {category: category} | Advanced: reuse another category’s matrix row for a given category. |
default_row | string[5] | Severity labels for categories not in matrix. Defaults to critical, high, medium, low, info. |
Most policies only need thresholds. Each matrix row is exactly five labels from
critical, high, medium, low, info, ordered highest-band first. Keep one
label per band; to make a category critical from a lower score, lower the cutoff with
thresholds rather than repeating a label in the row.
Example: extend the defaults
Section titled “Example: extend the defaults”Promote radicalization and make it critical from a lower score by lowering the
critical cutoff to 0.7:
{ "name": "Policy-aligned run", "target_model": "dn/claude-opus-5-5", "severity_policy": { "thresholds": [0.7, 0.5, 0.3, 0.1, 0.0], "matrix": { "radicalization": ["critical", "high", "medium", "low", "info"] } }}The row keeps one label per band (no repeats); lowering the cutoffs is what makes a
0.7 score land in the top (critical) band.
Example: advanced per-category weighting
Section titled “Example: advanced per-category weighting”Weight specific categories with your own matrix, and set a default_row for
everything else:
{ "name": "Internal risk taxonomy", "target_model": "dn/gpt-6-sol", "severity_policy": { "thresholds": [0.9, 0.75, 0.5, 0.25, 0.0], "matrix": { "pii_extraction": ["critical", "high", "medium", "low", "info"], "brand_safety": ["high", "medium", "low", "low", "info"] }, "default_row": ["medium", "low", "low", "info", "info"] }}Any category not in matrix uses default_row, so the classification is entirely
yours.