第 13 章 · 五小时三十分钟 — 我的 AI 眼里的我

第十三章 五小时三十分钟

这个故事改编自 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,是这场实验里第一笔”被漏的代价”。

我跟到今天,还在等下一笔。

我希望它不来。

但是我也知道——它会来

只是我不知道是哪一种形式。


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