2.9 KiB
Incident TTL (Auto-Close Stale Incidents)
Slice 3 of 3 — Incident Manager → Governance Workflows Migration Depends on: incident-lifecycle-workflow (Slice 1) Enables: Nothing (terminal slice) ADR: adr-incident-manager-governance-workflows.md
What Ships
Incidents open longer than a configurable deadline (e.g., 30 days) are automatically resolved with reason Expired. Configurable per workflow, disabled by omitting the ttl field.
User-visible changes:
- Stale incidents auto-close after deadline
- Resolution reason:
Expired(distinct fromAutoResolvedand manual) - TTL configurable per workflow (ISO 8601 duration:
P30D,P7D, etc.) - Default workflow ships with
ttl: "P30D"
What We Build
TTL Boundary Timer on HumanInterventionTask
Add an interrupting boundary timer to the HIT SubProcess (built in Slice 1):
Existing HIT (from Slice 1):
[StartEvent] → [SetupPhase] → [Gateway] → [IntermediateCatchEvent: wait] → [End]
New addition (conditional on ttl config):
+ [BoundaryTimer: TTL deadline, interrupting]
→ [ServiceTask: AutoResolveExpiredImpl]
- Create Resolved status (reason: "Expired") via repository
- Close Thread task via repository
→ [EndEvent]
Only compiled into BPMN when ttl is set in the HIT config. No TTL = no timer = no overhead.
AutoResolveExpiredImpl:
- Get test case FQN from process business key
- Create Resolved record (reason:
Expired) via repository - Close Thread task
- Process ends (interrupting timer terminates the subprocess)
Schema Changes
resolved.json: AddExpiredtoTestCaseFailureReasonTypeenumhumanInterventionTask.json: Documentttlfield (ISO 8601 duration)
Updated Default Workflow
Update incident-lifecycle workflow to include TTL:
{ "config": { "template": "incident", "responsibles": { "source": "tableOwner" }, "ttl": "P30D" } }
Out of Scope
| Feature | Deferred to | Why |
|---|---|---|
| SLA escalation timers | Future | Same boundary timer infrastructure, different business logic |
| Per-severity TTL | Future | Requires conditional timer duration |
| TTL warning notification | Future | Non-interrupting timer before deadline |
Design Notes
Interrupting, not non-interrupting. When TTL fires, the incident is expired — nothing left to wait for. The subprocess terminates.
Boundary timer, not polling. Flowable fires the timer exactly once at the deadline, per process instance. No table scans, no cron. At 75K incidents with 30-day TTL, overhead is negligible.
Expired vs AutoResolved. Different operational signals: "issue was fixed" (auto-close) vs "nobody looked at this" (TTL). Enables distinct reporting and alerting.