SLA tracking

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.

On track Paused Breached
Two clocks

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.

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

Lifecycle

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.

Ticket created

Both clocks start. Due-ats stamped from the resolved policy (project override > org default).

Status → awaiting_input / on_hold

Both clocks pause. Vendor / customer wait time excluded.

Status leaves blocker state

Clocks resume. Due-ats shift forward by paused duration.

First non-system non-submitter comment

Response clock closes. sla_first_response_at stamped.

Ticket resolved

Resolve clock closes. existing resolved_at reused — no schema churn.

Due passes (5-min scheduler tick)

Breached flag flips, breach timestamp stamped, in-app + immediate email fans out to assignee + followers + submitter (bypasses digest).

Breach fanout

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.

MTD dashboard card

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.

MTD response breaches

Tickets whose response clock blew this month.

MTD resolve breaches

Tickets whose resolve clock blew this month.

Currently breached

Open tickets still over. Clickable → filtered ticket list.

Open with SLA clock

Active clocks, useful as a denominator.

Roadmap

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

Next

On 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

Next

Fire a softer notification at 80% of the clock — gives the assignee a chance to engage before formal breach.

Business hours awareness

Next

Per-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

Maybe

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