Service Level Objectives
Version: 1.0 · Effective: 2026-06-06
Owner: Dev Tools team → Platform/SRE (handoff target: Phase 4 completion)
Overview
These SLOs define the measurable reliability targets for the ai-agents-observability platform. They are tracked for 30-day rolling windows. Error budgets gate Phase 4 ops handoff.
Services
apps/ingest — Telemetry Ingestion
| SLI | Target | Measurement |
|---|---|---|
| Availability | 99.5% | 1 - (5xx_count / total_requests) on /v1/events and /v1/transcripts |
| Latency (p99) | < 200ms | POST /v1/events response time at p99 |
| Latency (p50) | < 50ms | POST /v1/events response time at p50 |
| Event loss | 0% | Events written to DB within 5 min of receipt (hook retry covers transient failures) |
Error budget (30 days): 3.6 hours of < 99.5% availability.
Note: Hook clients buffer locally (SQLite queue) and retry, so brief outages do not cause event loss. Availability SLO is for client experience, not data integrity.
apps/web — Dashboard & API
| SLI | Target | Measurement |
|---|---|---|
| Availability | 99% | 1 - (5xx_count / total_requests) across all authenticated routes |
| Latency p95 | < 1s | /me, /me/sessions, /team/[slug] response time |
/me p50 |
< 500ms | Specifically the /me overview page (PLAN.md Phase 1 exit criterion) |
Error budget (30 days): 7.2 hours of < 99% availability.
apps/github-app — GitHub Webhooks
| SLI | Target | Measurement |
|---|---|---|
| Delivery success | 99% | 1 - (error_count / total_deliveries) in webhook_deliveries table |
| Processing latency | < 5s | From webhook receipt to PR row upserted |
Note: GitHub retries failed deliveries for 72 hours; a brief outage is recoverable without permanent data loss.
Scheduled Jobs
| Job | Schedule | Target completion | Alert threshold |
|---|---|---|---|
sync-teams |
Hourly | < 60s | > 5 min or 2 consecutive failures |
sweep-abandoned |
Every 10 min | < 30s | > 2 min or 3 consecutive failures |
sweep-scratch |
Hourly | < 30s | > 5 min or 2 consecutive failures |
run-deletions |
Every 6h | < 2 min | Any failure (GDPR obligation) |
sweep-retention |
Configurable in job_config (default 02:00 UTC) |
< 10 min | > 30 min or any failure |
index-transcripts |
Configurable in job_config (default 03:30 UTC) |
< 30 min | > 1h |
compute-effectiveness |
Configurable in job_config (default 05:00 UTC) |
< 15 min | > 45 min |
compute-trajectory-scores |
Configurable in job_config (default 05:30 UTC) |
< 20 min | > 1h. Must not overlap compute-effectiveness — it buckets step-efficiency by the shape label that job writes, and a session scored before its shape exists correctly gets no step-efficiency row |
compute-subject-scores |
Configurable in job_config (default 06:00 UTC) |
< 10 min | > 30 min |
evaluate-alerts |
Configurable in job_config (default 01:00 UTC) |
< 5 min | Any failure or missed run |
judge-sessions |
Configurable in job_config, seeded disabled (default 06:30 UTC) |
< 30 min | Any failure while enabled; also alert on spend — this is the only job with a per-run model cost |
sync-jira |
Every 6h when Jira is configured | < 5 min | > 15 min or 2 consecutive failures. No-ops with a warning when unconfigured |
reconcile-cost |
Daily when BILLING_RECONCILIATION_ENABLED=true |
< 15 min | Any failure when enabled |
backfill-redaction |
Operator-triggered only (POST /admin/jobs/backfill-redaction/run) |
one trigger drains the whole backlog | Any failure |
reprice-events |
Operator-triggered only, report-only — never writes | < 5 min | Any failure |
reprice-events-apply |
Operator-triggered only, writes historical cost | < 30 min | Any failure. A run that fails partway leaves history partly repriced — re-run it rather than leaving it, since IS DISTINCT FROM makes the rewrite idempotent. Do not run a report against a table mid-apply: it will describe a half-repriced state |
Three more jobs — compute-effectiveness-backfill, rescore-effectiveness,
rescore-trajectory — are one-shot and dispatchable only from in-process operator
scripts, not over HTTP. They have no schedule and therefore no SLO.
Error Budget Policy
- > 50% budget consumed in first 15 days: engage Platform/SRE for review.
- 100% budget exhausted: freeze non-critical deploys; incident post-mortem required within 3 business days.
- GDPR run-deletions failures: always P1 regardless of budget state — 30-day legal obligation.
Measurement Notes
- Latency measured from access logs (pino structured logs, parsed by Grafana / your preferred log pipeline).
- Availability calculated from
/healthchecks + 5xx error rates. - SLI data retained for 12 months.
- SLO review cadence: quarterly, or after any incident that burns > 20% of budget.
Additional SLIs
- Org dashboard page p95 < 2s
- Transcript FTS query < 500ms
- Continuous aggregate refresh lag < 2h