From 32eb5a6a9efe8fa85c77b94ab25bfaf6f0085940 Mon Sep 17 00:00:00 2001 From: claude Date: Sat, 25 Jul 2026 05:15:01 +0200 Subject: [PATCH] =?UTF-8?q?fieldtest:=20blueprint-name=20=E2=80=94=204=20e?= =?UTF-8?q?xamples,=201=20bug=20/=200=20friction=20/=201=20spec-gap=20/=20?= =?UTF-8?q?4=20working?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Source-blind consumer run over the four cycle axes on the release binary at 4ff85b9: the authoring loop lands the name in bytes, store document, and traces// (with the documented default collision observable on the unnamed twin); the refusal battery is uniform and op-indexed across the op route and the file intakes; a named blueprint defaults its use-splice instance identifier as documented, two unnamed splices collide, two named ones coexist; help/guide/glossary agree on eleven ops and the render-name vs registry-label split. Finding B1 (sweep --list-axes ungated, mangled listing at exit 0) is fixed RED-first in the preceding commit; SG1 (prefix variance in the refusal prose) is ratified there in C24. refs #331 --- .../cycle-331-blueprint-name/TRANSCRIPT.md | 184 ++++++++++++++++++ .../cycle-331-blueprint-name/c331_1_build.err | 0 .../c331_1_named_crossover.bp.json | 1 + .../c331_1_named_crossover.ops.json | 15 ++ .../c331_1_register.out | 1 + .../cycle-331-blueprint-name/c331_1_run.err | 0 .../cycle-331-blueprint-name/c331_1_run.out | 1 + .../c331_1_traces.txt | 11 ++ .../c331_1b_unnamed_A.bp.json | 1 + .../c331_1b_unnamed_A.ops.json | 14 ++ .../c331_1c_unnamed_B.bp.json | 1 + .../c331_1c_unnamed_B.ops.json | 14 ++ .../c331_2a_dup_name.err | 1 + .../c331_2a_dup_name.ops.json | 11 ++ .../c331_2b_slash_name.err | 1 + .../c331_2b_slash_name.ops.json | 10 + .../c331_2c_empty_name.err | 1 + .../c331_2c_empty_name.ops.json | 10 + .../c331_2d_dotdot_name.err | 1 + .../c331_2d_dotdot_name.ops.json | 10 + .../c331_2e_badroot.bp.json | 1 + .../c331_2e_contentid.out | 1 + .../c331_2e_open_named.bp.json | 1 + .../c331_2e_open_named.ops.json | 14 ++ .../c331_2e_params.out | 1 + .../c331_2e_register.out | 1 + .../c331_2e_render.out | 1 + .../cycle-331-blueprint-name/c331_2e_run.out | 1 + .../c331_2e_sweep_axis.out | 1 + .../c331_2e_sweep_list.out | 3 + .../c331_2f_dotroot.bp.json | 1 + .../cycle-331-blueprint-name/c331_3A.bp.json | 1 + .../cycle-331-blueprint-name/c331_3A.err | 1 + .../c331_3A_splice_named.ops.json | 7 + .../cycle-331-blueprint-name/c331_3B.bp.json | 0 .../cycle-331-blueprint-name/c331_3B.err | 3 + .../c331_3B_two_unnamed.ops.json | 8 + .../cycle-331-blueprint-name/c331_3C.bp.json | 1 + .../cycle-331-blueprint-name/c331_3C.err | 2 + .../c331_3C_two_named.ops.json | 9 + .../c331_3_agree.ops.json | 8 + .../c331_3_refute.ops.json | 8 + .../c331_3_reg_agree.out | 2 + .../c331_3_reg_refute.out | 2 + .../c331_3_reg_unnamed.out | 2 + .../c331_3_unnamed_smoother.ops.json | 7 + .../c331_4_graph_build_help.txt | 38 ++++ .../c331_4_register_help.txt | 11 ++ 48 files changed, 424 insertions(+) create mode 100644 fieldtests/cycle-331-blueprint-name/TRANSCRIPT.md create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1_build.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1_named_crossover.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1_named_crossover.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1_register.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1_run.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1_run.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1_traces.txt create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1b_unnamed_A.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1b_unnamed_A.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1c_unnamed_B.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_1c_unnamed_B.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2a_dup_name.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2a_dup_name.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2b_slash_name.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2b_slash_name.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2c_empty_name.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2c_empty_name.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2d_dotdot_name.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2d_dotdot_name.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_badroot.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_contentid.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_open_named.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_open_named.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_params.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_register.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_render.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_run.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_sweep_axis.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2e_sweep_list.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_2f_dotroot.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3A.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3A.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3A_splice_named.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3B.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3B.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3B_two_unnamed.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3C.bp.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3C.err create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3C_two_named.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3_agree.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3_refute.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3_reg_agree.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3_reg_refute.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3_reg_unnamed.out create mode 100644 fieldtests/cycle-331-blueprint-name/c331_3_unnamed_smoother.ops.json create mode 100644 fieldtests/cycle-331-blueprint-name/c331_4_graph_build_help.txt create mode 100644 fieldtests/cycle-331-blueprint-name/c331_4_register_help.txt diff --git a/fieldtests/cycle-331-blueprint-name/TRANSCRIPT.md b/fieldtests/cycle-331-blueprint-name/TRANSCRIPT.md new file mode 100644 index 0000000..183f5d4 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/TRANSCRIPT.md @@ -0,0 +1,184 @@ +# Fieldtest transcript — cycle #331 (blueprint name op) + +Source-blind consumer field test of the eleventh op-script op +`{"op":"name","name":""}` — the composite render name that flows to store +documents, `traces//`, and `use`-splice instance defaults, gated by a +deterministic shape check at every authored intake. + +Binary: `target/release/aura`, built from HEAD `4ff85b9` via +`cargo build --release -p aura-cli` (Finished in 5.48s — HEAD builds clean). +Scratch project `aura new nm_lab` in `/tmp/ftwork/nm_lab`; real data from the +built-in archive (US500). Public interface only (README, authoring-guide, +glossary, design ledger C23/C24/C29, `aura … --help`) — no crate source read. + +--- + +## Example 1 — authoring loop end to end (`c331_1_named_crossover.ops.json`) + +A named SMA-crossover with a `spread` tap, all knobs bound (closed → runnable). + +``` +$ aura graph build < c331_1_named_crossover.ops.json > c331_1_named_crossover.bp.json # exit 0 +# blueprint.name == "ny_momentum", taps == [{"name":"spread",...}] +$ aura graph register c331_1_named_crossover.bp.json +registered blueprint 347a361997e8a65d4122b5ab50367031f78df24a1ff6ad14477ed2c04ec3b603 (…) +# store doc runs/blueprints/347a…json -> name: ny_momentum +$ aura run c331_1_named_crossover.bp.json --real US500 --tap spread=mean # exit 0 +$ find runs/traces +runs/traces/ny_momentum +runs/traces/ny_momentum/index.json +runs/traces/ny_momentum/spread.json +``` + +The authored name `ny_momentum` shows up in all three documented places — the +blueprint bytes, the store document's `name`, and the run's trace directory +`traces/ny_momentum/`. (Finding W1.) + +### Default collision story (omitting the name) + +Two *different* unnamed crossovers (A: fast=3/slow=8, B: fast=5/slow=20), both +build to `name: "graph"`, both `--tap spread=record` over US500: + +``` +$ aura run c331_1b_unnamed_A.bp.json --real US500 --tap spread=record # exit 0 + sha256(runs/traces/graph/spread.json) = 5bb5dcfc… +$ aura run c331_1c_unnamed_B.bp.json --real US500 --tap spread=record # exit 0 + sha256(runs/traces/graph/spread.json) = 3be8025b… ← overwritten, silently +$ ls runs/traces/ → graph ny_momentum +``` + +Both unnamed strategies share `traces/graph/`; B silently overwrote A's +`spread.json` (differing sha). This is exactly the documented "later runs +overwrite earlier ones" consequence — observable, no warning (as documented). +(Finding W1.) + +--- + +## Example 2 — refusal battery (`c331_2*`) + +### Op route (op-indexed prose) + +``` +$ aura graph build < c331_2a_dup_name.ops.json # exit 1 +aura: op 1 (name): a script names its blueprint at most once +$ aura graph build < c331_2b_slash_name.ops.json # exit 1 +aura: op 0 (name): blueprint name "traces/evil" is invalid: must not contain '/' or '\' (a single path segment) +$ aura graph build < c331_2c_empty_name.ops.json # exit 1 +aura: op 0 (name): blueprint name "" is invalid: must be non-empty (a single path segment) +$ aura graph build < c331_2d_dotdot_name.ops.json # exit 1 +aura: op 0 (name): blueprint name ".." is invalid: must not be "." or ".." (a single path segment) +``` + +Each refusal is op-indexed, quotes the offending name, and states the exact +rule. Copy-paste fixable. (Finding W2.) + +### Hand-edited envelope with a bad root name (`../escape`) + +`c331_2e_open_named.bp.json` (clean name `clean_name`, `fast.length` open), +root `name` hand-edited to `../escape` → `c331_2e_badroot.bp.json`, fed to +every file intake: + +``` +$ aura graph register c331_2e_badroot.bp.json # exit 1 GATED +aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment) +$ aura run c331_2e_badroot.bp.json --real US500 # exit 2 GATED +aura: …/c331_2e_badroot.bp.json: blueprint name "../escape" is invalid: … +$ aura sweep c331_2e_badroot.bp.json --axis fast.length=2,4 # exit 2 GATED +aura: blueprint name "../escape" is invalid: … +$ aura graph introspect --content-id c331_2e_badroot.bp.json # exit 1 GATED +$ aura graph introspect --params c331_2e_badroot.bp.json # exit 1 GATED +$ aura graph c331_2e_badroot.bp.json # exit 2 GATED +aura: …/c331_2e_badroot.bp.json: blueprint name "../escape" is invalid: … + +$ aura sweep c331_2e_badroot.bp.json --list-axes # exit 0 *** NOT GATED *** +./escape.fast.length:I64 +slow.length:I64 default=8 +bias.scale:F64 default=0.5 +``` + +Six of seven file intakes gate uniformly (Finding W2). **`sweep --list-axes` +does not** — it exits 0 and prints a mangled, retired *wrapped* axis form +`./escape.fast.length` for the open param only. The same on a `.` root: +`sweep --list-axes` → `.fast.length:I64` (exit 0) while `register`/`--params` +refuse. Pasting the leaked `./escape.fast.length` back as `--axis` refuses — +so discovery emits a name the bind surface rejects. (Finding B1.) + +Prose note: `run` and `graph` prepend the full file path; `register`, +`sweep --axis`, `introspect` do not — the core sentence is uniform, the prefix +is not. (Finding SG1.) + +--- + +## Example 3 — use-splice interplay (`c331_3*`) + +Registered patterns: `agree` (input `x`, SMA length open), `refute` (input `y`), +`unnamedsm` (unnamed → `graph`, input `z`). + +``` +# A — splice agree, NO instance name: +$ aura graph build < c331_3A_splice_named.ops.json # exit 0 +aura: note: use "agree": agree -> 4f78a9f6e1f3… +$ aura graph introspect --params c331_3A.bp.json +agree.sma.length:I64 ← instance defaulted to authored name + +# B — splice unnamedsm TWICE, no instance names: +$ aura graph build < c331_3B_two_unnamed.ops.json # exit 1 +aura: note: use "graph": unnamedsm -> 25cdd4942f21… +aura: note: use "graph": unnamedsm -> 25cdd4942f21… +aura: op 3 (use): duplicate identifier "graph" ← collide, op-indexed + +# C — splice agree + refute, no instance names: +$ aura graph build < c331_3C_two_named.ops.json # exit 0 +$ aura graph introspect --params c331_3C.bp.json +agree.sma.length:I64 +refute.sma.length:I64 ← distinct names, no collision +``` + +Instance identifier defaults to the authored render name; two unnamed +(`graph`) splices collide with an op-indexed `duplicate identifier "graph"`; +distinct authored names dissolve the collision. Matches guide + glossary +`blueprint label` entry exactly. (Finding W3.) + +--- + +## Example 4 — discovery / docs parity (`c331_4_*`) + +`aura graph build --help` lists the name op last of the eleven: + +``` +{"op":"name","name":"ny_momentum"} + set the composite's render name, at most once per script (default + "graph" if omitted) +``` + +Consistent with the authoring guide's eleven-ops table (§1). Three distinct +`--name`-ish concepts, each with distinct help phrasing: + +- op `name` → **render name** (keys `traces//`, use-splice instance default) +- `aura graph register --name` → **registry label** ("Label the registered + content id for `use` by name (#317)") +- `aura sweep --name` → **family name** ("Family name (records to the registry…)") + +The glossary `blueprint label` entry separates render name from registry label +explicitly. Distinction is learnable from the public docs alone, though a +consumer must consult the glossary to fully disambiguate the three. (Finding W4.) + +--- + +## Findings summary + +- W1 (working, axis 1): authored name → blueprint bytes + store doc + + `traces//`; default `graph` collision observable (silent overwrite). +- W2 (working, axis 2): op-route refusals op-indexed + specific; hand-edited + bad root name gated uniformly on 6 of 7 file intakes. +- W3 (working, axis 3): use-splice instance defaults to authored name; unnamed + splices collide (op-indexed); named splices coexist. +- W4 (working, axis 4): `graph build --help` lists the name op consistently + with the guide; render-name vs registry-label distinction learnable. +- B1 (BUG, axis 2): `sweep --list-axes` does not gate a bad root name (exit 0) + and leaks a retired, non-bindable wrapped axis form (`./escape.fast.length`), + breaking #328's `--params`/`--list-axes` line-identity and the + every-discovered-name-is-verbatim-legal promise. +- SG1 (spec_gap, axis 2): "uniform refusal prose" — `run`/`graph` prepend the + file path, other seams don't; unclear whether "uniform" means the core + sentence or byte-identical. diff --git a/fieldtests/cycle-331-blueprint-name/c331_1_build.err b/fieldtests/cycle-331-blueprint-name/c331_1_build.err new file mode 100644 index 0000000..e69de29 diff --git a/fieldtests/cycle-331-blueprint-name/c331_1_named_crossover.bp.json b/fieldtests/cycle-331-blueprint-name/c331_1_named_crossover.bp.json new file mode 100644 index 0000000..3ee3921 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1_named_crossover.bp.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":"ny_momentum","doc":"SMA crossover bias with a raw-spread measurement tap","nodes":[{"primitive":{"type":"SMA","name":"fast","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":3}}]}},{"primitive":{"type":"SMA","name":"slow","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":8}}]}},{"primitive":{"type":"Sub","name":"sub"}},{"primitive":{"type":"Bias","name":"bias","bound":[{"pos":0,"name":"scale","kind":"F64","value":{"F64":0.5}}]}}],"edges":[{"from":0,"to":2,"slot":0,"from_field":0},{"from":1,"to":2,"slot":1,"from_field":0},{"from":2,"to":3,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":3,"field":0,"name":"bias"}],"taps":[{"name":"spread","from":{"node":2,"field":0}}]}} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_1_named_crossover.ops.json b/fieldtests/cycle-331-blueprint-name/c331_1_named_crossover.ops.json new file mode 100644 index 0000000..12c9727 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1_named_crossover.ops.json @@ -0,0 +1,15 @@ +[ + {"op": "name", "name": "ny_momentum"}, + {"op": "doc", "text": "SMA crossover bias with a raw-spread measurement tap"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 3}}}, + {"op": "add", "type": "SMA", "name": "slow", "bind": {"length": {"I64": 8}}}, + {"op": "feed", "role": "price", "into": ["fast.series", "slow.series"]}, + {"op": "add", "type": "Sub", "name": "sub"}, + {"op": "connect", "from": "fast.value", "to": "sub.lhs"}, + {"op": "connect", "from": "slow.value", "to": "sub.rhs"}, + {"op": "add", "type": "Bias", "name": "bias", "bind": {"scale": {"F64": 0.5}}}, + {"op": "connect", "from": "sub.value", "to": "bias.signal"}, + {"op": "tap", "from": "sub.value", "as": "spread"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_1_register.out b/fieldtests/cycle-331-blueprint-name/c331_1_register.out new file mode 100644 index 0000000..70bec17 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1_register.out @@ -0,0 +1 @@ +registered blueprint 347a361997e8a65d4122b5ab50367031f78df24a1ff6ad14477ed2c04ec3b603 (/tmp/ftwork/nm_lab/runs/blueprints/347a361997e8a65d4122b5ab50367031f78df24a1ff6ad14477ed2c04ec3b603.json) diff --git a/fieldtests/cycle-331-blueprint-name/c331_1_run.err b/fieldtests/cycle-331-blueprint-name/c331_1_run.err new file mode 100644 index 0000000..e69de29 diff --git a/fieldtests/cycle-331-blueprint-name/c331_1_run.out b/fieldtests/cycle-331-blueprint-name/c331_1_run.out new file mode 100644 index 0000000..442901b --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1_run.out @@ -0,0 +1 @@ +{"manifest":{"commit":"4ff85b94e56c6946361ecbcd94a6f6f99d49268c","params":[],"defaults":[["fast.length",{"I64":3}],["slow.length",{"I64":8}],["bias.scale",{"F64":0.5}]],"window":[1407103199999000000,1784926380000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","topology_hash":"347a361997e8a65d4122b5ab50367031f78df24a1ff6ad14477ed2c04ec3b603","project":{"commit":"f33b20e6d6cbfda4d9031cfc9c2361f5e751436b"}},"metrics":{"total_pips":-13655.020833332888,"max_drawdown":13733.579166666279,"bias_sign_flips":536589,"r":{"expectancy_r":-0.024114883486709465,"n_trades":581881,"win_rate":0.3205792937043829,"avg_win_r":1.62333970987585,"avg_loss_r":-0.8014533205646299,"profit_factor":0.9557138265296112,"max_r_drawdown":14084.435329973425,"n_open_at_end":1,"sqn":-8.965122280661042,"sqn_normalized":-0.11752740018906035,"net_expectancy_r":-0.024114883486709465,"conviction_terciles_r":[-0.024905829212096428,-0.022878394661105868,-0.024560424289849826]}}} diff --git a/fieldtests/cycle-331-blueprint-name/c331_1_traces.txt b/fieldtests/cycle-331-blueprint-name/c331_1_traces.txt new file mode 100644 index 0000000..406a2d4 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1_traces.txt @@ -0,0 +1,11 @@ +# traces after example 1 (named) + collision runs (unnamed) +runs/traces +runs/traces/graph +runs/traces/graph/index.json +runs/traces/graph/spread.json +runs/traces/ny_momentum +runs/traces/ny_momentum/index.json +runs/traces/ny_momentum/spread.json + +# trace index for ny_momentum: +{"manifest":{"commit":"4ff85b94e56c6946361ecbcd94a6f6f99d49268c","params":[],"defaults":[["fast.length",{"I64":3}],["slow.length",{"I64":8}],["bias.scale",{"F64":0.5}]],"window":[1407103199999000000,1784926380000000000],"seed":0,"broker":"sim-optimal+risk-executor(pip_size=1)","topology_hash":"347a361997e8a65d4122b5ab50367031f78df24a1ff6ad14477ed2c04ec3b603","project":{"commit":"f33b20e6d6cbfda4d9031cfc9c2361f5e751436b"}},"taps":["spread"]} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_1b_unnamed_A.bp.json b/fieldtests/cycle-331-blueprint-name/c331_1b_unnamed_A.bp.json new file mode 100644 index 0000000..5bb415c --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1b_unnamed_A.bp.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":"graph","doc":"unnamed crossover A (fast=3, slow=8) — no name op, defaults to graph","nodes":[{"primitive":{"type":"SMA","name":"fast","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":3}}]}},{"primitive":{"type":"SMA","name":"slow","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":8}}]}},{"primitive":{"type":"Sub","name":"sub"}},{"primitive":{"type":"Bias","name":"bias","bound":[{"pos":0,"name":"scale","kind":"F64","value":{"F64":0.5}}]}}],"edges":[{"from":0,"to":2,"slot":0,"from_field":0},{"from":1,"to":2,"slot":1,"from_field":0},{"from":2,"to":3,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":3,"field":0,"name":"bias"}],"taps":[{"name":"spread","from":{"node":2,"field":0}}]}} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_1b_unnamed_A.ops.json b/fieldtests/cycle-331-blueprint-name/c331_1b_unnamed_A.ops.json new file mode 100644 index 0000000..5eccd8e --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1b_unnamed_A.ops.json @@ -0,0 +1,14 @@ +[ + {"op": "doc", "text": "unnamed crossover A (fast=3, slow=8) — no name op, defaults to graph"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 3}}}, + {"op": "add", "type": "SMA", "name": "slow", "bind": {"length": {"I64": 8}}}, + {"op": "feed", "role": "price", "into": ["fast.series", "slow.series"]}, + {"op": "add", "type": "Sub", "name": "sub"}, + {"op": "connect", "from": "fast.value", "to": "sub.lhs"}, + {"op": "connect", "from": "slow.value", "to": "sub.rhs"}, + {"op": "add", "type": "Bias", "name": "bias", "bind": {"scale": {"F64": 0.5}}}, + {"op": "connect", "from": "sub.value", "to": "bias.signal"}, + {"op": "tap", "from": "sub.value", "as": "spread"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_1c_unnamed_B.bp.json b/fieldtests/cycle-331-blueprint-name/c331_1c_unnamed_B.bp.json new file mode 100644 index 0000000..5cdfc40 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1c_unnamed_B.bp.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":"graph","doc":"unnamed crossover B (fast=5, slow=20) — no name op, defaults to graph","nodes":[{"primitive":{"type":"SMA","name":"fast","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":5}}]}},{"primitive":{"type":"SMA","name":"slow","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":20}}]}},{"primitive":{"type":"Sub","name":"sub"}},{"primitive":{"type":"Bias","name":"bias","bound":[{"pos":0,"name":"scale","kind":"F64","value":{"F64":0.5}}]}}],"edges":[{"from":0,"to":2,"slot":0,"from_field":0},{"from":1,"to":2,"slot":1,"from_field":0},{"from":2,"to":3,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":3,"field":0,"name":"bias"}],"taps":[{"name":"spread","from":{"node":2,"field":0}}]}} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_1c_unnamed_B.ops.json b/fieldtests/cycle-331-blueprint-name/c331_1c_unnamed_B.ops.json new file mode 100644 index 0000000..a5bdb02 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_1c_unnamed_B.ops.json @@ -0,0 +1,14 @@ +[ + {"op": "doc", "text": "unnamed crossover B (fast=5, slow=20) — no name op, defaults to graph"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 5}}}, + {"op": "add", "type": "SMA", "name": "slow", "bind": {"length": {"I64": 20}}}, + {"op": "feed", "role": "price", "into": ["fast.series", "slow.series"]}, + {"op": "add", "type": "Sub", "name": "sub"}, + {"op": "connect", "from": "fast.value", "to": "sub.lhs"}, + {"op": "connect", "from": "slow.value", "to": "sub.rhs"}, + {"op": "add", "type": "Bias", "name": "bias", "bind": {"scale": {"F64": 0.5}}}, + {"op": "connect", "from": "sub.value", "to": "bias.signal"}, + {"op": "tap", "from": "sub.value", "as": "spread"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_2a_dup_name.err b/fieldtests/cycle-331-blueprint-name/c331_2a_dup_name.err new file mode 100644 index 0000000..ca593c8 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2a_dup_name.err @@ -0,0 +1 @@ +aura: op 1 (name): a script names its blueprint at most once diff --git a/fieldtests/cycle-331-blueprint-name/c331_2a_dup_name.ops.json b/fieldtests/cycle-331-blueprint-name/c331_2a_dup_name.ops.json new file mode 100644 index 0000000..0f680cb --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2a_dup_name.ops.json @@ -0,0 +1,11 @@ +[ + {"op": "name", "name": "first_name"}, + {"op": "name", "name": "second_name"}, + {"op": "doc", "text": "two name ops — should refuse at the second"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 3}}}, + {"op": "feed", "role": "price", "into": ["fast.series"]}, + {"op": "add", "type": "Bias", "name": "bias", "bind": {"scale": {"F64": 0.5}}}, + {"op": "connect", "from": "fast.value", "to": "bias.signal"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_2b_slash_name.err b/fieldtests/cycle-331-blueprint-name/c331_2b_slash_name.err new file mode 100644 index 0000000..26de825 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2b_slash_name.err @@ -0,0 +1 @@ +aura: op 0 (name): blueprint name "traces/evil" is invalid: must not contain '/' or '\' (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2b_slash_name.ops.json b/fieldtests/cycle-331-blueprint-name/c331_2b_slash_name.ops.json new file mode 100644 index 0000000..dca850e --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2b_slash_name.ops.json @@ -0,0 +1,10 @@ +[ + {"op": "name", "name": "traces/evil"}, + {"op": "doc", "text": "name with a path separator — should refuse"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 3}}}, + {"op": "feed", "role": "price", "into": ["fast.series"]}, + {"op": "add", "type": "Bias", "name": "bias", "bind": {"scale": {"F64": 0.5}}}, + {"op": "connect", "from": "fast.value", "to": "bias.signal"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_2c_empty_name.err b/fieldtests/cycle-331-blueprint-name/c331_2c_empty_name.err new file mode 100644 index 0000000..32bb9de --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2c_empty_name.err @@ -0,0 +1 @@ +aura: op 0 (name): blueprint name "" is invalid: must be non-empty (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2c_empty_name.ops.json b/fieldtests/cycle-331-blueprint-name/c331_2c_empty_name.ops.json new file mode 100644 index 0000000..4bed77f --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2c_empty_name.ops.json @@ -0,0 +1,10 @@ +[ + {"op": "name", "name": ""}, + {"op": "doc", "text": "empty name — should refuse"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 3}}}, + {"op": "feed", "role": "price", "into": ["fast.series"]}, + {"op": "add", "type": "Bias", "name": "bias", "bind": {"scale": {"F64": 0.5}}}, + {"op": "connect", "from": "fast.value", "to": "bias.signal"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_2d_dotdot_name.err b/fieldtests/cycle-331-blueprint-name/c331_2d_dotdot_name.err new file mode 100644 index 0000000..1a1c705 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2d_dotdot_name.err @@ -0,0 +1 @@ +aura: op 0 (name): blueprint name ".." is invalid: must not be "." or ".." (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2d_dotdot_name.ops.json b/fieldtests/cycle-331-blueprint-name/c331_2d_dotdot_name.ops.json new file mode 100644 index 0000000..99a664e --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2d_dotdot_name.ops.json @@ -0,0 +1,10 @@ +[ + {"op": "name", "name": ".."}, + {"op": "doc", "text": "parent-dir name — should refuse"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 3}}}, + {"op": "feed", "role": "price", "into": ["fast.series"]}, + {"op": "add", "type": "Bias", "name": "bias", "bind": {"scale": {"F64": 0.5}}}, + {"op": "connect", "from": "fast.value", "to": "bias.signal"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_badroot.bp.json b/fieldtests/cycle-331-blueprint-name/c331_2e_badroot.bp.json new file mode 100644 index 0000000..a7474ca --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_badroot.bp.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":"../escape","doc":"open crossover (fast.length free) with a clean name, for hand-editing","nodes":[{"primitive":{"type":"SMA","name":"fast"}},{"primitive":{"type":"SMA","name":"slow","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":8}}]}},{"primitive":{"type":"Sub","name":"sub"}},{"primitive":{"type":"Bias","name":"bias","bound":[{"pos":0,"name":"scale","kind":"F64","value":{"F64":0.5}}]}}],"edges":[{"from":0,"to":2,"slot":0,"from_field":0},{"from":1,"to":2,"slot":1,"from_field":0},{"from":2,"to":3,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":3,"field":0,"name":"bias"}]}} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_contentid.out b/fieldtests/cycle-331-blueprint-name/c331_2e_contentid.out new file mode 100644 index 0000000..88a2bd1 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_contentid.out @@ -0,0 +1 @@ +aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_open_named.bp.json b/fieldtests/cycle-331-blueprint-name/c331_2e_open_named.bp.json new file mode 100644 index 0000000..53e9b7a --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_open_named.bp.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":"clean_name","doc":"open crossover (fast.length free) with a clean name, for hand-editing","nodes":[{"primitive":{"type":"SMA","name":"fast"}},{"primitive":{"type":"SMA","name":"slow","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":8}}]}},{"primitive":{"type":"Sub","name":"sub"}},{"primitive":{"type":"Bias","name":"bias","bound":[{"pos":0,"name":"scale","kind":"F64","value":{"F64":0.5}}]}}],"edges":[{"from":0,"to":2,"slot":0,"from_field":0},{"from":1,"to":2,"slot":1,"from_field":0},{"from":2,"to":3,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":3,"field":0,"name":"bias"}]}} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_open_named.ops.json b/fieldtests/cycle-331-blueprint-name/c331_2e_open_named.ops.json new file mode 100644 index 0000000..6ff5fd8 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_open_named.ops.json @@ -0,0 +1,14 @@ +[ + {"op": "name", "name": "clean_name"}, + {"op": "doc", "text": "open crossover (fast.length free) with a clean name, for hand-editing"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "add", "type": "SMA", "name": "fast"}, + {"op": "add", "type": "SMA", "name": "slow", "bind": {"length": {"I64": 8}}}, + {"op": "feed", "role": "price", "into": ["fast.series", "slow.series"]}, + {"op": "add", "type": "Sub", "name": "sub"}, + {"op": "connect", "from": "fast.value", "to": "sub.lhs"}, + {"op": "connect", "from": "slow.value", "to": "sub.rhs"}, + {"op": "add", "type": "Bias", "name": "bias", "bind": {"scale": {"F64": 0.5}}}, + {"op": "connect", "from": "sub.value", "to": "bias.signal"}, + {"op": "expose", "from": "bias.bias", "as": "bias"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_params.out b/fieldtests/cycle-331-blueprint-name/c331_2e_params.out new file mode 100644 index 0000000..88a2bd1 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_params.out @@ -0,0 +1 @@ +aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_register.out b/fieldtests/cycle-331-blueprint-name/c331_2e_register.out new file mode 100644 index 0000000..88a2bd1 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_register.out @@ -0,0 +1 @@ +aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_render.out b/fieldtests/cycle-331-blueprint-name/c331_2e_render.out new file mode 100644 index 0000000..51fdd3f --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_render.out @@ -0,0 +1 @@ +aura: /home/brummel/dev/aura/.claude/worktrees/issue-331-blueprint-name/fieldtests/cycle-331-blueprint-name/c331_2e_badroot.bp.json: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_run.out b/fieldtests/cycle-331-blueprint-name/c331_2e_run.out new file mode 100644 index 0000000..51fdd3f --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_run.out @@ -0,0 +1 @@ +aura: /home/brummel/dev/aura/.claude/worktrees/issue-331-blueprint-name/fieldtests/cycle-331-blueprint-name/c331_2e_badroot.bp.json: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_sweep_axis.out b/fieldtests/cycle-331-blueprint-name/c331_2e_sweep_axis.out new file mode 100644 index 0000000..88a2bd1 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_sweep_axis.out @@ -0,0 +1 @@ +aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment) diff --git a/fieldtests/cycle-331-blueprint-name/c331_2e_sweep_list.out b/fieldtests/cycle-331-blueprint-name/c331_2e_sweep_list.out new file mode 100644 index 0000000..d7cab15 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2e_sweep_list.out @@ -0,0 +1,3 @@ +./escape.fast.length:I64 +slow.length:I64 default=8 +bias.scale:F64 default=0.5 diff --git a/fieldtests/cycle-331-blueprint-name/c331_2f_dotroot.bp.json b/fieldtests/cycle-331-blueprint-name/c331_2f_dotroot.bp.json new file mode 100644 index 0000000..3ec83d9 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_2f_dotroot.bp.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":".","doc":"open crossover (fast.length free) with a clean name, for hand-editing","nodes":[{"primitive":{"type":"SMA","name":"fast"}},{"primitive":{"type":"SMA","name":"slow","bound":[{"pos":0,"name":"length","kind":"I64","value":{"I64":8}}]}},{"primitive":{"type":"Sub","name":"sub"}},{"primitive":{"type":"Bias","name":"bias","bound":[{"pos":0,"name":"scale","kind":"F64","value":{"F64":0.5}}]}}],"edges":[{"from":0,"to":2,"slot":0,"from_field":0},{"from":1,"to":2,"slot":1,"from_field":0},{"from":2,"to":3,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":3,"field":0,"name":"bias"}]}} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_3A.bp.json b/fieldtests/cycle-331-blueprint-name/c331_3A.bp.json new file mode 100644 index 0000000..2ac154b --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3A.bp.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":"graph","doc":"splice agree once, NO instance name — instance should default to authored name","nodes":[{"composite":{"name":"agree","doc":"reusable SMA smoother over an open input role x; length open","nodes":[{"primitive":{"type":"SMA","name":"sma"}}],"input_roles":[{"name":"x","targets":[{"node":0,"slot":0}]}],"output":[{"node":0,"field":0,"name":"smoothed"}]}}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0}],"source":"F64"}],"output":[{"node":0,"field":0,"name":"out"}]}} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_3A.err b/fieldtests/cycle-331-blueprint-name/c331_3A.err new file mode 100644 index 0000000..0c619dc --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3A.err @@ -0,0 +1 @@ +aura: note: use "agree": agree -> 4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154 diff --git a/fieldtests/cycle-331-blueprint-name/c331_3A_splice_named.ops.json b/fieldtests/cycle-331-blueprint-name/c331_3A_splice_named.ops.json new file mode 100644 index 0000000..21a6d12 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3A_splice_named.ops.json @@ -0,0 +1,7 @@ +[ + {"op": "doc", "text": "splice agree once, NO instance name — instance should default to authored name"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "use", "ref": {"name": "agree"}}, + {"op": "feed", "role": "price", "into": ["agree.x"]}, + {"op": "expose", "from": "agree.smoothed", "as": "out"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_3B.bp.json b/fieldtests/cycle-331-blueprint-name/c331_3B.bp.json new file mode 100644 index 0000000..e69de29 diff --git a/fieldtests/cycle-331-blueprint-name/c331_3B.err b/fieldtests/cycle-331-blueprint-name/c331_3B.err new file mode 100644 index 0000000..dddf1cd --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3B.err @@ -0,0 +1,3 @@ +aura: note: use "graph": unnamedsm -> 25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96 +aura: note: use "graph": unnamedsm -> 25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96 +aura: op 3 (use): duplicate identifier "graph" diff --git a/fieldtests/cycle-331-blueprint-name/c331_3B_two_unnamed.ops.json b/fieldtests/cycle-331-blueprint-name/c331_3B_two_unnamed.ops.json new file mode 100644 index 0000000..1095fa1 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3B_two_unnamed.ops.json @@ -0,0 +1,8 @@ +[ + {"op": "doc", "text": "splice the unnamed (graph) smoother TWICE, no instance names — should collide"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "use", "ref": {"name": "unnamedsm"}}, + {"op": "use", "ref": {"name": "unnamedsm"}}, + {"op": "feed", "role": "price", "into": ["graph.z"]}, + {"op": "expose", "from": "graph.smoothed", "as": "out"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_3C.bp.json b/fieldtests/cycle-331-blueprint-name/c331_3C.bp.json new file mode 100644 index 0000000..7cf0a82 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3C.bp.json @@ -0,0 +1 @@ +{"format_version":1,"blueprint":{"name":"graph","doc":"splice agree + refute, NO instance names — distinct authored names, no collision","nodes":[{"composite":{"name":"agree","doc":"reusable SMA smoother over an open input role x; length open","nodes":[{"primitive":{"type":"SMA","name":"sma"}}],"input_roles":[{"name":"x","targets":[{"node":0,"slot":0}]}],"output":[{"node":0,"field":0,"name":"smoothed"}]}},{"composite":{"name":"refute","doc":"a second reusable SMA smoother over open input role y; length open","nodes":[{"primitive":{"type":"SMA","name":"sma"}}],"input_roles":[{"name":"y","targets":[{"node":0,"slot":0}]}],"output":[{"node":0,"field":0,"name":"smoothed"}]}}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":0},{"node":1,"slot":0}],"source":"F64"}],"output":[{"node":0,"field":0,"name":"agree_out"},{"node":1,"field":0,"name":"refute_out"}]}} \ No newline at end of file diff --git a/fieldtests/cycle-331-blueprint-name/c331_3C.err b/fieldtests/cycle-331-blueprint-name/c331_3C.err new file mode 100644 index 0000000..ad3e777 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3C.err @@ -0,0 +1,2 @@ +aura: note: use "agree": agree -> 4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154 +aura: note: use "refute": refute -> 9580a623d1faf83841482ae08874ffe2464aff30a2ac2e800a9b47a3bb56d1f2 diff --git a/fieldtests/cycle-331-blueprint-name/c331_3C_two_named.ops.json b/fieldtests/cycle-331-blueprint-name/c331_3C_two_named.ops.json new file mode 100644 index 0000000..c73348c --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3C_two_named.ops.json @@ -0,0 +1,9 @@ +[ + {"op": "doc", "text": "splice agree + refute, NO instance names — distinct authored names, no collision"}, + {"op": "source", "role": "price", "kind": "F64"}, + {"op": "use", "ref": {"name": "agree"}}, + {"op": "use", "ref": {"name": "refute"}}, + {"op": "feed", "role": "price", "into": ["agree.x", "refute.y"]}, + {"op": "expose", "from": "agree.smoothed", "as": "agree_out"}, + {"op": "expose", "from": "refute.smoothed", "as": "refute_out"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_3_agree.ops.json b/fieldtests/cycle-331-blueprint-name/c331_3_agree.ops.json new file mode 100644 index 0000000..91121ab --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3_agree.ops.json @@ -0,0 +1,8 @@ +[ + {"op": "name", "name": "agree"}, + {"op": "doc", "text": "reusable SMA smoother over an open input role x; length open"}, + {"op": "input", "role": "x"}, + {"op": "add", "type": "SMA", "name": "sma"}, + {"op": "feed", "role": "x", "into": ["sma.series"]}, + {"op": "expose", "from": "sma.value", "as": "smoothed"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_3_refute.ops.json b/fieldtests/cycle-331-blueprint-name/c331_3_refute.ops.json new file mode 100644 index 0000000..2fc42d6 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3_refute.ops.json @@ -0,0 +1,8 @@ +[ + {"op": "name", "name": "refute"}, + {"op": "doc", "text": "a second reusable SMA smoother over open input role y; length open"}, + {"op": "input", "role": "y"}, + {"op": "add", "type": "SMA", "name": "sma"}, + {"op": "feed", "role": "y", "into": ["sma.series"]}, + {"op": "expose", "from": "sma.value", "as": "smoothed"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_3_reg_agree.out b/fieldtests/cycle-331-blueprint-name/c331_3_reg_agree.out new file mode 100644 index 0000000..20fa9a2 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3_reg_agree.out @@ -0,0 +1,2 @@ +registered blueprint 4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154 (/tmp/ftwork/nm_lab/runs/blueprints/4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154.json) +label "agree" -> 4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154 diff --git a/fieldtests/cycle-331-blueprint-name/c331_3_reg_refute.out b/fieldtests/cycle-331-blueprint-name/c331_3_reg_refute.out new file mode 100644 index 0000000..ca98367 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3_reg_refute.out @@ -0,0 +1,2 @@ +registered blueprint 9580a623d1faf83841482ae08874ffe2464aff30a2ac2e800a9b47a3bb56d1f2 (/tmp/ftwork/nm_lab/runs/blueprints/9580a623d1faf83841482ae08874ffe2464aff30a2ac2e800a9b47a3bb56d1f2.json) +label "refute" -> 9580a623d1faf83841482ae08874ffe2464aff30a2ac2e800a9b47a3bb56d1f2 diff --git a/fieldtests/cycle-331-blueprint-name/c331_3_reg_unnamed.out b/fieldtests/cycle-331-blueprint-name/c331_3_reg_unnamed.out new file mode 100644 index 0000000..782ded4 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3_reg_unnamed.out @@ -0,0 +1,2 @@ +registered blueprint 25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96 (/tmp/ftwork/nm_lab/runs/blueprints/25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96.json) +label "unnamedsm" -> 25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96 diff --git a/fieldtests/cycle-331-blueprint-name/c331_3_unnamed_smoother.ops.json b/fieldtests/cycle-331-blueprint-name/c331_3_unnamed_smoother.ops.json new file mode 100644 index 0000000..480920f --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_3_unnamed_smoother.ops.json @@ -0,0 +1,7 @@ +[ + {"op": "doc", "text": "an UNNAMED reusable SMA smoother over open input role z; defaults to graph"}, + {"op": "input", "role": "z"}, + {"op": "add", "type": "SMA", "name": "sma"}, + {"op": "feed", "role": "z", "into": ["sma.series"]}, + {"op": "expose", "from": "sma.value", "as": "smoothed"} +] diff --git a/fieldtests/cycle-331-blueprint-name/c331_4_graph_build_help.txt b/fieldtests/cycle-331-blueprint-name/c331_4_graph_build_help.txt new file mode 100644 index 0000000..fcded68 --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_4_graph_build_help.txt @@ -0,0 +1,38 @@ +Construct a graph from a stdin op-list + +Usage: aura graph build [OPTIONS] + +Options: + --release Load the project dylib from target/release instead of target/debug + -h, --help Print help + +Op-list reference (stdin: a JSON array of op objects, applied in order): + {"op":"source","role":"price","kind":"F64"} + declare a bound root input role of a scalar kind + {"op":"input","role":"price"} + declare an open input role (wired by an enclosing graph) + {"op":"add","type":"SMA","name":"fast","bind":{"length":{"I64":2}}} + instantiate a node ("name" optional; "bind" maps param -> typed scalar) + {"op":"add","type":"Session","name":"ny","args":{"tz":"America/New_York","open":"09:30"},"bind":{"period_minutes":{"I64":15}}} + an arg-bearing type applies "args" (closed, per-type-declared string + pairs) BEFORE "bind" — see graph introspect --node for its args + {"op":"feed","role":"price","into":["fast.series","slow.series"]} + wire a role into one or more input slots + {"op":"connect","from":"fast.value","to":"sub.lhs"} + wire a node output into an input slot + {"op":"expose","from":"sub.value","as":"bias"} + name a graph output field + {"op":"tap","from":"sub.value","as":"spread"} + declare a recordable tap on a wire (expose's output-side twin) + {"op":"gang","as":"length","into":["fast.length","slow.length"]} + fuse two or more sibling params into one public knob + {"op":"doc","text":"..."} + declare the composite's one-line meaning (C29) + {"op":"use","ref":{"name":"agree"},"name":"gate","bind":{"sma.length":{"I64":9}}} + splice a registered blueprint (by "content_id" or "name") under an + instance name ("bind" path-qualifies the spliced instance's params) + {"op":"name","name":"ny_momentum"} + set the composite's render name, at most once per script (default + "graph" if omitted) + +Node types and their ports: aura graph introspect --vocabulary | --node diff --git a/fieldtests/cycle-331-blueprint-name/c331_4_register_help.txt b/fieldtests/cycle-331-blueprint-name/c331_4_register_help.txt new file mode 100644 index 0000000..1ce2cfe --- /dev/null +++ b/fieldtests/cycle-331-blueprint-name/c331_4_register_help.txt @@ -0,0 +1,11 @@ +Register a blueprint document into the content-addressed store (#196) + +Usage: aura graph register [OPTIONS] + +Arguments: + The blueprint .json file to register + +Options: + --name Label the registered content id for `use` by name (#317); a re-registered label repoints (latest-wins on resolve) + --release Load the project dylib from target/release instead of target/debug + -h, --help Print help