fieldtest: blueprint-name — 4 examples, 1 bug / 0 friction / 1 spec-gap / 4 working
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/<name>/ (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
This commit is contained in:
@@ -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":"<name>"}` — the composite render name that flows to store
|
||||
documents, `traces/<name>/`, 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/<name>/`, 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/<name>/`; 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.
|
||||
@@ -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}}]}}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
registered blueprint 347a361997e8a65d4122b5ab50367031f78df24a1ff6ad14477ed2c04ec3b603 (/tmp/ftwork/nm_lab/runs/blueprints/347a361997e8a65d4122b5ab50367031f78df24a1ff6ad14477ed2c04ec3b603.json)
|
||||
@@ -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]}}}
|
||||
@@ -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"]}
|
||||
@@ -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}}]}}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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}}]}}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
aura: op 1 (name): a script names its blueprint at most once
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
aura: op 0 (name): blueprint name "traces/evil" is invalid: must not contain '/' or '\' (a single path segment)
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
aura: op 0 (name): blueprint name "" is invalid: must be non-empty (a single path segment)
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
aura: op 0 (name): blueprint name ".." is invalid: must not be "." or ".." (a single path segment)
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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"}]}}
|
||||
@@ -0,0 +1 @@
|
||||
aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment)
|
||||
@@ -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"}]}}
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment)
|
||||
@@ -0,0 +1 @@
|
||||
aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -0,0 +1 @@
|
||||
aura: blueprint name "../escape" is invalid: must not contain '/' or '\' (a single path segment)
|
||||
@@ -0,0 +1,3 @@
|
||||
./escape.fast.length:I64
|
||||
slow.length:I64 default=8
|
||||
bias.scale:F64 default=0.5
|
||||
@@ -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"}]}}
|
||||
@@ -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"}]}}
|
||||
@@ -0,0 +1 @@
|
||||
aura: note: use "agree": agree -> 4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1,3 @@
|
||||
aura: note: use "graph": unnamedsm -> 25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96
|
||||
aura: note: use "graph": unnamedsm -> 25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96
|
||||
aura: op 3 (use): duplicate identifier "graph"
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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"}]}}
|
||||
@@ -0,0 +1,2 @@
|
||||
aura: note: use "agree": agree -> 4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154
|
||||
aura: note: use "refute": refute -> 9580a623d1faf83841482ae08874ffe2464aff30a2ac2e800a9b47a3bb56d1f2
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -0,0 +1,2 @@
|
||||
registered blueprint 4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154 (/tmp/ftwork/nm_lab/runs/blueprints/4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154.json)
|
||||
label "agree" -> 4f78a9f6e1f3e1c7671edaf1be29d1e339fd07f38fb2c65cb23637502f94d154
|
||||
@@ -0,0 +1,2 @@
|
||||
registered blueprint 9580a623d1faf83841482ae08874ffe2464aff30a2ac2e800a9b47a3bb56d1f2 (/tmp/ftwork/nm_lab/runs/blueprints/9580a623d1faf83841482ae08874ffe2464aff30a2ac2e800a9b47a3bb56d1f2.json)
|
||||
label "refute" -> 9580a623d1faf83841482ae08874ffe2464aff30a2ac2e800a9b47a3bb56d1f2
|
||||
@@ -0,0 +1,2 @@
|
||||
registered blueprint 25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96 (/tmp/ftwork/nm_lab/runs/blueprints/25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96.json)
|
||||
label "unnamedsm" -> 25cdd4942f217381da0d799b0c5b22752a963a2bdc7df83e5d1377ae3b974e96
|
||||
@@ -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"}
|
||||
]
|
||||
@@ -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 <T> 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 <T>
|
||||
@@ -0,0 +1,11 @@
|
||||
Register a blueprint document into the content-addressed store (#196)
|
||||
|
||||
Usage: aura graph register [OPTIONS] <FILE>
|
||||
|
||||
Arguments:
|
||||
<FILE> The blueprint .json file to register
|
||||
|
||||
Options:
|
||||
--name <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
|
||||
Reference in New Issue
Block a user