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)
