v0.9.0 — human gates get SLAs
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 anyDateInterval. Recorded astimeout_aton 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.