Files
claude ba46350da9 fieldtest: measurement milestone — 3 studies, 8 findings
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.
2026-07-18 00:45:38 +02:00
..

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 cellsSign, 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 fastslow 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.