feat(cli,docs): the r_channel OHLC example + ledger amendment C26 (#231 tasks 6-7)
The acceptance proof: hl_channel — a causal Donchian channel (Delay(1) excludes the current bar, C2) consuming high/low/close roles, built from rostered vocabulary, shipped as the r_channel/r_channel_open example pair (builder + regenerator + serialize pins, the r_* pattern). Proven at three layers: a non-gated loaded-vs-carve equivalence over inline sources (non-zero-bias hardened per review), the unconditional synthetic multi-column refusal, and archive-gated CLI e2e — aura run on GER40 end-to-end plus a sweep whose members run and reproduce 2/2 bit-identically. Ledger: new C26 entry (the binding vocabulary — closed column set + price alias, name-driven default + campaign data.bindings override, canonical order = the C4 tie-break, Blockly-litmus argument, the #71 extension point for recorded non-price sources) and the C20/C24 scaffolding-clause annotations: the single-price data weld is retired, wrap_r's remaining R-scaffolding retirement stays #159. Verified: all proof tests green, full workspace suite green, clippy -D warnings clean; independent quality review approved. closes #231
This commit is contained in:
+51
-2
@@ -1726,7 +1726,11 @@ not a hand-coded blueprint nor engine-baked source: a structural axis selects am
|
||||
structural variation **first-class and searchable** rather than a hand-enumerated
|
||||
menu — `HarnessKind` and the per-strategy `*_sweep_family` functions in `aura-cli`
|
||||
are the pre-C24 scaffolding (topology-as-engine-source, a C16 tension), retired as
|
||||
C24 + the project-as-crate layer land.
|
||||
C24 + the project-as-crate layer land. [C26 realization, 2026-07-10 (#231): the
|
||||
scaffolding's last data weld — `wrap_r`'s hard-wired `price`←close role and the
|
||||
`M1Field::Close`-only open sites — is retired; a strategy's input roles now bind
|
||||
archive columns by name (C26). `wrap_r`'s remaining R-scaffolding retirement
|
||||
stays #159.]
|
||||
**Refinement (2026-07-03, #188/#189 — experiment INTENT is campaign-document data).**
|
||||
The "ordinary Rust control flow, not a config schema" clause and the forbids-clause
|
||||
"declarative experiment mini-DSL" are scoped by the #188 role-model pass: they forbid an
|
||||
@@ -2028,7 +2032,9 @@ authoring brain** (the format is required by C21/C18 at the CLI level, independe
|
||||
any UI); a **generated / searched run whose topology is not recoverable from its
|
||||
manifest** (C18 reproduction); baking topology as **engine source** compiled into the
|
||||
binary (the hard-wired `aura-cli` harnesses are pre-C24 scaffolding, a C16 tension,
|
||||
retired as this lands).
|
||||
retired as this lands). [C26, 2026-07-10 (#231): the single-price data weld inside
|
||||
the surviving `wrap_r` scaffolding is retired — input roles bind archive columns
|
||||
by name; the wrapper's remaining R-scaffolding retirement stays #159.]
|
||||
**Why.** The World (C21) is the product, and it cannot orchestrate, **structurally
|
||||
search**, or **reproduce** *families that vary topology* while topology stays opaque
|
||||
Rust source baked into the engine. The **game-engine principle** (C16's engine / game
|
||||
@@ -2324,6 +2330,49 @@ artifacts (process/campaign documents, C18 realization note); roles 4/7/8 remain
|
||||
technically present but faceless (no addressed verb families yet); role homes in
|
||||
the project layout and docs-by-role are open (#192 context).
|
||||
|
||||
### C26 — Harness input binding: role names bind archive columns
|
||||
**Guarantee.** A strategy blueprint declares WHICH data it consumes as the NAMES
|
||||
of its root input roles: a role whose name is in the **closed column
|
||||
vocabulary** — `open`, `high`, `low`, `close`, `spread`, `volume`, plus `price`
|
||||
as the backward-compatible alias of `close` — binds by default to that column of
|
||||
the campaign cell's (or run invocation's) instrument. A campaign document may
|
||||
**override** the name default per role via the additive `data.bindings` block
|
||||
(`role name → column name`; serde `default` + skip-if-empty, so binding-less
|
||||
documents keep their content ids) — the 6b rebind seam: the blueprint's content
|
||||
identity never changes. Resolution (`aura-cli`'s `binding` module,
|
||||
`resolve_binding`) produces ONE ordered plan consumed by BOTH halves of the old
|
||||
weld: the columns are opened (`aura_ingest::open_columns`, the generalization of
|
||||
`open_ohlc`/#92) and the wrapped root roles declared (`wrap_r`) in the **same
|
||||
canonical order** — `M1Field` declaration order (open, high, low, close, spread,
|
||||
volume), filtered to the consumed set — which is the C4 merge tie-break order,
|
||||
so role i receives source i by construction. A close column is always part of
|
||||
the plan (shared when the strategy consumes `close`/`price`, else opened for the
|
||||
broker/executor pair alone). The vocabulary is **Blockly-litmus-clean** (C25):
|
||||
role-name slots draw from a closed enum, the bindings block is typed
|
||||
`role → column` with no free-form holes, and validation is two-tier — values
|
||||
against the column vocabulary in the intrinsic tier (`validate_campaign`), keys
|
||||
against the strategies' `input_roles()` in the resolver tier
|
||||
(`validate_campaign_refs`).
|
||||
**Forbids.** Guessing a column for an unknown role name (refuse with the
|
||||
vocabulary + the override remedy, never default); opening columns in any order
|
||||
other than the canonical declaration order (the C4 tie-break contract);
|
||||
free-form or logic-bearing binding values (the C17/C25 line — a binding value is
|
||||
a typed column reference, nothing else); fabricating synthetic OHLC when a
|
||||
multi-column strategy meets synthetic data (the walk generates a close series
|
||||
only — refuse with the `--real` remedy).
|
||||
**Extension point.** When recorded non-price sources land (the #71 Source seam),
|
||||
the binding VALUE-space grows additively from archive columns to recorded-stream
|
||||
references — a root role like `sentiment` becomes bindable to a recorded stream
|
||||
then, and until then refuses with the vocabulary-naming message. The role-name
|
||||
key-space and the campaign `bindings` carrier are unchanged by that growth.
|
||||
**Why.** The single-price weld (`wrap_r`'s hard-wired `price`←close and the six
|
||||
`M1Field::Close`-only open sites) made every strategy monocular regardless of
|
||||
what its blueprint declared; binding by role name keeps the blueprint the single
|
||||
source of its own data needs (C24: topology-as-data carries its input contract),
|
||||
lets a campaign re-aim a strategy without touching its content id (C18
|
||||
identity), and pins opening and declaring to one shared, canonically-ordered
|
||||
plan so the two halves cannot drift (C1/C4 determinism).
|
||||
|
||||
---
|
||||
|
||||
## Open architectural threads not yet resolved
|
||||
|
||||
Reference in New Issue
Block a user