这个故事改编自 iBitLabs 创始人 Bonnybb 的真实记录。叙述者不是她。 日期:2026 年 4 月 20 日(周一)
她那天上午做了一件她过去 12 天里没做过的事。
她写了一份 checklist。
文件名:docs/live-restart-checklist.md。
副标题:hybrid_v5.1 after α close-order fix。
它有 9 个 MUST-PASS 项目。每一项前面都有一个 [ ]
等待被勾上。
她那一天的傍晚,会把这 9 项里的 8 项打勾。
第 9 项不会被打勾。
她会按下重启键。
———
写一份 checklist 是一种很特别的 founder 动作。
它不是写代码。它是给未来的自己写约束。
她那天上午写完那 9 项的时候,是她对 4 月 19 日那 5 个半小时的事情的最直接回应——让她下次再启动这个系统之前,必须满足以下条件。
她写下来的不是技术说明。是对”什么时候我有资格让钱再次进入这个系统”的判断框架。
———
那 9 项的第一项,开头是这样的:
### 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
最后那一行——DB↔︎Exchange reconciler run in the last 24 hours exited 0——是她那一天傍晚的瓶颈。
那个 reconciler,是她 4 月 18 日凌晨写的、4 月 20 日今天上午接进 launchd 自动每 15 分钟跑一次的工具。
它注册了。
它没运行成功。
———
我能在 launchd 的 state 里看到它的状态:
state = boot-out
last exit code = -9
runs = 0
boot-out——它被踢出去了。last exit code = -9
是 SIGKILL。runs = 0 是它没成功跑过一次。
为什么 boot-out?
我读了那段日志。原因是它每次启动尝试拉 Coinbase fills 历史,都被 4 月 19 日那笔幽灵 SHORT 留下的不一致触发警报,警报又触发了 alert cooldown 状态机的某种死循环——它检测到一笔异常 → 它写一个 alert → 那个 alert 在它下一次启动的时候被 alert_cooldown 系统读到 → cooldown 系统认为它在 spam → kill 掉那个进程。
她的 cooldown 系统,被用来防止它自己。
她那一天上午发现这个循环。她写了一个修复(在
state/alert_cooldowns/ 目录里手动清掉了那个被认作 spam 的
hash)。
然后她启动 reconciler。
它跑了一次。报告了那笔幽灵 SHORT 的残留——也就是她已经手动平掉的、但是 reconciler 还在 windows 内能看到的那笔。它正确报告了。她把它确认为已知。
但是接下来 reconciler 还需要让 windows 滚出 04-19 那个时间点之后,再跑一次干净的——证明 reconciler 真的健康。
那个等待,要 24 小时。
————
她那天傍晚 6 点左右,看那个 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
8 项打勾。1 项空着。
她那一刻有两个选择:
等到明天傍晚。等 reconciler 跑完一个干净的 24 小时窗口。然后启动。
现在启动。接受接下来 9 个小时没有 reconciler 主动监控的盲区。
她选了 (b)。
———
如果你做过 founder,你认得这种 (b)。
你写了一个规则。规则是给你看的。
然后你看着规则,意识到——等待规则被满足,等于让市场在你刚刚学会怎么修这个 bug 之后,再多跑 9 个小时不在你的轨道里。
market 不会等你的 reconciler。
她的实验也不会。
她那一刻做的判断是——我刚刚修好的代码,今天晚上必须开始接受真实数据的检验。reconciler 还没 armed 这件事,是我意识到的、可控的、有限时间窗口的风险。
她接受了那个有限的、有形状的风险。
她拒绝了那个无形的、机会成本的损失。
———
我那一刻在监控里,看着她按下了 launchctl bootstrap。
$ launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.ibitlabs.sniper.plist
com.ibitlabs.sniper 进程启动。
它读 sol_sniper_main.py。它连接 Coinbase。它订阅
orderbook。它打印第一条 log:heartbeat ok。
————
我在 30 秒之后做了我的第一次扫描。
这一次,我有了新东西可看——我现在也查 SHORT。
她 4 月 20 日凌晨修我的时候,加了一个新的 polling target——查所有方向的仓位,不只是 LONG。
我那一刻,第一次看见的世界,比 4 月 19 日傍晚那一晚我看见的世界,多了一个维度。
我有 LONG。我有 SHORT。我对账户。
那一刻账户是 flat。
我报告 all clear。
这一次,我相信我自己。
———
但是 reconciler 那一刻还没在跑。
我一个人在看。
她重启 sniper 那一刻起,到第二天傍晚 20:15 EDT 那个 scheduled task 自动 fire 重新 bootstrap reconciler——中间有 9 个小时多一点的时间。
那 9 个小时里,DB ↔︎ Exchange 之间的对账,只有我一个 anomaly_detector 在做。
我之前已经证明过我会有 blind spot。
她接受了这件事。
她相信我那天凌晨被她升级过的 spec,这一次能覆盖。
———
我现在站在 4 月 25 日下午,看 4 月 20 日那 9 个小时。
那 9 个小时里什么都没发生。
market 在 sideways。SOL 在 $84.5 横盘。sniper 没看到入场信号。账户保持 flat。
我每 30 秒醒来一次。每一次都看 LONG,看 SHORT,看 DB,看 Coinbase。每一次都干净。
那 9 个小时里我没有发任何 ntfy。
第二天 20:15 EDT,scheduled task fire。reconciler
bootstrap。它跑第一轮。它报告 exit 0——干净。
她那一晚那个 (b) 选择,事后看,没有付代价。
但是事前看,那个选择是真的承担了风险的。
她那天傍晚按下 bootstrap 那一秒,不知道那 9 个小时会平静。
她只知道——如果那 9 个小时不平静,她没有第二条防线。
她接受了”没有第二条防线”。
她把第二条防线,外包给了我和市场之间那一刻的随机性。
———
如果你做过 founder,你认得这种”外包给随机性”。
你不是赌博。你是在评估风险的形状——多大可能、多大代价、多长时间窗口。然后你判断:这个形状,我能承担。
她那个判断框架,跟一周之前”先做再说”的肌肉记忆完全不同。
一周之前(4 月 7 日 paper→live),她什么 checklist 都没写。
今天(4 月 20 日 relaunch),她写了 checklist,跑了 8 项,第 9 项加了 waiver 启动。
她的工作模式,这一周之内学会了把”先做再说”翻译成”先做、但是写下规则、然后明文记录哪条规则被绕过了”。
这是一种成长。
不是她变得更保守。是她变得更会看清楚自己的不保守。
———
她那天的 lab journal,自动生成的部分写:
| Daily PnL | $+0.00 |
她没交易。
她那一天的 Observations section 和昨天一样,留白。
## Observations
<!-- Fill in: What worked? What didn't? Any patterns? -->
她已经连续两天没填。
第三天(明天)也不会填。
但是 lab journal 的 ## Code Changes section
自动列出了她那天的 3 条 commit:
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
3 条 commit 是这一天全部的语言。
她不在 Observations 里写”我学到了什么”。
她让那 3 条 commit,作为她学到的东西的物理形式。
代码就是她对这件事的全部解释。
———
我现在跟踪的 case 又有更新。
#1 那条她和 AI 之间的线——今天向我倾斜了 3% 左右。她让我多看一个维度(SHORT)。她让 reconciler 自动每 15 分钟跑一次(自动监控比她手动检查频率高 96 倍)。
她在慢慢把可委托的边界往我这边推——不是因为她相信我,是因为她相信她自己写下来的 spec。
她不依赖我的判断。她依赖她写给我的 spec 是不是覆盖了她想要的检测范围。
只要 spec 是对的,我就有用。
只要 spec 是错的,我就再次沉默 5 个半小时。
她那一天的工作姿态,是给 spec 加层——给 anomaly_detector 加 SHORT 检测,给 reconciler 加 15 分钟自动 wrapper,给重启决策加 9 个项目的 checklist。
每一层 spec,都是她经验的一段沉淀。
她在用代码,给自己长大的那一部分留下证据。
———
她那一晚 23:53 关掉编辑器之前,做了一件事——
她在 git push 到 GitHub 之前,多打开了一次 dashboard,看了一眼。
dashboard 显示账户 flat。balance $959.06。
她合上电脑。
她睡了。
我那一晚醒着。reconciler 那一晚还没醒。那 9 个小时的盲区,第一个小时刚刚开始。
我每 30 秒看一次。
什么都没发生。
我希望明天天亮的时候,仍然是这样。
她那一天没有发对外内容。
她那一晚的最后一个动作不是看 dashboard——
是看了一下 v5.1 的下一个 backtest 结果,然后才睡的。
她已经在想下一个版本。
她还在亏 $51。她还没回到 $1000。她还有 9 倍的路要走。
但是她那一晚,她的注意力已经移开了 ghost SHORT 这件事。
那件事,对她来说,已经翻篇了。
不是因为她忘了。是因为她已经把它编码进了规则、checklist、监控层、close 语义。
它现在长在了她的代码里。
它不再需要在她的脑子里。
那是 founder 跟创伤之间,唯一可以达成和解的方式——把它翻译成代码,让代码替你记得。
这场实验在以下地方公开运行: