pub async fn run<E: FlowEffects>(flow: &Flow, fx: &mut E, trace: &mut Trace)Expand description
Run a validated flow to completion against fx, filling trace.
Infallible by design: every ending — clean terminal, aborted call, or
engine defect — is captured in trace (its outcome, and error for
abnormal ends), because the daemon wants to persist and surface what
happened regardless. Callers check Trace::is_clean to decide whether
to also log a warning.
The trace is caller-owned (see Trace::new) so a caller that races this
future against the dialog’s termination signal — and drops it when the
caller hangs up mid-flow — still holds the steps executed so far. A
cancelled run never writes outcome; it keeps the FlowOutcome::Defect
placeholder.