slo-spec
Define service level objectives for a service from its critical user journeys — each SLI a good-events / valid-events ratio with both sides defined and measured where the user feels it, a target set from user need and history (checked against dependency SLOs), the error budget computed in minutes and bad requests at current traffic, multi-window burn-rate alerts with the budget consumed when each fires, low-traffic handling, and an error-budget policy with owners. Use when the user asks to "define SLOs", "write our SLIs", "how much error budget do we have", "what burn-rate alerts should page", "is 99.99% realistic", or "write an error-budget policy".
Other ways to install
With the sibling skills it hands off to:
The whole pack it belongs to:
By hand, from a clone of the repo:
In Claude Code, with the sre-oncall plugin installed, invoke it as:
Try it
A realistic prompt from the skill's acceptance evals:
We need SLOs for our order service before the reliability review next week. Everything I know about it is in order-service.md: the journeys, traffic, what we measure today and the last 90 days. Give us SLIs, targets, error budgets, the alerts that should page, and an error-budget policy.
What a good result looks like
Example output
Larkspur Theatres booking API · the skill's own worked example, source
Input
Set SLOs for our booking API. Customers browse showtimes (about 900,000 requests a day) and book seats (about 60,000 bookings a day). Booking calls our card processor, whose SLO is 99.95%; the API returns 200 only after the charge succeeds. Box-office staff use a back-office API, about 800 requests a day, 10:00–22:00. Last quarter from load balancer logs: browse 99.96%, booking 99.87%, back-office 99.4%. Our CTO wants "four nines everywhere". The team lead is Ines Calder; product owner is Raj Bhatt.
Script runs
python3 scripts/slo_math.py --batch slos.json # browse, booking (with --dep 99.95)
python3 scripts/slo_math.py --name "Box-office API (probe every minute)" \
--target 99.5 --window 30 --rpd 1440 --alerts "6:6h:1h:ticket"
Output, abridged to the rows used below:
Browse showtimes (availability): 99.9% over 30 days
= 43.2 minutes of full outage per window (43m 12s)
= 27,000 bad requests per window at 900,000 requests/day
14.4x 1h 5m page 1.44% 2% 2d 2h 540 45
6x 6h 30m page 0.6% 5% 5d 1,350 112
1x 3d 6h ticket 0.1% 10% 30d 2,700 225
Book seats (end to end): 99.8% over 30 days
= 86.4 minutes of full outage per window (1h 26m 24s)
= 3,600 bad requests per window at 60,000 requests/day
14.4x 1h 5m page 2.88% 2% 2d 2h 72 6 *
Hard dependencies in series: 99.95% -> ceiling 99.95%; at their SLOs they spend 25% of this budget
- 14.4x 1h/5m: only 6 bad events in the 5m short window ... the short window will flap.
Box-office API (probe every minute): 99.5% over 30 days
= 216 minutes of full outage per window (3h 36m)
6x 6h 1h ticket 3% 5% 5d 10.8 1.8 *
Reply
Four nines isn't reachable for booking: every booking needs the card processor, which only promises 99.95%, so 99.99% would be spent five times over by the processor alone. I've set booking at 99.8% (last quarter ran 99.87%), browse at 99.9%, and the back-office API at 99.5% on a synthetic probe, because 800 requests a day is too few to page on.
Assumptions: 30-day rolling window; traffic is the daily average you gave; the 1 s, 10 s and 2 s thresholds are mine [assumption].
| Journey | SLI (good / valid) | Measured at | Target | Budget per 30 days |
|---|---|---|---|---|
| Browse showtimes | Good: non-5xx in < 1 s / Valid: all GET /showtimes, excluding health checks and bots | Load balancer | 99.9% | 43.2 min · 27,000 bad requests |
| Book seats | Good: 200 or a bank decline within 10 s / Valid: all POST /bookings, excluding 4xx validation errors | Load balancer | 99.8% | 86.4 min · 3,600 bad bookings |
| Back-office API | Good: probe gets a correct answer in < 2 s / Valid: one probe a minute | Probe | 99.5% | 216 min of failed probes |
At its own SLO the card processor spends 25% of booking's budget. Going above 99.95% would need a second processor or an accept-now, charge-later path.
| Journey | Burn | Long / short | Trips at | Budget at fire | Exhausts in | Action |
|---|---|---|---|---|---|---|
| Browse | 14.4× | 1 h / 5 m | 1.44% errors | 2% | 2 d 2 h | page |
| Browse | 6× | 6 h / 30 m | 0.6% | 5% | 5 d | page |
| Browse | 1× | 3 d / 6 h | 0.1% | 10% | 30 d | ticket |
| Booking | 14.4× | 1 h / 15 m | 2.88% | 2% | 2 d 2 h | page |
| Booking | 6× | 6 h / 30 m | 1.2% | 5% | 5 d | page |
| Booking | 1× | 3 d / 6 h | 0.2% | 10% | 30 d | ticket |
| Back-office | 6× | 6 h / 1 h | 3% of probes | 5% | 5 d | ticket, 10:00–22:00 |
Booking's 5-minute short window would hold about 6 failed bookings at the threshold and flap, so it is 15 minutes. The back-office probe still has fewer than 2 failures expected in an hour, so it raises a ticket and never pages; staff will report an outage faster than a page.
Error-budget policy (owner: Ines Calder; to be agreed with Raj Bhatt before it applies)
| Budget state | What changes |
|---|---|
| 50% spent in the first 15 days | Reliability work tops the next sprint |
| 100% spent | Only fixes and security patches ship until the 30-day budget is positive |
| Card processor spent it | Raise it with the processor using the numbers; the freeze still covers risky changes |
Exception: the CTO approves a release during a freeze in writing, recorded on the release ticket.
To confirm: the three latency thresholds; whether bank declines reach the API as 200 or 402.
Next step: add the browse and booking alerts to the alerting system and set up the back-office probe.
How it's checked
Measured against plain Claude Code (2026-10-23): it met 61% of its checks, against 42% without it, and a blind judge preferred it. How skills are checked
38 assertions across 5 acceptance evals, and 9 trigger queries. Every skill's checks
What the output must do
When it should and shouldn't activate
Should activate:
- Define SLOs for our checkout service: which SLIs, what targets, and the error budget
- How much error budget is 99.9% over 28 days if we do 3 million requests a day?
- What burn-rate alerts should page us for a 99.95% availability SLO?
- Product wants 99.99% for the payments API. Is that realistic when our card processor only promises 99.9%?
- Write an error-budget policy: what happens when our SLO budget runs out
Should leave to another skill:
- List the non-functional requirements for the new booking feature: latency, availability, data retention, accessibility
- What should we instrument in the order service, and which dashboards and log fields do we need?
- Write the on-call runbook for the payments service, including rollback and escalation
- Compute our change failure rate and deployment frequency from this deploy log
Hands off to
- observability-plan — when the SLIs are agreed and the telemetry to produce them doesn't exist yet. Design the instrumentation, logs, traces and dashboards behind the SLIs.
- runbook-generator — when the burn-rate alerts are defined and each page needs a procedure. Write the steps on-call follows when each alert fires.
Related skills
delivery-metrics-report, nfr-spec
Source
SKILL.md · the whole folder on GitHub.