2026-08-21 — meanrev clearing-day churn: the RWG-1 leg-2 measurement
Author: daily audit routine (read-only measurement; no interpretation beyond the numbers). Context: RWG-1 = queue item 15; its panel-run-12 rider tasked "tonight's daily audit" with reading the realized churn of the first clearing day under the recalibrated runaway cap (150→300, commit 955db93) against the real book. This note is that reading.
Setup
- meanrev (negative-control sleeve) was SAFETY-HALTed 2026-08-19 and 08-20: its legitimate 158-order batch crossed the old runaway cap of 150; zero orders submitted on both days.
- Leg 2 of RWG-1 claims the halt path still advances its own blend base
(
daily.pypersistslast_targetsbeforeexecute_orders): the rider's evidence waskelly_ledger.jsonlast_targetsdated 08-20 with 161 weights whilen_submitted: 0. - Leg 2's pre-registered prediction for the first clearing day: a churn burst past the 0.5/day two-sided turnover cap.
Measurements (2026-08-21 run, workflow 32495726531, state commit d1d9701)
| quantity | value | source |
|---|---|---|
| configured cap | daily_turnover_cap: 0.5 two-sided Σ|Δw|/day | config/meanrev.yaml:65 |
| engine-reported realized turnover | 67.2% | job log Daily run complete: 133 submitted, 2 failed, turnover=67.2% (this is the cap-accounting figure; emergency exits are excluded from cap accounting in daily.py) |
| digest-reported turnover | 97.43% = Σ|order notional|/equity, all causes | digest.py:109 (different definition, gross activity incl. cap-exempt emergency exits — not a divergence) |
| orders | 133 submitted (67 sells / 66 buys) + 2 failed = 135 attempted; causes emergency_exit 36 / selection 99 | job log + order_log.jsonl (136 rows incl. run summary) |
| blend base | last_targets 08-20: 161 weights on n_submitted: 0 (phantom step during halt); 08-21: 149 weights = the run's target-position count | kelly_ledger.json, rider, job log Target positions: 149 |
| book | 196 names pre-clearing → 219 positions post (digest) | 08-20 beacon / 08-21 digest |
| broker reconcile | OK — local state matches broker | in-job portfolio reconcile --days 14 |
Reading
The cap-accounted realized churn (67.2%) exceeded the nominal 0.5/day cap by ~17 points on the clearing day, with a further ~30 points of cap-exempt emergency-exit activity on top (gross 97.4%). Numerically, leg 2's predicted burst was observed. What this note deliberately does not decide: how much of the excess is the engine's frequency-scaled catch-up allowance (3 trading days since the last executed rebalance would scale the cap to 1.5, making 67.2% compliant by design) versus the phantom-advanced blend base pulling the target further from the real book than a frozen base would have. That attribution is queue item 15's territory (panel/implementer); the data point is recorded here so it survives tonight's session.
Failed-pair root causes (now log-proven, 3rd recurrence: 08-17, 08-18, 08-21)
- AVB sell (~$120, now cause
emergency_exit, wasselection): Alpaca40010001 "asset AVB is not active"after 3 retries. The broker HOLDS the position (the sell qty was clipped to broker-held 0.651071404) but marks the asset untradeable — a stuck position the strategy wants out of and cannot exit. Only broker-side action (manual close, or waiting out whatever corporate action inactivated it) resolves it. - BRK-B buy (~$14): Alpaca
42210000 'asset "BRK-B" not found'— symbology mismatch (Alpaca lists Berkshire class B asBRK.B; the data universe usesBRK-B). Will recur whenever selection picks it. - Side-effect worth its own queue attention: the pre-submit batch quote
fetch failed on the one invalid symbol (
invalid symbol: BRK-B) and the pipeline fell back to market orders for the entire 133-order batch (alpaca_broker15:07:47). One bad symbol degraded execution quality for every order that day. Execution-tier; the audit records it and routes it — no code touched.