$ aura graph build < ../c319_1_spread_tap.ops.json > blueprints/c319_1_spread_tap.bp.json
EXIT=0

$ aura graph introspect --folds
count   — number of warm rows (any kind; i64 row); one row at the last warm ts
first   — first warm value, at its own timestamp (any kind; kind-preserving row)
last    — last warm value, at its own timestamp (any kind; kind-preserving row)
max     — maximum of the series (f64 taps; f64 row); one row at the last warm ts
mean    — arithmetic mean of the series (f64 taps; f64 row); one row at the last warm ts
min     — minimum of the series (f64 taps; f64 row); one row at the last warm ts
record  — persist the full series, lossless, at constant memory (any kind)
sum     — sum of the series (f64 taps; f64 row); one row at the last warm ts

$ aura exec blueprints/c319_1_spread_tap.bp.json --override fast.length=2 --tap spread=record
EXIT=0
runs/traces/c319_spread/spread.json:
{"tap":"spread","kinds":["F64"],"ts":[8,9,10,11,12,13,14,15,16,17,18],"columns":[[0.002650000000000041,-0.0002249999999999197,-0.0027250000000000885,-0.004237499999999894,-0.004124999999999934,-0.0023

$ aura exec blueprints/c319_1_spread_tap.bp.json --override fast.length=6 --tap spread=record   # second override, same blueprint
EXIT=0
runs/traces/ now holds:
  c319_spread
runs/traces/c319_spread/spread.json (run A's series is gone):
{"tap":"spread","kinds":["F64"],"ts":[8,9,10,11,12,13,14,15,16,17,18],"columns":[[0.001383333333333292,0.0011750000000001481,0.0006749999999999812,-0.00010416666666679397,-0.001091666666666491,-0.0015

$ aura exec blueprints/c319_1_spread_tap.bp.json --tap spread=median
EXIT=1
aura: unknown fold 'median' — available: count, first, last, max, mean, min, record, sum

$ aura exec blueprints/c319_1_spread_tap.bp.json --tap spread
EXIT=2
aura: --tap expects TAP=FOLD, got "spread"

$ aura exec blueprints/signal.json --tap spread=record   # blueprint declares no taps
EXIT=1
aura: the tap plan names 'spread', but the blueprint declares no such tap — declared taps: 
