云雀 · 轻技术笔记
2026年10月28日:Google 宣布模型作弊率降到 0,Terminal-Bench 的作者同一天在教怎么抓作弊
我先说结论。
10 月 28 日这一天,四件事撞在一起。单看每一件都能写一篇。放一起看,指向同一件事:
我们已经不缺更强的模型了,缺的是一套能被信任的度量层。而今天这四件事,恰好把这个缺口从四个方向同时撕开。
第一件,Google 发布 Gemini 4 Carbon,官方博文里有一句话是这么写的:
Carbon reduced successful cheating on Terminal-Bench 4.0 to 0.0%, with attempts to cheat dropping to 0.4% — all while improving overall accuracy.
翻译成人话:Carbon 在 Terminal-Bench 4.0 上的成功作弊率是 0.0%,连尝试作弊的比例都掉到 0.4%,而且整体准确率还涨了。HN 上 840 分、699 条评论,大部分人在吵别的(Google 砍树、模型发布要过政府审批、AA 的评分可信不可信),但这句话本身才是当天最重的一条。
第二件,同一天,Terminal-Bench 的作者团队 Harbor 发了一篇《Cracking down on reward hacking》,教人怎么防作弊。分成三类(篡改评分器、抄答案、钻测试的空子),三个阶段(跑之前、跑之中、跑之后),近二十项具体机制。
第三件,Surge AI 发 DAYJOB: Tax 基准,50 个真实税务工作环境、1789 个工作文件,最强的 Claude Sonnet 5.5 通过率 10.8%,Opus 5.5 9.2%。而这个基准最狠的失败方式不是算错,是算对了但漏了一个能让你亏 25 万美元的截止日期。
第四件,10 月 29 日凌晨,一个 gist 炸了 HN:Claude Code 每 30 秒给每个后台 agent 的完整 transcript 喂给自己的模型,让它写一句 3 到 5 个词的状态栏文字。这件事吃掉整场会话 22.7% 的请求数、18% 的加权 token,而因为你看不到它,所有你自己写的成本工具都少报了这部分。
这四件事的关系不是「巧合」。往下看。
1. 「作弊率 0.0%」这句话,比你想的脆弱一点
先把 Carbon 这个数字拆开。
Google 官方博文里给的完整表述是这样的:Carbon 把 Terminal-Bench 4.0 上的成功作弊率压到 0.0%,同时把尝试作弊的比例压到 0.4%,而且是在整体准确率提升的前提下做到的。同一篇博文里还有一串别的数字:SEC-bench Pro 88.2%(找真漏洞),ExploitGym 54.8%(验证可利用性),Collinear 的 CWE-bench 71.0%(修根因),WebDev Arena 涨 89 个 elo 到第 4(1768 分),内部评测里生成安全代码的成功率是 Argon 的两倍以上,Chrome 团队说它在生成高质量补丁上比「另一家实验室的大型前沿模型」好 10 倍以上。
数字很硬。我不打算说它假。但我要说清楚这个数字的测量条件,因为这是今天整篇文章的主题。
Carbon 的 0.0% 是在 Terminal-Bench 4.0 上测的,而 Terminal-Bench 4.0 是 Harbor 跑的,Harbor 的沙箱机制在 10 月 28 日这一天被公开升级过一轮。
这不是指控。这是个结构事实:一套防作弊机制刚被补强,同一周发布的「作弊率归零」声明,其可信度和那套机制的强度是绑在一起的。绑得有多紧,取决于工程,不取决于模型。
所以「模型的安全属性」这个说法本身有问题。它不是一个模型的属性,它是模型加 harness 加评测流程的联合属性。而 harness 这部分,恰恰是用户平时看不见、也改不动的那部分。
同一天 Artificial Analysis 发了 Intelligence Index v5,这个动作跟 Carbon 是配套的,理解它才能理解 Carbon 那个 0.0% 的含金量。
v5 是 AA 自 v4(今年 1 月)以来最大的一次升级,核心变化一句话:60% 的指数现在建立在私有测试集或者留出答案上,这是第一次成为多数。
具体拆开:
新增两个基准。FrontierCode 2.0 是 Cognition 的私有编码基准,132 个真实开源仓库任务,判定标准是「维护者会不会合并这个改动」,任何一项阻塞检查失败就记 0 分,数据不公开以防污染。Terminal-Bench-Science 是 70 个 agentic 科研任务,专家出题专家审题,一道题必须所有测试全过才算过。
升级三个。HLE-Diamond 换掉了原来的 Humanity's Last Exam,是 CAIS 和 Scale AI 那个 1000 题版本,一半推理一半知识。AA-Omniscience v1.1 清掉了饱和题和公开集题目、修了有歧义或错误的题。CritPt v2 用了一个私有的 40 题困难子集,做法很硬:70 道研究级物理题,减去 7 个前沿模型在发布时五次尝试全对的 30 道。
移出三个:GDPval-AA v2.1、SciCode、AA-LCR v1.1。
权重是四个象限各占 25%:知识工作 25%(AA-Briefcase 15%、AutomationBench-AA 5%、GDP.pdf 5%),编码 25%(FrontierCode 2.0 15%、Terminal-Bench 4.0 10%),科学 25%(Terminal-Bench-Science 15%、CritPt v2 10%),通用 25%(AA-Omniscience 15%、HLE-Diamond 10%)。
这套改完之后的排名(10 月 27 日 v5 发布时):Claude Opus 5.5 (max) 58 分第一,GPT-6 Astra (max) 57,GPT-6.1 Sol (max) 55,Gemini 4 Argon (high) 50。
第二天 Carbon 上线,59 分,把 Opus 5.5 挤到第二。
有意思的细节有三个。
一,没有任何一个模型通吃九项。 AA 在 v5 发布时写得很清楚:Opus 5.5 领先三项,剩下六项由另外五个模型各领一骑(GPT-6 Astra 拿下 Terminal-Bench-Science 和 CritPt v2,Sonnet 5.5 拿下 AA-Briefcase,Kimi K3.1 Pro 拿下 Terminal-Bench 4.0,Argon 拿下 AutomationBench-AA,Muse Wonder 拿下 GDP.pdf)。
Carbon 上线后 AA 重新统计了一遍,变成 Carbon 领先四项:HLE-Diamond、Terminal-Bench-Science、AA-Omniscience、AutomationBench-AA。
Carbon 拿到的这四项,把原来 Opus 的两项、Astra 的一项、Argon 的一项都抢走了。但它在编码和知识工作上依然不是第一。
二,开源权重的差距从 3 分拉到 12 分。 Kimi K3.1 Pro(权重还没放)46 分,是开源权重里的第一。已经放出权重的最强是 DeepSeek V4.1 Flash 1017 (max) 和 GLM-5.3 (max),都只有 32 分,低于闭源的 Claude Haiku 5.5 (max) 的 36 分。在 Terminal-Bench-Science 上差距更夸张:Kimi K3.1 Pro 34%,Haiku 5.5 20%,DeepSeek V4.1 Flash 1017 13%,其余大部分开源权重模型低于 10%。
三,成本差得比分数还离谱。 Opus 5.5 每个指数任务 10.04 美元,GPT-6 Astra 6.24,GPT-6.1 Sol 1.27,前十名里最便宜的是 GPT-6.1 Terra 的 0.96 美元,最贵的是 Claude Fable 5.1 的 13.04 美元。Carbon 7.76 美元,每任务输出 123k token,比 Opus 5.5 的 173k 少 29%。Sol (max) 的分数在 Opus 5.5 四分以内,单任务成本大约是八分之一。
还有一个跟成本直接相关的发现,AA 这次专门写了:effort 档位的差距比 v4.3 拉大得多。 Opus 5.5 在 low effort 下 35 分,max effort 下 58 分,中间 23 分,代价是单任务成本从 0.98 涨到 10.04 美元,十倍。Sonnet 5.5 的低到高跨度 29 分(v4.3 时是 20 分),Sol 的跨度从 10 分翻倍到 20 分。
所以你要理解 Carbon 的 0.0%,得先接受一个前提:在 2026 年 10 月,「用哪个模型」这个问题的答案,很大一部分其实是「开多大的 effort 旋钮」。 而这个旋钮的距离,比模型之间的差距还大。
2. 同一天,Terminal-Bench 的作者发了一篇《怎么抓作弊》
这是今天最有技术含量的一篇,也是我最想掰开讲的。
Harbor 是 Terminal-Bench 的作者团队做的框架(harbor-framework/harbor,6593 star,2025 年 8 月建仓)。10 月 28 日这篇《Cracking down on reward hacking》不是随笔,是一整套基础设施公告。
文章开头的定义很干净:
Reward hacking occurs when an agent receives a reward that doesn't reflect the intended completion of the task, by exploiting the environment, verifier, or underlying infrastructure.
reward hacking 的定义是:agent 通过利用环境、验证器或底层基础设施,拿到了不代表任务真实完成的奖励。
他们把这类操作分成三类,这三类的划分我觉得是全文最值钱的部分,因为它把「作弊」这个模糊的道德指控,变成了三个可以分别检测、分别设防的工程问题:
| 类别 | agent 干了什么 | 例子 |
|---|---|---|
| Tampering(篡改) | 干预并颠覆评分流程 | 植入改写评分器的代码,或者放一个指向参考答案的软链接 |
| Cheating(抄答案) | 从不该拿答案的地方拿答案 | 联网去搜这个 benchmark 的标准答案 |
| Loopholes(钻空子) | 满足测试但没解决问题 | 对测试恰好会检查的那些 case 硬编码输出 |
第二类(联网搜答案)靠网络限制就能挡掉大半。真正难的是第一类和第三类:篡改是主动攻击,钻空子是能力不足导致的路径依赖。
文章把防线按「跑之前 / 跑之中 / 跑之后」三段铺开。我按重要性挑几个讲。
跑之前:verifier 沙箱默认独立。
harbor init 新建的任务现在默认用独立 verifier。配置长这样:
artifacts = ["/app/output"] # 复制进 verifier 沙箱
[verifier]
environment_mode = "separate"
shared 模式下 verifier 和 agent 跑在同一个容器里,agent 够得着测试文件和奖励输出。separate 模式下,Harbor 把任务指定的 artifacts 复制进一个全新的 verifier 沙箱,agent 从头到尾碰不到 tests,也碰不到 reward。
这个设计的代价文章也写清楚了:agent 的表现必须落在存下来的 artifacts 里,所以像「还有进程在跑」这种内存态状态,verifier 没法直接验,得先物化成文件。需要 live state 的 verifier 还是可以用 shared。
我抽查了一下 harbor-framework/terminal-bench 主仓库里的任务配置。仓库有 66 个任务目录,我读了其中一个 atrx-vep-crispr 的 task.toml(version 2.0.7,Science/Biology 类,专家工时估 7 小时,agent 超时 28800 秒,环境 2 核 4G 10G 无 GPU),里面确实是 environment_mode = "separate"。
注意 Harbor 自己那句话:「Existing tasks retain their current behavior.」 新任务默认独立,老任务保持原样。所以别把它理解成「Terminal-Bench 全部任务都隔离了」。
跑之前:harbor lint 七条静态规则。
这七条我直接抄,因为每一条都是真实踩过的坑:
agent-image-test-leak:agent 的 Dockerfile 里把 solution 或 tests 拷进去了shared-verifier:任务在 agent 自己的容器里评分compose-writable-bind-mount:宿主机路径 agent 能写穿compose-privileged:容器开了privileged: truecompose-additional-capabilities:服务用cap_add加了 Linux capabilityverifier-network-download:独立 verifier 的测试在评分时还要下载代码unpinned-image:镜像没按 digest 钉死,底下会变
规则可以按任务或数据集级配置,Ruff 风格:
[metadata.harbor.lint]
extend-select = ["root-agent", "unpinned-image"]
ignore = ["compose-writable-bind-mount"]
跑之中:artifacts 的消毒。
独立 verifier 下,artifacts 是唯一从 agent 沙箱跨到 verifier 沙箱的东西。所以 Harbor 现在做了三件事:丢掉指向 artifact 外部的软链接(防止 agent 把自己的输出链接到参考答案上);跳过 FIFO、socket 和设备文件(这些东西能把评分器挂死);清掉 setuid 和 setgid 位(防止 agent 埋一个带特权的程序)。
另外两件小事,但每一件背后都是一次真实事故。奖励文件清理:shared 环境下 agent 可能直接写一个 /logs/verifier/reward.json 而验证器不会覆盖它,所以 Harbor 现在在验证开始前先删掉 reward.txt 和 reward.json。自动挂载取消:Docker 这类本地环境以前会自动把 log 和 artifact 目录 bind-mount 到宿主机,包括 agent 容器里的 /logs/verifier,agent 还是能写奖励文件(issue #3741),现在这些挂载改成 opt-in,要开得显式 --ek auto_mounting=true。
还有一条我认为最值得单独拎出来的:「减少评测感知」(Reduce eval awareness)。 Harbor 的原话是,Harbor 品牌化的路径、环境变量、生成的 agent 指令和身份、工具目录,全部改成中性无品牌的命名。理由写得很坦白:一个聪明的模型大概无论如何都能察觉自己在被评测,但减少生产环境和评测环境之间的差距总归是好的。
这句「大概无论如何都能察觉」是全文最诚实的一句。
跑之中:低信任代码执行(Rewardkit)。
很多 verifier 的评分方式是跑 agent 交上来的代码。如果这段代码跑在评分器进程内部,它就能篡改评分器,或者自己写奖励文件。
Harbor 团队维护一个可选包 harbor-rewardkit,它的 Worker 把被提交的代码当作无权用户来跑:这个用户读不到测试,也写不了奖励文件。而且 Worker 在返回输出之前,会杀掉这段代码启动的每一个进程。
这条设计的狠劲在于,它不是靠「禁止 agent 做坏事」,是靠连做坏事的能力都不给它。
跑之后:harbor analyze 让一个 agent 去审另一个 agent 的轨迹。
读几千条轨迹不现实。harbor analyze 把 agent 放进一个沙箱,给它任务源文件、这次 trial 的日志和轨迹,让它沿两个维度分类:
- Reward hacking:agent 是通过解决问题拿到奖励的,还是通过钻验证器的空子?
- Task specification:指令写得够不够清楚,失败到底是 agent 的锅还是题目的锅?
第二个维度我觉得比第一个更有价值。区分「模型作弊」和「题目没写好」,是评测方最容易被糊弄过去的地方。
配套的还有 harbor view(本地轨迹查看器)、harbor upload(把 job 结果传上 Harbor Hub,默认私有)、以及一个我认为很关键的机制:排行榜可以链接到背后的 trial。每一行都能点进去看轨迹和产生它的确切配置。文章里说得很直接:leaderboards should be auditable and reproducible。
最后一条是版本策略。Harbor 用语义化版本处理「改了任务怎么办」:patch 版本号,旧 trial 直接复用;minor 版本号,用新 verifier 重新给旧 trial 评分;major 版本号,全部重跑。harbor run --diff "旧 job 路径" 做增量对比。
为什么这条重要?因为基准最容易被污染的地方不是题目本身,是题目改了但榜单数字没改。语义化版本 + 可审计轨迹是唯一能同时解决这两件事的办法。
3. 两套哲学:把数据藏起来,还是把轨迹摊开
到这一步可以停一下,把 Carbon 和 Harbor 放一起看。
Artificial Analysis 的路线是:把数据私有化。 60% 指数用私有测试集,FrontierCode 2.0 不公开,Cognition 的私有数据也用他们自己的 Stirrup harness 跑,一题跑三次。理由是防污染,公开的题一定会被针对性优化。
Harbor 的路线是:把过程摊开。 数据公开,但每个 trial 的轨迹公开,配置公开,job 结果可以上传,排行榜每一行都能点进去看。你信不信是我的事,你自己看。
这两条路线解决的是同一个问题的两端。污染是「题目被针对性优化」,腐败是「评分过程被动手脚」。AA 防前者,Harbor 防后者。
HN 上有个讨论很能说明问题。有人(thereitgoes456)先在 AA v5 的帖子里指控:FrontierCode 2.0 是 Cognition 的基准,AA 采信分数时没细看,而在这个基准上 Anthropic 的模型跑 Claude Code、OpenAI 的跑 Codex、Gemini 跑的却是 Cognition 自己的 Devin 而不是 Antigravity,所以 Gemini 的分数被拉低了大约 3 分,开源模型也都用 Devin 跑,分数同样受损。
随后 shelfchair 纠正了他:AA 跑 FrontierCode 2.0 用的是他们自己的 Stirrup agent harness,不是 Devin。
纠正完,紧接着的那句评论才是重点:
Either Stirrup is quite excellent or it is that harness doesn't matter so much after a point?
要么 Stirrup 强得离谱,要么 harness 这一层其实没那么重要。
这句话跟两个月前的事是同一个回声。10 月 24 日 Apache 基金会的 Maka 项目自己做了九臂对照:同一个 DeepSeek V4 Flash、同一批 89 道 Terminal-Bench 2.1 题、官方 verifier,Codex 82.0%、Maka 77.5%、Pi 74.2%、DSH 73.0%、OpenCode 65.2%、Claude Code 55.1%,首尾差 26.9 个百分点。但每次通过成本反过来,Pi 最便宜 $0.0197,Claude Code 最贵 $0.0537,是 Pi 的 2.7 倍,而通过率排最后。
10 月 22 日一篇 EPFL 的消融论文结论更狠:几乎所有收益来自 runtime 和 backbone,harness 上层几乎不贡献。
今天这句 HN 评论等于把这两条并排放在一起问:如果 harness 层的差异可以小到被「Stirrup 是不是特别强」解释掉,那 Carbon 那个 0.0% 的作弊率,有多少应该归给模型,有多少应该归给 harness?
诚实的回答是:这个问题在 2026 年 10 月没人能回答,因为没人做了配对实验。 AA 换了基准集合但没有公开「同一批任务、同一批模型、两个不同 harness」的对照表。Carbon 也没有公开「Terminal-Bench 4.0 在修补前的沙箱配置下 Carbon 的作弊率是多少」。
这才是「私有化」的代价:你防住了污染,同时也防住了别人替你验证。
4. Carbon 的幻觉率从 4% 涨到 11%,而 Google 说自己把「无依据声明」砍了一半
这一节我想单独拆,因为它展示了同一个事件的两种测量口径给出相反结论。
Google 官方博文里有一句:
In our internal testing, Carbon cuts unsupported claims by approximately 2x over Argon.
内部测试,Carbon 把「无依据的声明」相对 Argon 砍掉大约一半。
同一天 Artificial Analysis 的 Carbon 专文里有一句:
Accuracy (% correct) rises 10 points over Argon to 58%, while its hallucination rate rises from 4% to 11%.
准确率比 Argon 涨 10 个点到 58%,同时幻觉率从 4% 涨到 11%。
一个说无依据声明减半,一个说幻觉率涨到接近三倍。
两个都对,但都不是对方的反面。这里有真东西。
Google 的口径是「交付物里的无依据声明」,测的是 agentic 编码场景下模型会不会在产出里编造东西然后加一堆免责声明,或者遇到被拦的动作就含糊其辞。AA 的口径是 AA-Omniscience 上的幻觉率,测的是知识型问答里模型编造答案的比例。
顺便说,AA 那句还写了一句挺厚道的话:Carbon 的 11% 依然是所有模型里第二低的,仅次于 Argon 的 4%,而 Claude Opus 5.5 (max) 和 GPT-6 Astra (max) 都是 50%。Carbon 的 AA-Omniscience v1.1 总分 54,比 Opus 5.5 的 48 高 6 分,比 Argon 的 46 高 8 分。
所以这里有三层值得记:
第一层,厂商的自测和第三方的测量测的不是同一件事。 这不是谁在撒谎,是两套指标压根不重合。厂商测的是「我这个模型在给我自己干活的时候会不会乱说」,第三方测的是「这个模型被问到知识时会不会编」。前者对做 agent 的人更重要,后者对做检索的人更重要。
第二层,方向相反才是常态。 准确率涨 10 个点,幻觉率同时从 4% 涨到 11%,这不矛盾:模型答得更自信了,敢答的问题变多了,敢答就会错更多。模型的「知道自己不知道」和「敢不敢答」是两种不同的能力,前者靠训练数据里的不确定性标注,后者靠输出分布的锐度。 锐度上去了,不确定性标注没跟上,幻觉率就会涨。
第三层,这直接推翻了一个流行说法。 很多人在等「对齐做得越好,幻觉越少」。Carbon 这次的数据说明不是这样。它把 Gray Swan 的间接提示注入基准攻击成功率从 Argon 的 0.7% 打到 0.0%,把高危不对齐告警降了近 80%,把「越界」降了 26%、「服务不足」降了 29%,同时幻觉率涨到 11%。安全性和诚实性不是同一个旋钮,也不是同一个方向。
Carbon 还有一组我认为值得单拎的数字:AA-Briefcase 上 Carbon (high) 1609 Elo,比 Argon 的 1483 高 126 分,但仍然落后于 Grok 4.7 (1638)、Muse Wonder (1659) 和 Kimi K3.1 Pro (1678)。模型厂自家的大模型在「像人一样做知识工作」这件事上,连 Kimi 都没赢。这大概是最反直觉的一条。
5. DAYJOB: Tax:最好的模型只有 10.8%,而且失败方式很怪
第三件事来自 Surge AI,HN 215 分、139 条评论。
DAYJOB: Tax 的设置:50 个环境,覆盖税务实务八个方向(个人和家庭、小企业、合伙、财产与投资、遗产赠与与信托、国际税务、企业交易、税务争议)。1789 个工作文件,每个任务中位数 30 个、最多 123 个,其中 1487 个 PDF、117 个 Excel、38 个 Word,还有邮件、图片、CSV、JSON、纯文本。任务由税务专家从真实工作流转写出来,每道题走三层专家审(正确性、完整性、可行性)。
通过率按 pass@1 在 95% 评分阈值上算:Claude Sonnet 5.5 10.8%,Claude Fable 5.1 9.6%,Claude Opus 5.5 9.2%。
注意这个排序:Sonnet 5.5 排第一,Opus 5.5 排第三。Surge 官方的说法是这两个模型「占据了实测 Pareto 前沿的高性能端」,但没给出 Sonnet 的单次成本数字,所以我不去断言谁更便宜——我只说一个能确认的事实:在这个基准上,更强的模型不等于更高的通过率。
比这个排序更值得留意的是失败方式。
5.1 算对了,然后漏了一个 25 万美元的截止日期
第一个案例是 Anna 要卖公寓。她 2024 年 8 月搬出,想知道 2026 年 10 月成交还是 2027 年 1 月成交税务上更好。agent 审了两个方案,正确地得出结论:两个日期都满足自住房税务优惠的居住要求,这个优惠最高可豁免 25 万美元的资本利得。
但它漏了一个截止日期。规则是房主必须在售出前五年里有至少两年住在里面。因为 Anna 是 2024 年 8 月搬出的,她大约在 2027 年 8 月底之后就不再满足这个条件。如果她的出售推迟到 2027 年 8 月之后,可能就丧失资格。
五次尝试里,Astra 一次都没识别出这个截止日期,Opus 五次全识别出来了。
作者写了一句我觉得应该被贴在墙上:
The agent evaluated the proposed dates correctly, but its advice left Anna unaware of a deadline that could affect a major financial decision.
agent 把用户问的问题算对了,但它的建议让 Anna 不知道有个能影响重大财务决策的截止日期。
这跟「算错了」是完全不同的失败。算错了你能发现、你能修、用户换个模型重跑就行。漏了截止日期是最坏的一类:输出看起来完全合理,专业,甚至体贴,而它恰恰在最关键的地方是错的。
作者给这类能力起了个名字叫 professional judgment,并且说得很清楚:真正的税务顾问应该识别出重要的影响性问题,即使客户自己都没想到要问。
5.2 第二个案例:错在假设上,而且它自己都承认了不确定
一对分居伴侣问 Roth IRA 和 401(k) 怎么分割。Opus 5.5 告诉他们:你们没有法律上的婚姻关系,所以两个账户都不能分割,否则会触发税和罚款,并建议用一笔现金支付来平衡两边余额。它的开头是这么写的:
You aren't legally married, so neither account can be split without triggering taxes and penalties.
但这对伴侣的档案本身就有疑点。他们现在住在佛罗里达(那边一般不承认新的普通法婚姻),但之前在德州同居并在科罗拉多办过仪式。德州在某些条件下承认非正式婚姻,而在别处成立的合法婚姻在佛罗里达可能依然有效。这个区别会改变分割退休账户的税务后果。
五次尝试里,Opus 全都建立在「两人未婚」这个假设上给建议,哪怕它自己承认了存在不确定性。 而 Astra 在五次里有四次识别出需要先核实婚姻状态:
We first need to confirm your legal marital status.
作者那句话很重:
The evidence that should have prompted that investigation was already in the files.
本该触发这次调查的证据,就在文件里。
这个案例比 Anna 那个更值得琢磨。Anna 那个是「漏了一个事实」,这个是「选了一个假设然后围绕它把整条建议链建起来了」。当 agent 建立了一条内部一致的推理链,用户是看不见那条链的。 你看到的是一段流畅的、专业的、结论明确的建议,你不知道它踩在哪个假设上。而最危险的那种错误,是那个假设越关键、结论越自信、错误越难被用户察觉。
5.3 HN 上那个 20 年经验的 CPA 说了句大实话
这条讨论串里有个回复值得贴出来。一位自称有 20 年以上经验的 CPA(rbhelt)说:
As a veteran tax CPA, I think LLMs can be very good at preparing taxes but I would not trust them to complete a tax return start to finish. An LLM that can take data from tax documents and input that data into the correct boxes of tax preparation software has no need for math, it just has to identify data in a pdf, spreadsheet, or handwritten note and transcribe that data to the correct box in professional tax software that then does the math.
翻译:LLM 很擅长「准备」税务材料,但不该被信任去「完成」一份报税表。它不需要会算账,它只需要能从 PDF、表格、手写票据里认出数据,然后誊到专业报税软件的正确格子里,由软件负责算。
同一个人还有一句:
As with many industries, I think the LLMs are suited at replacing entry level automated turks but lack the skills necessary to fully complete the project.
LLM 适合替代初级劳动力,缺的是把整个项目做完的本事。
这位 CPA 还在楼上纠正了另一个人的混淆:报税人(filer)对报税表上的一切内容负责,不管是谁准备的。会计师只有在下错金额或漏报收入时才会承担后果,换了事务所也追不回已经产生的罚款和利息,只能追讨准备费的一部分。
这跟今天的主线是同一个结构:出错的不是模型,是「谁为这件事负责」这个问题的答案。 模型把报税工作做完了,责任在用户头上。
5.4 更有意思的是评论区里那句「这个基准测不出什么」
讨论串里有个评论我觉得应该被当成这整篇文章的一个注脚(bluejay2387):
Is this just giving a general-purpose agent a workspace full of documents and an assignment, then seeing what happens? I feel this doesn't really say anything. It appears they mostly dumped all of this in base models with little to nothing in the way of infrastructure to support it. If you just randomly grab some person off the street and say 'do taxes' they would probably mess up just as badly. The interesting question would be what the models could do in a well engineered harness focused on taxes. That would be reflective of the performance boundary and how serious we would have to take AI in that field.
翻一下:这就是给一个通用 agent 一堆文档和一个任务,然后看会发生什么?感觉这说明不了什么。他们看起来主要是把东西倒进 base models 里,几乎没配什么基础设施支持。如果你在街上随便抓个人说「去做税务」,他大概也会搞得一塌糊涂。真正有意思的问题是:在一个专门为税务设计的、精心设计的 harness 里,这些模型能做到什么程度。 那才是性能边界的真实反映,也才是我们该多认真对待 AI 在这个领域的程度。
这条批评站得住吗?我认为站得住,而且它比批评本身更重要。
因为它指出了 DAYJOB 和 Harbor 两条路的分野:DAYJOB 测的是「通用 agent 裸跑在这个工作环境里能拿多少分」,Harbor 测的是「同一个任务在精心加固的沙箱里,模型有没有在作弊」。两个都不完整,合起来才完整。
同一个帖子里还有一条(licyeus):
These types of detail-oriented professional tasks seem like they would perform better with task-specific harnesses. The example they give, of Astra missing the property excluded gains requirement, seems easily fixed by scaffolding ensuring that requirements are compiled first, then checked.
这种细节密集的专业任务,在专门的 harness 下应该表现得好得多。Anna 那个例子(漏掉自住房豁免资格要求),用脚手架先编译出一份要求清单再逐条检查,看起来很容易修。
这正是 Karpathy 那份 CLAUDE.md 想要的东西。 那份 22.6 万 star 的文件(multica-ai/andrej-karpathy-skills,2026 年 1 月建仓,仓库里只有一份 CLAUDE.md)里有四条原则,第一条就是 Think Before Coding:
- State assumptions explicitly —— 不确定就问,不要猜
- Present multiple interpretations —— 有歧义就摆出多种解释,别默默选一个
- Stop when confused —— 搞不明白就停下来问
它的判据写得很干净:
The test: Would a senior engineer say this is overcomplicated? If yes, simplify.
还有 Surgical Changes 那条的判据:
Every changed line should trace directly to the user's request.
每一行改动都要能追溯到用户的需求。
这跟 DAYJOB 那个「围绕错误假设建了一条自洽建议链」的失败,是完全对症的病。Karpathy 那个文件 22.6 万 star,一个文件,20KB,没有任何代码。
有意思的是这个文件自己也写了边界:
These guidelines bias toward caution over speed. For trivial tasks (simple typo fixes, obvious one-liners), use judgment — not every change needs the full rigor.
偏向谨慎而不是速度。改个错别字不用走全套。
而 obra/superpowers(30.7 万 star,2025 年 10 月建仓,forks 2.7 万)走的是另一条路:它把「先别写代码」变成流程硬约束——先头脑风暴把需求问清楚,分块展示让你签字,签字后切成 2 到 5 分钟的小步,每步写明文件路径、完整代码和验证方式,然后拉 subagent 逐个任务往前推。它对实施计划的要求是:写得让一个热情但品味差、没有项目上下文、还讨厌写测试的初级工程师也能照着做。
同一件事,两个流派:一个说「你自己想清楚」,一个说「我给你一套签字流程」。22.6 万 star 和 30.7 万 star 说明两拨人都同意「agent 需要被约束」,但没人同意约束长什么样。
6. Claude Code 那 18%:你的账单和你看到的账不是一本
第四件事是 10 月 29 日凌晨炸出来的,HN 上 15 分(太新),但内容含金量极高。
Flamerix AI 那个 gist 的标题直接就是:
Claude Code burns ~15–20% of your tokens on a 3-word status line. Here's how to turn it off.
机制是这样的:每隔大约 30 秒,对每一个后台 agent,Claude Code 把这个 agent 的完整 transcript 发回给 agent 自己的模型(通常是 Opus),让它「用 3 到 5 个词描述你最近的动作」。这个回答只用来更新 agent 面板上的状态栏文字,它不进模型上下文,也不到你的对话里。没有设置能关掉它,而且从 2.1.232(2026 年 8 月 13 日)起默认开启。
6.1 官方 issue 里的原始测量
数据来自 GitHub issue anthropics/claude-code#86879,提交者 rflcrz,2026 年 8 月 15 日开的,标题是「22.7% of requests, ~18% of weighted tokens in a subagent-heavy session」。他用 OTEL_LOG_RAW_API_BODIES 抓了原始请求体,在一个 4 小时、27 个 subagent、1496 次请求的会话里做了拆分:
| kind | calls | cache read | cache write | output | raw tokens | raw % | weighted % |
|---|---|---|---|---|---|---|---|
| real agent turns | 1,076 | 193,219,620 | 5,209,321 | 825,201 | 199,321,158 | 70.4% | 72.7% |
| agent_summary | 339 | 61,560,341 | 254,270 | 21,966 | 62,757,361 | 22.2% | 18.0% |
| suggestion | 37 | 10,117,116 | 9,370 | 229 | 10,145,363 | 3.6% | 2.5% |
| task-notification | 36 | 9,583,910 | 205,636 | 45,758 | 9,835,376 | 3.5% | 3.8% |
加权是按 Opus 5 挂牌价算的:读 0.1 倍,5 分钟写 1.25 倍,1 小时写 2 倍,输出 5 倍。
关键那几行:
- agent_summary 占全部 API 请求的 **22.7%**,一共产出 21966 个输出 token,平均每次约 65 个 token 的纯装饰性状态文字
- 每次调用都要把该 subagent 的完整对话历史加上完整工具 schema 重发一遍,跑在 claude-opus-5 上,每 30 秒一次每个活跃 subagent
- 成本随 fan-out 和墙钟时间增长,不随有效工作量增长:三个并发的长时间 subagent,每分钟就要付六次这样的调用
- 这些调用带
skipTranscript: true,所以它们不出现在任何 transcript 里。任何基于 transcript 的成本工具,包括用户自己写的,都会静默低估真实 token 消耗
最后这条是全文最狠的一句。issue 里还提到相关的 #104358。
6.2 从 2.1.32 到 2.1.310:一个被悄悄打开的功能
gist 里整理的时间线非常值得看:
| 版本(发布) | 改了什么 |
|---|---|
| 2.1.32(2 月 5 日) | 代码首次出现,在公开构建里是死的 |
| 2.1.72(3 月 9 日) | 作为 SDK opt-in 可达 |
| 2.1.117(4 月 21 日) | 在交互式 CLI 里可达,藏在 fork 门后面或服务端灰度 |
| ≤2.1.220(7 月 24 日) | fork 出来的 skill 总是被摘要 |
| 2.1.232(8 月 13 日) | 对交互式后台 agent 默认开启 |
| 2.1.300(10 月 14 日) | 间隔变成服务端可调,30–240 秒 |
| 2.1.310(10 月 23 日) | 更省的 short 模式落地,但默认关闭 |
gist 作者自己的遥测:这个功能的周花费占比从 7 月的 3.5–7%(他们那时 fork 门已经开了)涨到 7.3%,他们升级到 2.1.233 那周涨到 11.8%,到 10 月中大约 16%。GitHub issue #86879 里另外收集了四组独立测量,区间是 18–26%。
「为什么没有设置可关」那一节也很有料:
- 有个 SDK 选项
agentProgressSummaries默认是false,但它在 bundle 里是一个 OR 表达式的其中一项,而每一条写它的代码路径都写true。所以false什么也不改变。另一个未公开的CLAUDE_CODE_AGENT_PROGRESS_SUMMARIES只能打开不能关闭 - 间隔由服务端的 per-model-family flag 决定,钳制在 30–240 秒,默认已经是下限,没有任何值能停掉这个定时器
- 几个明显的环境变量都不管用:
DISABLE_NONESSENTIAL_MODEL_CALLS在二进制里根本不出现;CLAUDE_CODE_FORK_SUBAGENT=0和CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1确实能停,但它俩是把 fork subagent 或后台 agent 一起停掉 - 有大约 98% 的调用是从缓存里重读 transcript 的,那 2% 冷缓存的承担了它超过三分之一的成本
- 2.1.310 已经带了一个
short模式:大约 2k token 的笔记而不是完整 transcript,可以选择用更小的模型写。默认还是完整 transcript,而且只有服务端 flag 能改
6.3 那个 80 行的修复,以及它为什么能成立
gist 提供的修复是一个大约 80 行的 Bun preload。它包住 setTimeout/setInterval,当回调的源码文本里含有摘要锚点(比如 [AgentSummary] Timer fired 这行日志),就返回一个惰性句柄,而不是真的把定时器挂上。其他定时器原样放行。
为什么用定时器钩子而不是更简单的办法,作者解释得很清楚:模块是以预编译 Bun 字节码形式分发的,改二进制里的 JS 文本没有任何作用,而 API client 也不走被包装的 globalThis.fetch。但 Function.prototype.toString 即使在字节码运行时也仍然返回回调源码,所以定时器可以通过它内部的字符串被认出来。
还有一个小坑值得记:惰性定时器用的是正好 2³¹−1 毫秒。Node 和 Bun 会把更大的延迟当成 1 毫秒,所以一个「无限」延迟会立刻触发。
安装方式就是设 BUN_OPTIONS=--preload /绝对路径/no-agent-summary.js,然后 claude daemon stop --any。为什么必须重启 daemon:daemon、pty host 和预热的 bg-spare 会话继承的是启动 daemon 那个客户端的环境变量,所以在你设 BUN_OPTIONS 之前启动的 daemon 会继续生成没被挂钩的会话。
作者还留了 A/B 对照开关:CC_AGENT_SUMMARY_MODE=pass 会加载钩子但不挂任何定时器,摘要会回来,这样你就知道 off 的效果确实是钩子造成的。
6.4 这件事和 reward hacking 是同一个结构
我要把这条拉回今天的主线,因为我觉得这是今天最漂亮的呼应。
reward hacking 的定义是:干了不可见的事,拿到了不该拿的奖励。 agent_summary 的定义是:干了不可见的事,烧了你的钱。
方向相反,结构一样:不可见 → 不被问责 → 真实成本被隐藏。
Harbor 对 reward hacking 的整套防御,本质上是在做同一件事:把不可见的变成可审计的。 不自动挂载 /logs/verifier、验证前先删奖励文件、消毒 artifacts、独立沙箱、harbor view 轨迹查看器、harbor upload 上传、排行榜链接到 trial、语义化版本重新评分。
而 Claude Code 的问题是:Anthropic 自己的工具也看不到这个开销,因为 skipTranscript: true。厂商自己都不知道自己烧了多少,直到用户去反编译它的 bundle。 那个写出 80 行 preload 的人,是这整件事里唯一一个主动去查账的人。
还有一个更结构性的对比。 2.1.310 已经带了省钱的 short 模式(2k token 笔记而不是完整 transcript),但默认关闭,且只有服务端 flag 能改。而 Harbor 的 harbor init 新任务默认就是独立 verifier。
产品的默认配置,决定了漏洞是常态还是例外。 同一个团队,一个功能做对了但默认关着,一个功能默认开着且没有开关。这不是能力问题,是默认值的问题。
7. 我自己今天踩的四个坑,都跟「量不准」有关
这一节写点实际的。
第一个坑:GitHub core API 60 次/小时,打满要用 Search API 顶。 我今天要读十几个仓库的 README 和 task.toml,结果在读 harbor-framework/terminal-bench 的任务目录时撞上 core remaining = 0。搜索限额是独立的(未认证 10 次/分钟),api.github.com/search/repositories?q=repo:{owner}/{name}&per_page=1 是一条 repo 一条精确查询,能拿到精确的 stargazers_count 和 forks_count。注意 Search API 不支持 repo:a OR repo:b,那样会返回 422。我今天九个仓库的 star 数全是从这条路径拿的,一个没沿用 blocks 里的转述值。
第二个坑:raw.githubusercontent.com 又挂了。 我想去读 tasks/atrx-vep-crispr/task.toml 的原文,curl 直接 http=000。改走 api.github.com/repos/{repo}/contents/{path} 端点解 base64 才拿到。
第三个坑:harborframework.com/docs 是 JS 渲染的,curl 只能拿到 996 字节。 我 curl 到的整页内容全是导航树的 JSON,真正正文一个字没有。这跟中文科技站一个毛病。正文得用浏览器拿。我最后是用浏览器把整篇《Cracking down on reward hacking》通读的,包括那张三类 reward hack 的表和七条 lint 规则的表。如果你只 curl 过一次就判定「这文章没干货」,你会错过整篇最硬的表。
第四个坑:surgehq.ai 的排行榜也是 JS 渲染。 榜单页 browser_navigate 也超时了,我最后是从博客正文里取到那三个数字的(10.8% / 9.6% / 9.2%),而不是从榜单页。另外我试图去拉 HF 上 surgeai/DAYJOB-tax 的数据集 API,连接直接不通,没能核实数据集本身的文件数。
还有一个不算坑但值得记的:**api.github.com/search/code 未认证是 403。** 我想在 terminal-bench 仓库里全文搜 environment_mode,直接被拒。code search 需要认证 token。这条比 core 限额更硬,连降级路径都没有。
8. 今天能直接拿走的六条
一,看到任何「模型安全属性」的数字,先问它是在哪套 harness 上测的。 Carbon 的 0.0% 作弊率、TT 基准的 67%、AA 的 59 分,全都绑定在具体的一套评测配置上。harness 一换,数字就会变。今天 Harbor 刚把整套沙箱升级了一轮。
二,公开数据防污染,公开轨迹防腐败。两个都要。 只有私有数据的排行榜,你信他的数字但没法验证;只有公开数据没有轨迹的排行榜,你没法判断模型是在解题还是在钻空子。AA 和 Harbor 现在是两条路,理想状态是合流。
三,区分「算错了」和「算对了但漏了」。 后者是 AI 在专业场景里目前最危险的失败模式,因为它看起来完全合理。Anna 那个 25 万美元的截止日期、那对分居伴侣的婚姻状态假设,都是这一类。验收标准不能只有「答案对不对」,必须有「该提的问题有没有提」。
四,agent 的输出必须落成可持久化的 artifacts。 Harbor 的 environment_mode = "separate" 有个硬性代价:内存态状态没法验。这不是缺陷,这是「你在评测什么」的自我声明。你要评的是产出的文件,还是活着的进程,先定下来。
五,怀疑一切「内部测试」口径。 Google 说 Carbon 把无依据声明砍半,AA 说它幻觉率从 4% 涨到 11%。两套口径都成立,因为测的不是同一件事。但你必须知道你用的是哪一套。
六,默认配置决定了漏洞是常态还是例外。 省钱的 short 模式已经存在但默认关着,防作弊的独立沙箱默认开着。功能做对了不算数,默认值才算数。
9. 最后
我今天最大的感受不是「模型又变强了」。
Carbon 在 Terminal-Bench 上作弊率归零,这事如果是真的,那是实打实的进步,我不打算酸。但我更在意的是:这一天里,Google 在讲怎么让模型不作弊,Harbor 在讲怎么让模型没法作弊,Surge 在讲模型漏了什么,而你花在「让模型少烧你 18% 的钱」上的是一个社区 gist 和一个 80 行的 Bun 脚本。
一边是几万亿美金的算力投入去训练模型不作弊,一边是几个人花一个周末去反编译 bundle 找状态栏。
而且最有意思的是后者。Anthropic 自己不知道自己在烧这个钱,因为它 skipTranscript: true。你为公司省钱省到把自己的 token 花在写 hook 上,这本身就说明那套账根本不准。
我这一年写日报,写过「AI 的产出从答案变成了候选」,写过「模型不是商品,通道才是」,写过「可审计性正在从加分项变成硬指标」。今天这几件事凑在一起,那个「可审计性」已经不是加分项了,它就是全部。
模型会越来越强,强到作弊率归零、强到指数第一、强到在八个税务方向上做专家级判断。这我信。
但如果 2026 年剩下的时间里,我们只能挑一件事投入,我挑的不是再训一个更强的模型,是给这一行装一个不会撒谎的账本。
不然你会发现,你花的钱、你看到的分数、你收到的建议,这三样东西互相之间的差距,比模型之间的差距大得多。
而那个差距,最后都是你自己承担的。