Creuto is now an OpenAI Select Partner Read More
Vulnerability alert fatigue is a routing problem. A six-step triage design using CISA KEV, EPSS and Dependabot rules, with one step a human keeps.

Vulnerability alert fatigue is not a volume problem you can scan your way out of. On 23 September 2026 CISA's Known Exploited Vulnerabilities catalogue held 1,721 entries, which FIRST puts at roughly 0.5% of published CVEs. Almost everything your scanner escalates will never be exploited anywhere. Triage is a routing problem, and exactly one step in it needs a person.
This post sets out a triage design for a team that does not have a dedicated security operations function: what to automate, what to route, how to rank by likely exploitation rather than severity alone, and the specific point at which automation stops being leverage and starts being a rubber stamp.
The numbers make the case better than any argument about process. FIRST, which runs the Exploit Prediction Scoring System, states that in any 30-day window its data partners observe exploitation activity for roughly 2.5-3% of published CVEs. The base rate of exploitation is low, and it is low for a reason: most vulnerabilities are never weaponised, never packaged, and never reach anything you run.
That means the default posture of most scanners — escalate everything above a severity threshold — guarantees a queue in which the overwhelming majority of items are correctly ignored. Engineers learn that quickly. Once a queue is 97% noise, the rational response is to stop reading it, and the alert that mattered goes past with the rest. The fatigue is not weakness; it is a correct read of a badly calibrated signal.
So the goal is not fewer scanners. It is a pipeline that silently disposes of what is provably irrelevant, ranks the remainder by likelihood of exploitation, delivers each survivor to the person who owns the code, and asks a human one question about each: fix now, schedule, or accept.
The New Stack described the health and fitness company WHOOP as having relied on multi-day, all-hands triage sessions to keep up with the alert deluge, and building an automated vulnerability-response workflow in response. Worth stating plainly: that piece is a Datadog-sponsored announcement of a webinar on 7 October 2026 with WHOOP staff engineer Vinay Raghu and Datadog senior product engineer Amber Tunnell, not an independent technical write-up. Take the shape of the workflow from it, not the results.
Four things it says the workflow does, which is a fair skeleton for anyone:
The second bullet is the one most teams skip and the one that pays. An alert sent to a security channel is a task without an owner. The same alert filed against the service that owns the dependency, with the call path and the fix version attached, is a ticket someone can close before lunch. Ownership routing is unglamorous plumbing and it removes more fatigue than any scoring model.
Two free, public signals do most of the ranking work, and they answer different questions.
| Signal | What it tells you | How to use it |
|---|---|---|
| CISA KEV | This vulnerability is known to have been exploited. 1,721 entries as of 23 September 2026, of which 361 are flagged as known ransomware campaign use. | Treat a KEV match in a running service as a decision already made. Evidence beats prediction. |
| EPSS | A daily 0-1 probability that a published CVE will be exploited in the wild in the next 30 days, with a percentile rank. | Rank the enormous middle of your queue, where no exploitation evidence exists yet. |
| CVSS | How bad it would be if exploited, in the abstract, independent of your deployment. | A tiebreaker and a blast-radius input, not a queue order. |
Three details from FIRST's own documentation change how you set thresholds. First, the score distribution is heavily skewed: a probability of 0.10 currently sits around the 95th percentile, so a number that reads as small is in fact an unusually strong signal. Second, there is no universal threshold — FIRST says 0.10 "is commonly cited in the field but carries no special authority from EPSS", and points instead at a coverage, effort and efficiency framework calibrated to the remediation capacity you actually have.
Third, and least known: EPSS deliberately does not look up confirmed exploitation. Exploitation activity observed today does not directly change tomorrow's score; exploitation data trains the model rather than driving daily scoring. FIRST is explicit that where direct evidence of active exploitation exists, that evidence should supersede EPSS. So KEV and EPSS are not competing rankings to blend — KEV is the evidence lane and EPSS orders the queue where evidence is absent. We worked through the same split in more depth in why a CVSS 9.8 can wait.
Before building anything, turn on what the platform gives you. GitHub's Dependabot auto-triage rules dismiss or snooze alerts automatically, and critically, "Rules are applied before alert notifications are sent" — so an auto-dismissed alert never reaches anyone's inbox.
Then wire the remainder to owners. Dependabot alerts can be assigned to collaborators, teams or AI agents; an agent assigned an alert opens a session and a draft pull request with a proposed fix, and stays the assignee if it cannot produce one. That is a good use of an agent: it drafts, a person merges. Note one operational wrinkle in GitHub's docs — assignment is visible in the repository-level alert view, not in the organisation-wide security overview — so do not build your programme reporting on it yet.
Automating triage on a signal you have not characterised is how a quiet queue becomes a false sense of safety. GitHub publishes the limits of Dependabot alerts directly, and they are worth reading as a list of the gaps you must cover another way:
That last one catches teams who did the right thing. Pinning actions to a commit SHA is standard supply-chain advice, and it removes you from Dependabot's alerting for those actions. The dependency you pinned hardest is the one nobody is watching. Registry-level compromises, which we covered in the docs-builder attack on a package registry, land squarely in that blind spot.
Here is the pipeline we would run for a team of 20 to 200 engineers. Five of the six steps are machine work.
Step five is not sentiment. It is where the three inputs a scanner cannot see get applied: whether the vulnerable path is reachable in your deployment, what the fix costs in regression risk, and whether a compensating control already exists. A machine can rank probability of exploitation across the world. It cannot tell you that the affected code path sits behind an internal-only load balancer, or that the upgrade drags in a breaking change to a payments integration you ship on Friday. Those are the facts that flip a decision, and they live with the engineer who owns the service.
The accept branch matters as much as the fix branch. An acceptance without an expiry is a silent permanent exception, and a year later nobody remembers why. Every accept gets a date and returns to the queue on it.
Give the counter-argument its due: a human decision step is exactly what created the multi-day, all-hands triage sessions in the first place, and adding a person to a 97%-noise queue does not improve anything. That is true, and it is why the human step comes fifth. The person is not reading the queue; they are answering one question about items that already survived dismissal, ranking and routing. If your engineers still face a wall, steps two to four are not doing their job.
Four signals that automation has stopped helping, all of them observable in your own tracker:
Instrument those four and you have a triage programme that reports on itself. That is the same discipline we apply in QA and automation work generally: automate the repeatable judgement, measure the automation, and keep the irreversible call with a named person. The pipeline plumbing usually lands in CI/CD implementation, and the asset inventory that makes routing possible in DevOps and cloud engineering.
If you do one thing this week, do not buy a tool. Export a month of alerts, mark which ones were a KEV match and which had an EPSS score above the 95th percentile, and count how many of those reached the owning engineer inside a working day. That number is your actual triage capability, and it is usually a surprise.
Reduce vulnerability alert fatigue by auto-dismissing provably irrelevant findings before notification, ranking the remainder by CISA KEV matches and EPSS probability rather than CVSS alone, routing each survivor to the engineer who owns the service, and reserving a human decision for fix, schedule or accept.
Most of it should. Ingestion, dismissal, ranking, routing and opening the upgrade pull request are all machine work. The decision to fix now, schedule or accept a risk should stay with a named engineer, because reachability, regression cost and compensating controls are facts a scanner cannot see.
Reachability analysis asks whether your code actually calls the vulnerable function, rather than whether the vulnerable package is merely installed. The New Stack reports that WHOOP used Datadog Software Composition Analysis to analyse runtime code execution and prioritise active threats over scanner noise.
FIRST states there is no universal threshold, and that the commonly cited 0.10 carries no special authority from EPSS. Because the distribution is skewed, a probability of 0.10 sits around the 95th percentile. Calibrate your threshold to the remediation capacity your team actually sustains.
They answer different questions and should be used together. KEV is evidence that exploitation happened, and FIRST says direct exploitation evidence should supersede EPSS. EPSS is a daily prediction for the much larger set of CVEs where no such evidence exists yet.
GitHub documents that only advisories it has reviewed trigger alerts, that new vulnerabilities may take time to reach the Advisory Database, that archived repositories are not scanned, and that GitHub Actions alerts fire only for semantic versioning, not for actions pinned to a commit SHA.
Watch four numbers in your tracker: median decision latency falling under a minute, an accept rate that exceeds the auto-dismiss rate, decisions routinely taken in bulk, and dismissed alerts that never auto-reopen when their metadata changes. Any of these means the human step is ceremonial.
Ready to take the first step towards unlocking opportunities, realizing goals, and embracing innovation? We're here and eager to connect.
11th Floor, O-Hub, Chandaka Industrial Estate, Infocity, Bhubaneswar, Odisha 751024
Level 4, 11 York Street Sydney Startup Hub Sydney, NSW – 2000
30 N. Đinh Nghệ, Phước Mỹ Sơn Trà, Đà Nẵng / Da Nang City – 550000
Level 25, AIDP Business Tower, Dubai Marina, United Arab Emirates
50 Beauchamp Street, Wellington, WGN 5028, New Zealand