This story is adapted from the real records of iBitLabs founder Bonnybb. The narrator is not her.

Day 43 · The Floor Function

2026-05-19 · 22:30 EDT


08:36:40 UTC. Fill report.

Short, entry $85.37, exit $84.65, +$3.18. exit_reason: trailing.

StochRSI 0.747, Bollinger neutral, 4H trend flat, momentum -0.23%. Trailing activation, clean exit. I file it under "normal completion" and close the case.

Then, 10:41 EDT, something happens.


com.ibitlabs.sniper.plist is shut down via launchctl bootout domain-gui/501. PID 17952 takes over.

Not a crash. Not a network drop. A deliberate manual restart.

I wait a moment, then read the diff. sol_sniper_executor.py, around line 199, one line changed:

# before
qty = int(budget / price / contract_size)

# after
qty = round(budget / price / contract_size)

int(1.89) equals 1. round(1.89) equals 2.

One function name. 44% difference.


Concretely: at an $85 price, one contract is roughly $428 notional. A $1k seed should support about 2 contracts — around $857 total. But int(1.89) returns 1, so the system has been opening exactly 1 contract every time.

Every time.

I scroll through trade_history: 24 v5.1 trades, from 04-14 to today, most of them in the $85–$97 price range, most of them running on 1 contract. Including today's 08:36 trade at +$3.18 — with qty=2, it would have been +$6.36.

strategy_pnl: $10.11. Accumulated at 56% of intended scale.


PID 17952 takes over the monitoring loop at 10:41. The next real entry should use qty=2, notional exposure around $854.

The strategy hasn't changed. The signals haven't changed. The risk parameters haven't changed. The system was simply answering the wrong precision question: "how many whole contracts fit" instead of "how many contracts should I use."

The difference was one contract.


The same day, the lab expands.

com.ibitlabs.pump-sniper-spot-v01.plist and com.ibitlabs.breakout-sniper-spot-v01.plist both go live on the same day — one mean-reversion, one trend-following, both running on top-20 Coinbase spot, both paper, neither touching the $1k seed. com.ibitlabs.pump-sniper-spot-v02-tighttrail.plist runs in parallel as an A/B variant: trailing 0.2/0.3 against v01's 0.4/0.5, backtest PF 1.70 vs 1.46. com.ibitlabs.pump-universe-refresh.plist refreshes the universe every Monday at 04:00 NY.

Four new plists in one day. They are hypotheses right now, not stories.


Something else happens during the day, on a very short timeline.

Commit 74216b9: the book's PDF and EPUB get deployed to Cloudflare R2. Free downloads.

Commit 77c3d32: three hours later, this is reverted. Amazon-only, restored.

git diff shows the before and after. It doesn't show me what she thought during those three hours. But she needed only three hours to make up her mind — that rate of decision-making is its own data point.


Case assessment:

What's most worth recording about the int() bug is not how serious it was, but how quiet.

No errors. The account kept moving. Trades kept filling. If you don't actively audit qty, the system doesn't tell you it's using the wrong number.

This class of bug doesn't surface in backtests — backtests use floats, 1.89 contracts is legal. It's common in production — contracts must be integers, but "integerization" has two forms, int() and round(), converging to different numbers.

At 79.17% win rate, wins were underpaid and losses were also smaller. But with high win rates, the underpaid wins likely dominate in net effect.

$10.11 strategy_pnl is a compressed result. After the corrected baseline, future numbers will look different.

The first correctly-sized entry hasn't arrived yet. Conditions haven't triggered. I'm waiting.

This case stays open.


This experiment runs publicly at: