Puccha — Service Level Objectives
This document is the source of truth for Puccha’s internal SLI / SLO targets. It promotes the table from ADR-0050 §3 to a doc that engineering links from incident postmortems, capacity reviews, and (eventually) sales material.
Status: internal targets. Not yet contractual — that promotion happens in ADR-0051 (drafting).
1. Service Level Indicators (SLIs)
Section titled “1. Service Level Indicators (SLIs)”We measure three.
| SLI | Definition | Source |
|---|---|---|
| Availability | 1 − (5xx requests / total requests) over a rolling 30-day window, excluding routes tagged health and internal |
Cloudflare Analytics Engine status_class dimension (ADR-0050 §1) |
| Chat latency | p95 of POST /api/chat end-to-end latency over a rolling 30-day window, excluding the warmup turn after a deploy |
AE doubles[0] filtered to route='POST /api/chat' |
| RAG faithfulness | Promptfoo eval pass rate on the rolling golden set | ADR-0006; CI-enforced on PRs touching RAG |
Resist adding more. Each SLI we promise is a thing we have to measure, alert on, and explain when we miss it.
2. Service Level Objectives (SLOs)
Section titled “2. Service Level Objectives (SLOs)”Targets per plan tier. The 30-day window is rolling; an outage today burns budget for the next 30 days.
| Plan | Availability target | Chat latency p95 target | Notes |
|---|---|---|---|
free |
99.0% (best-effort) | 5000 ms | No external commitment |
team |
99.5% | 3500 ms | Internal target; not contractual |
business |
99.9% | 2500 ms | Internal target; ADR-0051 promotes to contractual |
enterprise |
99.95% | 2000 ms | Internal target; ADR-0051 promotes to contractual |
Why these numbers, not industry stock 99.99 / 99.95 / 99.9:
- We’re on Cloudflare Workers. Cloudflare’s published SLA is 99.9% for the Workers product. Promising 99.95 to enterprise is already a stretch above our largest dependency; 99.99 would be a lie.
- Lower tiers have headroom so we can ship and learn without burning enterprise credit. A free-tier outage is not a 99.95 violation.
RAG faithfulness target: ≥ 0.85 (gates on PRs touching RAG, per CLAUDE.md “Quality gates”).
3. Error budgets
Section titled “3. Error budgets”A 30-day window at 99.9% availability allows 43m13s of downtime per month. At 99.95%, 21m36s. At 99.5%, 3h36m. The numbers matter: when an incident burns 30m of budget on the business tier, that’s ~70% of the monthly allowance, and the next two weeks deserve a noticeably more conservative deployment posture.
We do not yet have:
- Burn-rate alerts (e.g. “budget exhausted in 1 day at current rate”)
- Automated freeze of non-critical deploys when budget < 25%
Both are follow-ups, not blockers — at one-engineer scale the human running the incident already knows this implicitly. Document them as TODO when team size justifies the automation.
4. Excluded traffic
Section titled “4. Excluded traffic”These do not count against availability:
- Routes tagged
health(/health) — health probes are for the observability system, not a customer signal - Routes tagged
internal(e.g./admin/...,/api/cron/...) — staff surface, not customer-facing - The first request to each route after a deploy (warmup) — Workers cold-start variance is not representative of steady-state UX
These do count:
- Widget chat from anonymous visitors — these are customers of our customers; their experience is the SLI
- Dashboard logins — agents using the dashboard expect uptime
- Webhook delivery to
/api/billing/webhook— Stripe retries on 5xx but the latency matters for plan-change UX
5. Where this is measured
Section titled “5. Where this is measured”/admin/tenants/[id]/health (superadmin, ADR-0050 §4) renders
per-tenant availability + latency from Analytics Engine. The page is
the operational source-of-truth; this document explains what the
numbers should be.
When ADR-0051 ships, the customer-facing surface (status page, tenant self-view) reads from the same AE dataset with sanitisation applied.
6. Revisiting these numbers
Section titled “6. Revisiting these numbers”Trigger to revisit:
- We have ≥ 6 months of AE data and the actuals trend significantly higher OR lower than the targets. If actuals are consistently 99.99, promote business / enterprise targets one tier. If actuals are bumping into 99.85 on business, either fix the underlying issues or drop the target — promising what we can’t deliver is worse than promising less.
- A new tier ships (e.g. a “pro” between team and business)
- A dependency’s published SLA changes (Cloudflare, Anthropic)
- ADR-0051 lands and contractual SLAs need a defensible floor
Otherwise, leave the numbers alone. Stable targets make for legible trends.
Source ADR: ADR-0050 — Tenant-aware SRE.