ba46350da9
Milestone acceptance corpus for 'Measurement as a first-class citizen', authored as a downstream consumer (public interface only): a gated rate/mux/counter over the four new cells, a SessionFrankfurt anchor study, and the origin first-candle-momentum study on real GER40 data — each a hand-authored blueprint plus one recorded run, zero throwaway Rust. The three capabilities compose end-to-end and record via declared taps. Findings routed separately: two aura-run panics-where-refusal-expected (bad tap wire; non-bias output) to debug; a tap-authoring friction and two doc gaps to follow-ups.
58 lines
2.9 KiB
Markdown
58 lines
2.9 KiB
Markdown
# Fieldtest corpus — "Measurement as a first-class citizen" milestone
|
||
|
||
Downstream-consumer study blueprints authored from the public interface
|
||
(ledger C24/C26/C27, glossary, shipped example envelopes) to exercise the
|
||
milestone's three composing capabilities end to end:
|
||
|
||
1. **normalized-time bucketing** — coarse bars / session anchoring bucket by
|
||
the nominal minute despite jittered provider stamps;
|
||
2. **the four new std cells** — `Sign`, `Select`, `CumSum`, `When`;
|
||
3. **declared taps** — named measurement points on interior wires, recorded
|
||
from one `aura run`.
|
||
|
||
Each scenario ships three files: `*.ops.json` (the role-6a op-script, the
|
||
canonical authoring input), `*.bp.json` (the `aura graph build` output), and
|
||
`*.json` (the final runnable envelope — the built blueprint **plus a
|
||
hand-added `taps` field**, since no op-script verb and no documented surface
|
||
declares a tap; see the fieldtest spec).
|
||
|
||
## Reproduce
|
||
|
||
Build the CLI (`cargo build --release -p aura-cli`), then, inside a scratch
|
||
project (`aura new lab && cd lab`), copy a scenario's `*.json` in and run it.
|
||
Declared taps persist under `runs/traces/<blueprint-name>/` only inside a
|
||
project; chart with `aura chart <name>`.
|
||
|
||
### 1 — `mfc_1_gated_rate` (cells + taps, synthetic)
|
||
```
|
||
aura run mfc_1_gated_rate.json
|
||
```
|
||
A gated-rate / mux / counter study over the synthetic close stream. `Gt`
|
||
drives a Bool gate; `Select` muxes it back to ±1 (the Bool→F64 bridge);
|
||
`Sign` reads the fast−slow spread direction; `When(1.0, gate)` forwards a 1
|
||
only on gate-true cycles, and `CumSum` over it vs `CumSum` over the raw clock
|
||
gives the rate = qualifying/total. Verified: `dir_sign == sign(spread)`;
|
||
`mux_select == ±1` by the gate; `gated_when` records exactly the gate-true
|
||
subsequence; `count_above / count_all == 6 / 18`.
|
||
|
||
### 2 — `mfc_2_session_anchor` (session anchoring + taps)
|
||
```
|
||
aura run mfc_2_session_anchor.json --real GER40 --from 1725148800000 --to 1725321600000
|
||
```
|
||
`SessionFrankfurt` yields `bars_since_open`; `EqConst(·, 0)` flags the first
|
||
block of each session; `When` gates a momentum sign to it. Over real GER40 the
|
||
`isfirst_flag==1` set equals the `bars_since_open==0` set. On the synthetic
|
||
stream `bars_since_open` is a constant pre-open sentinel (toy timestamps), so
|
||
the anchoring is only meaningful over `--real`.
|
||
|
||
### 3 — `mfc_3_first_candle_momentum` (all three axes, real)
|
||
```
|
||
aura run mfc_3_first_candle_momentum.json --real GER40 --from 1725148800000 --to 1727740800000
|
||
```
|
||
The origin question — "is the first coarse candle after a session open a
|
||
momentum indicator?" `Resample` builds 15-minute bars (clean 15.0-min cadence
|
||
preserved across `:59.999` jittered stamps — the snap fix), `SessionFrankfurt`
|
||
anchors on the coarse close, and `When` gates `Sign(coarse close − coarse
|
||
open)` to the first coarse candle of each session. Records exactly one
|
||
`firstmom` sample per session (21 over September 2024), zero throwaway Rust.
|