Triaging Security Alerts logo

Triaging Security Alerts

Community
trilwu
triaging-security-alerts

Work a security alert queue to a defensible disposition — separating true positives from false positives and benign true positives, reasoning about base rates before escalating, ordering enrichment by cheapest discriminator, time-boxing, and documenting negative results so a closed alert is evidence rather than a guess. Use when triaging SOC or EDR alerts, deciding whether an alert warrants incident response, working through an alert backlog, or determining why a detection keeps firing.

Overview

Publishertrilwu
Repositorysecskills
Skill nametriaging-security-alerts
Stars
144
Forks
15
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by trilwu on GitHub. Read the source before you install it.

Installation

Install the Triaging Security Alerts AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/trilwu/secskills.git /tmp/secskills
mkdir -p .claude/skills
cp -r /tmp/secskills/secskills-defense/skills/triaging-security-alerts .claude/skills/triaging-security-alerts
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Triaging Security Alerts in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Triaging Security Alerts on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Triaging Security Alerts is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Triaging Security Alerts

Triage is the highest-volume work in security and the least written about. The output is a disposition you can defend later — most often to someone asking why an alert that preceded a breach was closed.

Three properties make it hard. The overwhelming majority of alerts are not incidents, so the prior is against you on every single one. The cost of the two error types is wildly asymmetric — a wrongly escalated alert wastes hours, a wrongly closed one costs the breach. And the queue keeps arriving, so unbounded care on one alert is care stolen from the next.

When to Use

  • Working an alert queue from a SIEM, EDR, or cloud security tool
  • Deciding whether an alert becomes an incident
  • Reworking a backlog, or a specific alert that keeps recurring
  • Reviewing another analyst's disposition
  • Determining whether a noisy detection should be tuned or removed

When NOT to Use

  • The alert is already confirmed malicious — stop triaging and use responding-to-incidents; triage ends where response begins
  • Searching for compromise with no alert to start from — use hunting-threats; a hunt is hypothesis-driven, triage is queue-driven
  • Rewriting the rule — use engineering-detections or writing-sigma-rules; feed your triage findings to it rather than tuning in place mid-queue
  • Analysing the sample an alert pointed at — use analyzing-malware
  • Investigating a specific compromised host in depth — use investigating-windows-endpoints or the relevant cloud investigation skill

Three Dispositions, Not Two

The common failure is a binary true/false frame. There are three, and conflating the last two destroys your detection programme:

DispositionMeaningCorrect action
True positiveDetection fired correctly, activity was maliciousEscalate to incident response
Benign true positiveDetection fired correctly, activity was authorizedClose, and record the authorizing context. Do not tune the rule away
False positiveDetection logic was wrong — it did not match what it claims to matchClose, and send it to detection engineering as a logic defect

An admin legitimately dumping LSASS for a memory test is a benign true positive: the rule worked perfectly. Filing it as a false positive leads someone to weaken a rule that is functioning exactly as designed. Over a year that is how a detection programme quietly dies.

Base Rates Decide More Than Evidence Does

Most triage errors are not evidence-reading errors. They are prior-probability errors.

Take a detection that is 99% accurate, firing across 10,000 hosts where 1 is actually compromised. It produces roughly 100 false alerts and 1 true one. A positive alert is about 1% likely to be a real compromise — even at 99% accuracy. This is why "the tool flagged it" carries almost no weight on its own, and why an analyst who escalates on tool severity alone will be wrong almost every time.

The practical consequences:

  • Severity is a property of the rule, not of the alert. It was assigned by whoever wrote the detection, before your environment existed.
  • Ask what else would produce this signal. If routine administration, backup software, or a vulnerability scanner explains it, that explanation is far more likely than compromise before you have contrary evidence.
  • Corroboration beats confidence. Two weak independent signals pointing the same way move the posterior much further than one strong signal, because their benign explanations rarely coincide.
  • Rare things are rare — but rarity is not innocence. The point is to make the prior explicit so evidence has to actually overcome it, not to explain every alert away.

Order Enrichment by Cheapest Discriminator

Work the question that most cheaply splits benign from malicious. Do not run a fixed enrichment checklist.

  1. What is this asset and who uses it? A domain controller and a developer's laptop generate different priors for identical activity.
  2. Is this normal for this host or user? Frequency and history first. An action that ran daily for eight months is a baseline, not an event.
  3. Was it authorized? Change tickets, maintenance windows, deployment pipelines. Most benign true positives resolve here.
  4. What is the parent and the chain? Provenance discriminates far better than the artifact itself. powershell.exe is meaningless; spawned by winword.exe is not.
  5. Only then, external reputation. Hash and IOC lookups are the last cheap step, not the first. A clean reputation proves nothing about targeted activity, and a dirty one still needs the local context above.

