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).
