numeric param-space:
  slot 0: sma_cross.fast.length : I64
  slot 1: sma_cross.slow.length : I64
  slot 2: exposure.scale : F64

Arity (2 ranges, 3 slots)                        -> Err(Arity { expected: 3, got: 2 })
RangeKindMismatch (F64 range on I64 slot 0)      -> Err(RangeKindMismatch { slot: 0, expected: I64, got: F64 })
EmptyRange I64 (lo=8 > hi=2 on slot 0)           -> Err(EmptyRange { slot: 0 })
EmptyRange F64 (lo == hi == 1.5 on slot 2, half-open) -> Err(EmptyRange { slot: 2 })

VALID  | I64 lo == hi == 5 single point accepted -> 7 points

bool param-space:
  slot 0: gate.enabled : Bool
  slot 1: exposure.scale : F64
range on Bool slot 0                             -> Err(NonNumericRange { slot: 0, kind: Bool })

OK: every fault was caught by RandomSpace::new before any run.