Stop as soon as one of these settles it. Running every step on every alert is how the queue wins.

Time-Boxing and Escalation

Set a bound before you start — commonly 15 minutes for a routine alert. When it expires, you must choose, and the choice is not "keep digging":

  • Enough to close → close with the evidence recorded.
  • Enough to escalate → escalate.
  • Neither → escalate anyway. An alert that resists a full time-box is itself a signal. Ambiguity is not a reason to keep it in your queue; it is a reason to give it more resources than you have.

Escalate immediately, without finishing triage, on any of: confirmed execution on a crown-jewel asset, credential access on a domain controller or identity provider, evidence of lateral movement, security tooling being disabled, or anything touching backup infrastructure. These are too expensive to be wrong about slowly.

A Closed Alert Must Be Evidence

Record what you checked, what you found, and what would change your mind. A disposition with no reasoning is unreviewable, and the alert that preceded a breach is always reviewed.

The dangerous phrasing is "no evidence of compromise found" where the honest statement is "the telemetry that would show compromise is not collected." The first closes the question; the second is a finding about a visibility gap and belongs to engineering-detections.

Every disposition also carries information back to detection engineering: false positives are logic defects, repeated benign true positives are missing authorized-context filters, and a rule producing only noise for months should be measured and removed rather than endured.

Rationalizations to Reject

  • "The tool rated it critical, so it is serious." Severity was set by the rule author against a generic environment. Your base rate is local.
  • "It has fired a hundred times before and always been nothing." Prior benignity is evidence, not proof — and an attacker who knows the rule is ignored will use exactly that technique. Check this instance's specifics.
  • "The user said it was them." Confirms someone used the account, not that the account was not also used by someone else. Compromised users answer the phone. Corroborate against telemetry.
  • "It stopped on its own, so it resolved." Activity ceasing is equally consistent with the operator finishing, moving on, or going quiet. Nothing self-resolves in security.
  • "I could not find anything, so it is a false positive." Absence of evidence in telemetry you did not check, or that is not collected, is not a false positive. Say which you mean.
  • "It is a known false positive." Then it should have been tuned or filtered. If it is still firing, either the tuning is missing or it is actually a benign true positive being mislabelled — both are actions, not dispositions.
  • "I will keep digging until I am certain." Certainty is not on the menu, and the queue is still arriving. Time-box, then escalate on ambiguity.
  • "Escalating something benign makes me look careless." Escalating ambiguity is the system working. Closing ambiguity silently is the failure the post- incident review will find.

Reading External Sources

Fetch public advisories, specifications, and vendor reports as Markdown:

bash
curl -sL "https://defuddle.md/<url>"      # scheme in the path is optional

This strips page boilerplate — roughly 78% fewer tokens on a prose page — and returns the full text rather than a summary, so you can grep it and trust a negative result.

Three things it is not for. Fetch JSON and API responses raw, because readability extraction mangles structured data. Fetch authenticated or JavaScript-rendered pages directly, because it retrieves them anonymously. And never route adversary infrastructure (phishing links, C2, malware hosting), client-owned hosts, or engagement URLs through it — the request leaves your machine to a third party, and for live adversary infrastructure it also tips off the operator.

Some sites block the extractor and return an error blob rather than the page — {"error":"Failed to fetch: 418 I'm a teapot"} from freedesktop.org, for instance. That is the fetch being refused, not the source saying the thing does not exist. Re-fetch the URL directly before drawing any conclusion from it.

References

  • responding-to-incidents — where a true positive goes next
  • engineering-detections — where false positives and tuning gaps go back to
  • hunting-threats — the hypothesis-driven counterpart to queue-driven triage
  • investigating-windows-endpoints — deep host analysis once triage escalates

Frequently asked questions

What does the Triaging Security Alerts AI skill do?

Work a security alert queue to a defensible disposition — separating true positives from false positives and benign true positives, reasoning about base rates before escalating, ordering enrichment by cheapest discriminator, time-boxing, and documenting negative results so a closed alert is evidence rather than a guess. Use when triaging SOC or EDR alerts, deciding whether an alert warrants incident response, working through an alert backlog, or determining why a detection keeps firing.

Why use Triaging Security Alerts on TypingMind?

Because you install it once and use it with any model. Triaging Security Alerts is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Triaging Security Alerts in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/trilwu/secskills/tree/main/secskills-defense/skills/triaging-security-alerts. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Triaging Security Alerts?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Triaging Security Alerts?

As many as you like. As long as a model supports skills, you can use Triaging Security Alerts with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Triaging Security Alerts AI skill free?

Yes. It is published on GitHub by trilwu under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