Add compileWorkflowToSteps + validateLinearity: walk the linear main path of a WorkflowIr, emit prompt/script/gate user nodes as ordered WorkflowStep inputs, skip the execute/review seams, and use the merge seam as the pre-/post-merge boundary. Non-linear graphs (branching beyond canonical seam success/failure) throw WorkflowCompileError so they route to the deferred interpreter instead of mis-executing.