# 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.py` persists `last_targets` before `execute_orders`): the rider's
  evidence was `kelly_ledger.json` `last_targets` dated 08-20 with 161
  weights while `n_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`, was `selection`): Alpaca
  `40010001 "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 as `BRK.B`; the data universe uses
  `BRK-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_broker` 15: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.
