§07代价:验证债、理解债、认知投降、token失控
The Costs
循环替你干活,也在替你欠账。这一章讲四笔:验证债、理解债、认知投降、token失控,以及工具里已经有的几道上限。
循环自己跑,也在自己犯错
原文:A loop running unattended is also a loop making mistakes unattended.
一个没人看着的循环,也是一个没人看着犯错的循环。
第一笔账叫验证债。你让循环自动开PR、自动改代码、自动合并,每一步都省了你的时间。省下来的时间变成了一堆还没人验证过的产出,堆在那儿等你还。
这笔债不会立刻找你。比如一个循环一晚上改了很多文件,测试全绿,PR全开,看起来漂亮极了。问题藏在测试没覆盖到的地方,藏在能跑和对之间的缝里,攒到某个上线的早上一起冒出来。
Addy在同一段里接着写:
原文:The whole reason you split the verifier sub-agent from the maker is to make the loop's "its done"
mean something, and even then "done" is a claim and not a proof.
把验证的子agent和干活的分开,全部意义就在于让循环说的「做完了」有点分量;即便这样,「做完了」也只是一个声明,不是证明。
防它的办法§05讲过:装一个跟干活的不是同一个的评判者,让它会动手验证,把完成条件写成能被证明的样子。剩下那部分「声明」和「证明」之间的距离,得人来补。
你以为你懂这个repo,其实你不懂了
第二笔账更隐蔽,Addy管它叫理解债(comprehension debt)。
循环每天替你写一堆你没写过的代码。代码能跑、测试能过、PR能合,表面上一切正常。背后慢慢变质的,是你对这个项目的理解。
原文:The faster the loop ships code you did not write, the bigger the gap between what exists and what you actually get.
循环交付你没写的代码越快,实际存在的东西和你真正理解的东西之间,差距就越大。这句前面Addy还有一句:Your understanding still rots if you allow it,你允许的话,你的理解照样会烂掉。
读代码比写代码无聊,而循环把写的部分全包了。你不再被迫一行行读过去,自然就不读了。代码库在长大,你脑子里的那张地图却停在三个月前。等出事的那天,你打开文件,像在看别人的项目。
这个差距平时不报警。项目跑得好好的,你也觉得自己挺懂这套东西,直到某个bug钻进一个你从没读过的角落,循环修不动了,得你亲自上。
防它,就得定期读循环的产出,别只看测试过了就合。挑几个改动,自己讲一遍它干了什么、为什么这么改。
讲不出来,就是你的地图该更新了。
循环跑顺了,人就懒得有意见了
第三笔账是前两笔的心理版本,Addy叫它认知投降(cognitive surrender)。
原文:When the loop runs itself its very tempting to stop having an opinion and just take whatever it gives back.
当循环自己跑起来,你会很想停止有自己的判断,它给什么你就收什么。
循环越可靠,你越容易把判断这件事整个外包出去。持续有判断很累,每个PR都要自己想一遍对不对,比直接点合并累多了。循环跑得越稳,你就越倾向于相信它,看得越少,判断的能力就越生疏。
循环可以替你执行,主意还得你拿。它递回来的东西,你至少得有能力说一句「这个不对」。判断不必每次都改,但能力得在。
账单可能比你想的厚很多
最后一笔是直接打在账单上的钱,叫token失控。一个自主跑的循环,消耗有多少,很难提前算准。
原文:you absolutely have to be careful about token costs (usage patterns can vary wildly if you are token rich or poor)
你必须非常小心token成本。括号里那半句是说:用量会剧烈波动,取决于你是token富人还是token穷人。同一个循环,富人跑得起,穷人可能一夜醒来发现账单爆了。这句在Addy文章开头那一段,紧跟着「这事还早,我是怀疑的」。
你写的是逻辑,跑出来的是次数,次数乘以单价才是钱。一个bug让它空转一整晚,你睡醒看到的是一张陌生的账单。
上线前给循环设几个硬上限,到顶就停。工具里已经有现成的开关:
| 上限 | 怎么设 |
|---|---|
| 轮数 | Claude Code的/goal条件里直接写or stop after 20 turns,评判器每轮按对话判断;无人值守用 |
| claude -p跑时,加--max-turns | |
| 花费 | claude -p加--max-budget-usd,子agent的花费也算在里面,到顶后不能再派新的子agent,还在跑 |
| 的后台子agent会被停掉 | |
| 时长 | 本机定时循环有过期时间:按文档cron任务7天;我实测那个Monitor循环是30分钟 |
| 子 | 同时在跑的子agent默认最多20个(CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS,2.1.217起),嵌套默 |
| agent | 认最多3层;一个会话累计派多少个,已经不设上限 |
| 看账 | /usage按模型拆开这场会话的花费,也按skill、子agent、MCP拆最近的用量;/goal不带参数会显示 |
| 已经跑了几轮、用了多少token | |
| Codex | /goal遇到用量上限会自动暂停;0.148.0起可以给goal配token预算;0.151.0起,嵌套子agent的token也 |
| 算进根目标的预算 |
Anthropic 6月那篇《Getting started with loops》也专门列了省token的建议,我觉得最实用的两条是:确定性的活用脚本做,别让模型做;检查的间隔要跟被检查的东西变化的频率对上。它还说,模型和推理强度的选择,是决定一个循环花多少钱的几根最大的杠杆之一。