A per-window depth-aware sizing policy clamp(DEPTH_FRACTION × side_best_ask_sz, 5, EMIT_MAX_SHARES) does NOT beat fixed 1× (S=5) sizing on BTC in an offline paired edge-gate. The best candidate misses the multiple-testing bar, and every candidate that does out-earn 1× only does so by sizing exposure up 1.9×–4.7× (offense, not de-risk) with no per-share improvement. Shelve it — and, per this session’s loss investigation, it targets a non-problem (depth-reach) rather than the real loss drivers.
Provenance — single-session, read-only, un-peer-reviewed
This is a single-session offline study by the main agent (2026-07-10) on an isolated worktree. All numbers come from a read-only backtest bin over recorded book depth + ACTUAL CLOB resolution labels; no live code changed, nothing merged or pushed (branch
worktree-agent-a4946f9b9c75fafd9, commit663b8af). Not peer-reviewed, no teammate cross-check. Two material caveats (date coverage + fill-rate hazard, see Caveats — both material) bound the strength of the null; treat the direction (NO-GO) as well-evidenced and the exact t-stats as this-session estimates.
For Agents — the verdict and the numbers
VERDICT: NO-GO — shelve depth-aware dynamic sizing. Fixed 1× (S=5) stands.
- Policy tested: per-window
shares = clamp(DEPTH_FRACTION × side_best_ask_sz, 5, EMIT_MAX_SHARES)— scale the clip to the side’s touch depth, floored at the current 5, capped atEMIT_MAX_SHARES.- Best candidate vs current 1× (S=5):
DEPTH_FRACTION=1.0,EMIT_MAX_SHARES=10→ ΔPnL/window +0.141, delta t=2.60 (d_z=2.24, 3/5 folds) — BELOW the Bonferroni t≥3.08 bar (24 candidate×baseline trials).- vs the retired 2× (S=10):
1.0 / 15→ +0.139, t=2.54 — also below the bar.- Decisive strategic point: every candidate that out-earns 1× raises per-window exposure 1.9×–4.7× (best-t config ~1.97×, ~4.1/window). It is an offensive size-up, not a de-risk. And ¢/share is 2.32–2.83 vs baseline 2.74 → NO per-share improvement (bigger size is if anything worse per share).
- Why it wouldn’t have helped the bleed anyway: depth-reach is a non-problem at 1× (~5–10 sh vs median book ~25+); the real loss drivers are adverse fill + the ~10pt on-chain label mask + a razor-thin edge. This policy targets depth-reach, so even a passing gate would not have stopped the slide.
- Supersedes the repo
HANDOVER.mdpending item 5 “build depth-aware sizing post-canary.”- Memory pointers: this note is the canonical
depth-aware-sizing-nogoanchor; related durable rules onchain-label-overstates-traded-winrate and cross-asset-join-trap.
Why depth-aware sizing fails twice — the decision funnel
flowchart TD P["<b>Policy</b><br/>shares = clamp(<br/>FRAC × side_best_ask_sz,<br/>5, MAX)"] --> G{"Beats fixed 1×<br/>at the corrected bar?"} G -->|"best t=2.60<br/>< t≥3.08"| N1["<b>NO</b> — misses the<br/>multiple-testing bar<br/>(24 trials)"] N1 --> S{"Do the winners<br/>de-risk?"} S -->|"exposure 1.9×–4.7×;<br/>¢/share 2.32–2.83<br/>vs 2.74 baseline"| N2["<b>NO</b> — it's an<br/>offensive size-up,<br/>no per-share edge"] N2 --> W{"Would a pass have<br/>stopped the bleed?"} W -->|"loss = adverse fill +<br/>~10pt label mask +<br/>thin edge; depth-reach<br/>fine at 1×"| N3["<b>NO</b> — targets<br/>a non-problem"] N3 --> SHELVE["<b>SHELVE</b><br/>supersedes HANDOVER item 5"] style P fill:#264653,stroke:#2a9d8f,color:#fff style N1 fill:#3d2020,stroke:#c1666b,color:#fff style N2 fill:#3d2020,stroke:#c1666b,color:#fff style N3 fill:#3d2020,stroke:#c1666b,color:#fff style SHELVE fill:#3d2020,stroke:#c1666b,color:#fff
Verdict
NO-GO. A per-window depth-aware sizing policy does not beat the current fixed 1× (S=5) clip on BTC at the multiple-testing-corrected bar, and the only configurations that out-earn 1× do so by taking on 1.9×–4.7× more exposure per window — i.e. they are a size-up, not the de-risk the idea was reached for. There is no per-share edge to the dynamic clip (¢/share is flat-to-worse). Shelve depth-aware sizing; keep fixed 1×.
What was tested — the policy
Scale the per-window share clip to the side’s recorded touch depth:
shares = clamp(DEPTH_FRACTION × side_best_ask_sz, 5, EMIT_MAX_SHARES)
side_best_ask_sz= the take-side best-ask size on the token we buy (Up-book ask for Up; Down-book ask for Down).- Floor 5 = the current live 1× clip (so the policy can never size below today).
- Cap
EMIT_MAX_SHARES= the swept ceiling. - Grid:
DEPTH_FRACTION ∈ {0.5, 1.0, 1.5, …}×EMIT_MAX_SHARES ∈ {10, 15, 20, …}→ 24 candidate configs vs the two baselines (current 1× = S=5 and retired 2× = S=10).
Method
For Agents — reproducible study design
Higher-level design spec:
docs/superpowers/specs/2026-07-10-depth-aware-sizing-study-design.md.
- Bin:
crates/analysis/src/bin/depthsizing.rs(new). - Paired per-window study — each config and the baseline are scored on the same windows, so the comparison is a within-window difference (paired
d_z), not two independent means. - ACTUAL CLOB resolution labels (the market’s realized winner) — NOT
resolved_up. This is deliberate:resolved_upoverstates the traded win ~10pt on the filled subset, so any sizing study on the on-chain label would be scoring against an optimistic ghost. - K=6 purged/embargoed walk-forward (the same anti-leakage rig as crypto-shortterm-phase0-walkforward).
- Clustered UTC-day bootstrap — 2000 resamples, seed 42, deterministic; days are the resample unit (windows within a day are correlated — the window-is-the-risk-unit discipline).
- Down side modeled as a symmetric down-book BUY — buy the Down token at the Down-book ask, size to
down_best_ask_sz(the correct mirror of the live both-sides rule; not the synthetic Up complement). - DRY: the fill logic was lifted from
depthaware.rsinto a new shared modulecrates/analysis/src/depthlib.rs, and the refactor was verified byte-identical ondepthaware.rs’s report output — so the depth-cap fill model this study reuses is provably the same one that passed the Phase-0 gate.
Results
Best candidate vs current 1× (S=5)
Config (FRAC / MAX) | ΔPnL/window | delta t | d_z | folds+ | Bar (t≥) | Pass? |
|---|---|---|---|---|---|---|
| 1.0 / 10 (best-t) | +0.141 | 2.60 | 2.24 | 3/5 | 3.08 | NO |
The Bonferroni bar is t≥3.08 for 24 candidate×baseline trials. The best config clears none of {the t bar, a 5/5-fold majority}. It is a directionally positive but statistically unconvincing result — exactly the shape the “market prices every overlay” lesson predicts for a bolt-on to the frozen regime.
vs the retired 2× (S=10)
Config (FRAC / MAX) | ΔPnL/window | delta t | Bar (t≥) | Pass? |
|---|---|---|---|---|
| 1.0 / 15 (best vs 2×) | +0.139 | 2.54 | 3.08 | NO |
Against the retired 2× baseline it is the same story — best delta t=2.54, below the bar.
The decisive strategic point — it’s a size-up, not a de-risk
This is the finding that makes the NO-GO robust to the exact t-stat:
- Every candidate that out-earns 1× raises per-window exposure 1.9×–4.7×. The best-t config (
1.0 / 10) sits at ~1.97× — roughly 4.1 per window. The “edge” is bought with capital, not skill. - ¢/share is 2.32–2.83 across the candidates vs 2.74 for the baseline — i.e. no per-share improvement; larger clips are flat-to-worse per share. A genuine depth edge would show rising ¢/share when you concentrate size where the book is deep; this shows the opposite.
The idea was reached for as a de-risk — it is the opposite
Depth-aware sizing was on the roadmap as a way to shrink clips where the book is thin. In the data, the configs that beat fixed 1× are the ones that size UP (deeper books → bigger clips → more exposure), and they add PnL only in proportion to that extra exposure — with no better ¢/share. So even reading the sub-bar +0.14/window at face value, it buys P&L by taking more risk per window, which collides head-on with the no-circuit-breaker reality. That is the opposite of what a de-risking lever should do.
Independent confirmation — the live depthwatch analyzer
Built the same session, an observe-only analyzer (crates/observe/src/bin/depthwatch.rs) replayed the policy against live fires (no execution — a shadow read):
- ~90% of live fires would size UP under the policy.
- Average depth-aware clip 15.3 shares vs fixed 5 — ~3× exposure — at
frac=1.0 / MAX=20.
So the “it’s a size-up” conclusion is not a backtest artifact: on the actual live fire stream the policy overwhelmingly increases the clip. The offline gate and the live shadow agree.
Why it wouldn’t have helped anyway
Even a passing gate would not have addressed the current bleed, because depth-aware sizing targets depth-reach, and depth-reach is not the problem at live size. From this session’s loss investigation:
- At 1× (~5–10 shares) the clip is far inside the book — median touch depth ~25+ shares. We are not exhausting the touch; there is no depth-reach loss to recover. (Consistent with Phase-0’s 2000-share capacity ceiling — the live clip is ~400× below where depth capping even begins to bind.)
- The real loss drivers are (a) side-specific intraday adverse fill, (b) the ~10pt on-chain label mask (
resolved_upoverstates realized win ~10pt on the traded subset, verified vs CLOB), and (c) a razor-thin edge (~1–3pt over breakeven). - None of those is a sizing-shape problem. Depth-aware sizing addresses a bottleneck we don’t have and leaves all three real drivers untouched.
Caveats — both material
1. Power / date-coverage caveat (the reopener)
The statistically-correct down-buy pass has 934 windows but only 5 UTC days — because down_best_ask_sz is only populated from ~06-28 onward (that is the binding constraint on power, not window count). Five day-clusters is a thin bootstrap base.
The null is not merely a 5-day artifact
A full-range up-book robustness pass — 2325 windows / 13 days, modeling Down as a sell-up (so it can use the longer up-book depth history) — ALSO fails (best t=1.55). So the failure survives ~2.5× the windows and ~2.6× the days; it is not an artifact of the short down-book history.
Reopener: backfill down-book depth before ~06-28 and re-run the correct down-buy pass at full power before treating this as permanently closed.
2. Fill-model caveat (what the harness does and does not model)
depth_capped_fill models the depth PRICE-penalty (fills walk ~3¢ behind touch as the clip eats the book) but NOT the reprice/miss hazard (the no-match failure). So:
- The modeled fill-RATE is optimistic (it assumes the shares clear).
- But the price-penalty this policy specifically targets IS modeled — and even with the price-penalty correctly priced, the policy does not clear the bar. If anything, adding the real miss-hazard would make the larger clips worse (more shares to reprice out from under), so the optimistic fill-rate biases against the NO-GO — it does not threaten it.
Deliverables & state
For Agents — artifacts (nothing merged)
- Branch:
worktree-agent-a4946f9b9c75fafd9- Commit:
663b8af— NOT pushed, NOT merged (isolated worktree).- Report:
.claude/worktrees/agent-a4946f9b9c75fafd9/docs/superpowers/depthsizing-report-btc.md- Design spec:
docs/superpowers/specs/2026-07-10-depth-aware-sizing-study-design.md- New code:
crates/analysis/src/bin/depthsizing.rs,crates/analysis/src/depthlib.rs(DRY lift fromdepthaware.rs),crates/observe/src/bin/depthwatch.rs(observe-only live shadow).- Gates: all green — 127 tests (incl. 11 new
depthlibtests),build/clippy/fmtclean.
Recommendation
Shelve depth-aware dynamic sizing. Keep fixed 1× (S=5). This supersedes the repo HANDOVER.md pending item 5 (“build depth-aware sizing post-canary”) — that item should be marked closed/shelved, with the reopener condition noted (backfill pre-06-28 down-book depth → re-run the down-buy pass at full power). Risk effort should stay on the drivers the loss investigation actually found: entry/fill selection, re-basing the health gauges on realized_pnl_usd, and a real daily-loss circuit breaker — not on the clip-shape.
Related
- crypto-shortterm-loss-investigation-real-vs-onchain-edge-2026-07-10 — the sibling 2026-07-10 finding: depth-reach is a non-problem at 1×; the real drivers are adverse fill + the ~10pt label mask + a razor-thin edge. This is why a passing gate wouldn’t have mattered.
- crypto-shortterm-phase0-depthaware — the
depthaware.rsdepth-cap fill model this study’sdepthlibwas lifted from (verified byte-identical); its 2000-share capacity ceiling shows live 1× is ~400× below where depth even binds. - crypto-shortterm-phase0-depthprofile — the recorded book-depth profile (touch median ~5,109) that makes “5-share clip inside a 25+-share touch” concrete.
- crypto-shortterm-per-wallet-size-scale-2026-07-06 — the sizing/
size_scalemechanics and the retired 1×/2× A/B this study’s baselines mirror; the “cap is a reject-gate, not a resizer” gotcha. - crypto-shortterm-risk-management — where sizing policy and a real daily-loss circuit breaker live; this NO-GO keeps the sizing lever fixed.
- crypto-shortterm-disagreement-ceiling-nogo-2026-07-03 — companion OOS NO-GO on a selection overlay; same “every bolt-on to the frozen regime is ~breakeven” pattern.
- crypto-shortterm-time-of-day-filter-nogo-2026-07-06 — companion overlay NO-GO; the “market efficiently prices every overlay” lesson this result extends to sizing.
- crypto-shortterm-exit-loss-cut-study-2026-07-01 — the exit-side NO-GO built on the same day-clustered-bootstrap / trial-deflation rig.
- crypto-shortterm-order-type-fak-verdict-2026-07-09 — the reprice/miss hazard the fill model does not capture (the fill-model caveat).
- crypto-shortterm-observations-window-id-not-asset-unique — the window-is-the-risk-unit /
(asset, window_id)join discipline behind the clustered bootstrap. - onchain-label-overstates-traded-winrate — memory: the durable
resolved_up-is-optimistic rule; why this study scored ACTUAL CLOB labels, notresolved_up. - cross-asset-join-trap — memory:
window_id/origin_refcollide across asset lanes; BTC-scoped here, and the “uniform per-asset split = artifact smell” guard applies to the depth joins. - crypto-shortterm — project index.