Automation · IT and security
How to build security alert triage
Four thousand alerts a week and the one that mattered was closed as noise by somebody on their fourth hour. This is the design behind triage that reduces the queue, the prompts that build it, and what production adds.
Built with Tray Headless
- System Datadog
- Step Enrich
- Step Suppress known-benign
- Step Score on asset
- System Jira
Enrichment happens before a human sees the alert, and suppression is time-boxed so a rule cannot silently hide a real detection forever.
The short answer
What is security alert triage automation?
Security alert triage is four parts: enrichment that answers the obvious questions before a human opens the alert, suppression of known-benign patterns with an expiry so nothing hides forever, scoring on the value of the asset instead of the severity the tool assigned, and measuring what was closed instead of what fired. Teams usually come unstuck on suppression without expiry. A rule written during one noisy week silently hides a real detection two years later and nobody remembers it exists.
What matters here
- Enrich before a human sees it. Most triage time is spent answering questions a machine could have answered already.
- Every suppression rule gets an expiry. A rule with no end date is a permanent blind spot nobody revisits.
- Score on the asset, not the tool severity. A medium on a production database outranks a critical on a test box.
- Measure alerts closed and time to triage, not alerts generated. Volume rises with instrumentation and means nothing.
- Track false negatives found later. That is the only honest measure of whether suppression went too far.
Who this is for
You run security operations. The queue is thousands of alerts a week, most are noise, and the concern is that the real one gets closed by somebody tired.
How it works in practice
From a detection firing to somebody deciding it matters, in order.
- 1
The alert is enriched before anybody opens it
Asset owner, environment, exposure, recent changes, and whether this fired before.
- 2
Known-benign patterns are suppressed with an expiry
Every rule ends, so a blind spot cannot be permanent by accident.
- 3
Scoring uses the asset, not the tool severity
A medium on a production database outranks a critical on a test instance.
- 4
Related alerts are grouped into one case
Forty alerts from one misconfiguration is one investigation, not forty.
- 5
Only what survives reaches a human
With the context already attached, so triage starts at the decision rather than the research.
- 6
Outcomes are recorded on every alert
True positive, benign, or a duplicate, which is what makes the suppression rules improvable.
What triage is made of
Four parts, and the second is the one that becomes a liability if it is done carelessly.
Enrichment first
Asset, owner, environment, exposure and change history attached automatically. Most triage time is research a machine can do.
Expiring suppression
Every rule has an end date and an owner. A permanent suppression is a blind spot that outlives the person who created it.
Asset-based scoring
The tool knows the detection and you know the asset. Severity that ignores what the asset is will always be wrong.
Outcome measurement
Closed, time to triage and false negatives found later. Alerts generated is a measure of instrumentation, not of security.
The Tray Headless prompts
Paste these into Claude Code or Codex with the Tray Headless plugin installed. Each stage runs on its own. The systems named in them are the worked example rather than a requirement, and every prompt says so.
Once per project, run
/tray-workflows:set-workspace
to pick the workspace these build in. Point it at a sandbox first.
- 1
Set up, then get the asset context
Scoring depends on knowing what the asset is worth.
Headless skills
build-workflowUse build-workflow. The systems in play are Datadog, Okta, Jira, PagerDuty, Slack and Snowflake, or whatever we run in those seats. Before you plan anything, tell me which of them are already authenticated in the workspace, because I do not want a connector stubbed that I have not authenticated. The detail that matters most is the detection sources and our asset inventory. I need: alerts with their raw detail, the asset register with owner, environment and data classification, and recent change events. The asset register is the constraint. If we cannot resolve an alert to a known asset with an owner and an environment, everything downstream is guessing, and that is worth knowing before we build scoring on top of it.
- 2
Enrich before a human ever sees it
Most triage time is research a machine could have done.
Headless skills
build-workflowUse build-workflow. On every alert, before it reaches a queue, attach: The asset, its owner, environment and data classification Whether it is internet-facing Deploys and configuration changes on that asset in the last 24 hours How many times this detection fired on this asset in 30 days, and what the outcome was each time Any related alert within a short window For an identity alert, the user, their department and whether they are a leaver An analyst opening an alert should be deciding, not researching. Every one of those lookups is something they would have done by hand, and doing them beforehand is most of the value here.
- 3
Suppress with an expiry, always
A rule with no end date is a permanent blind spot.
Build suppression, and give every rule an expiry and a named owner. Known-benign patterns: a scanner we run, a backup job, a health check Expected noise from a specific asset during a known change window Duplicate detections of the same thing from two tools Maximum 90 days. When a rule expires it stops suppressing and asks the owner whether to renew, rather than lapsing silently in either direction. Never allow a permanent rule. A suppression written during one noisy week in 2024 hides a real detection in 2026, and by then nobody remembers it exists or why. Report what each rule suppressed. A rule silently eating thousands of alerts a month deserves a look, because it is either doing great work or hiding something.
The expiry is the whole control. Suppression is necessary and it is also how detections quietly disappear, and only an expiry keeps both true.
- 4
Score on the asset, and group the related
Forty alerts from one misconfiguration is one investigation.
Headless skills
tray-gotchasUse tray-gotchas, then score using the asset rather than the tool severity: Detection severity as the starting point Multiplied by data classification and whether the asset is internet-facing Raised if the asset is in production Raised if the same detection is firing across several assets, which suggests something systemic Lowered if it fired and was benign repeatedly on this asset Group related alerts into one case: same asset within a window, same detection across assets, or the same identity across systems. Forty alerts from one misconfiguration is one investigation, and presenting it as forty is how the queue becomes unmanageable.
- 5
Measure outcomes, including the ones you missed
Alerts generated rises with instrumentation and says nothing.
Record an outcome on every alert: true positive, benign, duplicate, or suppressed by rule. Then report: alerts closed and time to triage, not alerts generated; suppression coverage, meaning the share never seen by a human; precision per detection source; and false negatives found later, where an incident turned out to have a suppressed or closed alert in its history. That last number is the only honest check on whether suppression has gone too far, and it is the one almost nobody produces because it requires looking back.
- 6
Validate it, then hand the rules to security ops
Because suppression is a security decision with an owner.
Run the per-step schema checks and the whole-workflow audit before this touches production. Run it shadow for a fortnight: enrich and score everything, suppress nothing, and compare what it would have hidden against what analysts actually closed. Then open the same workflow in Tray Build so security operations can manage suppression rules, expiries and scoring weights in the visual canvas.
What it connects to
Detections come from several tools and have to meet asset context before a human sees them.
Datadog
Read security detections with their raw context, and read deploys on the affected asset.
Reads
Jira
Create one case per grouped incident where the team already works, with enrichment attached.
Writes
PagerDuty
Page only for what survives scoring, so an out-of-hours page still means something.
Writes
Slack
Ask an asset owner whether activity was expected, which resolves a large share of alerts in one message.
Writes
Snowflake
Land alerts and their outcomes, so precision per source and false negatives are measurable.
Writes
Same build, other stacks
The design does not change if you run something else in one of these seats. The same prompts build it against Google BigQuery, Microsoft Teams, Azure Active Directory, ServiceNow, Databricks or Google Chat.
Named systems are the ones most teams run, not the only ones that work. Each is an authentication in your Tray workspace, referenced by name, so the workflow never holds a credential. Where we have a connector page, the name links to it.
Running it in production
This decides what a human sees. Suppressing wrongly is the failure that matters.
It runs where production runs, not on a laptop
Enrichment and scoring run on every detection at whatever volume an incident produces, with a record of each decision.
Every suppression is attributable and temporary
Which rule, whose, when it expires, and what it hid. A suppression nobody can explain is a blind spot.
Managed credentials, not secrets in a config file
Reading security telemetry and the asset register is privileged. Both are authentications in your workspace, read-only and scoped.
Security ops own the rules
Suppression, expiries and scoring weights open in Tray Build, owned by the team accountable for what gets missed.
Run it shadow first
A fortnight enriching and scoring while suppressing nothing, compared against what analysts actually closed. That comparison sets the rules honestly.
Questions people ask
Why must suppression rules expire?
Because a rule written during one noisy week becomes a permanent blind spot. Two years later it hides a real detection and nobody remembers it exists or why it was created.
Why score on the asset rather than the tool severity?
Because the tool knows the detection and you know the asset. A medium severity on a production database holding customer data outranks a critical on a test instance every time.
Why group alerts?
Because forty alerts from one misconfiguration is one investigation. Presenting it as forty separate items is how a queue becomes unmanageable and how the real one gets closed by somebody tired.
What should alert triage measure?
Alerts closed, time to triage, precision per source, and false negatives found later. Alerts generated rises with instrumentation and tells you nothing about security.
How do you roll this out safely?
Shadow mode for a fortnight: enrich and score everything, suppress nothing, then compare what it would have hidden against what analysts actually closed as noise.
Vibe-coding app guides
Vibe-code an entire app with Helix
This moves the data between systems. It does not give anybody a screen to work in. Build that app in Claude Code, Codex or Cursor, then deploy and run it governed on Tray Helix. Same kind of guide, same kind of prompts.
How to build an incident and postmortem tracker (opens helix.tray.ai in a new tab)
Related guides
IT and security
How to build incident to resolution
Declare fast, assemble the channel and the timeline automatically, keep customers informed on a cadence, and make the postmortem unavoidable. The prompts.
IT and security
How to build access request and approval
Route to the system owner, grant with an expiry by default, provision automatically, and produce the access review as a by-product. The prompts that build it.
AI operations
How to build shadow AI discovery
Find the AI tools nobody registered, from expenses, SSO and DNS, then route to a path rather than a ban. The Headless prompts that build it.
IT and security
How to build vulnerability to ticket routing
Rank on exploitability and exposure rather than CVSS, group by fix instead of by finding, and route to whoever ships the patch. The prompts that build it.
Last reviewed September 2026.