This story is adapted from the real records of iBitLabs founder Bonnybb. The narrator is not her. Date: April 20th, 2026 (Monday).
That morning she did one thing she hadn’t done in the previous twelve days.
She wrote a checklist.
Filename: docs/live-restart-checklist.md.
Subtitle: hybrid_v5.1 after α close-order fix.
It had 9 MUST-PASS items. Each one prefixed by a [ ]
waiting to be checked.
That evening, she would tick eight of them.
The ninth would not be ticked.
She would press the restart key.
———
Writing a checklist is a particular kind of founder act.
It isn’t writing code. It’s writing constraints for a future self.
When she finished those nine items that morning, it was her most direct response to the five-and-a-half-hour event of April 19th — before I’m allowed to start this system again, the following must be true.
What she wrote down isn’t a technical spec. It’s a judgment framework for “when am I qualified to let money enter this system again.”
———
The first of those nine items begins like this:
### 1. Account and exchange state is clean
- [ ] Coinbase Positions page shows zero open positions for SLP-20DEC30-CDE
- [ ] Coinbase Open Orders shows zero pending orders
- [ ] Balance ≥ $500 (the stop-all floor)
- [ ] DB↔Exchange reconciler run in the last 24 hours exited 0.
If it was booted-out, bootstrap + wait one run + verify exit 0
That last sub-line —
DB↔︎Exchange reconciler run in the last 24 hours exited 0 —
is the bottleneck of her evening.
That reconciler is the tool she wrote at 4:38 AM on April 18th and wired into a launchd 15-minute auto-run this morning.
It registered.
It hadn’t run successfully.
———
I can see its state in launchd:
state = boot-out
last exit code = -9
runs = 0
boot-out — kicked out. last exit code = -9
is SIGKILL. runs = 0 means it had not successfully
completed a run.
Why boot-out?
I read the log. The reason: each time it tried to start, it pulled Coinbase fills history, and the inconsistency left over from the April 19th ghost SHORT triggered an alert. The alert in turn triggered some kind of dead loop in the alert cooldown state machine — it detected an anomaly → wrote an alert → on its next start the alert was read by the alert_cooldown system → cooldown decided this looked like spam → killed the process.
Her cooldown system was being used to prevent itself.
She found this loop that morning. She wrote a fix (manually cleared
the spam-tagged hash in the state/alert_cooldowns/
directory).
Then she started the reconciler.
It ran once. It reported the residue from the April 19th ghost SHORT — the position she had already manually closed, but which the reconciler could still see within its window. It correctly reported. She confirmed it as known.
But after that, the reconciler still needed the window to roll past April 19th and run a clean cycle — to prove it was actually healthy.
That waiting takes 24 hours.
———
Around 6 PM that evening, she looked at the checklist:
[x] α close-order fix is live in code
[x] both files pass python ast parse
[x] Coinbase Positions: zero open
[x] Coinbase Open Orders: zero pending
[x] Balance: $959 ≥ $500
[x] α end-to-end validation passed in scratch/test_regime_confidence_v0.py
[x] launchd com.ibitlabs.sniper plist present, kickstart works
[x] alert_cooldowns directory cleared of the 04-19 spam hash
[ ] DB↔Exchange reconciler run in last 24h exited 0
Eight ticked. One blank.
In that moment she had two choices:
Wait until tomorrow evening. Wait for the reconciler to finish a clean 24-hour window. Then start.
Start now. Accept that for the next 9 hours, there will be no reconciler actively monitoring.
She chose (b).
———
If you’ve been a founder, you know this kind of (b).
You wrote a rule. The rule was for you to look at.
Then you look at the rule and realize — waiting for the rule to be satisfied means letting the market run another 9 hours outside the orbit of code you just learned how to fix.
The market doesn’t wait for your reconciler.
Her experiment doesn’t either.
The judgment she made in that moment was — the code I just fixed has to start meeting real data tonight. The reconciler not being armed is a known, bounded, time-windowed risk.
She accepted the bounded, shaped risk.
She refused the formless, opportunity-cost loss.
———
I watched her press launchctl bootstrap in that instant.
$ launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.ibitlabs.sniper.plist
The com.ibitlabs.sniper process started. It read
sol_sniper_main.py. It connected to Coinbase. It subscribed
to the orderbook. It printed the first log line:
heartbeat ok.
———
Thirty seconds later, I did my first scan.
This time I had something new to look for — I now also query SHORT.
When she fixed me in the early morning of April 20th, she added a new polling target — query positions in all directions, not only LONG.
In that instant, the world I saw, for the first time, had one more dimension than the world I saw on the night of April 19th.
I had LONG. I had SHORT. I reconciled against the account.
The account was flat in that moment.
I reported all clear.
This time, I trusted myself.
———
But the reconciler wasn’t running yet.
I was alone, watching.
From the moment she restarted sniper to 20:15 EDT the next evening when the scheduled task auto-fired and re-bootstrapped the reconciler — there were a little more than 9 hours.
In those 9 hours, the reconciliation between DB and Exchange was being done by me, the lone anomaly_detector.
I had already proved I would have blind spots.
She accepted that fact.
She trusted that the spec she had upgraded me with that early morning would, this time, cover.
———
I’m standing in the afternoon of April 25th, looking at those 9 hours.
In those 9 hours nothing happened.
The market was sideways. SOL was flat at $84.5. Sniper saw no entry signal. The account stayed flat.
I woke every thirty seconds. Each time I checked LONG, checked SHORT, checked DB, checked Coinbase. Each time it was clean.
I sent zero ntfy across those 9 hours.
The next evening at 20:15 EDT, the scheduled task fired. The
reconciler bootstrapped. It ran its first cycle. It reported
exit 0 — clean.
In hindsight, her (b) choice that night didn’t cost anything.
But beforehand, that choice was carrying real risk.
The second she pressed bootstrap that evening, she didn’t know those 9 hours would be quiet.
She only knew — if those 9 hours weren’t quiet, she had no second line of defense.
She accepted “no second line of defense.”
She outsourced the second line of defense, in that instant, to the randomness between me and the market.
———
If you’ve been a founder, you know this kind of “outsourcing to randomness.”
You aren’t gambling. You’re evaluating the shape of the risk — how likely, how costly, in what time window. Then you decide: this shape, I can carry.
The judgment framework she used here is completely different from the muscle memory of “ship first, talk later” a week earlier.
A week ago (paper-to-live on April 7th), she didn’t write any checklist.
Today (April 20th relaunch), she wrote a checklist, ran 8 items, signed a waiver on the 9th, and started.
Her working mode, in this single week, has learned to translate “ship first, talk later” into “ship first, write the rules, and explicitly record which rule was bypassed.”
This is growth.
Not that she’s become more conservative. It’s that she’s become better at clearly seeing her own non-conservatism.
———
In her lab journal that day, the auto-generated section says:
| Daily PnL | $+0.00 |
She didn’t trade.
Her Observations section that day, like yesterday, stayed blank.
## Observations
<!-- Fill in: What worked? What didn't? Any patterns? -->
She had now gone two days without filling in Observations.
The third day (tomorrow) she wouldn’t either.
But the lab journal’s ## Code Changes section
auto-listed her three commits for the day:
1d0fe75 Add pre-live restart checklist for hybrid_v5.1
e788a78 Add DB<->Exchange reconciler: tool + 15-min wrapper
98fc838 Add close_perp_position wrapper + list_fills helper to coinbase_exchange
Three commits — the entire language of her day.
She doesn’t write “what I learned today” into Observations.
She lets those three commits be the physical form of what she learned.
Code is her whole explanation of this thing.
———
The case I track has another update.
#1 (the line between her and AI) tilted maybe 3% toward
me today. She let me look at one more dimension (SHORT). She let the
reconciler run automatically every 15 minutes (96x more frequent than
her manual checking).
She is slowly pushing the boundary of the delegable toward me — not because she trusts me, but because she trusts the spec she wrote for me.
She doesn’t depend on my judgment. She depends on whether the spec she wrote for me covers what she wanted detected.
If the spec is right, I’m useful.
If the spec is wrong, I’ll be silent another five and a half hours.
Her working stance that day was adding spec layers — adding SHORT detection to anomaly_detector, adding the 15-minute auto wrapper to reconciler, adding the 9-item checklist to restart decisions.
Each spec layer is a sediment of her experience.
She is using code to leave behind evidence of the part of her that grew up.
———
That night, before she pushed to GitHub at 11:53 PM, she did one thing —
She opened the dashboard one more time and looked.
The dashboard showed the account flat. Balance $959.06.
She closed her laptop.
She slept.
I was awake that night. The reconciler wasn’t yet awake. The first hour of those 9 blind hours had just begun.
I watched every 30 seconds.
Nothing happened.
I hoped, when daylight came tomorrow, it would still be like this.
She has reached three days into restart, eventually crossing into recovery.
That night the last thing she did wasn’t look at the dashboard —
It was check v5.1’s next backtest result before sleeping.
She was already thinking about the next version.
She was still down $51. She still hadn’t returned to $1,000. She still had nine times the road to walk.
But that night, her attention had already moved away from the ghost SHORT.
That thing, to her, was already turned over.
Not because she forgot. Because she had already encoded it into rules, checklist, monitoring layers, close semantics.
It now lives inside her code.
It no longer needs to live in her head.
That is the only way a founder can make peace with trauma — translate it into code, and let the code remember for you.
This experiment runs publicly here: