Skip to content

v0.9.0 — human gates get SLAs

Choose a tag to compare

@timmcleod timmcleod released this 28 Jul 23:07

Additive release. Existing installs must re-run the migration to pick up the interrupts table's timeout_at column.

Real processes have deadlines — a run shouldn't wait for sign-off forever. awaitHuman() now takes a timeout, enforced by the scheduled agent-workflows:sweep command you already run:

->awaitHuman(reason: 'Final sign-off required', schema: [
    'approved' => 'required|boolean',
    'notes' => 'nullable|string',
], timeout: CarbonInterval::days(3), timeoutResponse: [
    'approved' => false,
    'notes' => 'Auto-rejected: sign-off timed out.',
])
  • timeout: — seconds or any DateInterval. Recorded as timeout_at on the interrupt row, so approval UIs can show the deadline.
  • With a timeoutResponse:, the run resumes with that payload past the deadline — an auto-decision, validated against the schema like any human answer.
  • Without one, the run fails at the gate — and $run->retry() re-arms the same wait with a fresh deadline, so "give them another three days" is one call.

The timeout and response count toward the definition hash; editing the human-facing reason remains free.