好的 Runtime 不挑模型

A Good Runtime Does Not Care Which Model Wrote the Code

上个月我们团队换了一次 agent loop。从 Claude Code 切到 OpenCode。

切换本身很轻——prompt 改改,工作流调调,两天上手。切完第三天,周一早上打开 dashboard,CI 全绿。我松了口气,泡了杯咖啡,随手点开一条 PR 的 review 记录。

空的。

再点开一条。还是空的。咖啡没喝完就放下了。

不是代码质量出了问题。是 pipeline 里有一条规则:检测注释里的 // Generated by Claude Code 标记,命中就触发额外的 AI 代码 review 流程。OpenCode 不打这个标记。于是这条规则永远不触发,review 流程形同虚设。CI 是绿的,但绿得没有意义。

一条规则,把整个团队锁死在一个工具上。不是我们选择了 Claude Code,是基础设施绑架了我们。

我在 代码是 AI 写的了,品味住在哪里 里说,品味从代码搬到了工程系统——CI pipeline、release 节奏、事故响应。但那篇文章用的词是「harness」,而且只讨论了 harness 和 agent loop 的关系。

三个月后我意识到,那个框架已经不够用了。

2026 年的前沿 Agent 系统,不再是「一个模型 + 一个循环」的结构。它是 Foundation Model、Agent Policy、Runtime 三层的协同设计。品味不住在任何一层里,它住在三层之间的契约里。

A Good Runtime Does Not Care Which Model Wrote the Code

一、先看清今天的 Agent 长什么样

很多人对 Coding Agent 的心智模型还停留在 2024 年:

Prompt → Model → Answer
# generated by hugo AI

一次推理,一次生成,人肉验收。

但今天前沿的 Coding Agent——Claude Code、Codex、OpenCode、Devin——早已不是这个结构。它们是持续闭环:

Goal
Plan(拆解任务、选择策略)
Read(读代码、读文档、读测试输出)
Edit(修改代码)
Run(跑测试、跑 lint、跑构建)
Observe(看结果、看 diff、看 log)
Reflect(判断:对不对?够不够?要不要换方向?)
Repeat(或者 Stop)
# generated by hugo AI

真正的软件开发能力来自这个闭环的转速和质量,而不是任何一次推理的精度。

这意味着「agent loop」这个词已经不够精确了。Loop 只是 Runtime 的一个组成部分。一个完整的 Agent Runtime 至少包括:

组件职责
Loop / Scheduler驱动 Plan→Edit→Run→Observe 的迭代
Memory跨轮次、跨会话的状态保持
Tool Registry管理可用工具、参数校验、失败处理
Sandbox隔离执行环境,限制副作用半径
Checkpoint / Recovery崩溃恢复、断点续跑
Permission什么能做、什么要人确认
Context Management上下文窗口优化、渐进式披露
Parallel Execution多任务并发、子 Agent 编排

Loop 是心跳。但心脏不等于身体。

二、三层架构:Model、Policy、Runtime

2026 年,理解 Agent 系统需要一个三层模型:

┌─────────────────────────────────┐
│        Foundation Model         │
│  知识、推理、语言理解、代码生成   │
├─────────────────────────────────┤
│         Agent Policy            │
│  什么时候规划、搜索、调用工具、   │
│  验证、反思、停止                │
├─────────────────────────────────┤
│          Runtime                │
│  Memory / Tool / Sandbox /      │
│  Checkpoint / Permission /      │
│  Context / Scheduler            │
├─────────────────────────────────┤
│        Environment              │
│  代码仓库 / CI / 浏览器 /        │
│  终端 / 文件系统 / 人            │
└─────────────────────────────────┘
# generated by hugo AI

Foundation Model 决定知识和推理能力——它知道什么是好的代码,能理解需求,能生成实现。

Agent Policy 决定行为策略——什么时候该规划而不是直接动手,什么时候该搜索而不是凭记忆,什么时候该验证而不是继续推进,什么时候该停下来问人。

Runtime 提供执行基础设施——状态管理、工具调用、权限控制、崩溃恢复、上下文优化。

Environment 是真实的软件工程环境——代码仓库、CI 系统、浏览器、终端、以及最终的人类审查者。

关键洞察: 未来 Agent 的竞争越来越来自 Policy,而不仅仅来自模型参数。

