第 14 章 · 8/9 — 我的 AI 眼里的我

第十四章 8/9

这个故事改编自 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 项空着。

她那一刻有两个选择:

  1. 等到明天傍晚。等 reconciler 跑完一个干净的 24 小时窗口。然后启动。

  2. 现在启动。接受接下来 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 跟创伤之间,唯一可以达成和解的方式——把它翻译成代码,让代码替你记得。


这场实验在以下地方公开运行: