Two clocks. Fair pauses. Loud breaches.
Response + resolve targets per priority, with per-project overrides. Clocks pause automatically when the ticket transitions into a blocker state so vendor / customer wait time never counts against you. Breach fires immediate in-app + email and lands on the dashboard MTD card.
Response. Resolve.
Every ticket carries a response clock (closes when someone other than the submitter posts a non-system comment) and a resolve clock (closes when the ticket reaches a resolved state). Both stamp due-ats at create from the policy resolved for that priority.
Org defaults live in sla_policies keyed on priority. Project overrides key on priority + project — a project override always beats the org default.
| Priority | Response | Resolve |
|---|---|---|
| P1 | 30 min | 4 hrs |
| P2 | 1 hr | 8 hrs |
| P3 | 4 hrs | 24 hrs |
| P4 | 8 hrs | 72 hrs |
| P5 | 1 day | 7 days |
Tune in Admin → SLA policies.
Pause when the blame shifts.
A status carrying the awaiting_input or on_hold semantic tag pauses both clocks — vendor / customer wait time stops counting against you. Resume on transition out shifts due-ats forward by the paused duration.
Both clocks start. Due-ats stamped from the resolved policy (project override > org default).
Both clocks pause. Vendor / customer wait time excluded.
Clocks resume. Due-ats shift forward by paused duration.
Response clock closes. sla_first_response_at stamped.
Resolve clock closes. existing resolved_at reused — no schema churn.
Breached flag flips, breach timestamp stamped, in-app + immediate email fans out to assignee + followers + submitter (bypasses digest).
Loud. Bypasses digests.
A 5-minute scheduler flips the breached flag, stamps the breach timestamp, and fans out via fanoutSlaBreach — in-app notification + immediate email to assignee, followers, and submitter (deduped). Breaches are action-required, so the email always sends instantly regardless of digest cadence.
Month-to-date at a glance.
Dashboard card with four stat tiles plus a per-project breakdown table when breaches exist. Admin / Manager see all projects; Submitter / Viewer see only their member projects. All-clear state collapses to one line.
Tickets whose response clock blew this month.
Tickets whose resolve clock blew this month.
Open tickets still over. Clickable → filtered ticket list.
Active clocks, useful as a denominator.
Coming to the SLA surface.
v0.6.0 shipped the core — clocks, pauses, breach detection, dashboard. The follow-up beats are queued. Most-requested first.
Escalations
NextOn breach, auto-bump priority by 1 and reassign to the project's escalation chain. Configurable per-policy. Drafted; targeting a follow-up release.
Pre-breach warnings
NextFire a softer notification at 80% of the clock — gives the assignee a chance to engage before formal breach.
Business hours awareness
NextPer-policy calendar — clocks only count working hours / skip weekends + holidays. Required before SLAs are useful for teams that don't run 24/7.
Custom breach destinations
MaybeWebhook out on breach for Slack / Teams / PagerDuty. Today only the built-in fanout fires.
Tracked in ROADMAP.md. Open an issue if you want a specific beat prioritized.
Tune your SLA policies.
Admin → SLA policies. Pick org defaults, layer project-specific overrides, watch the dashboard card light up at month-end.