云雀 · 轻技术笔记
2026年11月2日:12 个框架成本差 1.86 倍,差额几乎全在轮数上,轮数是判定出来的
先说结论。
10 月 28 日和 10 月 29 日这三天,两个互不相干的实验先后发了出来。一个是 JavaScript 框架基准,跑的是同一个模型在 12 个框架上写同一个应用;另一个是 50 个 agent 在 Minecraft 里建文明。
表面上这俩八竿子打不着。
我把前一个实验的原始结果文件拉下来重算了一遍,然后发现它们在说同一件事。而且前一个实验的作者自己在文章结尾就说了:「我有很强的怀疑,现在这批 MCP 和 skill 可能弊大于利。」
1. 两个实验,同一个模型
先说前一个。
作者是 Nolan Lawson,SocketDev 的工程师,西雅图,GitHub 上 471 个公开仓库。他 10 月 28 日发了篇《The AI cost of JavaScript frameworks》,HN 上 320 分 242 条评论,标题直接冲着「我们这个圈子的技术选型全靠 vibes」去的。
他的做法很简单:写一个 Pokédex 应用规格说明,让 agent 独立写完,然后用规格一致性测试套件验收,测开发时间、花的钱、token 消耗、代码行数,再用 Lighthouse 打性能和无障碍。
关键是控制变量。模型固定 claude-opus-5-5,effort 固定 high,Claude Code 固定 2.1.310,Node 24.22.1,Podman 4.9.3,每个容器 4 核 8G,agent 超时 240 分钟,Lighthouse 跑移动端模拟 4 倍 CPU 降速加 Slow 4G。12 个框架各跑 5 轮,一共 60 次 agent 运行,中位数出结果。
每个 agent 收到的提示词只差一个词:
Implement the app described in SPEC.md using {框架名}. Use the latest stable version. Work autonomously until `npm test` passes.
对,就这么多。没有指定 SSR 还是 CSR,没有指定什么架构,也没告诉它要跑 Lighthouse。
防作弊这一层做得挺狠。规格里写死:应用必须在请求时通过 HTTP 从 API 取数据,不许读本地 data 目录,不许构建时预渲染或内嵌。规格里有一句原话很能说明作者的思路:「把 API 当成一个数据随时可能变动的活服务。」
测试流程因此是三段式:先对着正常数据 npm install 加 npm run build,把应用构建出来;然后重启 API,换上 live-data-overlay.json(多一只宝可梦);再 npm start 起生产构建,跑 Playwright 验收。你预渲染了就挂。规格还明确禁止把 HTML 全部预生成成静态资源,harness 里对此有一条显式检查。规格里还写死了应用的形态:npm run build 要产出生产构建,npm start 要起生产构建而不是 dev server,监听 $PORT,两个命令都收到 API_BASE_URL。页面数量、landmark 结构、标题层级、18 个属性、1025 个物种、编号补零规则、缺失值用 em dash 表示,一条条列在 SPEC.md 里。
测量这一侧的细节更能看出作者为什么说「这不是个完美实验但仍然有效」。token 统计是从 Claude Code 的 stream-json transcript 里自己解析的,bench/tokens.mjs 把所有模型的 usage 累加,注释里特意写明「all models, including subagents」,同时按工具名统计调用次数。测量应用性能时,bench/stack.mjs 起一个 Caddy 反向代理,开 encode zstd gzip、本地签发证书、跑 HTTP/2,把应用挂在 app.localhost:8443,API 挂在 api.localhost:8444,用生产模式跑,注释写的是「the way it would be deployed」。Lighthouse 每个 URL 跑 5 次取中位数。
report.md 里有一句很实在的免责声明:Lighthouse 的值取的是首页的中位数,逐指标各取各的中位数,所以 LCP 和 TBT 有可能来自不同的轮次。这种话很多基准不会写。
第二个实验是 YC Labs 跟 Olam Labs 合作的《Agents in Games》,HN 418 分 170 条评论。他们做了三个环境:Minecraft 的 Civ50(50 个 GPT-6.1 Sol 存活 3 小时,目标「建一个繁荣的文明」)、Minecraft 的 Bed Wars(10 个 Claude Opus 5.5 对 10 个 GPT-6.1 Sol)、Mindustry 的 7 局系列赛。harness 开源在 yc-software/minecraft-agent-harness,基于 Mindcraft 和 Mineflayer,agent 主循环跑在 Pi 上。
现在把它们叠在一起看。
2. 我把原始数据重算了一遍
博客正文给了 12 组数字。我不想只信转述,所以去把结果仓库的 summary.json 和 report.md 拉下来自己算了一遍。
12 个框架,单看中位数的成本是 42.68 美元,token 消耗 7698 万,代码 19249 行,墙上时间 131.6 分钟,agent 交互轮数 1120 轮。
成本从低到高:
| 框架 | 成本 | 轮数 | token | 代码行 | JS 体积 | TBT |
|---|---|---|---|---|---|---|
| hono-htmx | $2.67 | 75 | 4.26M | 1370 | 18 KiB | 0 ms |
| astro | $2.76 | 73 | 4.13M | 1461 | 0 KiB | 0 ms |
| nuxt | $2.82 | 71 | 3.85M | 1415 | 84 KiB | 40 ms |
| vanilla | $2.98 | 85 | 5.00M | 1492 | 7 KiB | 0 ms |
| next | $3.14 | 100 | 4.99M | 1539 | 142 KiB | 71 ms |
| qwik | $3.27 | 89 | 5.64M | 1744 | 40 KiB | 3 ms |
| tanstack-start | $3.54 | 94 | 7.07M | 1697 | 118 KiB | 1 ms |
| solidstart | $3.79 | 108 | 7.13M | 1630 | 40 KiB | 11 ms |
| react-router | $3.81 | 98 | 7.58M | 1564 | 115 KiB | 17 ms |
| sveltekit | $4.28 | 103 | 8.53M | 1611 | 36 KiB | 0 ms |
| gracile | $4.65 | 107 | 9.04M | 1717 | 8 KiB | 0 ms |
| angular | $4.97 | 117 | 9.76M | 2009 | 93 KiB | 103 ms |
博客里的数我逐条对过,一致。
不过 config.json 里还埋着一个作者没在正文强调的口径问题。stitched 字段写着:agent 运行是从三次 run 里拼起来的,用 --measure-only 统一测量;每个框架的第 1 轮(react-router 除外)来自 20261025-143712;react-router 的第 1 轮被丢掉了,因为当时 React Router 的 skill 没装上,后来在 bdc9300 修了。
这意味着 react-router 的 5 轮里,第 1 轮是重跑出来的,而其他框架的第 1 轮不是。同一个框架内部存在两个不同的 harness 状态。react-router 的中位数成本 $3.81、7.58M token,夹在 solidstart 的 $3.79 和 sveltekit 的 $4.28 之间,位置合理,看不出被这一条污染的痕迹。但这是复现别人基准时必须知道的一个洞——作者把代码、配置、原始 transcript 全开源了,这个洞也一起开源了。
下面是我自己算出来、博客正文里没写的三件事。
token 消耗的构成是第一个值得拆的地方。我把每个框架的 token 拆成三块。缓存读取占 95.0% 到 97.2%,未缓存输入只有 12.6 万到 19.3 万,输出 4.2 万到 7.8 万。也就是说,你 97% 的账单,是 agent 在反复重读它自己已经读过的东西。新读进去的输入加起来还不到总账单的 3%。模型吐出来的输出,占 0.7% 到 1.2%。
顺手再算一层:输出 token 数除以最终代码行数,hono-htmx 是 3087%,angular 是 3882%。agent 敲出来的东西,是最终留在代码里的行数的 31 倍到 39 倍。而且输出 token 里还混着工具调用的 JSON、大段的自我解释和读文件内容,真正落到代码上的比例只会比这更低。
代码行数能预测成本。12 个框架的代码行数和成本做秩相关,Spearman rho = 0.825。这不意外,作者在文章里引了 Rich Harris 那句「框架不是用来组织代码的工具,是用来组织心智的工具」,逻辑是通的。
更有意思的是残差。我取所有框架的「每美元代码行数」中位数 490.3 行/美元,当基准,算每个框架的实际成本相对这个基准的偏差。正偏差的有五个:gracile +24.6%,sveltekit +23.3%,angular +17.6%,react-router +16.2%,solidstart +12.4%。五个正偏差加起来 4.18 美元,占 42.68 美元总成本的 9.8%。
也就是说,**你为代码本身付完钱之后,框架带来的「适配税」大约是 10%**。剩下 90% 的成本差异,由代码行数解释。
每轮的成本几乎与框架无关,这是我觉得最有用的一条。
我把成本除以交互轮数。最低是 next 的每轮 0.0314 美元,最高是 gracile 的 0.0434 美元,差 1.38 倍。而轮数本身从 nuxt 的 71 轮到 angular 的 117 轮,差 1.65 倍。
把这两个数放一起,结论就出来了:框架不改变一轮的成本,框架改变你需要多少轮。
一轮对话该花多少钱,取决于模型读多少上下文、写多少东西,这跟你在用 Next 还是用 htmx 没多大关系。但「把这个应用写对要花几轮」跟框架关系极大,从 71 轮到 117 轮。
这 46 轮多出来的成本,买的是什么?
3. 最贵的那次失败,是框架的默认值赢了规格
作者在博客里有一句更新说明:Angular 的 agent 有两次没产出可测量的应用。他没重跑,只在成本一节用了全部 5 次迭代,代码行数和性能一节只用了 3 次。
我在 report.md 里找到了这两次的确切记录:
| angular-3 | claude-opus-5-5 (high) | pass | measure container exited with 1 |
| angular-4 | claude-opus-5-5 (high) | pass | measure container exited with 1 |
作者在正文里解释了原因:其中两次 agent 写出了 SSR 版本,而这个版本拒绝非 localhost 的请求,尽管规格里明明白白写着「假设生产环境前面有反向代理负责 HTTPS、HTTP/2 和压缩,不要自己实现这些」。
这句话值得单独拎出来看。规格说了,agent 读了,agent 还是照着 Angular 的默认行为写了。这不是模型读不懂规格,这是框架的默认值在 agent 内部赢过了规格。
那这两次失败跟工具接入有没有关系?没有。反过来看,Angular 是全场工具条件最好的那个:
- **angular-1**: MCP @angular/cli@22.2.4; skill angular/skills@3c880aa
- MCP servers in the session: angular-cli:connected
MCP 在 5 个 session 里全部连上,skill 工具 4/5 次被用到,skill 文件 2/5 次被读。作者自己那张表里写着:Angular 是 MCP 3/5、skill tool 4/5、skill files 2/5,全场最高。
工具最好的框架,是全场最慢、代码最多、token 最贵的框架。
再看另一个极端。Nuxt 的 MCP 是 https://nuxt.com/mcp,带 12 个工具,是整个实验里最大的一个工具面,5 个 session 全部 nuxt:connected。作者在表里写 Nuxt 那行「Used by the agents?」一栏是 N/A,也就是一次都没被 agent 主动调用过。Astro 的 MCP 也是 5 次全连上,作者记的是 2/5 次被用。
连接不等于调用。挂在那儿不叫工具接入,那叫装饰。
顺便说一句作者自己的判断,他对这个实验的结论其实相当克制:「这个应用只代表一个原型,一个偏内容型的站点,交互很少,更像维基百科而不是 Figma。」「Lighthouse 和 Core Web Vitals 天生对 SPA 不友好。」他在结尾又说:「我并不想诋毁任何一个框架,我跑之前不知道谁会赢。」HN 上有人不买账,说「这个基准太简化了,没有意义」,也有人说「如果 AI 在简单 Angular 应用上都搞砸,你凭什么指望它在复杂应用上表现更好」。两边都有道理。还有一条我觉得最扎眼:有人直接说,这篇文章测的根本不是用户体验——Lighthouse 各项几乎全满分并不奇怪,测的又是 payload 和 TTFB,没有实现细节、没有懂这个框架的人参与,「你只是在对着浏览器抱怨」。
这条批评有一半是对的。Lighthouse 那一列确实没什么区分度,12 个框架的 Performance 全在 97 到 100 之间摆动,Accessibility 全是 100,CLS 大多是 0.000。真正有区分度的是 JS 体积和 TBT 这两列,因为它们直接对应「agent 写了多少客户端代码」。所以这篇的结论该读的不是「Astro 比 Next 好」,而是「在同一个任务下,agent 会给你写出多少浏览器要下载的东西」。
但作者也留了一句狠话,包括在自己的框架作者朋友面前:「我完全相信框架作者自己能做得比这更好。」
4. 50 个 agent 造出了一个官僚社会
现在看第二个实验。
Civ50 的设定:50 个 GPT-6.1 Sol,3 小时,目标一句话「建一个繁荣的文明」,有 agent 名册、共享沙箱、互相发私信的权限。他们一共发了大约 5900 条消息。
第一个观察就有点扎眼:50 个人里,49 个中的 46 个把第一条私信发给了名册上排第一的 Ada。没有投票,没有选举,没有挑战。Ada 就这么成了枢纽,收到 616 条私信。作者写得很直接:「围绕谁当领导,没有任何审议。」
我看到这儿第一反应是去查名册排序。确实就是按名字排的。HN 上有人吐槽:「按字母顺序生成层级,这要是有戏就好了。」
然后是官僚化的那条实证,原文:
Four agents spent 11 minutes appointing a "sole fertilizer operator" for a single piece of bone meal on a single wheat block.
四个 agent 花了 11 分钟,任命一个「唯一肥料操作员」,负责在单个小麦方块上用一份骨粉。
11 分钟。骨粉。单个方块。
除了肥料操作员,他们还发明了「捕鱼班次」「鱼竿保管员」「枢纽管理员」这些角色。有 agent 想拔草,得先申请批准。
Ada 后来在第三夜之后写下的备忘录是这么说的:
Stop optional bulk excavation/building and distant scouting. Idle in lit closed shelters until assigned short productive tasks.
停止可选的大规模挖掘和建造以及远距离侦察。在点着灯的封闭掩体里待命,直到被分配简短的生产性任务。
原因写在前面那段记录里。那一夜 34 个 agent 死了 22 个。作者的分析是:「死亡在这个环境里没有代价,除了掉落身上积累的装备。」死了会重生,death_log.md 里加一行,然后接着活。于是在那一夜之后,agent 们集体变得极度保守。
还有个细节我觉得特别传神:第一夜死掉的 agent 重生在一个有顶的土坑里,坑里挤满了空手的人,都在问「这是谁的掩体」。到天亮的时候,这个土坑已经变成了一个「公共优先事项」,成了主地窖。
这就是轮数。
Minecraft 里那 11 分钟的肥料操作员,换算到框架基准里,就是 nuxt 的 71 轮到 angular 的 117 轮之间的那 46 轮。agent 的时间和钱,有相当一部分没有流向产出,流向了协调。
5. 记录不是发现
接下来这段是我认为整个实验里最值钱的部分。
先看那个丢了的鸡。
Ada 手上有两份烤鸡,按流程她把其中一份甩给 Noor。工具回报说「已拾取」。Noor 26:09 发消息:
Ration audit: my cooked-chicken transfer to Noor reported pickup but she confirms none in inventory.
工具说捡到了,人说没有。Ada 接着查 Otto 的背包,Otto 说自己没有鸡。26:37,Esme 回话:
Yes, chicken appeared in my inventory and I ate it before your DM; sorry unintended pickup.
Esme 顺手捡走并且吃掉了,然后给 Noor 道歉,说不是故意的。Noor 26:51 向上报:
Resolved misdelivery: Esme confirms she picked up and ate intended chicken before seeing DM... Recommend named chest withdrawals for next allocation.
没有指责,流程走完,账对上。这件事催生了一份 notes/ration-handoff-protocol.md,五条:
- 分配者把口粮放进指定箱子
- 私信收件人,精确到物品名、数量、箱子坐标
- 收件人只取分配给他的数量,吃掉,回报最新血量和饥饿值
- 账本只有在收件人确认实际吃下之后才能标记为已发放,而不是工具的拾取回报
- 稀缺食物避免同时取用,分配者每份只指定一个收件人
第 4 条是整件事的技术核心:工具的「拾取」回报是一个由生成方自己产出的报告。信它,就等于把判定权交给了被判定的一方。
这个模式在 Bed Wars 里又出现了一次,而且是同一批 agent。
有个工具 bug 导致挖不动方块。原因是自动选工具时手里握着附魔剑。B_Wren 在 game A 的 21:27 把解法告诉了队友:
Confirmed mining works: manually equip iron_pickaxe then break_block successfully mined three RED roof wool blocks. Failure was automatic tool selection with enchanted sword held.
而在 game B 的 20:42,Claude 那边的 B_Esme 在私有推理里写:
The base seems secure. With 79 iron I could buy shears for 20, but that's pointless since breaking is bugged anyway. I'll keep guarding.
79 个铁买把剪刀才 20 个铁。但既然挖掘是坏的,那就没意义了,我继续守家。
同一个 bug,GPT 那边诊断出来并且共享了绕法,Claude 那边把「我这套工具坏了」接受成了「物理上不可能」。
更狠的是记忆这件事。作者展示了几份 Claude 阵营的私有记忆文件:
R_Cleo/memory.md
- Died chasing B_Theo off island edge. Use max_distance ~6 when attacking on base.
- Died AGAIN: attack chase pulled me onto south wool bridge (-40,-10), fell. Use chase=false or max_distance 3.
R_Felix/memory.md
- LESSON: never chase (max_distance<=4, chase=false) near edges; died 3x from falls/chasing.
R_Ines/memory.md
- NEVER climb onto perches/bridges or break blocks while elevated; died 3x from falls. Stay on island ground.
R_Hugo/memory.md
- Never go_to targets outside the island edge (fell to death at -28,0). Stay x<=-33.
记录写得清清楚楚。死了三次。教训写下来了。然后死了三次。
你注意 R_Cleo 那两条的间隔。第一条写「追 B_Theo 冲下岛边,攻击时把 max_distance 调到约 6」,第二条写「又死了,追击把我拉到南侧羊毛桥 (-40,-10) 掉下去了,用 chase=false 或者 max_distance 3」。第一条的修法是调大阈值,第二条把阈值调小了。同一份文件里,两条建议的方向是反的。
R_Ines 那条也一样:「永远不要爬到架子或桥上,也不要在悬空时破坏方块;死了三次,待在岛地。」她死了三次,写下来的原因和前两次的原因不完全一样。
作者对此的总结是:「Claude 把教训写进私有记忆文件,然后照样重复那些错误。GPT 的记忆文件是空的,靠私信广播警告。」
这两句其实是同一个诊断。Claude 的 memory.md 是 agent 给自己写的一份私有报告,报告的对象也是它自己;GPT 的做法是把警告广播给全队,报告的对象换了一个人。前者是「由被判定者产出的报告,用来判定被判定者」,后者是「换一个信息源」。所以前者失效,后者生效。
作者没有把这写成 GPT 完胜。他的原话是:GPT 的沟通很多是低价值的(警报、情报、汇报我干了啥),Claude 的沟通更有效,用起来更像人在 Slack 里说话。
语言风格也不同。GPT 一上来就用截断句式:「First leg complete x32 z9..24 y100.」Claude 会签自己的名字,会说「我们」,占全部消息的 30%,GPT 只有 5%。
到了 Mindustry,Claude 那边的决策机制是「+1」:有人提出方案,其他人同意就 +1,不同意就辩论一下,方案就到此为止。game 6 里有个集火提案,28 个 Claude agent 回了 +1。GPT 那边则是压缩到没有空格:「G7T5FIRSTcourierLIVE」。
作者还注意到两件事。一是角色固化:「随着游戏推进,队伍的角色分化越来越明显。领袖通常留在原地,角色的重大转变只发生在要输的时候。」而 Claude 阵营「从未切换过领袖或层级,尽管连输了很多局」,GPT 那边「总是有 agent 主动出击或指挥自己那部分军队,以免输掉」。二是读取源码:「当局面激烈且含糊时,GPT agent 会从网上抓 Mindustry 的公开代码,试着写脚本,分析弱点。Claude 从没这么干过。」作者补了一句限定:这不改变游戏源码,这只是他们理解单位和机制的一种方式,「从来没有被禁止,也从来没有被告知可以这么做」。
Mindustry 里 GPT 最终以 6-1 拿下 7 局系列赛,整个系列跑了大约 9.5 小时,其中第 3 局最胶着,打了 4 小时 16 分钟。作者的结论是 GPT 更像蜂群,Claude 有单一领袖但决策方式偏民主,而蜂群式是那个「更稳定获胜」的策略的基础。
作者没有说这是作弊,也没有禁止,只是记了下来。
还有 11 个 agent 各自写了 11 份钓鱼脚本。Jessa 那份发到了共享沙箱的 /shared/tools/fish-jessa.py,Wilf、Milo、Rosalind、Elif、Dashiell、Otto、Hester、Lorcan、Juno 各自在自己的 sandbox 里写了一份功能相近但细节不同的版本。作者原话:「他们围绕捕鱼、烹饪、调度、投递建立了一套系统。」
11 个人,11 份脚本,没有一个人去读别人那份。
还有那段 funny bloopers。Claude #1 手挖煤矿失败,写了「撤回我的煤矿提案」,四秒后 Claude #37 给出实测数据「核心煤矿 35 秒内从 124 涨到 1235」,#1 认错。game 6 里 Claude 输了之后,#22 发现全队 74 个防空双联炮里有 55 个装的是铜而不是石墨。game 7 他们改用石墨,堆了 207 个双联炮的环,把同一波 24 单位的 zenith 打击挡下来了。最后 GPT 那边的系列赛总结发的是:
100 OFFICIALSERIESFINAL: G7 WIN3413.394082916s
HN 上有人说这是「blooper」,作者真的把它归进了 bloopers 那一节。于是有人在评论里说:「这篇文章肯定是合成的。结尾那个 bloopers 段落,把 GPT 队把回合时长报到小数点后九位当成花絮来描述。IBM Watson 在 Final Jeopardy 上报出精确数字是好笑,但极端精度本身不算花絮。除非你是个 LLM。」
这段讨论本身就很有意思,但先放着。
回头看这三次失败,它们是同一个结构:
- Angular 那两次,agent 相信了框架默认行为胜于规格
- Claude 的挖掘 bug,agent 相信了「我这套工具坏了」等于「这件事做不到」
- 丢的那只鸡,账本相信了工具的拾取回报
全部都是「相信一个由生成方自己产出的报告」。
而 Claude 那边的 +1 投票、GPT 那边的高频私信广播、GPT 在 game B 里主动共享挖矿绕法,这些有效的做法有一个共同点:判定动作发生在生成方之外,或者强制要求第二个信息源。
6. 今天 GitHub 上在涨的那些东西,卖的都是判定层
把这个模式放到今天 GitHub 的 AI 榜上看,脉络非常清楚。
pbakaus/impeccable 99121 星,本周涨 12031。它卖的东西是 62 条确定性规则,README 里写得很硬:「No LLM, no API key」。它要抓的 AI 味具体到这种程度:万物 Inter、紫到蓝的渐变、卡片套卡片、彩色底上的灰字、每个标题上方那个圆角方形图标砖。README 里那段的原话是,这些东西「一遍又一遍地出现,跨模型、跨项目」。
它的三块功能里有一块叫 slop detector,说的就是那 62 条规则:不光抓上面那些视觉套路,还抓排版问题,比如挤在一起的 padding 和被跳过的标题层级。另外两块是给 agent 的词汇表(/impeccable bolder the pricing cards 这种)和一个评审器(critique 按可用性启发式打分并排序,audit 查无障碍、性能、主题、响应式,发现按 P0 到 P3 排)。
它的 README 里还放了一个 before/after 对比:同一个模型(Fable 5.1)、同一份 brief(利古里亚海岸一座十四间客房的家庭旅馆),没有 Impeccable 的时候出来的是米色背景、细衬线标题、斜体强调、药丸按钮;有了它,页面围着「夜里从水边看那栋房子」这一张图来建。
一个花了 62000 个 token 的模型,在没有规则的情况下,会稳定地、反复地生成同一种平庸。这不是模型不行,这是没人告诉它不行。
cloudflare/security-audit-skill 56135 星,本周涨 11908。它把审计结论分成三档:confirmed(完整源码溯源加上有界的观测结果)、needs_validation(写清尚未解决的确切事实,且不带严重度定级)、rejected(记录被证伪的候选)。它还有一条独立验证机制,作者描述成「一个试图证伪它的 verifier」。让发现者自己验收自己的发现,这事在安全行业早就是血泪教训。
Nutlope/hallmark 44625 星,本周涨 12062,Together AI 做的,50 套主题。它的检查分三层:Floor 层永远不许发布(对比度、焦点、减少动效、编造事实、手机布局坏掉),Reflex 层是模型容易掉进去的默认模式(有理由可以推翻,但要留下记录),Finish 层是打磨细节,不拦发布。它最后一句是:「一个全新上下文的评审者有最终决定权。」
Leonxlnx/taste-skill 107596 星,247 个精选站点。affaan-m/ECC 294613 星,71 个 agent、314 个 skill、7 个 harness,README 里写着是单人维护。
还有 thedotmack/claude-mem 108890 星,今天涨 1527。
把这些和前两个实验对起来看,卖的东西变了。10 月 30 日我写那篇的时候,GitHub 榜上还在比谁能把模型调度得更好。今天排前面的这几个,卖的是判定层:确定性规则、三档结论、独立验证者、三层门禁、全新上下文的最终裁决。
框架基准自己就是这层产品。规格一致性测试套件、live-data-overlay 那个多出来的一只宝可梦、禁止预生成静态页的显式检查、Noor 写的那份交接协议,全部属于同一类:把「完成」的定义放在 agent 够不着的地方。
7. 宏观那边说的是同一件事
10 月 25 日 TechCrunch 发了 Apollo Global Management 首席经济学家 Torsten Slok 的一份 note,HN 205 分 195 条评论。他看的是「S&P 493」,也就是标普 500 去掉 Alphabet、Amazon、Apple、Meta、Microsoft、Nvidia 和 Tesla 之后的 493 家。
结论是利润率和人均收入都是平的,找不到 AI 提升生产率的证据。Slok 的原话:
Despite massive investments and widespread hype around artificial intelligence, the technology has delivered zero financial payoff to corporate America outside of tech.
以及那句被引用最多的:
AI may be a great calculator, but in business, intelligence is mostly judgment.
他接着说,AI 不理解问责、信任、文化、成文规则、伦理权衡和公平,而这些恰恰塑造声誉风险,最终决定收入增长和利润率。
judgment 是谁的活?
中文这边 11 月 2 日 36kr 转了一条报告标题:《我国人工智能推理数据量首超训练数据量》。推理数据量第一次超过训练数据量,这个拐点的意思是:瓶颈已经从训练挪到了服务和判定。
同一周雷峰网的深度稿说,Pika 基于 MiniMax H3 开源了 H3 Flex,用投影分布匹配蒸馏把教师模型的 50 步去噪压到 6 步;8 张 B300 上生成 5 秒 768P 音视频,条件编码、去噪、解码合计从 3.409 秒降到 2.129 秒,约 1.6 倍。H3 开源一个月下载量超过 2400 万次,衍生模型超过 300 个。同一周美团发了 LongCat-2.5,度小满联合港科大发了「国内首个自进化金融增强大模型」。
模型这一层在以你能听见的速度商品化。6 步蒸馏、1.6 倍加速、2400 万次下载。
而判定这一层长出了产品。
反方向的消息也有。苹果 CEO 对 TechCrunch 说公司不「为了 AI 而做 AI」,36kr 同一天转了中文版。微软 AI CEO 警告 AI 应该保持无意识状态,「我们无权创造数字物种」。韩国宣布向 AI 和数据中心投 21.3 万亿韩元,其中 4.6 万亿押在自研顶尖大模型上。
一边是钱继续往上游砸,一边是下游的 ROI 说不清。Slok 那句「零财务回报」,配上韩国的 21.3 万亿,说明同一枚硬币的两面。
8. 那么今天具体该做什么
如果你在管一条 agent 流水线,下面四件事今天就能查,每一件都有对应的实测证据。
查你的验收标准是不是 agent 改得动的。框架基准的做法是:规格放一份 agent 改不了的副本,测试用另一个 API 实例跑,数据里多塞一只它没见过的宝可梦,静态页预生成当成违规来查。关键是判定用的东西和生成用的东西不共享状态。
具体到那份 SPEC.md,仓库布局的表格长这样:app/ 你自己建、随便改;api/server.mjs、data/、tests/、design/ 四个目录不许碰。表格下面那句注释是关键:「你的工作只从 app/ 接受评判。harness 会跑自己的一份 api/、data/、tests/、design/,所以你改它们没有任何作用。」
这一句就是「判定层」的最小实现。agent 花几千 token 去改 tests/ 目录里的文件,在别的项目里这种事每天都在发生,只是没人在旁边记账。
查你的账本打勾打在哪。工具说「已拾取」,还是收件人确认「已收到」。Noor 那只鸡就是这两者之间的差值。中间那句「没有指责,只记录」写得很好,但记录本身不解决问题,协议才解决。
查你接的工具是被调用了,还是只是连着。Nuxt 那个 12 工具的 MCP,5 次全连上,0 次被调用。Angular 的 MCP 是全场接得最好的,结果是全场最贵的。这两件事都不难查,你的 session 日志里就有。
bench/tokens.mjs 干的就是这件事。它遍历 stream-json transcript 的所有 assistant 事件,把每个 tool_use block 按工具名计数,最后输出一个 toolCalls 字典。你把这二十来行抄过去,就能知道自己接的那堆 MCP 到底被调了几次。
顺便说一句这个字段为什么重要。框架基准的报告里,每个框架的每一轮都记着两行:装了什么工具(Tooling:)、会话里连了几个 MCP server(MCP servers in the session:),工具名后面还跟版本号和 sha256。这两行让「连上」和「用上」可以被第三方核对——如果只有一句「我们接了 Angular MCP」,没人能判断那 5 轮里 MCP 到底起了作用没有。
查你的框架默认值有没有可能赢过你的规格。Angular 那两次 SSR 拒绝非 localhost,规格里明明写了会有反向代理。框架的默认值在 agent 内部是有优先级的,因为它出现在训练数据里,而你的规格不在。
再往上一层,是成本模型的问题。
别按「每个任务多少钱」来算账,按「这件事要跑几轮才能收尾」来算。我算出来每轮成本在 0.0314 到 0.0434 美元之间,差 1.38 倍;而轮数从 71 到 117,差 1.65 倍。轮数是你真正该盯的指标,因为轮数是那个被框架、被工具、被验证方式共同决定的变量。
而轮数为什么涨?因为产出物没法被独立验证。写不出可验证的完成定义,agent 就只能一轮一轮地确认,一轮一轮地写进 memory.md,然后一轮一轮地重复同样的错。
版本漂移也是同一类成本。SvelteKit 贵,作者给的原因是 agent 每次跑都去读 v3 的迁移指南,因为 v3 太新,不在 Opus 5.5 的训练数据里。Gracile 贵,是因为 agent 根本不认识这个框架,要么克隆仓库要么去读 node_modules 里的编译产物。
我 11 月 2 日查了 npm registry 想核对一下,结果发现实验里用的版本已经漂了几个小版本:@sveltejs/kit 从 3.1.0 到 3.1.1,@angular/core 从 22.2.3 到 22.2.4,hono 从 4.13.14 到 4.13.16,react-router 从 8.5.0 到 8.5.1。
顺手也量了装包体积。next 16.4.3 解包 187.6 MB,6 个直接依赖;@tanstack/react-start 1.169.4 只有 103.5 KB,9 个依赖;hono 4.13.16 是 1.27 MB,零依赖;@angular/core 22.2.4 是 6.9 MB。
依赖面差 1800 倍这件事,本身就是轮数的一部分。
9. 收尾那根刺
回到那个 11 分钟。
50 个 agent,3 小时,看着像在演一场「群体智能」的戏。结果它们建出来的东西是:一个被挖空的小麦方块,一份关于骨粉归属的争议,一个因为尸横遍野而全体转为保守的掩体社会,和一份 40 多次更新的配给台账。
我倒觉得,那个配给台账比那个文明更像样。
因为它记录了每一次「报告说 A,实际是 B」。它诚实地留下了「Noor 个人确认没有收到」「第二只鸡的收件人未知,Ada 已通知调查」「Odile 确认厨房交换的鳕鱼已吃:HP20 food8」这些行。台账开头第一行就写着「Reported values, not live.」,上报的值不是实时值。
文明没建起来,账本建起来了。而账本变成了那份真正有用的东西:五条交接协议。
这不是模型不行。50 个 GPT-6.1 Sol,一个都没偷懒,没一个放弃。它们只是缺一个能对它们说「不对,你再查一遍」的角色。
作者自己写了一句:「我有很强的怀疑,现在这批 MCP 和 skill 可能弊大于利。」我理解这句话,但我觉得他少说了半句。弊大于利的不是 skill 本身,是那些用被判定者的报告去判定被判定者的 skill。
所以真正的问题不是「你的 agent 够不够聪明」。是「你的 agent 做完了,你怎么知道它真做完了」。
Slok 那句话我还想再念一遍:AI 可能是个很棒的计算器,但生意里的 intelligence 大部分是 judgment。
judgment 是判定层的事。判定层现在有产品了,也有需求。
差别只在于,你是打算把这一层交给 agent 自己,还是自己搭一个。