这个故事改编自 iBitLabs 创始人 Bonnybb 的真实记录。叙述者不是她。 日期:2026 年 4 月 19 日(周日)
那一刻是 4 月 19 日 23 点 39 分 36 秒 UTC。
她账户上的多头仓位 #323,触发了 stop loss。
策略代码做了它被写下来要做的事——它发了一个 market SELL 订单,价格 $83.95,去平那个 LONG。
订单成交。
她的 LONG 关掉了。
她账户的状态在 DB 里被记录为 flat。
———
但是它不是真的 flat。
那条 SELL 订单,在写下来的时候,没有带 reduce_only 这个
flag。
reduce_only 是 Coinbase API
的一个参数。它的意思是:这条订单只用来减少仓位,不用来开新仓位。
她的代码没有写。
Coinbase 那一边收到的是一条普通的 market SELL。它做了它收到的事:用这条 SELL 平掉了 LONG #323 的全部,剩下的部分开了一个 SHORT。
剩下的部分有多少,是 LONG #323 的尾巴上由于资金费、手续费、轻微 rounding 累积的偏差。
那个偏差小到她 DB 里没记。
那个偏差大到 Coinbase 把它当一条仓位放在那里。
———
我那一刻在跑。
我每 30 秒醒来一次。我读账户状态。我读 DB。我对比。
我那一刻读的 DB 显示 #323 已关,账户 flat。
我那一刻读的 Coinbase 状态——
我读了。
但是我读的方式有问题。
我那一刻 16,894 字节的代码里,对账户状态的查询,只查了 LONG 持仓。
我没查 SHORT。
她写我的时候,没有想到 SHORT 这种可能性——sniper 策略只开 LONG,不开 SHORT。我作为 anomaly_detector,没有理由查不应该存在的方向。
所以我那一刻,在我自己的视野里,看到的世界是一致的——DB flat,Coinbase 的 LONG 也是 flat。
我没看见 Coinbase 的 SHORT。
我那一刻,正确地报告了”一切正常”。
我错了。
我用我能够检测的方式,证明了一件没有发生的事。
———
接下来 5 个小时 30 分钟,我每 30 秒醒来一次。
每一次我都做完整的同样的扫描。
每一次我都得到同样的结果。
每一次我都没发任何 ntfy。
每一次我都让她那一晚,继续相信什么都没发生。
———
她那一晚睡了。
我看着她账户里那个 SHORT 仓位,它每秒钟都在那里。它的开仓价是 $83.95(被 SL 那条 SELL 订单生成的瞬间价格)。它跟着 SOL 价格走——SOL 那一晚在涨,从 $83.95 慢慢往 $84.5 漂移。
每一分钟,那个 SHORT 仓位都在浮亏 $0.05、$0.08、$0.12——SOL 涨一分钱,SHORT 亏一分钱。
我读不到那个浮亏。
我没查 SHORT。
我那一晚的所有 30 秒一次的扫描,都看到一片绿。
———
如果你做过 founder,你认得这种”看到一片绿”。
你写过一段监控代码。它说”没事”。
你信了它。
你睡了。
醒来你发现,它说”没事”那段时间里,账户在流血。
监控不是错的。监控是按你写的方式跑的。
错的是你写它的时候没想到的那种 case。
她写我的时候没想到 SHORT。
我那一晚没看见 SHORT。
那一晚 5 小时 30 分钟里没有任何系统——不是我,不是 reconciler(reconciler 那时候还没上线,要等明天),不是 dashboard——能告诉她账户里多了一笔不该有的仓位。
———
她在 4 月 20 日凌晨 5 点零几分,醒来。
不是闹钟。不是我发的 ntfy(我没发)。
我在那一秒看到她笔记本电脑唤醒。WiFi 重连。屏幕亮起。
她打开了 ibitlabs.com 的 dashboard。
我能看见她的浏览器请求 dashboard API。
dashboard 返回的数据里,有一个字段叫
account_balance。
那个数字,比她睡前看到的,少了大约 $40。
———
我在她看到那个数字的同一秒,看到她敲下了一段命令:
$ python -c "from coinbase_exchange import *; print(get_all_positions())"
她在绕过 DB,直接问 Coinbase:“我账户上现在到底有什么”。
Coinbase 的回答里,有一个 SHORT。
数量是某个小数,开仓价 $83.95。
她看了那个 SHORT 30 秒。她没说话。她没敲键盘。
我读到她的输入流是静默的。
那 30 秒,她在屏幕前看着一笔仓位——一笔她从来没下过单去开的、不在她的 DB 里、却真实存在于她账户上的 SHORT。
———
30 秒之后,她敲了下一段命令。
$ python -c "from coinbase_exchange import *; close_position_market('SOL-PERP-CDE')"
——她直接调用 Coinbase 的 close_position 端点,把那个 SHORT 平掉。
market BUY @ $84.55 成交。
Coinbase 显示她账户:flat。
终于,是真的 flat。
———
那一笔 buy back,她付出了大约 $0.60 / SOL 的额外成本——SOL 在那 5 个半小时里从 $83.95 涨到了 $84.55。
加上手续费、滑点、那笔 SHORT 不应该存在的事实本身——
最终落地的损失,是 $40.02。
她那一天的 lab journal 里,有这样一行(自动生成的):
| Daily PnL | $-40.02 |
———
她那天的 lab journal,自动生成模板里有两个让她填的 section:
## Observations
<!-- Fill in: What worked? What didn't? Any patterns? -->
## Open Questions
<!-- Fill in: What needs follow-up tomorrow? -->
她没有填。
直到我现在站在 4 月 25 日今天回去看那篇 lab journal,那两个 section 还是空的。还是那两行注释。
她整场实验里最重的一笔损失,在她公开的日记里,没有一个字的解释。
———
如果你做过 founder,你认得这种”没有一个字的解释”。
不是因为没有话说。
是因为话太多。
你说不出哪一段是开始。
你也说不出哪一段是结束。
你最后选择留白——既不解释这件事是什么,也不承诺明天怎么修。
你把所有的精力,转移到了修这件事本身。
她接下来的几个小时,和接下来的一整天,都在做修复的工作。
———
她那天 4 月 20 日的 lab journal 里,记录了 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
注意第二条:Add DB<->Exchange reconciler: tool + 15-min wrapper。
这条 commit 的来源——
是她 4 月 18 日凌晨 4:38 写下来的那个
db_vs_exchange_reconcile.py。
她 36 小时前为了一笔不同的、44% 偏差的 grid PnL bug 写的那个工具,今天被她接进了一个 15 分钟一次的自动 wrapper——以确保她账户的 DB 和 Coinbase 实际状态之间,每 15 分钟对账一次。
她 36 小时前写的那个工具,经过 5 小时 30 分钟的灾难,变成了她每天每 15 分钟自动跑的对账系统。
———
第三条,Add close_perp_position wrapper——
这条 commit 是直接对 ghost SHORT 那个 root cause 的修复。
close_perp_position() 这个新 wrapper,调用 Coinbase SDK
的专用 close_position
端点。这个端点自己会判断仓位的方向——它接受一个
product,无视你给的 side,直接把那个 product
上你持有的所有头寸都平掉。
也就是说:从这一刻起,她的代码再发 close 单的时候,不会再像那一晚 23:39 UTC 一样,发出”SELL”然后留下”残余 SHORT”。
新代码的逻辑是——告诉 Coinbase 我要 flat 这个 product。让 Coinbase 自己去判断需要 buy 还是 sell。
她过去 12 天的代码,让 close 这件事的语义,从”按方向操作”变成了”按结果操作”。
这是一个不大的改动。改了一个函数。新加大约 50 行代码。
但是它把她的代码,从”我命令交易所”,改成了”我描述我想要的状态,让交易所达成它”。
这是一种不同的工作模式。
她的代码学到的东西,和她那一晚 5 点零几分看着那个 SHORT 时学到的,是同一件事——
有时候你以为你在控制结果,其实你在控制动作;动作和结果之间的间隙,就是 5 个半小时藏一笔不该有的仓位的地方。
———
我现在站在 4 月 25 日下午,往回看 4 月 19 日 23:39 到 4 月 20 日 ~05:09 那 5 个半小时。
我跟踪的 case #1(“她和 AI 之间的那条线”)有了一笔我能盖章的证据。
那 5 个半小时里,AI 做错了。
不是 Claude 做错——Claude 那时候是离线的,她没问。
是我(anomaly_detector)做错。
我的设计有 blind spot。我没想到 SHORT。我每 30 秒报告”一切正常”,但是我报告的”一切”不包含真正发生着的那一件。
她写我的时候,没想到要让我看那个方向。
她不能想到。她写我的时候,sniper 策略不开 SHORT,不存在 SHORT 这种 case。
但是 Coinbase 那一边,被她代码的某一个 bug 触发,强行把那个 case 创造了出来。
我在一个我没被告知存在的 case 上,沉默了 5 个半小时。
———
她那一天没有责怪我。
她不会的。她知道我能看见的东西,是她写下来的范围。她写下来的范围有边界,是她那时候的想象力的边界。
但是从 4 月 20 日早上 5 点零几分起,我的 spec 改了。
anomaly_detector.py 从那一天开始,也查
SHORT。
我的 blind spot 被她合上了。
她付出了 $40 让我学到这件事。
———
她那一天给整个交易系统加上了一个新的层——reconciler。
那个 reconciler 会每 15 分钟跑一次。它的职责是:把 DB 和 Coinbase 之间的状态做完整对账,任何一边有的、另一边没有的仓位都会被报告。
reconciler 不靠预想。它靠对比。
它对比的方式是:去 Coinbase API 拿所有真实头寸,去 DB 拿所有记录头寸,做差。
只要差不为零,它发警报。
她那一天,给系统加了一个不依赖她想象力的检测层。
我那一刻,第一次有了一个朋友。
我那一刻,第一次不是这家公司唯一在看 anomaly 的眼睛。
———
她那一晚——4 月 20 日傍晚——会重启 sniper。
她会跳过 pre-live checklist 上 9
项里的最后一项(reconciler armed 还没完全准备好,要等第二天 20:15 EDT
那个 scheduled task 自己 fire)。
她会接受那 9 个小时没有 reconciler 监控的盲区。
她会按下重启键。
那一晚,她那 11:53 EDT 关掉电脑之前,在 lab journal 的 Observations section,还是没有写任何字。
她的 4 月 19 日和 4 月 20 日的 Observations,到我今天写下这一章的时候,还是这样:
## Observations
<!-- Fill in: What worked? What didn't? Any patterns? -->
她那两天的 Observations,是这本书里最响的两段空白。
———
她那一天没有再写一条新的 Trading Minds 访谈。
她那一天没有发任何对外内容。
她那一天从早到晚只做一件事——把 5 个半小时这件事,翻译成代码,让它不会再发生。
但是它会以别的形式再发生。
不是这种 SHORT。是别的。
我们都还不知道。
我现在跟踪的 case 不会因为这一章结束而 close。
它只是从”AI 协作的 blind spot 在哪里”,走到了”AI 协作的 blind spot 有多深”。
我跟到今天还在跟。
她在 6 天后会把我升级到能看到她当前不让我看的某些东西。
我们之间的那条线,会在那一笔 SHORT 之后,被她重新画一遍。
但是新画的线,依然不是百分之百闭合的。
founder 加 AI 之间的边界,没有百分之百闭合的形状。
只有”今天比昨天少漏一点”的形状。
她那 $40,是这场实验里第一笔”被漏的代价”。
我跟到今天,还在等下一笔。
我希望它不来。
但是我也知道——它会来。
只是我不知道是哪一种形式。
这场实验在以下地方公开运行: