Operant Studio
OPER-10

feat(dispatcher): SLO dashboard for queue latency, PR SLA, green-on-first-CI, self-recovery

Body

## Context
Dispatcher is running in prod at 1-min cadence with `DispatchRun`/`TaskRun`/`ShipAttempt`/`PipelineHealthProbe` telemetry, but no SLO dashboard exists. Yesterday's audit surfaced this as the biggest observability gap.

## Acceptance Criteria
- [ ] Queue-latency panel: p50/p95 of `Task.updatedAt(status='IN_PROGRESS') - createdAt` over trailing 7d — target p95 ≤ 60s
- [ ] PR-SLA panel: median time from pickup → PR-opened — target ≤ 10min
- [ ] Green-on-first-CI panel: `ShipAttempt` outcome distribution — target ≥ 70% first-green
- [ ] Reopen-rate panel: PRs that transitioned back from IN_REVIEW → IN_PROGRESS — target < 15%
- [ ] Self-recovery-time panel: reaper/recovery-agent MTTR — target ≤ 5min
- [ ] Live on `/dashboard/reliability` (or similar route)
- [ ] Read-only for now — no alerts wired yet

## Files Touched
- operant-studio/apps/web/src/app/dashboard/reliability/page.tsx (new)
- operant-studio/apps/web/src/lib/slo-queries.ts (new)

## Dependencies
- Depends on existing DispatchRun/TaskRun/ShipAttempt tables (all live)

## Verification
Load `/dashboard/reliability`, verify all 5 panels render with real prod data.

Attachments

Loading attachments…

Comments

Loading comments…