Files
claude d7874e2569 fieldtest: bound-override cycle — 4 examples, 6 findings (4 working, 1 friction, 1 bug)
Per-cycle fieldtest over the #246 surface, consumer-perspective, public
interface only: the scaffold quickstart end to end (aura new -> run ->
--list-axes -> override sweep), --list-axes on a partially-open
blueprint, an override family reproduced bit-identically (3/3 members),
and the error surface (wrong axis name, kind-mismatched value — both
exit 2). Corpus under fieldtests/cycle-246-bound-override/.

Dispositions: the one bug (F6) is fixed in this commit — authoring-guide
§1 still asserted a bound param 'never shows up in --list-axes' and 'no
aura sweep --axis can reopen it', contradicting the shipped #246
semantics and the C12 amendment; the three-states paragraph now reads
open = must-bind, bound = overridable default. The friction finding (F5,
KindMismatch/MissingKnob printed as raw Debug structs beside polished
prose) is filed as #247.

refs #246
2026-07-13 04:50:36 +02:00

86 lines
5.4 KiB
Plaintext

Field test — cycle-246-bound-override — verbatim transcript
Binary: target/debug/aura (built from HEAD 9d4e4c7, `cargo build -p aura-cli`)
All runs synthetic (no --real). Project = the scaffolded signal-lab/.
=====================================================================
EXAMPLE 1 — quickstart end to end (axis 1), exactly as scaffolded CLAUDE.md
=====================================================================
$ aura new signal-lab
created project "signal-lab" (data-only; attach native nodes later with `aura nodes new`)
# scaffold ships ONE blueprint: signal-lab/blueprints/signal.json (all params bound)
# CLAUDE.md quickstart advertises, verbatim:
# Run: aura run blueprints/signal.json
# Sweep: aura sweep blueprints/signal.json --axis signal_lab_signal.fast.length=2,4,8
# (aura sweep <bp> --list-axes lists open + bound-overridable axes)
$ aura run blueprints/signal.json # [exit 0]
{"manifest":{...,"params":[],...},"metrics":{"total_pips":0.3418...,"r":{"expectancy_r":1.271...,"n_trades":3,...}}}
$ aura sweep blueprints/signal.json --list-axes # [exit 0]
signal_lab_signal.fast.length:I64 default=2
signal_lab_signal.slow.length:I64 default=4
signal_lab_signal.bias.scale:F64 default=0.5
$ aura sweep blueprints/signal.json --axis signal_lab_signal.fast.length=2,4,8 # [exit 0]
{"family_id":"sweep-0","report":{"manifest":{"params":[["signal_lab_signal.fast.length",{"I64":2}],["stop_length",{"I64":3}],["stop_k",{"F64":2.0}]],...}}}
{"family_id":"sweep-0","report":{"manifest":{"params":[["signal_lab_signal.fast.length",{"I64":4}],...]}}}
{"family_id":"sweep-0","report":{"manifest":{"params":[["signal_lab_signal.fast.length",{"I64":8}],...]}}}
# bound fast.length overridden per member; slow.length + bias.scale stay at their bound defaults.
=====================================================================
EXAMPLE 2 — --list-axes on a partially-open blueprint (axis 2)
=====================================================================
# op-script bo_2_partial_open_opscript.json binds slow.length=4, leaves fast.length + bias.scale open.
$ aura graph build < bo_2_partial_open_opscript.json > bo_2_partial_open.json # [exit 0] (name = "graph")
$ aura graph introspect --params bo_2_partial_open.json # [exit 0] (raw namespace, OPEN only)
fast.length:I64
bias.scale:F64
$ aura sweep bo_2_partial_open.json --list-axes # [exit 0]
graph.fast.length:I64 # open knobs first, NO default=
graph.bias.scale:F64
graph.slow.length:I64 default=4 # bound param last, WITH default=
# bound is optional (uses default); open is still required:
$ aura sweep blueprints/partial.json --axis graph.fast.length=2,4 --axis graph.bias.scale=0.5 --name bo2d # [exit 0]
# 2 members run; slow.length omitted -> stays at default 4 (absent from manifest params).
$ aura sweep blueprints/partial.json --axis graph.fast.length=2,4 # [exit 2]
aura: MissingKnob("graph.bias.scale") # <-- raw Debug enum print (see finding F5)
=====================================================================
EXAMPLE 3 — override sweep + reproduce (axis 3)
=====================================================================
$ aura sweep blueprints/signal.json --axis signal_lab_signal.fast.length=2,4,8 --name bo3-override # [exit 0]
$ aura runs families # [exit 0]
{"family_id":"sweep-0","kind":"Sweep","members":3}
{"family_id":"bo2d-0","kind":"Sweep","members":2}
{"family_id":"bo3-override-0","kind":"Sweep","members":3}
$ aura reproduce bo3-override-0 # [exit 0] (help says "content id"; the name works too)
bo3-override-0 member signal_lab_signal.fast.length=2, stop_length=3, stop_k=2 reproduced: bit-identical
bo3-override-0 member signal_lab_signal.fast.length=4, stop_length=3, stop_k=2 reproduced: bit-identical
bo3-override-0 member signal_lab_signal.fast.length=8, stop_length=3, stop_k=2 reproduced: bit-identical
reproduced 3/3 members bit-identically
=====================================================================
EXAMPLE 4 — error surface (axis 4)
=====================================================================
$ aura sweep blueprints/signal.json --axis signal_lab_signal.nonexistent=1,2 # [exit 2] CLEAN
aura: axis signal_lab_signal.nonexistent: names no param of this blueprint (open or bound) — see `aura sweep <bp> --list-axes`
$ aura sweep blueprints/signal.json --axis totally.bogus=1 # [exit 2] CLEAN (retired "nothing to sweep" gone)
aura: axis totally.bogus: names no param of this blueprint (open or bound) — see `aura sweep <bp> --list-axes`
$ aura sweep blueprints/signal.json --axis signal_lab_signal.fast.length=1.5,2.5 # [exit 2] RAW DEBUG (finding F5)
aura: KindMismatch { knob: "signal_lab_signal.fast.length", expected: I64, got: F64 }
# run/mc still refuse open blueprints:
$ aura run blueprints/partial.json # [exit 2]
aura: run requires a closed blueprint (no free parameters); 2 free knob(s) — bind them or use `aura sweep --axis`
$ aura mc blueprints/partial.json # [exit 2] (generic usage error, not the open-param prose)
$ aura run blueprints/signal.json # [exit 0] (all bound = closed)