diff --git a/crates/aura-cli/src/main.rs b/crates/aura-cli/src/main.rs index 2ea536b..9c03911 100644 --- a/crates/aura-cli/src/main.rs +++ b/crates/aura-cli/src/main.rs @@ -1915,6 +1915,31 @@ fn override_paths( Ok(overrides) } +/// Renders a [`BindError`] as one-line prose in `override_paths`' sibling +/// register above (#247) — never the raw Rust `Debug` struct name +/// (`KindMismatch { .. }` / `MissingKnob("..")`), the two variants the sweep +/// terminal actually raises past `override_paths`' own pre-flight (which +/// already rejects an unresolvable axis name as prose before either call +/// site below ever reaches the terminal). Other variants keep the +/// established `{:?}` rendering unchanged — in particular `UnknownKnob` +/// already carries a fully-prosed message string at both call sites here +/// (wrapped from `override_paths`' own `Result<_, String>`), and pinned +/// tests (`aura_walkforward_emits_an_unknown_axis_rejection_once` et al.) +/// depend on that Debug-wrapped shape. +fn render_bind_error(e: &BindError) -> String { + match e { + BindError::MissingKnob(name) => format!( + "axis {name}: an open param with no axis and no bound default — \ + bind it with `--axis {name}=` — see `aura sweep --list-axes`" + ), + BindError::KindMismatch { knob, expected, got } => format!( + "axis {knob}: expected {expected:?}, supplied {got:?} — \ + see `aura sweep --list-axes`" + ), + other => format!("{other:?}"), + } +} + /// Apply a validated override set to a freshly loaded strategy (#246). /// Infallible by contract: the set was derived against this same document at /// the family boundary. @@ -2015,9 +2040,9 @@ fn blueprint_sweep_family( // the shared reduce-mode member path — the same fn reproduction re-runs. run_blueprint_member(reload(doc), point, &space, data.run_sources(env, &binding.columns()), window, 0, pip, &topo, env, StopRule::Vol { length: R_SMA_STOP_LENGTH, k: R_SMA_STOP_K }, &binding, &[]) }) - // render the sweep terminal's BindError to a message (the fn's String error contract), - // so `UnknownKnob("nope")` still surfaces verbatim at the IO wrapper. - .map_err(|e| format!("{e:?}")) + // render the sweep terminal's BindError to prose (#247), the fn's String error + // contract — never the raw Debug struct. + .map_err(|e| render_bind_error(&e)) } /// Sweep the LOADED blueprint over the user `--axis` grid on an in-sample window @@ -2188,7 +2213,7 @@ fn blueprint_walkforward_family( // (#253): `validate_axis_grid` resolves the SAME grid the sweep terminal would, without // running a single member — no IS window (or a second roller) is needed here at all. if let Err(e) = validate_axis_grid(doc, axes, &raw_space, &probe_signal, env) { - eprintln!("aura: {e:?}"); + eprintln!("aura: {}", render_bind_error(&e)); std::process::exit(2); } walk_forward(roller, space.clone(), |w: WindowBounds| {