Every alert and group Qevlar investigates gets a severity level, and every one that is not benign also gets a score from 0 to 100 (see Benign alerts). This article explains how that score is built, so you can read it, check it, and explain it to your own stakeholders.
In short: Qevlar's AI reads the investigation evidence and places the alert on a few clearly defined factors. A fixed formula then turns those factors into the score. The AI never picks the score or the level itself, so the same factors always give the same severity.
Severity levels
The score maps to one of five levels:
| Level | Score |
|---|---|
| Informational | 0–19 |
| Low | 20–39 |
| Medium | 40–59 |
| High | 60–79 |
| Critical | 80–100 |
In a few specific situations, a guardrail moves the level outside the band of its score. See Guardrails below.
The factors
Severity looks at four factors, the same for alerts and groups. Each factor has a small number of tiers with a precise definition.
Threat: what could this threat do?
Threat is judged on what the evidence shows the threat is capable of, not on the detection name or the vendor's label. The same scale applies to endpoint, email, identity, network, DLP and cloud alerts.
| Tier | Meaning | Examples |
|---|---|---|
| Nuisance | Cannot take, hold or destroy anything | Adware, potentially unwanted programs, spam, scam emails with no payload or credential form, opportunistic scanning with no sign of success, policy violations (unsanctioned SaaS, USB) |
| Access-capable | Could obtain access, credentials, money or data | Trojan, RAT, infostealer, phishing with a payload or a credential form, business email compromise, C2 beaconing, suspicious sign-in, privilege-escalation attempt, suspicious PowerShell or WMI use, OAuth consent to an unknown app, DLP hit on sensitive data |
| Destructive | Destructive, or a direct threat to your identity platform or data. Needs direct evidence | Ransomware, wiper, confirmed data exfiltration, an attacker who successfully signed in or obtained a token, domain or identity-provider compromise, tampering with backups or security tools, hands-on-keyboard lateral movement |
When the evidence could support two tiers, Qevlar takes the higher one only if there is direct evidence for it.
A few cases that often surprise:
- Reconnaissance or discovery that only returns identifiers or metadata is Nuisance, blocked or not.
- Cracks and keygens with no bundled payload are Nuisance.
- A suspicious or impossible-travel sign-in is Access-capable while there is no evidence that an attacker controls the account. Once an attacker-controlled sign-in or token is established, it is Destructive.
- Routine operational actions, such as deleting or restarting pods, redeploying containers or restarting services, are not destructive.
Containment: how far did the threat get?
Containment describes the furthest stage the threat reached. The key rule: a threat nobody engaged with is not contained. If a phishing email sits unopened in an inbox, nothing stopped it; nobody clicked it yet.
| Tier | Meaning |
|---|---|
| Blocked | A security control stopped the threat: EDR block, quarantine, email retraction, firewall deny, process kill, account disabled, session revoked, host isolated, conditional-access block |
| Latent | The threat is present or delivered, no control fired, and nobody ran or engaged with it |
| Realized | Something happened: a payload ran, a sign-in succeeded, credentials were submitted, data was touched or a configuration was changed, with no sign that it is still going on |
| Still active | The attack is in progress: beaconing, lateral movement, encryption or exfiltration under way |
For sign-in alerts: a sign-in stopped by a control is Blocked, a successful sign-in is Realized, and a sign-in that failed on wrong credentials with no control involved is Latent.
A few more rules:
- A control that fired after the threat succeeded counts as Blocked only if it fully reverses the access: sessions and tokens revoked, host isolated, payload removed. Otherwise the alert is Realized.
- A control on a different part of the attack chain does not contain the alerted activity.
- Traffic that a control only logged or allowed is not containment.
- When some recipients clicked a link that was blocked and others still have the email in their inbox, Qevlar takes the worst state that no control stopped: here, Latent.
- If the evidence does not say whether the threat was delivered, ran or got access, Containment is Not observed (see below), not Latent.
Reach: how many entities are affected?
Reach counts the distinct people or assets in your organization that the threat acted on or was delivered to: users, hosts and mailboxes. It does not count observables, IP addresses or alerts. A user and the device they were using count as one entity.
| Tier | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| Affected entities | 1 | 2–5 | 6–19 | 20–99 | 100+ or organization-wide |
Blocked emails and failed sign-ins do not add to reach. Also:
- Several addresses or accounts of the same person count as one.
- For sharing, DLP, permission-change and insider alerts, reach is the acting account plus each named target.
- Infrastructure that only answered the attacker, such as domain controllers authenticating it or proxies, is not counted.
- A change scoped to the whole tenant, such as an admin consent, a tenant-wide policy or a federation change, is organization-wide.
Asset: how critical is what was hit?
Asset criticality looks at the most critical asset or user affected.
| Tier | Meaning |
|---|---|
| Standard | Ordinary workstations, laptops, mobile devices, regular user accounts and mailboxes. This is the default when nothing points higher. |
| Important | Servers, administrator or privileged accounts, service accounts, executives or finance users, sensitive groups or business units |
| Critical | VIP users and crown-jewel assets, or structurally critical systems: domain controllers, identity providers, certificate authorities, backup infrastructure, security tooling, payment or personal-data stores |
Qevlar uses explicit signals first, such as VIP tags, asset tags and privileged roles. When there are none, it infers the tier from the evidence (naming conventions such as DC or adm-, server vs workstation, group memberships, job title) and says so in the explanation.
How the score is calculated
Step 1: Threat and Reach set the base, up to 100 points. Threat carries 60% of the weight and Reach 40%.
| Threat | Points | Reach | Points |
|---|---|---|---|
| Nuisance | 20 | 1 entity | 8 |
| Access-capable | 40 | 2–5 | 16 |
| Destructive | 60 | 6–19 | 24 |
| 20–99 | 32 | ||
| 100+ | 40 |
Step 2: Containment and Asset scale the base.
| Factor | Multiplier |
|---|---|
| Containment | Blocked ×0.65 · Latent ×0.75 · Realized ×0.90 · Still active ×1.00 |
| Asset | Standard ×1.00 · Important ×1.15 · Critical ×1.35 |
Score = (Threat points + Reach points) × Containment × Asset
The result is rounded and capped at 100.
Reading the severity breakdown
Click the severity on an alert or a group to open its breakdown:
- The grid has 100 squares in five bands of 20, from Informational at the bottom to Critical at the top. The filled squares are the score.
- One row per factor shows its tier and the points it adds. The points always add up to the score.
- Click a factor to highlight its squares and read why it got that tier: one sentence citing the evidence that decided it.
- Initial severity, under the breakdown, is the level given by your tools, shown for comparison.
Guardrails
A few rules adjust the level (not the score) after scoring, so that obvious cases are never under- or over-rated. When a guardrail moves the level, the breakdown says: "A guardrail moved the level outside the band of its score."
- Blocked threats are capped. If a control blocked the threat, the level is at most Medium, or at most High when 6 or more entities were targeted or a critical asset was involved.
- Active attacks are at least High. If the attack is still active and the threat is at least access-capable, the level is at least High. Running adware does not trigger this.
- Critical assets that were hit are at least High. If a critical asset is involved and the threat was realized or is still active, the level is at least High.
- Active attacks on critical assets are Critical. If a critical asset is involved, the attack is still active and the threat is at least access-capable, the level is Critical.
- A group is never less severe than its alerts. Its level is at least the highest level among its alerts. For an alert scored before this model existed, its previous severity level is used.
When a factor cannot be determined
Qevlar never guesses a tier. When the evidence does not establish a factor, the breakdown shows it as Not observed, and the formula uses a fixed, neutral value instead:
| Factor not observed | Value used |
|---|---|
| Threat | Access-capable |
| Containment | Latent (we never assume a control fired that we did not see) |
| Reach | 1 entity |
| Asset | Standard |
When two or more factors are not observed, the breakdown warns: "Some factors were not observed, so this score may be too low." Treat these alerts with extra care rather than trusting the level alone.
Benign alerts
Severity measures how serious a real threat is. When the investigation concludes an alert is benign, there is no threat to rate, so Qevlar does not score it: the alert is Informational by rule, and the breakdown shows the verdict Benign and Not scored, with no score and no factors.
The same applies to a group whose verdict is benign.
Only a benign verdict skips scoring. Malicious alerts are scored, and so are alerts whose investigation was suspicious or lacked data.
Groups of similar alerts
Groups are scored with the same factors and the same formula, looking at all their alerts together:
- Reach counts the distinct entities across all the alerts.
- Threat, Containment and Asset take the worst tier that at least one alert directly supports.
- The level is never lower than the most severe alert in it (guardrail 5).
Worked examples
| Scenario | Threat · Containment · Reach · Asset | Score | Level |
|---|---|---|---|
| Adware blocked on one laptop | Nuisance · Blocked · 1 · Standard | 18 | Informational |
| Trojan blocked by EDR on one laptop | Access-capable · Blocked · 1 · Standard | 31 | Low |
| Adware running, never blocked, one laptop | Nuisance · Still active · 1 · Standard | 28 | Low |
| Phishing email delivered, not clicked, one mailbox | Access-capable · Latent · 1 · Standard | 36 | Low |
| Successful suspicious sign-in, nothing further, standard user | Access-capable · Realized · 1 · Standard | 43 | Medium |
| Ransomware blocked at execution on one laptop | Destructive · Blocked · 1 · Standard | 44 | Medium |
| RAT beaconing to its command server right now, one laptop | Access-capable · Still active · 1 · Standard | 48 | High (guardrail 2) |
| Ransomware blocked on 40 hosts | Destructive · Blocked · 20–99 · Standard | 60 | High |
| Phishing wave delivered, not clicked, 200 mailboxes | Access-capable · Latent · 100+ · Standard | 60 | High |
| Credentials submitted and used, one standard user | Destructive · Realized · 1 · Standard | 61 | High |
| Data exfiltration in progress, one finance user | Destructive · Still active · 1 · Important | 78 | High |
| Credentials submitted and used, one VIP | Destructive · Realized · 1 · Critical | 83 | Critical |
| Ransomware encrypting 12 servers | Destructive · Still active · 6–19 · Important | 97 | Critical |
Severity in the API
The Get investigation result endpoint (GET /v2/investigations/{alert_id}/result) returns the same severity as the platform, in a severity object at the root of the payload:
{
"id": "00000000-0000-0000-0000-000000000001",
"severity": {
"score": 68,
"level": "HIGH",
"needs_data": false,
"guardrails_applied": [],
"parameters": {
"threat": {
"score": 39,
"tier": 3,
"explanation": "The IP is a known command-and-control server for active malware."
},
"containment": {
"score": 19,
"tier": 3,
"explanation": "The connection succeeded and no block was recorded."
},
"reach": {
"score": 10,
"tier": 2,
"explanation": "Three endpoints contacted the same IP."
},
"asset_criticality": {
"score": 0,
"tier": 1,
"explanation": "Regular workstations; no server role or VIP tag found."
}
}
},
"investigation": {
"report": {
"qevlar_severity": "HIGH"
}
}
}
| Field | Meaning |
|---|---|
score |
The severity score, from 0 to 100. |
level |
The severity level: INFORMATIONAL, LOW, MEDIUM, HIGH or CRITICAL. It is the same value as investigation.report.qevlar_severity. |
needs_data |
true when two or more factors were not observed, so the score may be too low. |
guardrails_applied |
The guardrails that moved the level away from the band of its score, as G1 to G4, numbered as in Guardrails. Empty when none applied. |
parameters |
One entry per factor: threat, containment, reach and asset_criticality. |
parameters.<factor>.score |
The points this factor adds, as in the breakdown. The four scores add up to score. |
parameters.<factor>.tier |
The tier as a number, or null when the factor was not observed. |
parameters.<factor>.explanation |
The one-sentence evidence behind the tier, as shown when you click the factor. |
Tier numbers map to the tiers described above, from lowest to highest:
| Parameter | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
threat |
Nuisance | Access-capable | Destructive | ||
containment |
Blocked | Latent | Realized | Still active | |
reach |
1 entity | 2–5 | 6–19 | 20–99 | 100+ |
asset_criticality |
Standard | Important | Critical |
severity is null when the alert was not scored: a benign alert, or an alert investigated before this model existed. In both cases investigation.report.qevlar_severity still gives the level.
The same severity breakdown is also available for groups of similar alerts, through the Get alert group endpoint (GET /v2/alert-groups/{group_id}).
FAQ
Why does my alert show a level that does not match its score band?
A guardrail moved it. The breakdown tells you when this happens; see Guardrails.
Does the AI decide the severity?
The AI decides each factor's tier from the evidence, and explains each choice in one sentence. The score and the level are then pure arithmetic, so the same tiers always give the same severity.
How can I make asset criticality more accurate?
Tag your VIP users in Qevlar. Explicit signals always take precedence over what the AI infers from naming or roles.
Why is a delivered-but-unopened phishing email not rated as contained?
Because no control stopped it. It is still in the mailbox and could be opened at any time. It is rated Latent, which weighs less than Realized or Still active, but more than Blocked.