pub fn play(yaml: &str) -> Result<(), String>Expand description
Play a dayscript in-process (§14.6): parse yaml and run each step through the SAME executor
the socket runner uses ([crate::run_step_with_wait]), on a spawned thread that dispatches each
step to the main thread and awaits its reply — mirroring the engine’s connection loop. Returns
as soon as the run is dispatched (the steps then run asynchronously against the live UI).
Refuses while a recording is live, so a replay never records itself.