同一个 Foundation Model,配上不同的 Policy,行为完全不同:

  • 一个 Policy 让 Agent 更主动——先搜索再动手,先跑测试再提交
  • 另一个 Policy 让 Agent 更保守——每步都确认,不确定就停
  • 第三个 Policy 让 Agent 更喜欢批量修改——一次改十个文件,统一验证
  • 第四个 Policy 让 Agent 更喜欢增量迭代——改一个文件跑一次测试

这些不是模型能力的差异,是 策略选择的差异

三、模型已经越来越 Agent Native

2024 年,模型是「被驱动的」。Harness 替模型思考:什么时候该搜索、什么时候该验证、什么时候该停。模型只负责在每一步生成文本。

2026 年,这个关系正在反转。

新一代 Foundation Model 已经内化了大量 Agent 能力:

  • 长轨迹推理——不是单步问答,是跨几十步的连贯推理
  • Tool Calling——原生理解工具调用的时机和参数
  • 多轮规划——先拆任务,再逐步执行,中间能调整计划
  • 自我验证——生成后主动检查,发现问题主动修
  • Retry + Reflection——失败了不是简单重试,是分析原因后换策略

这意味着 Runtime 的职责正在发生根本变化:

2024: Runtime 替模型思考
      「模型不会验证,所以我替它加一步验证」
      「模型不会规划,所以我替它拆任务」

2026: Runtime 放大模型能力
      「模型已经会验证,我提供验证的基础设施」
      「模型已经会规划,我提供规划所需的上下文」
# generated by hugo AI

从「替模型思考」到「放大模型能力」——这是 Runtime 设计哲学的分水岭。

如果你的 Runtime 还在替模型做决策(硬编码「第三步必须跑测试」),你实际上是在限制一个已经会自己判断的模型。好的 Runtime 应该提供能力(「这是测试工具,你可以随时调用」),而不是规定流程(「你必须在第三步调用」)。

四、生成侧和验收侧

回到开头那个故事。现在可以更精确地描述问题了。

生成侧是三层协同。 Foundation Model 提供推理能力,Agent Policy 决定行为策略,Runtime 提供执行基础设施。三者共同把意图变成代码。

验收侧是独立的质量系统。 lint、type check、test suite、release gate、postmortem 模板——它们定义「什么算合格」,不关心代码是怎么生成的。

生成侧(可换、可演化)              验收侧(稳定)
─────────────────────              ─────────────
Foundation Model(可换)            lint rules
Agent Policy(可调)               type check
Runtime(可升级)                   test suite
人(极端情况)                      release gate
                                   postmortem 模板
# generated by hugo AI

这两侧的关系是 契约关系:不管你用什么模型、什么策略、什么 Runtime 配置,出来的东西必须过同一套关。

类比:造纸厂定义纸的规格——克重、白度、吸墨性。它不关心你用什么笔写。钢笔、圆珠笔、毛笔,写上去不洇不透就是合格。如果一种纸只能配一种笔,那不是纸好,是纸窄。

五、挑模型的验收系统长什么样

反面比正面更有教学意义。三种常见的耦合:

一、检查来源,不检查质量。

「我们加了一条规则,检测 AI 生成的注释风格。如果是 AI 写的,触发额外 review。」

这条规则的隐含假设是:AI 写的代码比人写的更需要审查。但 2026 年的现实是:模型已经会自我验证。真正需要审查的不是「AI 写的」,是「质量不够的」。一段人写的烂代码和一段 AI 写的烂代码,对系统的伤害是一样的。你按来源分流,等于放过了人写的烂代码,同时给 AI 写的合格代码加了不必要的摩擦。

正确做法:检查质量标准本身。覆盖率低于阈值就拦,不管谁写的。

二、把验收标准塞进 Agent Policy。

「我们的 prompt template 里规定了代码风格,所以 CI 里不再检查格式。」

这条比第一条危险得多——因为它看起来是绿的。你把验收标准从验收侧挪到了生成侧的 Policy 配置里。Policy 是生成侧的策略——换一个模型、调一次策略、升一次 Runtime,验收标准就无声无息地蒸发了。CI 还是绿的,但绿是因为没有人在检查。

正确做法:验收标准永远在验收侧。Policy 里可以写风格偏好(提高一次通过率),但 CI 里必须有独立的格式检查(兜底)。

