docs(0088): document op-script grammar; refresh stale cycle-0088 example corpus

#163 — the construction op-script (`aura graph build`) had no durable public
schema doc, and the only worked-example corpus had drifted out of sync with the
current binary, so a consumer copying the visible example was misled.

Grammar reference (durable): a compact op-script grammar — the six verbs
(source/input/add/feed/connect/expose), their keys, the typed-Scalar bind form
({"I64":2}) and the capitalized ScalarKind, the by-identifier / dotted-port
model, and the add-`name` vs expose-`as` distinction — added to the C24 ledger
entry, with a correct worked-example pointer. Surfacing the same grammar in
`aura graph build --help` is left to ride with the CLI-discoverability work
(#159), keeping this change decoupled from the deferred World/project-as-crate
layer.

Corpus refresh: the cycle-0088 fixture corpus replayed against the current
binary failed on two accumulated drifts. (1) `add`'s naming key was renamed
`as` -> `name` (3c4b667; `expose` keeps `as` as a real alias) — the inputs now
use `name` for `add` ops only. (2) The dataflow-cycle bug the 0088 fieldtest
found was fixed (1652042, closes #161), so `c0088_3m_two_cycle` is now a
rejection fixture: the gap-era cyclic-blueprint golden is removed and
`c0088_3m.err` carries the eager cycle-rejection message. FINDINGS.md gets a
dated refresh stamp; its findings are preserved as written at fieldtest time.

Verified: the four golden-bearing success fixtures (_1, _2_completed,
_2_partial via --unwired) reproduce byte-identically; all 15 error fixtures
produce the intended by-identifier `op N (kind): cause` (or finalize) message.
Doc + fixtures only, no engine/CLI code touched.

closes #163
This commit is contained in:
2026-06-30 15:45:23 +02:00
parent 3f75d59598
commit 8bb21b1c16
22 changed files with 72 additions and 35 deletions
@@ -3,6 +3,14 @@
**Status:** Triaged 2026-06-29 — filed to the forward queue (see Triage outcome)
**Author:** fieldtester (dispatched by fieldtest skill); triaged by orchestrator
> **Corpus refreshed 2026-06-30 (#163)** to replay against the current binary.
> Two drifts had accumulated since this run recorded the fixtures: `add`'s
> naming key was renamed `as` -> `name` (commit `3c4b667`; `expose` keeps `as`),
> and the dataflow-cycle bug below was fixed (`1652042`, closes #161). The `.json`
> inputs now use `name` for `add`; `c0088_3m_two_cycle` is a rejection fixture
> (`c0088_3m.err` carries the cycle-rejection message; the gap-era cyclic-blueprint
> golden was removed). The findings below are preserved as written at fieldtest time.
## Scope
Cycle 0088 shipped the **construction op-script service** (#157, C24): two CLI
subcommands over a declarative JSON op-list. `aura graph build` reads an op-list
@@ -1,12 +1,12 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "as": "slow", "bind": {"length": {"I64": 4}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "slow", "bind": {"length": {"I64": 4}}},
{"op": "feed", "role": "price", "into": ["fast.series", "slow.series"]},
{"op": "add", "type": "Sub", "as": "sub"},
{"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", "as": "bias"},
{"op": "add", "type": "Bias", "name": "bias"},
{"op": "connect", "from": "sub.value", "to": "bias.signal"},
{"op": "expose", "from": "bias.bias", "as": "bias"}
]
@@ -1,12 +1,12 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 3}}},
{"op": "add", "type": "SMA", "as": "slow", "bind": {"length": {"I64": 8}}},
{"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", "as": "sub"},
{"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", "as": "bias"},
{"op": "add", "type": "Bias", "name": "bias"},
{"op": "connect", "from": "sub.value", "to": "bias.signal"},
{"op": "expose", "from": "bias.bias", "as": "bias"}
]
@@ -1,9 +1,9 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 3}}},
{"op": "add", "type": "SMA", "as": "slow", "bind": {"length": {"I64": 8}}},
{"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", "as": "sub"},
{"op": "add", "type": "Sub", "name": "sub"},
{"op": "connect", "from": "fast.value", "to": "sub.lhs"},
{"op": "add", "type": "Bias", "as": "bias"}
{"op": "add", "type": "Bias", "name": "bias"}
]
@@ -1,6 +1,6 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "Smaa", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "Smaa", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "feed", "role": "price", "into": ["fast.series"]},
{"op": "expose", "from": "fast.value", "as": "out"}
]
@@ -1,7 +1,7 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "Gt", "as": "g"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "Gt", "name": "g"},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "feed", "role": "price", "into": ["g.a", "g.b"]},
{"op": "connect", "from": "g.value", "to": "fast.series"},
{"op": "expose", "from": "fast.value", "as": "out"}
@@ -1,7 +1,7 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "Sub", "as": "sub"},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "Sub", "name": "sub"},
{"op": "feed", "role": "price", "into": ["fast.series"]},
{"op": "connect", "from": "fast.output", "to": "sub.lhs"},
{"op": "expose", "from": "sub.value", "as": "out"}
@@ -1,7 +1,7 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "Sub", "as": "sub"},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "Sub", "name": "sub"},
{"op": "feed", "role": "price", "into": ["fast.series"]},
{"op": "connect", "from": "fst.value", "to": "sub.lhs"},
{"op": "expose", "from": "sub.value", "as": "out"}
@@ -1,8 +1,8 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "as": "slow", "bind": {"length": {"I64": 4}}},
{"op": "add", "type": "Sub", "as": "sub"},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "slow", "bind": {"length": {"I64": 4}}},
{"op": "add", "type": "Sub", "name": "sub"},
{"op": "feed", "role": "price", "into": ["fast.series", "slow.series"]},
{"op": "connect", "from": "fast.value", "to": "sub.lhs"},
{"op": "connect", "from": "slow.value", "to": "sub.lhs"},
@@ -1,7 +1,7 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 4}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 4}}},
{"op": "feed", "role": "price", "into": ["fast.series"]},
{"op": "expose", "from": "fast.value", "as": "out"}
]
@@ -1,6 +1,6 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"F64": 2.0}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"F64": 2.0}}},
{"op": "feed", "role": "price", "into": ["fast.series"]},
{"op": "expose", "from": "fast.value", "as": "out"}
]
@@ -1,6 +1,6 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "feed", "role": "price", "into": ["fast.series"]},
{"op": "expose", "from": "fast.zzz", "as": "out"}
]
@@ -1,6 +1,6 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "connect", "from": "fast.value", "to": "fast.series"},
{"op": "expose", "from": "fast.value", "as": "out"}
]
@@ -1,6 +1,6 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "feed", "role": "pryce", "into": ["fast.series"]},
{"op": "expose", "from": "fast.value", "as": "out"}
]
@@ -1,6 +1,6 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "feed", "role": "price", "into": ["fast.serie"]},
{"op": "expose", "from": "fast.value", "as": "out"}
]
@@ -1,5 +1,5 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "feed", "role": "price", "into": ["fast.series"]}
]
@@ -0,0 +1 @@
aura: op 5 (connect): connecting b.value -> a.lhs would close a cycle
@@ -1 +0,0 @@
{"format_version":1,"blueprint":{"name":"graph","nodes":[{"primitive":{"type":"Sub","name":"a"}},{"primitive":{"type":"Sub","name":"b"}}],"edges":[{"from":0,"to":1,"slot":0,"from_field":0},{"from":1,"to":0,"slot":0,"from_field":0}],"input_roles":[{"name":"price","targets":[{"node":0,"slot":1},{"node":1,"slot":1}],"source":"F64"}],"output":[{"node":0,"field":0,"name":"out"}]}}
@@ -1,7 +1,7 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "Sub", "as": "a"},
{"op": "add", "type": "Sub", "as": "b"},
{"op": "add", "type": "Sub", "name": "a"},
{"op": "add", "type": "Sub", "name": "b"},
{"op": "feed", "role": "price", "into": ["a.rhs", "b.rhs"]},
{"op": "connect", "from": "a.value", "to": "b.lhs"},
{"op": "connect", "from": "b.value", "to": "a.lhs"},
@@ -1,6 +1,6 @@
[
{"op": "source", "role": "price", "kind": "F64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": 2}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": 2}},
{"op": "feed", "role": "price", "into": ["fast.series"]},
{"op": "expose", "from": "fast.value", "as": "out"}
]
@@ -1,6 +1,6 @@
[
{"op": "source", "role": "price", "kind": "f64"},
{"op": "add", "type": "SMA", "as": "fast", "bind": {"length": {"I64": 2}}},
{"op": "add", "type": "SMA", "name": "fast", "bind": {"length": {"I64": 2}}},
{"op": "feed", "role": "price", "into": ["fast.series"]},
{"op": "expose", "from": "fast.value", "as": "out"}
]