Timers
sleep is durable time. The runtime records a timer command and wakes replay when it fires. Do not call Future.delayed or read DateTime.now() in workflow code.
dart
await flow.sleep(const Duration(hours: 24), id: 'remind');Timer due time is computed from replay decision time, not from a worker's wall clock after a restart. Recovery scans fire due timers and expire bounded user tasks.
JSON documents use a timer step with a duration. The compiler rejects malformed durations.