三、测试适配 Runtime 的输出结构。

「这个集成测试只在 Claude Code 生成的代码上跑,因为 Cursor 生成的目录结构不一样,测试路径对不上。」

这是最隐蔽的耦合。你的测试在适配生成侧的输出特征,而不是验证系统行为。模型一换、Policy 一调、Runtime 一升级,测试就废。或者更糟——测试还在跑,但测的不是你以为的东西。

正确做法:测试验证行为,不验证结构。「调用这个 API 返回 200」是行为测试。「src/controllers/user.ts 文件存在」是结构测试。前者不挑工具,后者挑。

六、不挑模型的验收系统怎么搭

正面说。四条原则:

一、检查质量标准,不检查生成来源。

lint 规则不关心代码是人写的还是 AI 写的。type check 不关心类型标注是手打的还是模型补的。测试不关心实现是 Copilot 补全的还是你手敲的。

如果你的验收系统里有任何一条规则需要知道「这段代码是怎么来的」才能决定怎么检查,把它改成「这段代码是否满足质量标准」。

二、验收标准独立于生成配置。

Policy 里写的规则是 建议——提高一次通过率,减少返工。CI 里写的规则是 法律——不管你怎么生成的,过不了就不能合。

两者可以重叠(Policy 里说「用 4 空格缩进」,CI 也检查缩进),但不能只有前者没有后者。建议可以换,法律不能换。

三、测试验证行为,不验证结构。

✅ 行为测试(不挑模型):
   POST /api/orders → 201, body 包含 order_id
   输入非法金额 → 400, error message 包含 "amount"

❌ 结构测试(挑模型):
   src/services/order_service.py 存在
   类名是 OrderService
   方法签名是 def create_order(self, data: dict)
# generated by hugo AI

结构是生成侧的选择。不同模型、不同 Policy、不同 Runtime 配置会给出不同的结构——有的拆三个文件,有的合一个文件,有的用 class,有的用函数。只要行为对,结构不该是验收标准。

四、验收系统的演进由事故驱动,不由工具驱动。

代码是 AI 写的了,品味住在哪里 里我说过:有品味的工程师,每次事故都让工程系统变厚一层。

这里补一条:变厚的方向应该是「堵住质量漏洞」,不是「适配新工具」。

✅ 事故驱动(稳定):
   上次因为没检查空指针,线上崩了 → 加 null check lint rule
   上次因为没跑集成测试,API 契约破了 → 加 contract test

❌ 工具驱动(脆弱):
   换了 Claude Code,它生成的代码喜欢用 any → 加 no-any 规则
   换了 Cursor,它爱生成 utils.ts → 加文件数量检查
# generated by hugo AI

第一种规则,不管用什么模型都有效。第二种规则,模型一换就过时。

七、Runtime 与模型的共同演化

到这里,文章的核心论点已经清楚了:验收侧不应该耦合生成侧。

但 2026 年还有一个更深的趋势,不讨论就不完整: Runtime 和 Foundation Model 正在共同演化(co-evolution)。

什么意思?

不同 Runtime 会让同一个 Foundation Model 呈现完全不同的行为。同一个 Claude Sonnet,在 Claude Code 的 Runtime 里更激进(大范围重构、批量修改),在 Cursor 的 Runtime 里更保守(小步修改、频繁确认),在一个自研 Runtime 里可能更像一个初级工程师(严格遵循 checklist)。

这不是模型变了,是 Runtime 的 Policy、上下文管理、工具编排 改变了模型的行为表达。

更深的趋势:Runtime 的执行反馈正在回流到模型训练。

Runtime 执行
产生信号:Test Results / Logs / Git Diff / Human Feedback
信号回流到模型训练(RLHF / RLAIF / Online Learning)
模型行为改变
Runtime 策略调整
(循环)
# generated by hugo AI

这意味着:

  • Model Team 和 Runtime Team 不会永远独立。 当 Runtime 的执行数据成为模型训练的核心输入,两个团队必须协同设计。
  • Runtime 不只是「包装模型」。 它在塑造模型。一个提供丰富测试反馈的 Runtime,会让模型越来越擅长写可测试的代码。一个只有 lint 反馈的 Runtime,会让模型越来越擅长过 lint 但不擅长写正确的逻辑。
  • Agent 的竞争不只是模型参数的竞争。 是 Model × Policy × Runtime 整个系统的竞争。

