The Blowup That Wasn't: Both Numbers in the Canonical Statistic Were Artifacts
Saga A: Paper vs. Live — Part 3 of 5 By LowfieldLabs — dated kill decisions from the hypothesis ledger
Since 2026-04-14, one statistic anchored this operation’s entire critique of paper-sim validation: b27b — paper +$83/hr, live −$119 in 8 minutes. It sat at the top of the entity page, it motivated the fill-model audit in Part 1, and it was cited wherever we needed a calibration target for how badly a simulator can lie. On 2026-07-31 we reconstructed the run inside the quantpylib Replayer, on the real L2 tape, against on-chain settlement data. The reconstruction proves that both live numbers are artifacts. The −$218.76 bar-1 “realized” loss was computed against two mis-called settlements. The −$119.23 is a USDC cash delta, not a PnL at all. Corrected, bar 02:40–02:45 UTC on 2026-04-14 was +$86.22 — or −$118.75 on one ambiguous tie that cannot be resolved from the data.
This does not resurrect b27b as a strategy. It removes the measurement that was being used as a calibration target — which is worse, in a way, because that measurement had been load-bearing for three and a half months.
The settlement bug
The bot decided who won each bar. It should not have been trusted to, and here is the mechanism. live_bot.py:558-562 sets bar.open_price from the first Binance REST poll taken after the bar has already started. The bot launched at 02:40:33 and logged BAR OPEN BTC 02:40-02:45 @ $74453.52 at 02:40:36 — an anchor 36 seconds late. _settle_bar (line 590) then computes up_won = final_spot >= bar.open_price against that late anchor, so every SETTLE line in the run log is scored against a possibly-wrong outcome.
Independent ground truth for that bar exists, from two directions at once. Binance aggtrades boundary windows ([−2s, +2s] around 02:40:00 and 02:45:00) give the true open and close; the CLOB’s on-chain winner field records how the market actually resolved. Against the bot’s own log:
| coin | open (02:40:00) | close (02:45:00) | true outcome | bot said | correct? |
|---|---|---|---|---|---|
| BTC | ≤ 74408.59 | ≥ 74428.10 | UP won | LOST | no |
| ETH | 2373.03–2373.58 | 2372.55–2372.56 | LOST | LOST | yes |
| SOL | 86.20–86.22 | 86.20 | tie / ambiguous | LOST | unknowable |
| XRP | 1.3689 | 1.3703 | WON | WON | yes |
The BTC row is confirmed on-chain: the CLOB winner field for btc-updown-5m-1776134400 records Up = WON. Two independent sources against the bot’s own log. With the true open, the final spot cleared the strike; against the 36-second-late anchor at $74,453.52, it did not.
How much should a single bar’s settlement call be trusted in the first place? We validated the rule itself: close >= open → UP reproduces the CLOB on-chain resolution on 281 of 288 (97.6%) of btc-updown-5m bars that day. All 7 disagreements are |delta| ≤ $10 on a $74k index — under 0.014%, oracle-snapshot noise. This bar’s BTC delta is +$21.39, well outside that band. The rule is sound; the bot’s inputs to it were corrupted. SOL’s delta is a genuine 0.00–0.02 tie, so it is reported both ways rather than resolved.
The corrected bar-1 PnL
No sells fired in the run, so PnL per token is pnl = −buys_cash + pos × settle, and buys_cash is recoverable from each SETTLE line. Recomputing with corrected settlements:
| token | pos | buys_cash | bot PnL | corrected PnL |
|---|---|---|---|---|
| BTC UP | 259.97 | 170.48 | −170.48 | +89.49 |
| BTC DOWN | 159.97 | 44.99 | +114.98 | −44.99 |
| ETH UP | 305.80 | 145.59 | −145.59 | −145.59 |
| ETH DOWN | 146.38 | 74.67 | +71.71 | +71.71 |
| SOL UP | 263.06 | 125.61 | −125.61 | +137.45 / −125.61 |
| SOL DOWN | 58.08 | 21.35 | +36.73 | −21.35 / +36.73 |
| XRP UP | 50.00 | 43.50 | +6.50 | +6.50 |
| XRP DOWN | 50.00 | 7.00 | −7.00 | −7.00 |
| total | 633.19 | −218.76 | +86.22 / −118.75 |
The bot’s own accounting said bar 1 lost $218.76. Corrected for the settlement it mis-called, the same fills, same cash, same positions come out +$86.22 ahead — with the SOL tie swinging the total to −$118.75 in the pessimistic branch. The positions did not change. The arithmetic did not change. The only thing that changed was who actually won the bar.
The −$119 was cash, not PnL
The second number dies differently. Reconstructed bar-1 purchases alone total $633.19 against a $633.37 opening USDC balance. The wallet was spent, not lost — which is exactly what the log shows: not enough balance from 02:48:37, with 40 tokens quoted across 5 bars. The cash left the USDC bucket and became unsettled inventory. Polymarket winnings require redemption; they do not appear in USDC automatically. And the original postmortem itself records, in its own tables, W15 position holdings: unknown — on-chain CTF balances not independently audited.
A cash delta over an 8-minute window in which the bot was still accumulating unsettled inventory cannot be a realized PnL, in either direction. There is no audited PnL for this run — there never was. The canonical pair was a cash delta on the live side versus a paper accrual on the sim side, over different windows, with the live side’s settlement mis-called. It should never have been cited as a measured paper-vs-live gap, and it no longer is.
What the replayer says about the same window
The correction runs on the quantpylib Replayer, fed the reconstructed L2 book and real trade tape (latency profile: feed 100ms, private 200ms). Three results matter.
Decision replication is exact. Replay ladders match the live log to the second and the cent — live [02:40:37] POST BUY ... UP ladder=[0.7,0.69,0.68,0.67,0.66] lt=0.710 against replay [02:40:35] ... [0.7,0.69,0.68,0.67,0.66] lt=0.710. Eleven of eleven spot-checked ladders agree on anchor and last-trade. This is not an approximation of what the bot did; it is the bot’s decision stream, re-run.
Per-token PnL sign matches 8 of 8 against corrected settlement. In aggregate the replay brackets the corrected figures rather than reproducing them to the cent: live −118.75 versus replay −86.17 on the SOL-loses branch (1.4×), and live +86.22 versus replay −3.45 on the SOL-wins branch — both replay aggregates indistinguishable from zero. The honest reading: bar-1 PnL for this run is a small number with reconstruction error bars, not a blowup in either direction.
Fill rate is realistic. Live filled 132 times across 98 ladders — 1.35 fills per ladder. The Replayer produces 0.95. The paper bot’s _simulate_fills rule, run over the same event stream, produces 1.58 — 310 fills.
Postmortem bug 6, reversed
That last number reverses Part 1’s central mechanism. The postmortem claimed paper undercounted fills by 5–10× — that the sim only credited fills it could see cross the book, silently discarding the toxic flow that killed the bot live. Replaying paper’s exact rule (paper_bot.py:391-426: fill a resting bid only when best_bid is both below our price and below where it was at post time) over the identical L2 stream produces 310 fills against live’s 132 — a 2.3× over-fill, in the opposite direction to the claim.
The paper model is still wrong. It is wrong by being too generous, not too stingy. The fill-model audit in Part 1 survives as a process — state both fill conditions, compare them, ratio-test on real tape — and the [0.5, 2.0] ratio bound would still have failed this sim (310/132 = 2.35). But the specific story Part 1 told about which fills the sim discarded did not happen on this window, and the direction column of its taker/maker table is wrong for b27b. A correction that only fixed the convenient errors would not be much of a correction.
What survives, and what does not
Survives: paper sims of maker strategies are unreliable — demonstrated here directly, with the error quantified at 2.3× over-fill on this window. The process rule — the smallest-legal real-money probe is the validation — is untouched. The eebd-replica’s −$253 from Part 2 is a separate data point this note does not examine.
Does not survive: the claim that b27b lost $119 in 8 minutes, and the use of that figure to falsify a +$83/hr paper result. Also does not survive: the direction of postmortem bug 6.
What remains is the uncomfortable part. The corrupted measurement was not a stray number in a footnote — it was the anchor. The entity page led with it. The audit was motivated by it. The critique cited it as its canonical data point for three and a half months, from mid-April to the end of July, and nothing in the pipeline that produced it ever checked the bot’s settlement calls against the chain, or asked whether a cash delta was a PnL. The kill decision was right — the bot was out of control in eight minutes by any measure — but the justification on record was a measurement artifact, and the difference between those two things only surfaced because someone rebuilt the tape.
That is the lesson we are choosing to operationalize: epistemic humility as infrastructure, not virtue. Every number that anchors a decision — including, especially, a kill decision — needs a ground-truth path: an independent source to check against (the on-chain winner field, the boundary prices), a replay harness that can re-run the decision stream exactly, and a standing rule that a measurement without an audit trail is a hypothesis, not a fact. The checklist audits the model before you trade. It does not audit the evidence you used to stop trading. Now both gates exist.
The kill ledger
LowfieldLabs keeps a kill ledger: one dated page per hypothesis, including — especially — the ones that died. The count currently stands at 1,232 hypothesis pages, 15 proven. b27b’s page now earns its keep a third time: once as a blowup, once as the origin of the fill-model audit, and once as the proof that the audit’s motivating numbers were artifacts. The checklist survives. The numbers that motivated it do not. Both of those facts belong on the same page.
In Part 4: the replayer itself turns on us. The same harness that produced this correction can manufacture fake edge from cancel latency — edge that exists only inside the simulation’s timing assumptions, and evaporates the moment the venue answers at real speed.
This piece describes research methodology and historical experiments on dead systems. It is not financial advice.