Files
Brummel 03285d1b47 fieldtest: milestone the-world param-space & sweep — green, delivers promise
Milestone-scope fieldtest (closing functional gate) for "The World —
parameter-space & sweep" (issues #30-#36). Three curated end-to-end scenarios
derived top-down from the milestone promise, driven from the public interface
only (ledger + specs + rustdoc; no crates/*/src read), built and run from HEAD
via a downstream consumer crate.

Delivery verdict: GREEN. The milestone delivers its promise.
- mw_1 single run bound by name: .with("sma_cross.fast", 2).bootstrap() binds
  and runs (12 equity rows); diagnostics precise and knob-named (UnknownKnob /
  AmbiguousKnob / KindMismatch).
- mw_2 named-axis sweep + compare: .axis(..).sweep(run) yields a 4-member,
  ordered (odometer), disjoint, non-constant SweepFamily; ranking from public
  fields. CLI (aura sweep / aura runs rank) delivers the same with no Rust.
- mw_3 structural-constant negative space (deliberate): SMA2-entry's
  definitional `2` has no honest expression today -> grounds #55. Out of
  milestone scope; not a blocker.

Findings: 0 bugs, 2 working, 3 friction, 1 spec_gap. Verified independently
(re-ran all three from HEAD; confirmed a plain SMA-cross emits sma_cross.length
twice and the shipped CLI sample carries the fast/slow ParamAlias overlays).

Friction (routed to the forward queue, none blocks the gate):
- the promised sma_cross.fast/.slow names are not free — they require
  author-added ParamAlias overlays, doubly mandatory because the canonical
  2-SMA cross also will not bootstrap without them (IndistinguishableFanIn);
- the sweep closure drops back to positional bind + manual name re-zip.

spec_gap -> #55: the wished-for structural-constant consumer code is recorded
in mw_3 as #55's acceptance evidence.

This commit is the milestone fieldtest itself; it closes no issue. Closing the
tracker milestone stays a deliberate manual act on this green gate.
2026-06-11 09:11:37 +02:00

34 lines
1.3 KiB
Plaintext

param_space() knobs (name : kind):
sma_cross.length : I64
sma_cross.length : I64
scale : F64
[2a] promise-form (sma_cross.fast/.slow) result: Some(UnknownKnob("sma_cross.fast"))
[2b] real-emitted-name (sma_cross.length) result: Some(AmbiguousKnob("sma_cross.length"))
[2c] param_space() AFTER aliasing:
sma_cross.fast : I64
sma_cross.slow : I64
scale : F64
[2c] aliased named-bound run — recorded equity rows: 12
ts= 0 equity_pips=0.0000
ts= 60000000000 equity_pips=0.0000
ts= 120000000000 equity_pips=0.0000
ts= 180000000000 equity_pips=0.0000
ts= 240000000000 equity_pips=4.0000
ts= 300000000000 equity_pips=11.5000
ts= 360000000000 equity_pips=3.5000
ts= 420000000000 equity_pips=-2.5000
ts= 480000000000 equity_pips=0.5000
ts= 540000000000 equity_pips=4.5000
ts= 600000000000 equity_pips=-2.5000
ts= 660000000000 equity_pips=-6.5000
[3] wrong-name (sma_cross.slo) result: Some(UnknownKnob("sma_cross.slo"))
[4] bare-name ("fast") result: Some(UnknownKnob("fast"))
[5] wrong-kind (scale=1 into F64) result: Some(KindMismatch { knob: "scale", expected: F64, got: I64 })
[6] ambiguous (plain sma_cross.length) result: Some(AmbiguousKnob("sma_cross.length"))
OK: param-space inspected, named bind ran (aliased), diagnostics probed.