design(C10): reframe strategy output to intent/exposure stream; position table becomes a derived layer

The DAG expresses exactly one state at time t and a node emits at most one record
per eval (C8), so a *sequence* of position events — where one decision instant
(a stop-and-reverse) needs a close AND an open at the same event_ts — cannot be
the DAG's per-cycle output without violating C8. The state the DAG can express
faithfully is the desired exposure (one value per cycle); the buy/sell/close
events are its first difference, a derived consequence.

C10 is reframed accordingly: the strategy's primary, backtestable output is an
intent/exposure stream (one signed, bounded f64 in [-1,+1] per cycle). Signal
quality is measured by the sim-optimal broker integrating exposure*return into a
synthetic pip-equity curve. The broker-independent position-event table survives
as a decoupled, derivable, downstream position-management layer (computed table,
not a per-eval output) feeding realistic broker nodes for viability/deploy — no
longer the DAG output nor the signal-quality measure.

Touches the ledger contract (INDEX.md C10 + provenance/milestone/C20 ancillary),
the always-loaded summary (CLAUDE.md invariant #7), the glossary (broker, equity
stream, position table, realistic broker, signal, sim-optimal broker, strategy
reframed + new exposure-stream entry), and the north-star layout doc. Sealed
specs/plans (0001-0006) left as historical record.

refs #4 #5

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-04 17:02:33 +02:00
parent f000373507
commit 0d7deb3a91
4 changed files with 107 additions and 71 deletions
+8 -7
View File
@@ -77,13 +77,14 @@ per-session consent.
implements `schema` + `eval` against `aura-core`.
3. **Backtest:** `aura backtest nodes/third-candle-long --symbol GER40
--from 2020 --to 2024` → the strategy produces a broker-independent
**position table** (open/close events); the default **sim-optimal broker**
projects it into a synthetic **pip**-equity, yielding a metrics table
(trades, hit-rate, pip-P&L, max-DD, Sharpe) + a run record (manifest +
metrics) under `runs/`. Brokers are consumer **nodes**, and several can be
attached at once: add `--broker pepperstone` to get a realistic currency
curve *alongside* the default sim-optimal pip curve — two comparable equity
curves from the same position table. (Contract C10.)
**exposure stream** (one bounded signed value per cycle = intent); the default
**sim-optimal broker** integrates `exposure·return` into a synthetic
**pip**-equity — the signal's *quality* — yielding a metrics table
(pip-P&L, max-DD, Sharpe) + a run record (manifest + metrics) under `runs/`.
Brokers are consumer **nodes**: the sim-optimal one reads the exposure stream
directly, while a realistic broker reads the *derived* position-event table —
add `--broker pepperstone` to get a realistic currency curve *alongside* the
sim-optimal pip curve, two comparable equity curves. (Contract C10.)
4. **Sweep / Monte-Carlo / matrix — a Rust experiment.** Anything beyond a
single backtest is an *experiment* in `experiments/` (Rust, builder API): a
parameter sweep, Monte-Carlo over seeds, or a structural matrix like "these 10