Source-blind consumer fieldtest against the release binary at 4474814:
discovery-surface identity (--params vs --list-axes byte-identical,
raw + default= on bound), the document-first loop with two
bound-override axes (validate + run e2e, manifest raw), the translation
seams (all three verbs refuse wrapped identically exit 2; campaign
validate did-you-mean exit 1), and manifests raw in params AND defaults
on all routes with reproduce 4/4 bit-identical. One spec-gap: the guide
transcript abbreviated the strategy content-id (ratified in the
follow-up doc commit). Not exercisable source-blind: replay of a
pre-#328 wrapped-name on-disk family (noted in TRANSCRIPT).
refs #328
5.4 KiB
Fieldtest transcript — cycle #328 (axis-namespace reconciliation)
Per-cycle field test of the one-raw-namespace axis surface: the raw
<node>.<param> form as the only user-facing sweep-axis name across every
surface (discovery, intake on all three verbs, run manifests, campaign
documents), with the wrapped <blueprint>.<node>.<param> form retired behind
translation refusals.
Binary: target/release/aura, built from HEAD 4474814 via
cargo build --release -p aura-cli (Finished in 5.45s — HEAD builds clean).
Scratch project aura new ax_lab in /tmp/axwork/ax_lab; real data from the
built-in archive (US500). Public interface only (README, authoring-guide,
glossary, design ledger, aura … --help) — no crate source read.
Base blueprint cycle328_crossover: an SMA-crossover → bias signal with a
deliberate mix — fast.length open, slow.length bound (default=6),
bias.scale bound (default=0.5) — so both discovery line shapes and the
bound-override contract are exercised. Content id
f5fdf729d0333f0286c19d57143fb7933137f27a6128e72489c508096c7a2240.
Example 1 — discovery-surface identity (--params vs --list-axes)
$ aura graph introspect --params cycle328_crossover.bp.json
fast.length:I64
slow.length:I64 default=6
bias.scale:F64 default=0.5
$ aura sweep cycle328_crossover.bp.json --list-axes
fast.length:I64
slow.length:I64 default=6
bias.scale:F64 default=0.5
$ diff params.txt listaxes.txt # → IDENTICAL (no diff)
Byte-identical, raw <node>.<param> form, bound params carrying default=<v>.
--params discovers bound params too. (Finding W1.)
Example 2 — document-first loop (paste verbatim, incl. bound-override)
Axes pasted verbatim from --params into a hand-written campaign document
(cycle328_2_campaign.json), including two bound-override axes (slow.length,
bias.scale — bound defaults re-opened by name, #246 coincidence contract):
$ aura campaign validate cycle328_2_campaign.json # inside project, refs registered
campaign document valid (intrinsic): 1 strategy(ies), 3 axes (4 points), 1 instrument(s), 1 window(s), 1 regime(s) (default) — 1 cell(s)
campaign document valid (referential): all references resolve, axes are in the param space
campaign document valid (executable): pipeline shape and static guards pass
$ aura campaign run cycle328_2_campaign.json # exit 0
aura: campaign run 0 recorded: 1 cells
# manifest.params (raw): fast.length, slow.length, bias.scale (+ stop knobs)
All three tiers pass; the bound-override axes validate; the run manifest records raw names. (Finding W2.)
Example 3 — translation seams (wrapped form on every intake)
$ aura sweep cycle328_crossover.bp.json --axis graph.fast.length=2,4 ... (exit 2)
$ aura sweep cycle328_crossover.bp.json --real US500 --axis graph.fast.length=... (exit 2)
$ aura walkforward cycle328_crossover.bp.json --real US500 --axis graph.fast.length=... (exit 2)
aura: axis "graph.fast.length": axis names are raw node.param paths — use "fast.length" (the wrapped --list-axes form was retired, #328)
$ aura campaign validate cycle328_3d_wrapped_campaign.json (exit 1)
aura: campaign references do not resolve:
strategy f5fdf729d0333f0286c19d57143fb7933137f27a6128e72489c508096c7a2240: axis "graph.fast.length" is not in the param space; axis names are raw node.param paths — did you mean "fast.length"?
All three verbs refuse identically, naming the raw candidate; campaign validate
appends a did-you-mean. Note the campaign-validate strategy identifier is the
FULL 64-hex content id, where the authoring guide's transcript shows a 4-hex
strategy 9f3a: placeholder (Finding SG1). Edge probes:
$ aura sweep ... --axis fastt.length=2,4 # typo
aura: axis fastt.length: names no param of this blueprint (open or bound) — see `aura sweep <bp> --list-axes`
$ aura sweep ... --axis graph.fast.bogus=1 # wrapped, tail not a param
aura: axis graph.fast.bogus: names no param of this blueprint (open or bound) — see `aura sweep <bp> --list-axes`
$ aura sweep ... --axis project.graph.fast.length=2 # two leading segments (> one)
aura: axis project.graph.fast.length: names no param of this blueprint (open or bound) — see `aura sweep <bp> --list-axes`
Typos and >1-segment wrappings fall to a clean generic error — consistent with the documented "one leading segment strips to a hit" contract. (Finding W3.)
Example 4 — manifest raw names + reproduce
$ aura sweep cycle328_crossover.bp.json --axis fast.length=2,4 --axis slow.length=8,16 --name cycle328-sweep-bo
# each member manifest:
# params: [["fast.length",..],["slow.length",..],["stop_length",..],["stop_k",..]] (raw)
# defaults: [["bias.scale",{"F64":0.5}]] (raw)
$ aura reproduce cycle328-sweep-bo-0 (exit 0)
cycle328-sweep-bo-0 member fast.length=2, slow.length=8, stop_length=3, stop_k=2 reproduced: bit-identical
... reproduced 4/4 members bit-identically
Positive real/walkforward routes also record raw (params AND defaults) and run
clean (exit 0): cycle328_6a_sweep_real.*, cycle328_6b_walkforward.*. No
wrapped name appears on any surface. (Finding W4.)
Not exercised: the "old wrapped-name manifests remain reproducible" backward- compat claim (no pre-#328 on-disk family is reachable through the public interface to a source-blind consumer).