The first ten minutes of any page are spent assembling context: what fired, what changed, what the runbook says, whether it can wait until morning.
Tier: Core · Hands-on time: ~35 minutes
This playbook turns that assembly into a repeatable AI workflow — feed the model an incident bundle (alert payload + recent deploys + runbook excerpt) and demand a structured triage note in which every statement cites a line in the bundle. PagerDuty's SRE Agent and incident.io both ship this capability commercially; here you build the technique yourself so it works with any LLM and you know exactly how to audit the output.
Skip AI for alerts you have seen ten times before — your cached diagnosis is faster than any model, and pattern-matching a known alert is exactly what runbooks are for.
Assemble the bundle mechanically, not selectively. Concatenate into one text block, with headers: === ALERT PAYLOAD ===, === RECENT CHANGES (24h) ===, === RUNBOOK EXCERPT ===, === SERVICE METADATA === (owner, tier, dependencies). Do not pre-filter "irrelevant" changes — the deploy you dismiss is often the cause.
Request a triage note with citation demands. Send the bundle with:
You are assisting an on-call engineer. Using ONLY the bundle above, produce:
1. SEVERITY HYPOTHESIS: proposed severity + one-line justification.
2. WHAT FIRED: the alert condition in plain English (metric, threshold, duration).
3. CHANGE CORRELATION: any change events plausibly related, with timestamps.
4. ACT-NOW / DEFER: recommendation with the single strongest reason.
5. FIRST THREE CHECKS: ordered, each a concrete command or dashboard.
Rules: after EVERY factual statement, cite the bundle section and line/field
it came from in brackets, e.g. [ALERT: annotations.summary] or [CHANGES: line 4].
If the bundle does not contain evidence for a statement, write UNVERIFIED
instead of the citation. Do not invent metric names, hosts, or timestamps.
Audit the citations before acting. For each bracketed citation, check the referenced field actually exists in your bundle and says what the note claims. Every UNVERIFIED line is a question for you, not a fact.
Run the first check yourself. Execute check #1 from the note (a kubectl, promtool, or dashboard look). If reality contradicts the triage note, reply with the contradicting output and ask for a revised hypothesis — the model updates well when fed real signals.
Log the note into the incident channel with a one-line header: AI triage note — citations audited, checks 1–2 run by <you>. The audit statement is what makes it safe for teammates to build on.
The bundle is the boundary. A model restricted to a bundle you assembled can be audited line-by-line; a model free-associating about "typical causes" cannot.
git log + runbook repo and posts the note to Slack. Keep the citation rules in the system prompt; add a footer "AI-generated — audit citations before acting."UNVERIFIED lines: zero is suspicious (the model may be over-claiming coverage); more than half means your bundle is too thin to triage from.Services-company and client-account scenarios (client telemetry under MSA restrictions):
CLIENT_A, host-web-01) via a scripted sed/regex pass — manual redaction misses fields inside JSON payloads.Alert payloads routinely embed customer emails and request paths in annotations — grep the bundle for @ and URL patterns before it leaves the client environment.
UNVERIFIED.