Skip to content

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).

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.

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”).

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.

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

/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.

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.