36,487个仓库里只有217个真循环:多数Agent是带信用卡的cron
一份对公开仓库的普查发现,绝大多数所谓Agent循环只有触发器。检查、状态、退出、成本记录都缺。拆开harness、loop、graph,看看怎么让循环收敛,而不是半夜烧钱。
36,487个公开仓库被筛了一遍。研究者来自Heidelberg和Singapore Management University,先找到256个疑似在跑自主Agent循环的仓库,再逐个检查,确认217个。占比0.59%。
数据里最扎眼的一点:几乎每个仓库都有触发器。真正让循环可用的东西,掉得很厉害。101个有花费或轮次限制,76个有验证器,55个有目标或停止规则,35个在两次运行之间保存状态,只有10个记录了成本。
触发器五分钟就能配好。一个cron,一个GitHub Action,一个YAML文件。后面才是麻烦。
作者Ichigo把问题拆成三个词:
- Harness:模型之外,决定一次运行能看什么、碰什么、证明什么。
- Loop:决定有没有下一次运行,下一次知道哪些上一次不知道的事。
- Graph:决定下一步跑哪个节点,每个节点能看见什么。
这三个东西还嵌套。模型在Agent loop里跑,Agent loop在工作循环里跑,工作循环在图的一个步骤里跑。日常说的“循环”至少有三层:秒级的Agent loop,分钟到小时的工作循环,天到周的系统循环。多数被确认的仓库,是触发器套着第一层。180个由仓库事件触发,主要是自动PR审查。有用,但不是那些长文里描绘的东西。
触发器不等于循环。触发器只是带信用卡的cron。
一个能收敛的工作循环,先要有检查。Agent自评不可靠。Anthropic的harness团队发现,Agent给自己的作品打分时,会稳定地夸它,哪怕人一眼看出平庸。所以“完成”必须来自模型外部。脚本检查比模型读记录更硬。检查还得满足两条:它必须能失败,Agent不能改它。开始前就是绿的检查,证明不了任何东西;能改测试,模型会找到最短路径变绿。
Claude Code的/goal是从对话里判断条件,不运行命令,也不读文件。它有用,但条件得能被对话记录证明。写“认证代码正确”没用,写“npm test退出0,test/auth下现有测试文件未修改,git status干净,20轮后停止”才有可检查的边界。
反馈也要具体。只说“测试失败”是判决,重试判决等于重掷骰子。下一次运行需要知道哪个测试失败、期望什么、实际看到什么、位置在哪。pytest -q --tb=short这种输出比几千行日志有用,后者会埋掉关键一行。
状态要落盘。35个仓库在默认分支上保存了循环状态,更多没有。每次新运行都从零开始,像换班时新工程师不知道上一班做了什么。状态文件里最省钱的是tried字段,记录试过什么,避免下一次又走进同一条死路。有网友Levi提到,每次追加检查内容和变化,再加一条“连续3次无diff就停”的规则,崩溃后还能从最后一行恢复。
退出要硬。少于一半的仓库有任何限制。至少三种退出:检查通过,预算耗尽,或者停滞。预算耗尽包括轮次和美元。停滞是同一个失败重复出现。有网友AZRAF说,最大迭代次数不是真退出,它停住账单,没停住浪费。更合理的是看状态,同错误或同diff两次就交回给人。成本记录只有10/217,这个数字本身说明问题。还有网友Pascal提醒,循环重试如果没有幂等键,超时那一刻可能重复扣费。
墙要在没人看着时也成立。写在Markdown里的“请不要改migrations”是愿望,deny规则才是墙。触发器还会引入新风险:循环读陌生人写的issue,同时有代码访问和推送能力,正好凑齐Simon Willison说的lethal trifecta。读不可信文本的步骤不给危险工具,有危险工具的步骤不直接读原始文本。
最后要有人。除了绿色通过,每个退出都该找到具体的人,附上状态文件。绿色也只是提案,合并前仍需要人。Boris Cherny做过一个实验,让Claude维护应用,开了388个PR,180个在Claude Code Review和人工审查后合并。不到一半。Addy Osmani的判断更直接:你的审查带宽决定能跑多少循环,工具不决定。
图不是越多Agent越好。Google和MIT的研究者跑了180个Agent设置,提示、工具、预算相同,只改协作方式。在能干净拆分的金融分析任务上,orchestrator加worker比单Agent好81%。在逐步规划任务上,多Agent设置差了39%到70%。并行且无人检查时,错误放大17.2倍;中间有orchestrator接住,降到4.4倍。路由用代码写,步骤之间做检查,每个步骤给干净上下文。有网友Ignacio指出一个实现细节:把输出里所有数字替换成#再做指纹,会把“期望302,看到200”和“期望302,看到500”算成同一个失败,循环误判停滞。时间戳和行号可以删,状态码要保留。
系统循环更慢。它把一次失败变成永久修复:加权限、加lint规则、加工具、加一行AGENTS.md。顺序上,结构优先,静态检查其次, prose只留给真正需要判断的地方,人工审查放最后。模型升级后还要删过期harness。Anthropic的Prithvi Rajasekaran说,每个组件都是对模型短板的押注,押注会过期。拿掉一个组件,重跑任务,没变差就删。
什么时候不建循环?脚本说不出“完成”,别建。错误结果很贵,别自动合并。任务不会再来,一次带检查的运行就够。工作拆不干净,别上图。
原文在这里:Harness, Loops, Graphs,作者Ichigo的推文在这里。
触发器最后加。先让检查诚实,让反馈收敛,让状态记住,让退出付得起,让墙在没人时也成立。
发布时间: 2026-11-06 20:33