# 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.
