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.
2.9 KiB
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:
- normalized-time bucketing — coarse bars / session anchoring bucket by the nominal minute despite jittered provider stamps;
- the four new std cells —
Sign,Select,CumSum,When; - 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.