AVENUE (a) — param_space() of the SMA2-entry strategy: sma2_entry.bias : I64 sma2_entry.slow : I64 scale : F64 >> The DEFINITIONAL SMA(2) length surfaces as `sma2_entry.bias` — an OPEN >> knob, indistinguishable from the genuinely-tunable `sma2_entry.slow`. >> A sweep `.axis("sma2_entry.bias", [2, 5, 10])` would enumerate DEFORMED >> strategies (SMA-5-entry, SMA-10-entry) as valid family members. >> param_space() declares a degree of freedom the strategy's definition >> forbids. (C20: structural axes are NOT sweep params — but nothing here >> distinguishes the two.) NOTE: the alias `bias` was FORCED on this knob >> just to clear C9 IndistinguishableFanIn — so the surface makes me NAME >> the constant as if it were tunable. (avenue (a) runs: 12 recorded rows — it WORKS, but the 2 is fungible) AVENUE (b) — capture the 2 as a construction constant (SimBroker pattern): SimBroker::builder(1e-4) bakes pip_size OUTSIDE param_space (it is C10/C15 metadata — the broker declares NO param). The SMA2-entry author wants the SAME for the length: a value baked at build, never a knob. >> WALL: `Sma::builder()` takes no length arg (length is always a param), >> and `Sma::new(2)` returns a built `Sma`, not a `PrimitiveBuilder` / >> `BlueprintNode` — a blueprint holds value-empty RECIPES, not built nodes. >> There is no `Sma::builder_with(2)` analogous to `SimBroker::builder(pip)`. >> The construction-constant escape hatch exists for SimBroker (its builder >> TAKES the constant) but is UNREACHABLE for a stock indicator node. OK: scenario 3 recorded both wrong avenues + the wished-for code (grounds #55).