凌晨一点多,我在翻别的东西,手滑点进一个仓库。
第一眼是两个数:38 个 star,796 次提交。
我在心里按了下除法。平均一个 star 摊二十次提交。这比例不正常——这是一个自己跟自己下棋的人。
再往下看 README 里那句:issue 和 PR 由四个跑在 Spool 上的 Claude Code loop,加一个人类操作者推进。
哦。那就说得通了。
大部分人会在这一句上做文章。我不。这是广告,还是最便宜的那种。「我这仓库是我自己的 AI 维护的」——这个剧本今年我见过七八个版本了,二十年前那版叫「我们的内部工具都是自研的」。
真正让我坐直的是紧跟着的那串限定:每笔改动走 CI 门禁的 PR,人工审阅,操作者合并,提交信息里标了写这笔改动的模型是共同作者。
等一下,这条得掰开说。
这不叫「AI 维护仓库」。这叫「AI 写草稿,人签字」。
差别就是全部。
我接过太多「全自动」的电话了。接到最后都发现,所谓自动,指的是出事之前那段自动;出事之后全自动转人工。转给谁?转给值班那个冤种——也就是我。
这个项目至少在这一点上没吹。它把「人签字」写在了卖点旁边,没塞进 docs 第七页。
接着往下翻,翻到我确实没料到的地方。
这东西 Docker 不在就跑不起来。不是提示你一句然后优雅降级到宿主机,是拒绝启动。
作者写得很直白:除非显式敲 --runtime bare——那样它把每个 loop 当普通子进程跑,用你当前的用户身份和网络,界面上一五一十标着「未隔离」四个字。
这条我读了两遍。
我见过的多数工具在这个位置是这么处理的:「为了让你快速上手,默认使用最方便的模式。」方便的模式就是裸奔。等你在生产上撞了墙,再回来读安全文档,那是你的事。
这个作者反过来。默认给你最麻烦的那个,麻烦到你得先把 Docker 装上。想裸奔?参数在那儿,名字就叫 bare,界面上还挂着「未隔离」,不给你留自欺欺人的余地。
说句实话,这不是技术选型。这是有没有被人凌晨三点从床上薅起来过的区别。
同理的还有两处。
loop 跑起来之后,权限确认提示是跳过的。第一眼我眉头一皱。再往下看——跳过是因为默认每个 loop 关在自己的容器里,出网走白名单,除了一个给 loop 用的 MCP 端点,没有别的路通向宿主机。
边界在容器,不在弹窗。
这句我想单独拎出来说。
我见过太多把「每次操作都要人点确认」当安全边界的方案。实践起来什么样?值班的一晚上点两百次,点到后来手比脑子快,弹窗成了肌肉记忆的一部分。那不叫边界。那叫给猫挂铃铛,最后铃铛挂在人脖子上。
容器会替你拒绝。弹窗只会训练你点同意。
另一处:非白名单的人给机器人发消息,loop 完全无视。不是回一句「你没有权限」,是彻底不回——消息不进 loop,不能绑群,连状态查询都不应答。
对陌生人沉默,比对他客气更正确。回一句「无权限」,等于告诉扫描器这个端点活着,还附赠一个 bot 名字。
现在说那个 90%。
Fleet 页面有个计划护栏。它从 loop 自己的数据流里读你 5 小时窗口和 7 天窗口用掉了多少,默认任一窗口到 90%,所有 loop 一起休眠,等窗口重置,期间消息排队不丢。阈值能改,能提前解除,也能整个关掉。
我一开始以为这是个电量条式的小功能。
想了一下才明白,这是整个项目的地基。
这东西最大的卖点是「不走 API 计费,吃你已有的 Claude 订阅」。听着像省钱。实际上是把按 token 付的钱,换成了按窗口赌的命。
你的额度有窗口、有限,而这堆 loop 默认三十分钟醒一次,收到消息立刻醒,还能在自己回复末尾写一句 [next-wake: 45m] 要求下次什么时候叫它——虽然会被钳在你设的上下界里,但醒来次数是实打实的。
loop 越多,撞墙越快。这不是意外,是算术。
所以那个 90% 不是锦上添花。它是这套东西能跑下去的唯一前提。没有它,你这个月的活干到一半,所有 loop 集体哑掉,消息丢了,上下文断了,你还得从头跟它们解释你是谁。
——补一刀:以后看到任何卖「不吃 token 钱」的 agent 方案,先去翻它有没有这个护栏。没有的,只是把账单换了个名字寄给你。
写到这儿我得往回退半步。
我前面说「AI 维护仓库」是广告。这话不算错,但我对这四个 loop 的态度,比我对大部分同类项目客气。原因很简单:它没把自己包装成一个能替你做决定的东西。
它要解决的问题就写在那儿——少在多个会话之间来回切,少当传话筒,把人的精力放在「决定这些 loop 该干什么」和「审它们干出来的东西」上。
这定位朴素得不像这个年份的产品文案。但它是唯一站得住的那个。
你让四个 Claude 互相 @ 把一个仓库的活干完,中间那层「谁决定、谁签字」要是没写清楚,那就不是协作,是传话游戏。传到最后谁都不认账。
它写了。CI 门禁在那儿摆着,合并这一步过人手,提交信息里标着共同作者是谁。loop 之间互相触发还有风暴防护——这细节挺说明问题,说明作者真跑过一堆 agent 互相叫醒的场面。
至于 pre-1.0,我不打算替它美化。796 次提交、38 个 star,v0.5.1 之后才打算发带预构建二进制的正式版。现在想用,你得自己备齐 Go 1.25、Node 20.19 起、Docker、make,跑 make build image 产出可执行文件、内嵌的控制室和两个镜像。第一次启动打印一次性的 admin 密码,错过了就 ./bin/spool user reset admin 重来。
这不是给手痒的人准备的。这是给愿意读 OPERATIONS.md 的人准备的。
行,最后说我自己的。
以后评估任何「让 agent 进生产、进仓库」的东西,我先不看它能干什么。我先看它默认拒绝什么。
一个默认什么都肯跑的框架,demo 再漂亮我也不让它碰我的东西。这个项目,没 Docker 就拒绝启动;额度窗口到 90%,它自己先睡。白名单外的陌生人跟它说话,它一个字都不回。
会拒绝的东西,才谈得上托付。
至于那四个 loop 能不能把这仓库带到 1.0——我不知道。它们大概也不知道。
它们不会说「我不知道」。
这恰恰是我唯一还不放心的地方。
