Engine integration must go through `dispatch()`. No frontend-side direct calls to `StepRunner.execute_*`. CP-5 unification is a hard contract; Console v2 mutation routes call `dispatch()` server-side only.
