Start, stop, pause: the conditions that drive everything
Lesson 3 of 11 in Service Level Management — The clock on every ticket — definitions, schedules, and honest attainment.
A definition is mostly conditions. Each one is a stored condition string, evaluated against the task on every insert and update.
| Field | What it does | Tested against |
|---|---|---|
| start_condition | Attaches the clock. When it becomes true a task_sla row is created. | Records that do not already have an active clock for this definition. |
| stop_condition | Ends the clock. Stage moves to completed. | Records that do have an active clock for this definition. |
| pause_condition | Suspends the clock. | Evaluated continuously while the clock runs. |
| cancel_condition | Cancels the clock, when when_to_cancel is set to use it. | Records with an active clock. |
| reset_condition | Handles the edge where a clock should start again on the same task. | Records with an active clock, alongside reset_action. |
What the engine does on a task update
- Find the active definitions whose collection matches this table.
- For each definition with no active clock on this record, test start_condition. If true, create a task_sla row and stamp its schedule, timezone and planned_end_time.
- For each definition with an active clock, test stop_condition. If true, stop the clock and move stage to completed.
- Test pause_condition against the running clocks and suspend or resume accordingly.
- Apply when_to_cancel and reset_action to whatever is left.
| Field | Option | Meaning |
|---|---|---|
| when_to_resume | Pause conditions are not met | The default. The clock resumes the moment the pause condition stops matching. |
| when_to_resume | Resume conditions are met | A separate resume_condition must fire. This is how you build a pause that needs an explicit action rather than an incidental field change. |
| when_to_cancel | Start condition no longer matches, a cancel condition matches, or never | The choice decides what happens to a clock whose reason for existing went away. |
Pause only for hold reasons genuinely outside the team's control, such as awaiting caller or awaiting vendor. Then report paused duration by hold reason as a first-class metric, so gaming is visible next to the attainment number rather than hidden inside it.
Why pausing on "state is On Hold" is contested
It is the vendor-obvious answer and it is also the single biggest incentive for metric gaming on the platform. A team under attainment pressure can stop the clock by parking the ticket.
The third tier
Every lesson can carry an expert note: what you only learn running the thing at scale. It is optional by design — absent is better than padded — so it is missing wherever we had nothing honest to add. This one has it.
Conditions are the performance surface of this module, not just its logic. Every active definition whose collection matches a table adds condition evaluation to every insert and update of that table, and adv_condition_type records how expensive that evaluation is: a plain field comparison is cheap, but "Has advanced with Journal" means the engine must read journal entries to decide, which turns an SLA condition into extra queries on sys_journal_field for every save of a high-volume table. On an instance doing tens of thousands of incident updates a day, a handful of journal-aware conditions is measurable in transaction time, and it is invisible in every profiling tool that looks only at business rules. The condition_class reference is the deeper hook — it points at a script include implementing the condition evaluation, and a previous partner having replaced it is one of the few genuinely hostile customizations in this area, because the SLA module then behaves in ways the documentation cannot explain. Check it before you debug anything else. On the design side, the argument senior architects have is about pause conditions on hold states: pausing on "state is On Hold" is the vendor-obvious answer and it is also the single biggest incentive for metric gaming on the platform, because a team under attainment pressure can stop the clock by parking the ticket. The defensible middle ground is to pause only for hold reasons genuinely outside the team's control — awaiting caller, awaiting vendor — and to report paused duration by hold reason as a first-class metric so the gaming, if it happens, is visible next to the attainment number rather than hidden inside it.
What a static page cannot show you. In the app this lesson sits inside Service Level Management next to an animated graph of the module's 10 tables, 1 debugging drill played on that graph, 4 labs and 3 build tasks you build for real on your own dev instance and have graded by read-only queries against what you actually built. None of that is on this page, and this page does not pretend otherwise.
608 more pages are behind the invite.
This sample is 4 pages — this one and 3 others — generated straight from the corpus behind the app: 31 modules, 335 lessons, 238 how-to guides and 39 architecture decision guides. The rest is behind an invite.
Access is invite-based and free, and requests are read by a human — expect your invite by email within a day or two.