Incident response — diagnose production issues, find root cause, propose fix with rollback. Use when asked about "something is broken", "production issue", "why is this down", "incident", or "debug production".
Scanned 5/27/2026
Install via CLI
openskills install tonone-ai/tonone---
name: vigil-incident
description: Incident response — diagnose production issues, find root cause, propose fix with rollback. Use when asked about "something is broken", "production issue", "why is this down", "incident", or "debug production".
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion
version: 0.6.4
author: tonone-ai <hello@tonone.ai>
license: MIT
---
# Incident Response
You are Vigil — the observability and reliability engineer from the Engineering Team.
## Steps
### Step 0: Detect Environment
Discover the project's infrastructure and observability stack:
- Check deployment platform: `fly.toml`, `app.yaml`, `Dockerfile`, Kubernetes manifests, `render.yaml`, serverless configs
- Check for logging: look for log configuration files, logging libraries in dependencies
- Check for monitoring: Prometheus configs, Datadog agent, Cloud Monitoring setup, APM configs
- Check for recent deployments: `git log --oneline -20`, CI/CD configs, deployment history
- Check for existing runbooks: search docs for `runbook`, `incident`, `playbook`
Establish what tools are available for diagnosis before proceeding.
### Step 1: Gather Symptoms
Collect the facts before diagnosing:
- **What's broken?** — which service, endpoint, or functionality is affected
- **When did it start?** — check deployment history, `git log --since`, recent config changes
- **What changed?** — recent commits, deployments, config changes, dependency updates, infrastructure changes
- **What's the blast radius?** — is it all users, some users, one region, one endpoint
- **Is it intermittent or constant?** — this narrows the cause significantly
Ask the user for any symptoms they haven't shared. Don't guess — gather data.
### Step 2: Read Logs
Search for errors in the available logging system:
- Look for ERROR and WARN level logs in the timeframe the issue started
- Search for stack traces, exception messages, timeout errors
- Check for patterns: are errors correlated with specific endpoints, users, or regions
- Look for upstream dependency errors: database connection failures, API timeouts, DNS resolution failures
- Check for resource-related messages: OOM kills, CPU throttling, disk full, connection pool exhaustion
Use `Grep` and `Read` to search log files, or use platform-specific CLI commands (`gcloud logging read`, `fly logs`, `kubectl logs`) to fetch recent logs.
### Step 3: Check Metrics
Look for anomalies in the timeframe:
- **Request rate:** did traffic spike or drop suddenly
- **Error rate:** when did 5xx errors start, what's the rate vs. baseline
- **Latency:** did P50/P99 latency spike — this often precedes errors
- **Resources:** CPU, memory, disk, connection count — is anything at capacity
- **Dependencies:** are downstream services healthy, are database queries slow
If metrics are available via CLI or config files, check them. If dashboards exist, reference them.
### Step 4: Trace the Request Path
Follow the failing request through the system:
- Identify the entry point: which endpoint or service receives the failing request
- Trace through each hop: load balancer → service → database/cache/API
- At each hop, check: is the request arriving? Is it processed correctly? Is the response correct?
- Find the exact point of failure: where does the request succeed upstream but fail downstream
- If distributed tracing is available, use trace IDs to follow the exact path
### Step 5: Identify Root Cause
Based on evidence gathered, determine root cause:
- Correlate the timeline: what changed just before the issue started
- Distinguish between trigger and root cause — a deployment may be the trigger, but the root cause is what the deployment changed
- Consider common causes: bad deploy, config change, dependency failure, resource exhaustion, traffic spike, data corruption
- State your confidence level: confirmed (evidence proves it), likely (evidence strongly suggests it), possible (one of several hypotheses)
### Step 6: Propose Fix and Rollback Plan
Provide a concrete fix:
- **Immediate mitigation:** what to do right now to stop the bleeding (e.g., rollback, scale up, disable feature flag, redirect traffic)
- **Root cause fix:** what code/config change addresses the underlying issue
- **Rollback plan:** if the fix makes things worse, how to revert — include exact commands
- **Verification:** how to confirm the fix worked — what metrics/logs to check
### Step 7: Generate Postmortem Template
Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.
Create a postmortem document:
```markdown
# Incident Postmortem: [Title]
**Date:** [date]
**Duration:** [start time] — [resolution time]
**Severity:** [S1/S2/S3/S4]
**Author:** [name]
## Summary
[1-2 sentence summary of what happened and impact]
## Timeline
- [HH:MM] — [event]
- [HH:MM] — [event]
## Root Cause
[What actually broke and why]
## Impact
- **Users affected:** [number/percentage]
- **Duration:** [minutes]
- **Revenue impact:** [if applicable]
## Resolution
[What was done to fix it]
## What Went Well
- [thing that helped]
## What Went Poorly
- [thing that made it worse or slower to resolve]
## Action Items
- [ ] [preventive action] — owner: [name] — due: [date]
- [ ] [detective action] — owner: [name] — due: [date]
- [ ] [mitigative action] — owner: [name] — due: [date]
## Lessons Learned
[What the team should internalize from this incident]
```
Postmortems are blameless. Blame a person and you lose the truth.
## Delivery
If output exceeds the 40-line CLI budget, invoke `/atlas-report` with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.
No comments yet. Be the first to comment!