step.sleep interrupts execution by throwing a SleepSignal. This works for replay, but it creates a trap: if a user wraps workflow logic in a broad try { ... } catch (e) { ... }, they will accidentally catch the signal and break suspension. The engine relies on that exception escaping user code.