这对验收侧意味着什么?

验收侧的价值更大了,不是更小了。 当生成侧三层在共同演化、快速迭代时,验收侧是唯一稳定的锚点。模型会换,Policy 会调,Runtime 会升级——但「API 契约不能破」「覆盖率不能低于 80%」「安全漏洞不能进主干」这些质量底线不会变。

生成侧越动态,验收侧越重要。

八、和信任架构的同构

写到这里我发现,这个设计原则不是新发明——它和 Agent 时代的权限:从 RBAC 到五层信任架构 是同构的。

五层信任架构里,Agent Proxy 不关心 Agent 内部怎么推理。它只校验:你是谁(身份)、你能做什么(权限)、你替谁做(委托)、你怎么证明(凭证)。Agent 的推理过程是黑盒,Proxy 不介入。

验收系统对生成侧的关系一模一样:

信任架构验收系统
Agent Proxy 不关心 Agent 怎么推理验收系统不关心代码怎么生成
校验身份、权限、凭证校验质量、行为、契约
Agent 被劫持了,Proxy 兜住生成侧输出垃圾了,验收侧拦住
凭证不进入 Agent 运行环境验收标准不进入生成配置

两侧解耦的核心收益是:任何一侧出问题,另一侧兜得住。

Agent 被 prompt injection 劫持了,Proxy 的短期凭证机制限制损害半径。生成侧三层协同出了 bug——模型幻觉、Policy 误判、Runtime 状态丢失——验收侧的质量门禁拦住它进入主干。你不需要信任生成侧,因为验收侧是独立的。

反过来,如果两侧耦合了——验收标准写在 Policy 里、测试适配 Runtime 的输出结构、检查规则按模型来源分流——那生成侧一出问题,验收侧同时失效。两道防线变成一道,而且是你看不见的那道。

九、一个思想实验

假设明天所有 Foundation Model 都退回到 2024 年的水平。没有长轨迹推理,没有原生 Tool Calling,没有自我验证。

你的验收系统还能用吗?

如果答案是「能」——lint 还在跑,测试还在过,release 节奏不变,postmortem 模板不变——说明你的验收系统是模型无关的。它检查的是工程质量,不是模型能力。

如果答案是「不能」——有些规则失效了,有些测试跑不了了,有些流程断了——说明你的验收系统里混入了模型适配逻辑。那些逻辑在模型能力变化的瞬间就变成了死代码。

这个思想实验的价值不在于「模型真的会退步」——当然不会。它是一块试金石:帮你把验收系统里的每一条规则分成两堆——质量底线 (永远需要)和 生成侧适配 (模型换了就该删)。如果你的验收系统经不起这个实验,说明第二堆混进了第一堆。

最后

回到开头那次工具切换。

那条检测 // Generated by Claude Code 的规则,我当天就删了。换成了一条不挑模型的规则:所有新增代码必须有对应的测试覆盖,覆盖率低于 80% 的 PR 不能合。不管代码是 Claude Code 写的、OpenCode 写的、还是实习生手敲的,标准一样。

切换工具的成本从「改 CI + 改测试 + 改流程」变成了「改 Policy 配置」。两天搞定。

但这次经历让我想明白了一件更大的事:

2026 年,Frontier AI 不再是单一模型的竞争,而是 Foundation Model、Agent Policy 与 Runtime 的协同设计。 模型在变,Policy 在调,Runtime 在升级——三者共同演化,越来越难分开。

在这个快速演化的生成侧面前,验收侧是唯一不动的锚。

Agent loop 是笔,Runtime 是纸的规格。好的纸不挑笔。而 2026 年的笔,正在自己学会写字。

去翻一遍你的 CI pipeline。有没有一条规则,只有当前模型在的时候才成立?有没有一条测试,只有当前 Runtime 的输出结构下才能跑?如果有,它们不是质量底线,是生成侧依赖。趁还没换模型,把它们改成不挑模型的版本。

换模型那天你会发现,最贵的成本不是学新工具,是拆旧耦合。

你在团队里换过 AI 编码工具吗?验收系统跟着改了多少?欢迎留言讨论。


See also