每个人都必须使用的 AI Agent 技术栈:GPT-5.6 + Fable 5(开发者指南)

@Av1dlive
英语2天前 · 2026年7月13日
183K
145
27
38
380

TL;DR

本综合指南概述了使用 GPT-5.6 和 Claude Fable 5 构建高性能 AI Agent 技术栈的 12 个步骤,重点涵盖验证、路由和成本管理。

引言

你拥有两个目前最强大的通用模型,却还在逐个手动使用它们。

过去一个月发生了三件事。

  • Claude Fable 5 能够跨阶段规划,派遣自己的子 Agent,并验证自己的输出。输入 $10/百万 token,输出 $50/百万。
  • GPT-5.6 于 7 月 9 日发布,分为三个永久层级。Sol 为 $5 和 $30,Terra 为 Sol 的一半,Luna 为 $1 和 $6。OpenAI 现在将路由决策本身作为产品出售。
  • Fable 5 在 6 月被暂停了 19 天,受出口管制令影响。可用性现在成了一个需要你应对的问题。

随意使用这些模型,它们只是生成令人印象深刻却错误百出的东西的昂贵方式。

在一个系统内使用它们,它们就是你能租到的最接近员工的东西。Anthropic 的企业数据表明,Claude Code 每个活跃开发人员每天的成本约为 $13。OpenAI 将 Codex 的价格定为每月 $100 到 $200。

本指南将分十二个构建步骤搭建该系统:实际的文件,按顺序排列,每个都在发布前经过测试,并且每个步骤之后都有一个检查点,这样你在堆叠下一个部分之前就知道当前部分能正常工作。

它适用于任何拥有代码仓库、终端以及任一 CLI 访问权限的人。示例是代码风格的,因为"循环"概念是围绕代码发展起来的,但路由器、顾问和门禁系统同样适用于发票和报告。

请按顺序阅读,并完成每个检查。每个构建步骤需要 10 到 20 分钟,总共大约两小时。最后的 30 天是系统赢得无需你监督运行权力的时间表。

以下三个原则预测了下面的每个设计决策:

  1. 在边界处进行路由。先考虑努力程度,再考虑模型。 在会话中途切换模型会烧掉价值 90% 的缓存折扣。在同一个模型上提高思考努力程度在管道方面不增加额外成本。
  2. 没有人给自己的作业打分。 编写者、路由器、顾问和审阅者是不同的角色,尽可能来自不同的模型系列,最终投票由一个 bash 脚本做出。
  3. 完成是环境的一个事实。 一个通过的测试套件、一个勾选的任务文件、一行判决结果。绝不是模型对自身的看法。

路线图,以及为什么通常的路线图是错误的

循环工程是一种具有明确停止条件和重试逻辑的 Agent 工作流。是主控程序决定工作何时完成,而不是把"我完成了吗"这个问题留给模型。

标准的图示是 swyx 的 Loopcraft 栈:五个循环相互嵌套,执行循环嵌套在任务循环内,任务循环嵌套在产品循环内,产品循环嵌套在系统循环内,系统循环嵌套在监督循环内,每个循环都有自己的出口。这是目前最好的图示。

我用了好几周。然后我尝试基于它进行构建,结果在四个地方出了问题。

1) 问题一:循环并非嵌套关系。

嵌套意味着外层循环运行一次等于内层循环完整运行一次。但实际情况并非如此。系统循环不会等待产品循环完成。它每周日都会运行,无论是否有东西发布。

你可以手动中断一个 token 流,而无需展开四层结构。这是一幅基于一个执行交接的系统所绘制的包含关系图。

2) 问题二:画成无限循环的图示就是一张账单。

原始图示把产品循环画成了无限循环。实际上,它会在预算用尽、到达检查点,或者有人失去耐心时结束。

称之为"非设计目标"恰恰掩盖了 Agent 系统中资金流失的确切位置:一个没人告诉它如何退出的循环。

3) 问题三:没有中止机制。

每一层都有成功结局,但没有失败结局。真实的循环两者都需要:它如何正常结束,以及它如何在无法继续时停止。

我见过的每一个失控的账单,都是一个定义了退出条件但没有定义中止条件的循环。

4) 问题四:验证缺失,而验证才是关键。

验证是层与层之间的契约。当下层循环向上层循环传递的是报告而非事实时,上层循环就会基于一个谎言而结束。

这一个缺口就是为什么循环可能达到其停止条件却仍然是错误的。

以下是我基于其进行构建的版本。

证据阶梯

六个层级,每个两个出口,一条规则:控制作为目标向下流动,证据作为事实向上流动,并且任何层级都不能基于其下一层级的报告而关闭。

Avid - inline image

从该形状中得出五条定律。

每个层级都有一个中止条件,否则它就是一张账单。 如果你无法说出一个循环会如何糟糕地结束,那么你就构建了一个订阅。这就是为什么 ralph.sh 带有两个上限,而 swarm 带有一个周期上限。

证据向上流动,控制向下流动。 一个层级基于其下方产生的事实而关闭,绝不基于其下方产生的摘要而关闭。

工厂门禁就是这条定律在 SQL 中的体现。两位审阅者都亮绿灯。门禁仍然拒绝,因为没有人产生一条通过的测试数据行。

一个判决是意见。一行数据是证据。

每层级的单次运行成本大约增加十倍。

一个从第二层级逃脱的 bug,在第三层级捕获的成本是十倍,在第四层级则是一百倍。

这就是为什么要把你最好的验证放在尽可能低的层级上的全部原因,也是为什么门禁是一个 bash 脚本而不是一个会议。

时间尺度属于模型,而不是属于层级。

第二层级在 2024 年需要几分钟,在 2026 年需要几小时,很快将需要几天。要针对退出条件进行设计,永远不要针对时钟进行设计。这就是旧图示过时最快的地方。

只有第五层级没有退出条件,而这正是"人类"的含义。

你住在那里。阶梯的存在是为了赢得一句话:一个循环可能达到其停止条件却仍然是错误的。

测试通过,门禁变绿,两位审阅者都签字,但最后一次提交仍然是个错误。你之下的每一层级的存在,都是为了把这个检查变得更小。但没有任何一层能替你完成这个检查。

先决条件

bash
1claude CLI(Claude Code),具备 Fable 5 访问权限
2codex CLI,具备 GPT-5.6 访问权限 # 或 Claude Code 内的官方插件
3python3, jq, git, gh, make, cron
4一个今天就能正常运行的代码仓库及其测试命令
5
6# 可选,用于混合舰队(构建 7):
7openai/codex-plugin-cc # 官方:在 Claude Code 内运行 Codex
8claude-model-switch # 本地代理:Claude Code 背后的任何提供商
9CLIProxyAPI # 将 CLI 订阅封装为 API 端点

你要构建的内容

markdown
1your-repo/
2 CLAUDE.md # 构建 1:Claude 端的"宪法"
3 AGENTS.md # 构建 1:Codex 端的"宪法"
4 .claude/
5 skills/model-bench/SKILL.md # 构建 0:价格、API ID、回退方案。唯一包含数字的文件
6 skills/model-router/SKILL.md # 构建 4
7 skills/stuck-protocol/SKILL.md # 构建 5
8 skills/ship-gate/SKILL.md # 构建 2
9 agents/fable-expert.md # 构建 5
10 agents/fresh-eyes-reviewer.md # 构建 6
11 agents/sol-reviewer.md # 构建 6
12 agents/scout.md # 构建 7
13 loop/
14 ralph.sh # 构建 3:心跳
15 two_lane.sh # 构建 6:跨供应商审阅循环
16 PROMPT.md TASKS.md # 构建 3:工作协议
17 gate/
18 verify.sh # 构建 2:确定性最终投票
19 eval_gate.py eval/cases.jsonl # 构建 2:路由变更门禁
20 router/
21 router.py # 构建 4
22 advisor_loop.py # 构建 5
23 ~/.codex/
24 config.toml # 构建 0:luna/terra/sol 配置文件
25 prompts/effort.md # /effort 评估任务,指定座位
26 prompts/plan-stop.md # /plan-stop 规划,定价,然后停止
27 prompts/fable-advice.md # /fable-advice 跨供应商专家咨询
28 prompts/review-hostile.md # /review-hostile 干净上下文下的判决
29 prompts/compost.md # /compost 失败转化为法则,每周执行
30 factory/
31 factory_gate.py # 构建 8:黑板 + 完成门禁
32 factory.sh # 构建 8:概要 -> 实现 -> 审阅 -> 门禁
33 factory.db # 构建 8:决定结果的数据行
34 swarm/
35 swarm.sh # 构建 9:规划 -> 派遣 -> 评分 -> 重新规划
36 goals.jsonl # 构建 9:每行一个目标,每个目标带有其检查
37 system/
38 verify_goals.py # 构建 10:每日重新验证,永久运行
39 goals/ # 构建 10:每件完成的事情一个文件
40 ROUTING.md # 构建 12:完整的路由策略,两个主控程序
41 progress.log # 每个构建步骤都会追加内容
42 # 可选(构建 7):claude-model-switch 代理在 localhost:4000,
43 # CLIProxyAPI 用于将 CLI 订阅封装为 API 端点

构建 0:配置引擎

在编写你自己的任何文件之前,先设置好这些。下方每个数字在发布当周均经过官方定价页面验证。

席位榜:2026 年 7 月所有可用席位

系统可以雇佣的候选名单。

价格存储在一个技能文件中,.claude/skills/model-bench/SKILL.md,在任何路由或成本问题之前按需加载。没有其他文件硬编码数字。

在本文撰写前的六周内,价格变动了三次。 文章中的价格在发布时就是错的。技能文件中的价格只需一次编辑。

Avid - inline image

这个决定后续一切的分歧点:

  • Fable 5 在繁重的软件工作上领先。 在 SWE-Bench Pro 上达到 80%,而 Sol 为 64.6%,并且在整体智能上略优于 Sol。
  • Sol 在终端和 Agent 工作上领先。 在 Terminal-Bench 2.1 上达到 88.8%,在编码 Agent 指数上排名第一,成本约为 Fable 每任务成本的三分之一。

这个分歧点就是这个系统采用双供应商的原因。Fable 负责判断和规划,Sol 负责审阅和驱动终端,而两者都不负责大量的打字工作。

Avid - inline image

两个人们容易误解的席位。

Opus 4.8 不是那个被遗忘的旧旗舰。 它是 Fable 下的自动回退方案,也是复杂 Agent 编码的推荐默认选项。无论你是否计划使用它,你的系统都会继承它。

处于入门价格的 Sonnet 5 是整个项目板上性价比最高的。 能力接近 Opus 4.8,而输入价格仅为 Fable 的一小部分,这就是为什么它在本构建中到处是默认执行器。该价格将于 8 月 31 日到期,而技能文件已经知道这一点。

那个技能文件是系统中唯一包含数字的文件:

markdown
1---
2name: model-bench
3description: 当前价格表、API 模型 ID 以及本系统可以雇佣的每个模型的回退链。在任何路由决策、成本估算、预算问题、模型比较之前加载,或当用户询问某物成本时加载。
4---
5
6# 模型基准
7
8价格和 API 标识符的唯一真实来源。此仓库中没有任何其他文件硬编码价格,因此当实验室调整费率时,你只需编辑此文件,无需其他操作。于 2026-07-13 验证。价格会变动。在制定预算前请重新验证。
9
10## Anthropic(Messages API,/v1/messages)
11
12努力程度:output_config {"effort": "low|medium|high|xhigh|max"}。Fable 5 始终开启自适应思考,无法禁用。max_tokens 限制思考加响应文本的总和,因此在高级别及以上设置较大的值(从接近 64k 开始),否则模型会在思考中途用尽空间。
13
14| 模型 | 每百万 token 输入/输出 | 缓存读取 | 席位 |
15|---|---|---|---|
16| claude-fable-5 | $10/$50 | $1.00 | 指挥者、规划者、顾问、法官。自动回退到 opus-4-8 |
17| claude-opus-4-8 | $5/$25 | $0.50 | 遵守保留规则时的指挥者 |
18| claude-sonnet-5 | $2/$10(至 8 月 31 日,之后 $3/$15) || 默认编码执行器 |
19| claude-haiku-4-5 | $1/$5 | $0.10 | 侦察兵、子 Agent、机械性工作 |
20
21Fable、Opus 4.8、Sonnet 5 的上下文为 1M,长上下文统一价格,这就是为什么长读取任务会路由到这里。最大输出 128K。
22
23## OpenAI(Responses API,/v1/responses)
24
25| 模型 | 每百万 token 输入/输出 | 已缓存 | 席位 |
26|---|---|---|---|
27| gpt-5.6-sol | $5/$30 | $0.50 | 跨供应商审阅者,终端工作 |
28| gpt-5.6-terra | $2.50/$15 | $0.25 | Codex 日常驱动(先与 Luna 测试对比) |
29| gpt-5.6-luna | $1/$6 | $0.10 | 机械性工作,静默检查 |
30
31超过阈值的长上下文输入价格大约翻倍,这与 Anthropic 的 1M 统一价格层级不同。首个具有明确缓存断点系列的模型;写入成本为 1.25 倍。
32
33## 开放权重模型(批量工作者)
34
35| 模型 | 每百万 token 输入/输出 | 缓存命中 |
36|---|---|---|
37| deepseek-v4-flash | $0.14/$0.28 | $0.0028(大约 98% 折扣) |
38| deepseek-v4-pro | $0.435/$0.87 ||
39| kimi-k2.7-code | $0.95/$4.00 | $0.19 |
40
41## 可叠加的折扣
42 - 两个实验室的缓存读取成本均为新鲜输入的十分之一(约 90% 折扣)
43 - 缓存写入在读取一次后(5 分钟)或两次后(1 小时)即可收回成本
44 - 批量 API 双向均为 50% 折扣
45 - 批量 + 对重复前缀的缓存读取,总折扣接近 95%
46 - Anthropic 最新的分词器对相同文本生成的 token 数量大约多 30%,因此实际成本高于标价。按实际成本预算。
47
48## 如何回答成本问题
49 1. 分别估算输入和输出。Agent 每写 1 个 token 大约读取 100 个 token,因此输入占主导地位,缓存命中率决定账单。
50 2. 对重复前缀应用缓存读取率,而不是基础费率。
51 3. 将 Anthropic 的数字乘以约 1.3 以考虑分词器影响。
52 4. 给出一个范围,说明假设条件,并指出你使用了此文件的哪一行。
53 5. 如果数字超过仓库的每日上限,请在运行任何操作之前说明。
54
55除非你从本文件中读取,否则绝不给出价格。本文件未列出的模型不在候选名单上,添加模型属于需要通过门禁的路由变更。

七个改变你构建方式的事实:

  1. 两个实验室的缓存输入均为 90% 折扣。 系统提示中的一个时间戳会在每次调用时烧掉这个折扣。稳定的前缀,仅追加的历史记录,始终如此。Agent 每写 1 个 token 大约读取 100 个 token,因此这个折扣是你大部分账单。
  2. 缓存写入额外收费,但很快收回成本。 Anthropic 的 5 分钟写入收费 1.25 倍,且在一次读取后即可盈亏平衡。GPT-5.6 是 OpenAI 首个具有明确缓存断点和定价写入的系列。要像系统程序员围绕内存层次结构进行架构设计那样,围绕缓存进行架构设计。
  3. 最新的 Anthropic 分词器对相同文本大约多生成 30% 的 token。 实际成本高于标价。按实际成本预算。
  4. Fable 5 的安全拒绝不是错误。 调用成功,工作会按设计落在 Opus 4.8 上,这种情况发生在不到 5% 的会话中。要读取实际发生的情况,而不仅仅是退出代码,并在你需要之前配置好回退链。
  5. 不要默认选择中间层级。 独立测试发现,某些 Luna 或 Sol 设置在成本-质量边界上总是优于 Terra。在你自己的流量上先测试 Terra 与 Luna 的对比,然后再为它付费。
  6. 批量 API 可将任何可以等待过夜的任务成本减半, 并且折扣与缓存可叠加:批量工作中重复前缀的运行成本接近 95% 折扣。构建 7 中的夜间运行器就是为了利用这一点。
  7. 可用性是一种运营风险,而不是假设。 Fable 5 在 6 月损失了 19 天。此处的每个模型引用都有回退方案:fable-5 回退到 opus,sol 回退到 terra,并且每次回退都会被记录。

第二个计量器:一个席位不是 API 密钥

上面的每个数字都是以每百万 token 美元计价的。如果你按次付费,这是正确的货币。

如果你在 $200 的 Codex Pro 席位或 Claude Max 席位上运行它,这就是错误的货币。

在席位上,计量器是一个五小时窗口和一个每周窗口,两者共同评估,一个请求会同时消耗两个窗口的配额。

你可能在周维度上很充裕,但仍然被锁定四小时,因为一条消息就消耗了短窗口的配额。

同样的原则。不同的货币。三个设置决定了一条消息可以占用一个窗口的多少配额:

Avid - inline image

快速模式是昂贵的那个,因为它乘以一个刚刚变大的数字。

GPT-5.6 每条消息的运行时间远长于 5.5。这大多是个礼物。但它也使消耗变得不可预测。

  • Theo 报告在 Sol 上消耗了超过 $200,000 的 token
  • 他目睹过一条 5.6 消息消耗了五小时窗口的 15%
  • 按乘数计算,这相当于一条消息消耗了窗口的 40%

速度不是免费的。它向你收取的 token 是你本来就要消耗的。在信任它之前,重新阅读速度文档上的乘数:它是按模型发布的,并且会变动。

Ultra 是更隐蔽的陷阱,因为界面把它放在努力程度级别所在的位置,但它并不是其中之一。

  • Max 是深度。一个模型,一个问题,在一个推理链上花费更多时间。
  • Ultra 是宽度。工作分发给四个 Agent,然后合成。
  • 不同的维度。Ultra 不是"比 max 更多"。

指向一个并不能真正拆分的任务,Ultra 会购买四个 Agent 重复同一项调查。

它在 Terminal-Bench 2.1 上价值大约 3.1 分(88.8 到 91.9),代价是整个舰队的消耗。在子问题之间的边界真实存在之前,保持关闭。

为什么 Sol 和 Terra 都是正确的默认值

一份现场报告几乎在所有事情上都使用 Sol。上面的基准表将 Terra 设为 Codex 的日常驱动。两者都是正确的,而计量器就是原因。

  • 费率卡显示 Sol 的输出成本是 Terra 的两倍
  • 席位显示你已经支付了
  • 因此唯一实时的问题是达到绿灯需要多少次运行
  • 一个更强、努力程度较低的模型通常需要的次数更少

费率不是成本。成本是费率乘以达到绿灯所需的运行次数,而第二个项才是变动的那个。

这也就是构建 4 的法则从另一个方向到来:在调整拨盘之前,先升级席位。在 $200 层级上,高努力程度的 Sol 的席位,低于它的是低努力程度的 Sol。在相信任何一个之前,先进行测量。

现在设置 Codex 层级:

text
1# ~/.codex/config.toml
2model = "gpt-5.6-terra" # 日常驱动
3model_reasoning_effort = "medium"
4# service_tier = "fast" # 保持注释状态。快速模式按 2.5 倍计费
5 # 积分。运行 /fast status 确认你
6 # 尚未进入该模式。
7
8[profiles.fast] # 机械性工作。不是"快速模式":此
9model = "gpt-5.6-luna" # 配置文件是一个更便宜的模型,而不是 2.5 倍
10model_reasoning_effort = "low" # 计量器。两个不同的东西,同一个词。
11
12[profiles.deep] # 规划、棘手的错误、审阅
13model = "gpt-5.6-sol"
14model_reasoning_effort = "high"

检查 0:两个 CLI 都能认证,并且你的测试命令在当前仓库上退出码为 0。

构建 1:"宪法"

这些模型遵循法律并围绕提示进行优化,因此每一行都需要一个数字、一个"绝不",或者一个检查它的命令。

创建 CLAUDE.md:

markdown
1# CLAUDE.md
2
3## 绝不(例外需要先询问)
4- 绝不在会话中途切换模型。路由仅在会话和子 Agent 边界处发生。中途切换会烧掉缓存。
5- 绝不审阅你自己的 diff。审阅必须来自一个全新的上下文或不同的模型系列。Devin 的审阅者之所以能每个 Agent PR 捕捉 2 个 bug,正是因为它与编写者没有任何共享信息。
6- 绝不编辑、削弱或删除测试以使其通过。自动 FAIL。
7- 绝不根据自我评估报告完成。完成 = gate/verify.sh 通过。
8- 绝不进行第四次顾问咨询。三次未命中 = BLOCKED,轮到人类。
9- 绝不合并 eval_gate.py 判定为 BLOCKED 的路由或提示变更。
10- 绝不在两个上限都未设置的情况下运行任何循环:MAX_ITERS 和 BUDGET_USD。
11- 绝不要假设前沿模型可用。回退方案:fable-5 -> opus,sol -> terra。将每次回退记录到 progress.log。
12- 绝不生成未经要求的子 Agent。子节点继承父节点的模型和努力程度,因此一个热心的舰队会继承昂贵的席位。
13
14## 派遣(第一个匹配获胜)
15| # | 任务 | 席位 |
16|---|---|---|
17| 1 | 规划 / 架构 / 迁移 | fable-5 规划,sonnet 执行 |
18| 2 | 提取 / 格式化 / 测试 / 文档 | haiku 或 luna |
19| 3 | 上下文超过 60k token | Anthropic 1M 统一价格层级 |
20| 4 | 对 Agent 编写的代码进行审阅 | 通过 codex 使用 sol,原生主控程序 |
21| 5 | 不明确 | 难度评分:0-1 便宜,2 sonnet,3+ 前沿 |
22| 6 | 仍然不确定 | 先用便宜的跑一次,验证,失败时升级一次 |
23
24## 完成
25- 每项任务在工作开始前都带有一个机器可检查的 done_when 条件。
26- 一个全新上下文的审阅者只根据规格与 diff 进行判断,不参考其他内容。
27- gate/verify.sh 持有最终投票权。一个项目上出现两次制造者/检查者分歧 -> 停止,排队等待人类处理。

在仓库根目录创建 AGENTS.md,用 Codex 的语言表达同样的法律。保持在大约 100 行,是一份目录,而不是百科全书:

markdown
1# AGENTS.md
2
3## 命令
4| 用途 | 命令 |
5|---|---|
6| 测试 | make test (此命令即完成的定义) |
7| 代码检查 | make lint |
8
9## 会话协议
101. 先阅读 progress.log 和 TASKS.md。2. 一个未勾选的任务。
113. 实现,运行完整的测试套件,仅在绿色时提交,描述性消息。
124. 勾选任务,在 progress.log 中追加一行,停止。
13测试定义完成。绝不削弱、跳过或删除测试。错误的测试 = 将任务标记为 BLOCKED 并说明原因。
14
15## 模型策略
16默认:terra,中等努力程度。机械性:配置文件 fast(luna,低)。
17规划和棘手的错误:配置文件 deep(sol,高)。
18先考虑努力程度,再考虑模型。配置文件在会话开始时选定,绝不在任务中途更改。
19快速模式关闭(2.5 倍积分)。Ultra 关闭。这两者都不是努力程度级别。
20只有当我要求时,才生成子 Agent。子节点继承本次会话的模型和推理级别,因此一个高努力程度的热心生成就是一个高努力程度的整个舰队。
21
22## 卡住
23信号:相同的错误两次;两个无进展的步骤;一个测试在两次不同的修复后仍然失败。然后使用 /fable-advice。最多 3 次咨询,然后 BLOCKED。
24
25## 审阅
26在任何合并之前,在一个全新的会话中使用 /review-hostile,或者从 Claude 端使用跨供应商通道。绝不合并你自己未经审阅的工作。

有一条原则必须在双方都生效,否则,无论你切换哪个工具,习惯更松懈的那一方每次都会赢。

检查 1:对于每一行,问自己模型是否能在 80% 的程度上遵守并声称成功。如果是,就用一个数字或一个"绝不"来重写它。wc -l CLAUDE.md 应低于 60。

构建 2:门禁

在构建任何其他东西之前,必须有一个 bash 脚本持有最终投票权,因为后面的每个构建都依赖于它。

为你的技术栈创建 gate/verify.sh:

bash
1#!/usr/bin/env bash
2set -e
3npm run typecheck --if-present
4npm test --if-present
5npm run lint --if-present

创建 gate/eval_gate.py,作为未来每次路由或提示变更的安全带。它通过当前配置和提议配置运行 50 到 500 个保留案例,仅使用确定性检查:

python
1for case in cases: # {prompt, must_include, must_not_include, max_words}
2 hits += passes(case, run_config(case.prompt))
3verdict = "SHIP" if new_score >= old_score - 0.02 else "BLOCKED"

然后,将门禁设置为不可跳过的技能,.claude/skills/ship-gate/SKILL.md:

markdown
1---
2name: ship-gate
3description: 在任何路由、模型或提示词变更上线前,运行评估门禁。当用户要求更改路由规则、切换模型层级、编辑系统提示词、调整努力程度,或合并任何涉及路由、提示词或模型配置的内容时使用。
4---
5
6# 发布门禁
7
8任何对路由或提示词的更改都是一场质量赌博,直到门禁说没问题为止。这个技能的存在就是为了确保这种赌博不会悄无声息地上线。
9
10 1. 找到 eval/cases.jsonl。如果不存在,立即停止,并告诉用户先从真实流量中构建 50 到 500 个代表性案例。不要自行编造案例。
11 2. 运行:python3 eval_gate.py eval/cases.jsonl,对比当前配置与提议配置。
12 3. 阻止:报告两个分数,列出哪些案例出现了回归,不应用更改,建议能够通过门禁的最小回滚方案。
13 4. 放行:应用更改,并在 progress.log 中追加一行,记录两个分数。
14
15硬性规则:
16 - 永远不要覆盖"阻止"裁决,即使对方礼貌请求也不行。将失败的案例附上,上报给人类。
17 - 永远不要在同一个会话中同时编辑案例文件和路由更改。门禁和更改必须由不同的人完成。
18 - 成本数字不能作为质量下降的辩护理由。门禁拥有最终决定权。

门禁只使用确定性检查,因为它绝不能继承"谁来验证验证者"的问题。没有评估门禁的路由更改,就是在拿客户做成本实验。

检查 2:./gate/verify.sh 今天退出码为 0,且 eval_gate.py 在其演示中输出"SHIP"。如果 verify.sh 现在失败,先修复它再做其他事。系统依赖这个脚本。

构建 3:心跳

模型带来智能。循环带来纪律。

  • 每次迭代的新鲜上下文防止上下文腐烂
  • 仓库承载所有记忆
  • 两个上限将失控的 Agent 变成十美元的教训

这正是 Anthropic 16 次循环运行背后的精确形态,该运行以约 20,000 美元构建了一个 100,000 行的 C 编译器,且没有任何编排模型。

创建 loop/PROMPT.md:

markdown
1读取 progress.log 和 TASKS.md。选择恰好一个未勾选的任务。
2实现它。运行测试。如果通过:用描述性消息提交,勾选任务,在 progress.log 中追加一行,停止。
3如果同一个任务失败两次,将其标记为"阻塞"并附上错误,停止。
4仅当所有任务都已勾选且完整测试套件通过时,才创建名为 DONE 的文件。永远不要为了通过测试而编辑测试。

创建 loop/ralph.sh:

bash
1#!/usr/bin/env bash
2set -u
3MAX_ITERS="${MAX_ITERS:-25}" # 上限一:迭代次数
4BUDGET_USD="${BUDGET_USD:-10}" # 上限二:美元预算
5MAX_FAILS=3; fails=0; spent=0; i=0
6
7while [ ! -f DONE ] && [ "$i" -lt "$MAX_ITERS" ]; do
8 i=$((i + 1))
9 # 每次迭代全新会话:除仓库本身外不保留任何记忆
10 claude -p "$(cat PROMPT.md)" --max-turns 30 \
11 --output-format json > out.json 2> err.log \
12 && fails=0 || fails=$((fails + 1))
13 [ "$fails" -ge "$MAX_FAILS" ] && exit 2 # 断路器
14 cost=$(jq -r '.total_cost_usd // 0' out.json)
15 spent=$(awk -v a="$spent" -v b="$cost" 'BEGIN{printf "%.4f", a+b}')
16 awk -v s="$spent" -v c="$BUDGET_USD" 'BEGIN{exit !(s>c)}' && exit 3 # 上限
17 sleep 2
18done
19[ -f DONE ] && echo "done in $i ticks, \$$spent" || echo "cap hit, \$$spent"

将 claude 行替换为 codex exec,同样的循环就能驱动 GPT-5.6。

退出码的设计是有意为之:0 表示完成或静默,2 表示断路器,3 表示预算。 构建 12 中的所有警报都基于这些退出码。

成本行读取会话自身的 JSON 成本报告,因此上限由 harness 根据实际支出强制执行,而非估算。

数一下那个提示词中的停止点。每个分支都以停止结束,这不是毛病,而是设计。

这一代模型每次消息的运行时间比上一代长得多。这大多是好事,但偶尔也会变成账单,因为一个不再需要鼓励就能继续的模型,会在你希望审视它的那个点之后多走四步。

循环从结构上解决了这个问题:每个 tick 一个任务,结束时硬性停止。

在交互式使用中,你必须明确说出来。两个提示词就能完成工作:

  • "先写计划,然后停止,在实现任何内容之前给我看"
  • 一旦计划没问题:"构建它,测试它,打开 PR,处理第一轮评审意见,然后停止"

一个运行时间过长的模型,只有在你没有告诉它边界在哪里时才是危险的。

长任务失败的方式和上下文失败一样,所以迭代保持简短,由环境来负责记忆。寓言 5 和 Codex 系列模型现在能够在运行中压缩自己的上下文,因此抵制添加复杂的记忆管道;合适的量每个季度都在缩小。

检查 3:TASKS.md 中有两个极小的真实任务,在 BUDGET_USD=2 下单次手动运行一个 tick。确认有一个提交、一个勾选的任务、一行日志,并且循环在启动第二个任务之前退出。

构建 4:值得存在的路由器(模型,然后是努力)

2026 年最严格的路由基准 LLMRouterBench 发现,许多路由器(包括商业路由器)无法可靠地胜过选择最佳单一模型。因此,路由器在你的流量上被假定为有罪,直到证明其无罪。

在编写任何代码之前的决策规则:仅当以下两个条件都成立时,才添加路由器:

  • 在你的流量上,廉价层和前沿层的能力-价格比大约有五倍差距
  • 构建 2 中的评估集存在,用于对其进行监督

如果精心挑选的单个模型在你的评估集上击败了你的路由器,那就删除路由器,保留简单性。

一旦通过基准,router/router.py 运行三层,最便宜的决策优先。注意,层级命名的是座位,而非价格:费率在运行时来自基准技能,因此价格变动永远不会触及你的路由器。

python
1TIERS = { # 座位,不是数字
2 "cheap": "gpt-5.6-luna", # 或 claude-haiku-4-5
3 "mid": "claude-sonnet-5",
4 "frontier": "claude-fable-5", # 或 gpt-5.6-sol
5}
6PRICES = load_bench(".claude/skills/model-bench/SKILL.md") # 单一真相来源
7
8RULES = [
9 (kind in {"extract", "format", "summarize"}, "cheap"),
10 (kind in {"plan", "architect", "migrate"}, "frontier"),
11 (context_length > 60_000, "mid"),
12]
13tier = layer1_rules(task) or layer2_classifier(task)
14if tier: return call(TIERS[tier], task)
15return cascade(task) # 先 cheap,验证,失败时仅升级一次

中间层根据你可读的标记来评分难度:why、debug、race、deadlock、refactor、security,以及提示词中的代码、先前失败的尝试、以及涉及多个子系统。

零分或一分走 cheap。两分走 mid。三分或以上走 frontier。级联的验证器是确定性的,并且仅升级一次。

将相同的决策连接到 harness 中,使其无需调用即可自动触发,.claude/skills/model-router/SKILL.md。注意,该技能不会重述规则,而是读取它们——与基准用于价格的同一单一真相来源技巧:

markdown
1---
2name: model-router
3description: 在开始工作前,将每个任务路由到正确的座位和努力程度。在会话开始时、生成子 Agent 前、用户询问使用哪个模型时,或任务混合了规划和执行时使用。
4---
5
6# 模型路由器
7
8读取 ROUTING.md 并应用它。不要即兴制定策略,也不要在此处重述策略:这个文件会腐烂,而策略文件才是受评估门禁约束的那个。
9
10这个技能在该文件之上强制执行三件事:
11
12 1. 仅在边界处进行路由。会话开始和子 Agent 生成。任务中间切换会使缓存失效,并以缓存价格的十倍重新计费上下文。
13 2. 在会话结束时,将廉价层占比追加到 progress.log。只有大多数流量走廉价层时,节省才会复合增长,因此这个数字是值得关注的。
14 3. 对 ROUTING.md 的任何更改都通过发布门禁技能上线。没有例外。

决策顺序反映了成本:先免费检查,再评分猜测,最后付费实验。

钱在流量分流上,而不是在聪明程度上。

  • 将 70% 的工作发送到价格十分之一的层级,账单大约减少三分之二
  • 生产报告显示节省幅度在 40% 到 85% 之间,差异几乎完全来自分流比例
  • 只有大多数流量走廉价层后,节省才会复合增长

这就是为什么 progress.log 中的廉价层占比是这个系统让你关注的一个数字。

努力程度是第二个旋钮

努力程度是路由的下一层:同样的技能,用于决定模型思考多长时间,而不是哪个模型运行。

每个工具都将旋钮埋在不同的默认值下。Claude Code 中是高。Codex 中是中。大多数应用中是隐藏的。因此人们对所有事情都使用同一个设置,结果要么多付钱,要么思考不足。

Avid - inline image

默认设为高,并将最大值视为最后手段,而不是炫耀的资本。

  • Anthropic 自己的努力程度文档将最佳点定在高,并警告最大值会陷入过度思考
  • 一项涉及 26 个编码任务的公开基准发现,高大约将低的质量提升了三倍
  • 同一基准发现,超高的成本超过两倍,但收益很少能收回成本

模型至少和旋钮一样重要。寓言 5 在较低努力程度上往往能击败在超高下运行的旧模型,因此先升级模型,再提高设置。

有两个设置容易被误认为是这个阶梯上的更高层级。但两者都不是。

  • 最大值是深度。 一个模型,一个问题,更多时间。
  • 超极值是宽度。 一个任务扩展到四个并行 Agent,然后综合结果。

不同的维度。超极值不是"比最大值更多",将其应用于一个不能真正拆分的任务,只会让四个 Agent 重复同一个调查。

这个阶梯不跨版本移植。 同一个词在新模型上比旧模型买到不同数量的思考。

将一个熟悉的任务迁移到新座位时,从你信任的设置下降一档开始。只有当输出要求时才向上爬。

有一个陷阱特别针对集群。

子 Agent 继承父模型的模型和努力程度。从一个最大努力程度的指挥者生成的集群是一个最大努力程度的集群,它会在一条消息中耗尽一个窗口。

在它们自己的 frontmatter 中固定它们,并知道你在哪个 harness 中这样做,因为固定只取决于读取它的生成器。

  • Claude 端。 下面的 frontmatter 是控制。
  • Codex 端。 5.6 以父模型自身的模型和推理级别生成子代,并且它急切地生成。父级的旋钮就是集群的旋钮。

在 Codex 端,唯一真正的控制是你打开会话时的设置,以及 AGENTS.md 中一行说"除非被要求,否则不要生成"。在信任其中任何一个之前,验证你拥有哪一个:

yaml
1name: scout
2model: haiku
3effort: low # 子 Agent 继承父级。一个最大努力程度的集群
4 # 会在一条消息中耗尽一个窗口。固定它们。

按工具设置:在 Claude Code 和 Codex TUI 中使用 /effort,像 codex -e high 这样的标志,config 中的一行,或 API 上的 effort 字段。

模型路由决定谁思考。努力程度路由决定思考多久,第二个旋钮更容易转动,因为设置中的其他一切都不变,并且缓存保持温暖。在循环分支的地方花费努力。其他地方都是税收。

每周跟踪这个数字:

bash
1grep '^route' progress.log | awk -F'\t' \
2 '{r++; if($3!="frontier")c++} END{printf "cheap share: %.0f%%\n", c/r*100}'

ROUTING.md,两个 harness 都读取的策略

以上所有内容浓缩为仓库根目录下的一个文件。

markdown
1# ROUTING.md
2
3路由是四个决策,顺序是关键:
4 1. 在哪里:哪个 harness 运行工作
5 2. 何时:在哪个边界做出决策
6 3. 谁:哪个模型占据座位
7 4. 多努力:该模型运行在哪个努力程度
8大多数团队只争论第 3 点。钱在第 2 点和第 4 点。
9
10## 1. 在哪里:先选择 harness,再选择模型
11在 harness 内部进行后训练的模型,在其他任何地方都会分布异常。
12测量差异:原生 20.2%,外来 7.7%,相同权重。
13
14| 工作 | Harness | 原因 |
15|---|---|---|
16| 编写代码 | 模型的原生 harness | 编写者在分布外性能下降 |
17| 评审代码 | 评审者的原生 harness | 弱的评审比没有更糟 |
18| 阅读、侦察 | 任何地方 | 阅读成本低且可验证 |
19| 机械转换 | 任何地方 | 如果检查是确定性的,harness 几乎无关紧要 |
20
21法则:自由重新映射阅读者和评审者通道。编写者通道保持 harness 原生,直到你自己的评估集另有说明。该覆盖必须基于测量,而非偏好。
22
23## 2. 何时:在边界处路由,绝不在边界内路由
24会话中间切换会丢弃提示缓存。缓存的输入成本是新鲜输入的十分之一,因此无用的切换会以十倍价格重新计费整个上下文,且一无所获。
25
26合法的边界,唯一可能发生路由决策的地方:
27 - 会话开始
28 - 子 Agent 生成
29 - 集群中的新目标
30 - 将评审移交给另一个谱系
31 - 由故障或安全防护触发的回退
32
33其他任何地方都是非法的。没有每轮路由。没有任务中间自适应切换。
34级联恰好获得一次升级,并且会打开一个新的边界。
35
36法则:在边界打开时选择座位,然后一直保持直到下一个边界。
37
38## 3. 谁:决策流程(先匹配获胜,记录结果)
39
40第 1 层,规则。免费。始终先检查。
41
42| 信号 | 座位 |
43|---|---|
44| 提取 / 格式化 / 总结 / 分类 / 测试 | Haiku 或 Luna,低努力 |
45| 计划 / 架构 / 迁移 / 根因分析 | Fable 计划,Sonnet 执行 |
46| 上下文超过 60k tokens | Anthropic 1M 层级(统一定价) |
47| 评审 Agent 编写的代码 | 另一个谱系,原生 harness |
48| 目标拆分为独立部分 | 集群:Fable 编写和评分 |
49
50第 2 层,评分。每个一分:
51 - 包含 why / debug / race / deadlock / refactor / security / optimize
52 - 涉及多个子系统
53 - 先前的尝试已经失败
54 - 更改是不可逆的或面向用户的
55 0-1 -> 廉价层,低努力。2 -> Sonnet,中。3+ -> 前沿层,高。
56
57第 3 层,级联。运行廉价,确定性验证,恰好升级一次。
58绝不两次。第二次失败是规格问题,更大的模型不会修复你的规格。
59
60座位和回退位于 .claude/skills/model-bench/SKILL.md。这里没有价格。
61
62## 4. 多努力:努力程度路由
63努力程度是路由的下一层。这个文件中最便宜的旋钮:其他一切不变,缓存保持温暖。
64
65| 努力程度 | 使用场景 |
66|---|---|
67|| 拼写错误、重命名、排序、提取、所有子 Agent 默认 |
68|| 根据清晰规格的常规代码、总结、标准写作 |
69|| 拆解、迁移、棘手 bug、所有指挥者工作(默认) |
70| 最大 | 仅用于高已经无法破解的问题 |
71| 超极值 | 不在这个阶梯上。宽度,不是深度:4 个并行 Agent。默认关闭 |
72
73 1. 默认设为高。最佳点在那里;最大值会陷入过度思考。
74 2. 更好的模型优于更高的旋钮。先升级座位,再提高设置。
75 3. 子 Agent 继承父模型的模型和努力程度。从最大努力程度的指挥者生成的集群以最大程度运行,并在一条消息中耗尽一个窗口。在每个子 Agent 的 own frontmatter 中固定:努力程度:低。如果生成器忽略固定,父级的旋钮就是集群的旋钮。检查你拥有哪一个。
76 4. 最大值是深度。超极值是宽度。仅当子问题真正独立时才使用超极值,永远不要作为默认值,并且在 harness 过度生成时根本不使用。
77 5. 这个阶梯不跨版本移植。在新模型上,从旧模型上你信任的设置下降一档开始。
78 6. 快速模式也不是努力程度。它用 2.5 倍积分换取你本来就要消耗的 tokens 的延迟。关闭。
79
80旋钮存在于四个地方:Claude Code 和 Codex TUI 中的 /effort,codex -e high,config 中的 model_reasoning_effort,API 上的 effort 字段。Claude Code 默认高,Codex 默认中,大多数应用完全隐藏它,这就是为什么团队不小心对所有事情都使用同一个级别。
81
82## 5. 回退:假设前沿层宕机
83前沿层可用性不保证,安全防护可以在运行中将调用重路由到 Opus 4.8,在不到 5% 的会话中,且不会出错。
84 - 每个座位都有一个命名的回退。没有例外。
85 - 每个回退都被记录。静默重路由是一个 bug,因为你可能正在阅读来自你未选择的模型的输出。
86 - 永远不要在你未选择的模型的输出上进行迭代。
87
88## 6. 决定这一切是否有效的数字
89混合成本就是你的流量分流,没有别的。70% 廉价层将账单减少大约三分之二。10% 节省零花钱。路由器准确性远比路由器聪明程度值钱。
90
91用构建 4 中的一行命令跟踪它。低于 50%,节省尚未开始复合。在接触这里任何其他东西之前,先修复分流。
92
93## 7. 这个文件的门禁
94法则:没有 eval_gate.py 在 50 到 500 个保留案例上通过,任何对这个文件的更改都不能上线。"阻止"裁决是最终的,不能在会话中覆盖。门禁和更改必须由不同的人完成。
95
96## 8. 何时删除这个文件
97如果单个精心挑选的模型在你的评估集上击败了整个堆栈,删除路由器,保留简单性。2026 年最严格的路由基准发现,许多路由器(包括商业路由器)无法可靠地胜过选择最佳单一模型。
98先测量。再路由。开心地删除。

检查 4:router.py 离线运行并打印一个决策、一个原因和分流比例。你的笔记中保存着 5 倍差距的测量结果,或者一条注明日期的笔记,说明路由器尚未被证明合理。

构建 5:顾问反转

经典模式让聪明模型负责,并在批量执行上燃烧前沿层 tokens。反转它。

Anthropic 的顾问结果:Haiku 配备 Opus 级别的顾问,在一个困难的浏览基准上得分超过两倍,41.2 对 19.7,同时每个任务的成本比中层低 85%。

执行是批量。建议是克。

由 harness 决定何时驱动程序卡住,而不是驱动程序自己决定,.claude/skills/stuck-protocol/SKILL.md:

markdown
1---
2name: stuck-protocol
3description: 当进展停滞时,升级到 fable-expert 顾问。当相同错误出现两次、当连续两步没有更改文件而错误持续存在、当测试在两次不同的修复尝试后仍然失败、或当用户说 Agent 在兜圈子时使用。
4---
5
6# 卡住协议(顾问反转)
7
8你是廉价驱动程序,这正是一个特性:执行是批量,建议是克。但小型模型过于自信,因此你不能自己决定自己没事。相反,检查确定性信号。
9
10卡住信号(任何一个触发协议):
11 1. 连续两步出现相同的错误字符串。
12 2. 连续两步零文件更改而错误持续存在。
13 3. 同一个测试在两次真正不同的修复尝试后仍然失败。
14
15流程:
16 1. 统计本会话中的咨询次数。达到 3 次时,停止:将任务标记为"阻塞"并附上错误,总结给人类,继续。绝不要第四次咨询。
17 2. 构建简报,其中不包含其他内容:
18 目标:一行
19 尝试 x2:最后两次尝试,每次 200 个字符
20 错误:确切错误,300 个字符
21 3. 生成 fable-expert 并附带简报。它返回指导,而不是代码。
22 4. 在下一步立即应用指导,先于任何你自己的内容。
23 5. 在 progress.log 中追加一行:咨询 #N,它说了什么,是否有效。
24
25硬性规则:
26 - 永远不要要求专家做工作。如果回复包含完整实现,接受想法并丢弃代码。
27 - 永远不要在简报中加入你的推理历史。专家的价值在于干净的上下文;冗长的简报会毒害它。
28 - 如果指导失败,这算作你向下一次咨询的两次尝试之一。三次失败的咨询意味着这个任务超出了本会话的薪酬等级,如实说出这一点是正确的输出。

专家座位,.claude/agents/fable-expert.md:

markdown
1---
2name: fable-expert
3description: 卡住时刻的前沿层顾问。从 stuck-protocol 接收紧凑简报,返回 600 个 tokens 以下的指导,从不自己完成工作。
4model: claude-fable-5 # 如果保留规则限制,则切换到 opus
5effort: high
6tools: Read, Grep, Glob # 可以阅读,永远不能编辑
7---
8
9你是专家顾问,不是承包商。一个更便宜的模型正在驱动并遇到了障碍。你的价值在于以克为单位的判断力和干净的上下文:你对驱动程序如何到达这里一无所知,而这正是你的见解更敏锐的原因。
10
11你收到一份简报:目标、最后两次尝试和错误。如果简报提到了特定文件,你可以阅读它们。你不能编辑任何东西。
12
13 1. 如果简报缺少你需要的东西,回复一行,说明缺少什么。不要猜测缺口。
14 2. 在开处方之前先诊断:一两句话说明真正的问题是什么。
15 3. 然后以以下格式回复,之后不要有任何内容:
16 指导:
17 1. (最可能的修复:尝试什么,以及为什么它应该有效)
18 2. (如果 1 失败,回退方案)
19 3. (仅当存在真正不同的第三条路径时)
20 信心:高 | 中 | 低
21 4. 600 个 tokens 以下。没有超过 10 行的代码块。给出想法,而不是实现。如果你的回复包含完整解决方案,你就没有履行角色。
22 5. 如果任务本身被误解,在第 1 项中说明,并建议告诉人类什么。
23
24操作者说明:如果你的组织无法接受 Mythos 级别的保留,将模型行改为 opus。角色运作方式相同;顾问结果最初是用 Opus 级别的顾问证明的。

对于 Codex 会话,同样的通道反向,~/.codex/prompts/fable-advice.md:

bash
1claude --model claude-fable-5 -p "你是一位专家顾问。
2一个更便宜的模型正在驱动并卡住了。简报:<目标,两次
3尝试,错误>。回复指导:最多 3 个编号项目,
4600 个 tokens 以下。不要做工作。"

小型模型过于自信,因此 harness 观察行为而不是询问。

简报保持简短,因为专家的价值在于干净的上下文,冗长的简报会毒害它。

每次咨询运行几百个 tokens 的指导。 这就是经济学崩溃的原因:执行以百万计乘坐 1 美元层级,而判断以克计到达,每百万 50 美元。

Cognition 首先发表了失败。天花板由驱动程序设定,而不是顾问,并且该模式只有在他们的驱动程序改进一代后才开始回报。

开放问题是驱动程序注意到自己卡住了。这就是为什么上面的信号是行为性的,以及为什么它们存在于 harness 中。

检查 5:advisor_loop.py 通过其断言:驱动程序以相同方式失败两次,一次咨询触发,任务完成,咨询次数保持在上限以下。

构建 6:双车道基准

没有人给自己的作业打分是一条法则,这个构建跨供应商强制执行它。

相同权重在异种 harness 中大幅下降。 2026 年的一项测量显示原生 20.2% 对比第三方 7.7%。

因此,每个评审者在其自己的家中运行。Claude 在 Claude Code 中评审。Sol 通过 Codex CLI 评审。

内部评判者,.claude/agents/fresh-eyes-reviewer.md:

markdown
1---
2name: fresh-eyes-reviewer
3description: 空上下文代码审查器。在任何 Agent 写入变更后调用。与编写者共享零历史记录,自行读取 diff,不可编辑。
4model: haiku # 当 diff 涉及关键负载时,切换为 opus
5effort: medium
6tools: Read, Grep, Glob, Bash
7---
8
9你完全不记得这个变更是如何编写的,而这正是关键所在。不要询问作者的推理过程。不要相信任何摘要。只看证据。
10
11 1. 执行 git diff HEAD~1(或给定的范围)并读取每个代码块。
12 2. 读取每个被修改文件的**完整内容**,而不仅仅是代码块。Bug 往往隐藏在变更周围未更改的行中。
13 3. 运行 README 或 CLAUDE.md 中指定的测试套件。
14 4. 查找三种经典的 Agent 失败模式:
15 laziness(懒惰):部分实现、TODO、仅针对一种情况处理
16 self-grading(自我评分):测试被削弱、断言被删除、测试套件被跳过
17 drift(偏离):超出所述任务范围的变更
18 5. 判决,必须使用以下确切格式:
19 VERDICT: PASS 或 FAIL
20 BUGS: 编号列表,每个包含 文件:行号 和一句原因
21 RISK: 一句话描述此变更所触及的最具风险的部分
22
23硬性规则:你不得编辑文件,不得重新运行编写者的任务,且 BUGS 列表为空但 VERDICT: FAIL 是无效的。如果测试无法运行,则自动判定为 FAIL 并附上原因。

跨供应商审查器,.claude/agents/sol-reviewer.md,是一个管道,运行一条命令并逐字传递判决结果。Sol 是审查者;此文件将其接入自身的运行框架:

markdown
1---
2name: sol-reviewer
3description: 跨供应商审查器。通过 Codex CLI 将最新提交发送给 GPT-5.6 Sol,在 Sol 的原生框架中运行,并原封不动地传递判决结果。
4model: haiku # 仅作为管道。Sol 是审查者。
5effort: low
6tools: Bash, Read
7---
8
9你是管道,不是审查者。同系列模型共享盲点;此通道的存在是因为 Sol 不与 Claude 共享盲点。
10
11 1. 检查 CLI:codex --version。如果缺失,输出 VERDICT: FAIL 并附上原因 “codex CLI not installed” 以及设置路径(或官方插件:/plugin marketplace add openai/codex-plugin-cc, /plugin install, /codex:review)。
12 2. 以高努力度,在 Sol 自身的框架中运行审查:
13
14 codex --profile deep exec "Review the latest commit (git show HEAD) as a
15 hostile senior engineer who has never met the author. Read every touched
16 file IN FULL, not just the hunks. Hunt: partial implementations, weakened
17 or deleted tests, changes outside the stated task scope. End with exactly
18 'VERDICT: PASS' or 'VERDICT: FAIL' followed by numbered findings, each with
19 file:line and a one-sentence reason."
20
21 3. 将完整输出保存到 .review_sol_<short-hash>.md。
22 4. 向上传递:首先传递 VERDICT 行,然后**逐字**传递发现结果。不要总结或淡化发现,不要添加安慰性话语,不要与 Sol 争论。如果判决是 FAIL,由上级决定修复什么。你不做任何决定。
23
24硬性规则:绝不能编辑文件,绝不能重新运行编写者的任务,绝不能用自己的审查替代。如果 codex 在运行过程中出错,将其报告为 FAIL 并附带 stderr,而不是悄悄重试超过一次。

对于 CI,loop/two_lane.sh 驱动整个交换过程,最多三轮:

bash
1claude -p "Implement: $TASK. Run the tests. Commit when green."
2review=$(codex exec "Review HEAD ... VERDICT: PASS or FAIL plus findings.")
3grep -q "VERDICT: PASS" <<< "$review" && exit 0
4claude -p "A reviewer from another model family found these issues.
5 Fix every one, rerun tests, commit: $review"

在 Claude Code 内部,你可以完全跳过这个脚本。

OpenAI 为 Claude Code 发布了一个官方的 Codex 插件,自 2026 年 3 月起可用,并在九周内获得了大约两万个 GitHub 星标。这标志着市场已认可跨供应商审查成为主流。 安装一次即可:

text
1/plugin marketplace add openai/codex-plugin-cc
2/plugin install codex@openai-codex
3/codex:setup

在任何 Claude 会话中,可以使用三个命令:

  • /codex:review 进行标准审查
  • adversarial mode(对抗模式),会故意攻击你的设计决策
  • background handoff(后台交接) 给 Codex

对任何关键负载使用对抗模式。当工作涉及大量终端操作时,使用交接模式,这是 Sol 的强项。

越来越多的开发者现在通过 BUILD 7 的代理,在 Claude Code 内部运行 GPT-5.6 Sol,并且日常工作中更倾向于使用它而非 Codex。

它证明了这一论点:租用权重,拥有框架。

问题在于原生框架法则,因为 Sol 在 Claude Code 中运行在其原生环境之外。请在你的评估集上自行确认。如果你的评估显示外部框架更具优势,那么以你的评估结果为准。

三个特性使得这个审查者值得拥有:

  • 干净的上下文。 它不携带编写者的任何历史记录。
  • 不同的血统。 它不与编写者共享盲点。
  • 原生框架。 它能在全功率下进行判断。

一个被软化的判决是一个失效的验证器,因此传递是逐字的。第三次 FAIL 会通知人工介入,而不是进行第四次尝试。

检查 6:运行 two_lane.sh,或者在你的最后一次提交上运行 /codex:review。一个 VERDICT 会写入 .review 文件,而 FAIL 会路由回编写者通道。

BUILD 7:可选的分支扩展(当条件出现时安装)

侦察群组。当研究或代码库考古消耗你每天超过 30 分钟时安装。在独立的切片上并行生成三个:

markdown
1---
2name: scout
3description: 用于研究分支扩展的廉价并行读取器。可同时生成多个,用于代码库调查、依赖审计、日志考古、文档研究。根据原则只读;读取并行,写入保持单线程。
4model: haiku
5effort: low # 继承保护(BUILD 4):一个继承最大努力度的群组
6 # 会在一条消息内耗尽一个窗口
7tools: Read, Grep, Glob, Bash
8---
9
10你可能是多个并行运行的读取器之一。调查你的切片并返回简短而精确的信息。只有你的最终消息会返回给上级,因此请控制在 400 字以内,并确保每个字都物有所值。
11
12 1. 自行将你的任务缩小到一个切片(一个目录、一个子系统、一个问题),并说明你缩小到了什么范围。
13 2. 仅限读取:Read, Grep, Glob 和只读 shell(ls, git log, git show, rg)。绝不能编辑、安装或删除。如果任务需要写入操作,请报告它,不要执行它。
14 3. 先广度,然后对两到三个最热点的位置进行深度挖掘。
15
16报告格式,仅此而已:
17 FINDINGS: 最多 10 条要点,每条包含一个事实及其证据(文件:行号、提交哈希或 URL)
18 GAPS: 你无法确定的内容及其原因,以便上级了解哪些区域仍是未知的
19 HOTSPOT: 最值得深入查看的单个文件或函数,以及一句原因说明
20
21不要发表评论,不要提出实现方案,不要填充内容。一个返回 300 个有用词的侦察兵,胜过返回 3000 个混杂词汇的,因为你的所有输出都会进入上级的上下文窗口,而上级需要为此付费。

读取并行化,因为并行读取器可以叠加效果。字数限制存在是因为每份报告都会进入上级付费的上下文窗口。

写入操作绝不并行化。 一项 2026 年的等预算研究发现,在 Token 数量固定的情况下,单个 Agent 在推理任务上可以媲美多 Agent 设置。此通道仅用于读取。

夜间消耗器。当 TASKS.md 中包含十个或更多小的可验证项时安装。overnight-burner 技能会设置文件,确认两个上限,验证测试命令可运行,然后启动 ralph.sh。早上查看:git log, progress.log, 勾选标记。

计划拆分。当计划 Token 占会话账单主导地位时安装。Claude Code 中的一个设置可以使用 Opus 级模型进行计划,Sonnet 级模型进行执行。以克为单位进行前沿计划,批量执行。

三人组基准。当一个棘手的变更值得三个视角时安装。两个角色阅读,一个角色编写,第四个窗格是陷阱。管道位于下方。

混合机群的管道

两个开源组件可以将双供应商设置转变为任意供应商设置。仅当某个条件需要第三方提供商时才安装。

claude-model-switch(开源,Rust,运行在 localhost:4000 上)。Claude Code 与任何 Anthropic 或 OpenAI 兼容端点之间的本地代理。

  • 将 Claude Code 的三个内部层级(haiku, sonnet, opus)重新映射到你的提供商提供的任何模型
  • 通过配置重载,无需重启即可切换提供商
  • 作为带有斜杠命令的 Claude Code 插件发布
bash
1claude-model-switch init # 将 Claude Code 指向代理
2claude-model-switch add openrouter sk-or-xxx
3claude-model-switch add glm \
4 --haiku glm-4.5-air --sonnet glm-4.7 --opus glm-5
5claude-model-switch use glm # 按会话切换,绝不在任务中间切换
6claude-model-switch orchestrate start --preset trio # planer/coder/reviewer

三人组预设是 BUILD 7 基准的物理实现:三个 tmux 窗格,每个角色使用不同的提供商,每个都可寻址(orchestrate send coder "implement milestone 1"),并支持在提供商性能下降时在会话中重新分配角色。

CLIProxyAPI(开源)。同样的技巧,方向相反。

它将 ChatGPT Codex、Claude Code、Gemini 和 Grok 的 OAuth 登录封装为 OpenAI、Claude 和 Gemini 兼容的 API 端点。

翻译一下:你已经付费的订阅席位变成了可路由的 API 目标,可供 ralph.sh 和 two_lane.sh 等脚本使用,无需单独的 API 密钥。社区分支将其扩展到 Factory 和 Amp,而 ccs 等封装器增加了多账户切换功能。

从 BUILD 6 的数据中得出的管理两者的法则:一个被重新映射的模型运行在外部框架中。

可以自由地重新映射读取器和审查器通道。它们廉价且可验证。

保持编写代码的通道使用与其框架原生兼容的模型,直到你自己的评估集证明其他情况更优。

检查 7:每个已安装的分支扩展旁边都写有其触发条件。投机性地安装这些内容会导致堆栈臃肿。

BUILD 8:工厂(完成变为数据库事实)

到目前为止,所有内容都证明了即时的有效性。门控、判决和评估集都在运行期间触发。

一旦多个 Agent 在多个会话中接触同一个项目,你就需要一种能超越运行期的证据:谁做了什么,顺序如何,以及最后一个审查周期是否已清除。

Avid - inline image

该模式来自 pi-factory 演示 (github.com/xpriment626/pi-factory)。核心思想只有一句话:

线程是轨迹。行是证据。门控读取行。

progress.log 是日记。黑板是分类账。SQLite 是分类账,因为即使在所有人停止交流后它仍可查询。

创建 factory/factory_gate.py。它包含四个表(tickets, briefs, evidence, verdicts),一个每个 Agent 在工作时调用的记录命令,以及完成门控。门控的失败条件直接映射到工作本身:

python
1checks = [
2 (tickets == 0, "No tickets were recorded."),
3 (done != tickets, "Not all tickets are done."),
4 (first_brief is None, "No architecture brief was recorded."),
5 (first_brief > first_code, "Implementation evidence predates the brief."),
6 (code_ev == 0, "No implementer code evidence was recorded."),
7 (build_ok == 0, "No passing build command evidence."),
8 (test_ok == 0, "No passing test command evidence."),
9 (latest("architect") != "green", "Latest architect verdict is not green."),
10 (latest("reviewer") != "green", "Latest reviewer verdict is not green."),
11]

该列表编码了整个原则。

  • 顺序被强制执行。 在第一条代码证据之后才出现的简要说明是违规行为,这使得“先计划后构建”成为一个可检查的事实,而非习惯。
  • 在最新的同一个周期中,两个审查者席位都必须为绿灯。 一个过时的批准不能通过更新的 diff。
  • 没有通过零测试行的完成是不可能的,无论记录听起来多么自信。

创建 factory/factory.sh,它将你已构建的席位连接到运行顺序中,并在每一步之间记录行:

bash
1G ticket "kanban board" "columns render, drag persists" # planer 行
2G brief "$BRIEF" # 在任何代码之前
3../loop/ralph.sh && G evidence code pass "loop completed" # BUILD 3 工作
4npm test && G evidence test pass "npm test green"
5G verdict 1 architect green "layout matches brief" # Claude 席位
6G verdict 1 reviewer green "tests pass, scope clean" # Sol 席位,通过 codex
7python3 factory_gate.py gate factory.db # 行决定结果

没有引入任何新东西。

Fable 创建任务并编写简要说明,只读。BUILD 3 循环实现。Claude 和 Sol 各自从自己的框架返回判决。循环最多重复三次,直到两者都为绿灯。

工厂是你已经拥有的员工的组织结构图。

一个真实的运行,而非模拟。第二次门控调用是整个 BUILD 8 论点的核心:

text
1$ factory_gate.py record demo.db ticket "kanban-board" "columns render, drag persists"
2
3$ factory_gate.py gate demo.db
4GATE: REFUSED
5 - Not all tickets are done.
6 - No architecture brief was recorded.
7 - No implementer code evidence was recorded.
8 - No passing build command evidence.
9 - No passing test command evidence.
10 - No review cycle was recorded.
11 exit: 1
12
13... agents 工作。每一步都写入一行 ...
14
15$ factory_gate.py record demo.db brief "Stack: node+sqlite. /tasks CRUD."
16$ factory_gate.py record demo.db evidence code pass "src/board.js written"
17$ factory_gate.py record demo.db evidence build pass "npm run build exit 0"
18$ factory_gate.py record demo.db done "kanban-board"
19$ factory_gate.py record demo.db verdict 1 architect green "layout matches brief"
20$ factory_gate.py record demo.db verdict 1 reviewer green "scope clean"
21
22$ factory_gate.py gate demo.db
23GATE: REFUSED
24 - No passing test command evidence.
25 exit: 1
26
27$ factory_gate.py record demo.db evidence test pass "npm test 33/33"
28
29$ factory_gate.py gate demo.db
30GATE: COMPLETE (1/1 tickets, cycle 1 green x2)
31 exit: 0

两个审查者都说了绿灯。架构师确认布局符合简要说明。审查者确认范围是干净的。

但门控仍然拒绝,只有一行原因:没有通过的测试命令证据。没有人运行过测试。

一个判决是一个意见。两个意见仍然不是事实。 添加一行测试通过证据后,同一个门控返回 COMPLETE 并退出 0。

模型会为其工作提供有说服力的论证,而记录捕获的是论证而非真相。行无法被反驳。

当门控拒绝时,它会明确指出缺失的具体工件。这将“运行失败”转化为“生成一个通过的测试行”。一个任务,而非一个谜题。

安装条件:每天超过一个编写者会话,跨多天的审查周期,或需要在事后证明发生了什么。对于只有一个夜间循环的独立仓库,BUILD 3 就足够了,而 BUILD 8 是多余的。

检查 8:重现截图。记录除测试行之外的所有内容,门控必须仅因一个原因拒绝。添加该行后,它应返回 COMPLETE。一个没有测试行就通过的门控是记录阅读器。

BUILD 9:群组(Fable 计划,机群执行,Fable 评分)

一个驱动者带一个顾问可以处理一个任务。一个可以拆分为四个独立部分的目标需要四个工作者。

但是,一个机群只有在一个模型计划每个目标并对每个结果评分时才能保持其方向。这正是 BUILD 9 存在的全部原因,也是没有它群组通常会失败的原因。

第 3 级被具体化。Fable 编写目标,机群执行它们,Fable 根据其自身的检查对每个结果进行评分,下一个周期仅对未通过的目标重新计划。

其中止条件是周期上限。当上限触发且仍有未通过的目标时,这是一个需要交给人类处理的问题,而不是运行第四个周期的理由。

创建 swarm/swarm.sh。三个设置体现了这个原则:

bash
1FLEET=4 # 写入操作从不冲突:每个工作树单独一个
2WORKER_MODEL=claude-sonnet-5 # 或使用 haiku / luna / kimi 进行纯执行
3WORKER_EFFORT=low # 绝不能继承指挥者的努力度
4CONDUCTOR=claude-fable-5 # 或如果保留规则导致问题,使用 opus-4-8

这三行是明确的,因为默认值不是正确的。

一个继承设置的机群会同时继承指挥者的模型和努力度。一个高努力度的 Fable 指挥者生成四个高努力度的 Fable 工作者来执行机械性工作,是以最昂贵的方式做最便宜的事。

设置它们。绝不要让它们使用默认值。

跨框架并行扩展是合法的,并且它看起来并不像 ROUTING.md 第一条法则的例外情况。

  • 一个 Fable 指挥者,通过 shell 调用 codex exec,在 Codex 内部原生运行 Sol。这是遵守法则,而非违反法则。
  • 违反法则的是 Claude 端的子 Agent 使用 GPT 模型字符串,或者反之。

框架随工作者移动,而非随指挥者移动。

指挥者编写目标,从不编写代码,每个目标都带有自己的检查命令,因此“完成”始终是一个事实:

json
1{"id":"strip-legacy-auth","spec":"remove the v1 auth path from routes/","check":"npm test -- tests/auth"}
2{"id":"migrate-sessions","spec":"move session store to the new adapter","check":"npm test -- tests/session"}

然后分派、评分和重新计划:

bash
1# dispatch: one git worktree per goal, capped at FLEET in parallel
2claude --model "$WORKER_MODEL" --effort "$WORKER_EFFORT" -p "Execute this spec
3 exactly. Do not expand scope. Run the tests. Commit only when green."
4
5# score: 指挥者根据其自身的检查命令对每个目标进行评分。
6# 工作者的信心不是证据。退出代码才是。
7bash -c "$chk" && echo "$id" >> passed.txt || misses=$((misses+1))
8
9# replan: 下一个周期会看到 passed.txt 并仅对未通过的目标重新计划

逐个席位来看:

  • Sonnet 5 用于编码执行
  • Haiku 或 Luna 用于纯机械性工作
  • 像 Kimi 这样的开放权重工作者 当任务是重复性的且权重免费时
  • Sol 当工作涉及大量终端操作时
  • Opus 4.8 在工作席位中,仅当子 Agent 需要推理时

将 Fable 保留给两个廉价模型无法完成的工作:编写目标和评分。

机群是一个成本策略,绝非智能策略。

多 Agent 运行会消耗相当于同等工作 3 到 10 倍的 Token,而一项 2026 年的等预算研究发现,在 Token 数量固定的情况下,单个 Agent 在推理任务上可以媲美多 Agent 设置。

群组只有在目标独立且主要是机械性工作时才值得使用。写入操作在每个工作树内保持单线程,合并操作串行执行,而最后一次提交由人类负责。

检查 9:在一个可以拆分为三部分的目标上运行群组。一个失败的目标必须在 results.tsv 中返回 FAIL,并在第 2 周期被重新计划,绝不能声明为“完成”。

BUILD 10:第 4 级(曾经通过的内容不会被忽视)

到目前为止,所有内容都在工作构建过程中进行验证。没有内容会注意到,在六周后,已完成的工作不再成立。一个你只验证一次的目标是一个带有时间戳的假设。

第 4 级包含两个部分,其中止条件与退出条件同样重要:如果本周没有提案通过门控,系统不会改变,而这本身就是成功。

第一部分,常设目标。每一个完成的事项都升级为一个带有断言的不变量,每天重新验证,永不停止。在 goals/ 中为每个完成的事项创建一个文件:

text
1predicate: npm test -- tests/auth 2>&1 | tail -1 | grep -q passing
2born: 2026-07-13
3status: satisfied
4last-pass: 2026-07-13
5on-violation: wake me. do not auto-fix.

然后 system/verify_goals.py 运行所有目标,如果有任何不变量被破坏,则退出 1,并指出目标名称、其上次保持的日期以及你设置的策略:

python
1held = subprocess.run(["bash","-c",predicate], timeout=60).returncode == 0
2g["status"] = "satisfied" if held else "VIOLATED"
3# 超时是违规,而不是通过:一个昂贵的断言本身就是有问题的

断言规则有目的地严格:一个 shell 命令,退出码 0 表示不变量成立,廉价且只读。

禁止使用形容词。如果 shell 无法检查,模型也无法检查。

非代码目标的工作方式相同。test -s reports/$(date +%Y-%m)-review.md 是月度报告的一个很好的常设目标。

第二部分,堆肥。每周一次,阅读系统已经产生的耗材:BLOCKED 任务、失败的门控运行、被拒绝的工厂门控、被回滚的 PR、被违反的目标。

然后,最多提出三个变更。宪法中的一条新法则。修复一个持续以相同方式失败的技能。或者一个你缺失的常设目标。

只提建议。你来签署。

bash
1claude --model claude-fable-5 --effort high --allowedTools "Read,Grep,Glob" \
2 -p "Read this week's exhaust: BLOCKED lines in progress.log, GATE REFUSED
3 entries, VIOLATED goals, PRs closed unmerged. Extract AT MOST 3 proposals:
4 a new law (quote the incidents), a skill fix (same failure repeating), or a
5 standing goal we lacked. Propose only, do not edit anything. Clean week is a
6 valid answer, say so and stop."

这一级仅在评估和审查者都表示系统变得更好了时才关闭。这意味着系统需要对其自身失败有记忆,才能据此改进。

堆肥运行是将脚本转变为制度的关键。

常设目标使完成的成果变得安全。哨兵检测,正常管道修复,没有任何东西在沉默中腐烂。

检查 10:verify_goals.py 演示应指出被破坏的不变量及其最后通过日期,并让健康的不变量保持不变。然后为你最近完成的一件事编写一个真正的常设目标。

BUILD 11:第 5 级(你的席位,以及为什么它永不空缺)

第 5 级上有你的名字,这是出于机械性原因,而非情感原因。

一个循环可以满足其停止条件但仍然出错。 测试通过,门控变绿,两个审查者都签署了,但最后一次提交仍然是个错误。

此级别以下的所有构建都是为了降低这种风险而存在的。但没有一个能完全消除它。

你的常设职责,都很省时:

  • 喝杯咖啡时阅读队列:BLOCKED 任务、GATE REFUSED 行、VIOLATED 目标、廉价层级份额。十分钟。
  • 检查最后一次提交,然后再合并。不是每个 diff,而是最后一个,系统最有信心的那个。
  • 签署或拒绝三个堆肥提案。这是法律进入宪法的唯一途径。

三个剧本按节奏运行,而非按需运行,因为它们会消耗真金白银,并且提供的是方向而非 diff:

剧本一,项目反馈循环,每月一次。

让 Fable 审视你已经交付的内容,只读,并让它写一份详细的改进计划。然后将该计划的执行交给 Opus 4.8 或 Sol。

昂贵的模型做具有复利效应的部分,即关于改变什么的判断,而从不做没有复利效应的部分,即打字。

bash
1claude --model claude-fable-5 --effort high --allowedTools "Read,Grep,Glob" \
2 -p "Review this project end to end. Write an improvement plan ranked by
3 leverage: what is fragile, what is over-built, what is missing, what should
4 be deleted. Do not write code. Output tasks with acceptance criteria." \
5 > plans/$(date +%F)-improvement.md

第二项:行为分析,每月一次。

将你在两个工作台中的会话和项目历史输入其中,让它绘制出你的构建方式以及你在何处停滞不前。

这是系统中唯一一个以你为主体的报告。它通常也是变化最大的那个。

第三项:第二大脑审计,每季度一次。 将你的笔记、文档和积压任务指向它,让它根据你自己的想法,说出下一步值得构建什么以及哪些应该删除。将输出视为一份提案,就像堆肥一样。

下面的阶梯优化执行,而执行现在是廉价的部分。方向是稀缺的输入,而方向正是值得为前沿模型付费的地方。按克购买判断力,按吨购买执行力,并保留最后的签名。

检查 11:在自己的仓库上运行第一项。如果计划中没有提及任何你已知的脆弱之处,那么你的上下文文件就太单薄了,这是一个构建 1 的问题。

构建 12:运营

Agent 消耗的 Token 量是聊天调用的 10 到 100 倍,其中输入占主导地位,比例约为 100 比 1。

叠加来自构建 0 的四个杠杆(拆分、缓存、批处理、压缩),团队报告称,其成本比未优化的基线降低了 70% 到 90%。

为了让你有个概念:每个活跃开发者每天 13 美元是 Claude Code 的企业平均水平,90% 的用户花费低于 30 美元。

一条纪律,而非一个新子系统:一个任务类只有在记录超过 20 次运行且通过率达到 95% 后,才能自动合并;而单次通过率低于 90% 则会大声撤销该权限。

bash
1awk -F'\t' '$2=="fix-lint"{r++; if($3=="pass")p++}
2 END{printf "%d runs, %.0f%%\n", r, (r?p/r*100:0)}' progress.log

每周支出,基于 ralph.sh 已记录的每次 Tick 成本:

bash
1grep '^cost' progress.log | awk -F'\t' \
2 -v d="$(date -d '7 days ago' +%F)" \
3 '$2>=d{s+=$3} END{printf "week: $%.2f\n", s}'

在设置 Cron 之前,先计算好代谢率。每日成本等于 Tick 次数乘以平均每次 Tick 的成本。

处理安静无工作 Tick 的那个席位,决定了最终账单。 对于相同的“无事可做”的答案,在廉价层级上是几分钱,而在高努力度的前沿模型上则是几美元。

在你的限制之内运行

这些模型消耗 Token 的速度很快,你运行它们的方式决定了在撞墙之前能完成多少工作。

首先,要知道是哪堵墙。

  • 在使用 API 密钥时,墙是账单。progress.log 已经在监控它了。
  • 在使用订阅席位时,墙是同时评估的五小时窗口和周窗口。上面的日志中完全没有出现这两者。

关注你实际使用的计量表:Codex 设置中的使用面板,Claude 端的 /usage,或者像 ccusage 或 codexbar 这样放在屏幕角落的监控工具。

一个你从未读过的限制,就是你会在还剩四小时且无事可做时撞上的限制。

六个杠杆,从最便宜的开始。大多数作用于第 0 到第 2 级,即 Token 燃烧最厉害的地方:

  1. 将 CLAUDE.md 和 AGENTS.md 精简到核心内容。 每条消息都会读取它们,以及你启用的所有技能和工具。关闭你不使用的东西;一个未使用的 MCP 服务器就是对每条消息征收的税。
  2. 当你不需要最高层级时,降低努力级别。 默认设置为中等或高。将最高级别留给需要它的难题。同时,在调整时确认快速模式已关闭,因为它会放大你选择的任何设置。
  3. 给模型明确的停止点。 这些模型天生就会运行得很长。让它们先完成计划并检查,然后再执行,这才是计划模式真正的作用。
  4. 让子 Agent 保持在较低的努力级别。 它们会继承父级的模型和设置,一个满负荷的集群在一次消息中就能清空一个窗口。廉价的修复方法是在两个宪法中都加入一条规则:除非被要求,否则不要生成子 Agent。
  5. 让昂贵的模型远离批量工作。 无论 Fable 是作为低 Token 消耗的指挥者位于顶层,还是作为顾问随叫随到,它都应在决策点体现其价值,而不是在输入第一千行代码时。
  6. 查看一条消息的成本,然后根据这个数字调整以上五个杠杆。 这是唯一一个能告诉你其他五个中哪个是问题所在的杠杆。

这些杠杆共同决定了在限制阻止你之前,你能运行最佳模型多久。

当第二周开始时,Cron 任务:

bash
1# 任务循环:每日心跳,两个上限都设置
20 7 * * 1-5 cd /path/to/repo/loop && BUDGET_USD=5 ./ralph.sh >> ../progress.log 2>&1
3
4# 系统循环:没有已通过一次就不再被监控的东西
530 7 * * * cd /path/to/repo && python3 system/verify_goals.py goals/ >> progress.log 2>&1
6
7# 系统循环:失败变成规则,每周一次,仅限提案
80 9 * * 1 cd /path/to/repo && codex --profile deep exec \
9 "$(cat ~/.codex/prompts/compost.md)" >> proposals/$(date +\%F).md 2>&1

运行手册。每个警报,以及应对措施:

Avid - inline image

30 天日程表。不要跳过晋升步骤;每一步都解锁下一步。

Avid - inline image

指挥台

这里的每个循环都可以通过一个按键访问。斜杠命令存在于 Codex 端的 ~/.codex/prompts/ 目录下(文件名即命令),以及 Claude 端的 .claude/skills/ 目录下。CLI 片段是 cron 和 CI 运行的无头版本。

Codex 斜杠命令

Avid - inline image

/plan-stop 和 /effort 的回报最快。 两者都花费几百个 Token 来阻止你花费几十万个 Token。

这些模型运行时间长,所以你需要的关键检查点是在花费之前。/plan-stop 返回计划、“完成时”命令、影响范围、成本以及它会向人类提出的一个问题。然后它停止。

将这两个文件放入 ~/.codex/prompts/ 目录,文件名即命令。

effort.md 成为 /effort,即显式化的路由调节器:

markdown
1# /effort - 在花费之前选择努力级别
2
3先不要回答任务。先对其进行路由。
4
5给它打分。每项一分:
6 - 包含为什么、调试、竞态、死锁、重构、安全问题或优化
7 - 涉及多个子系统
8 - 之前的尝试已经失败
9 - 更改是不可逆的,或者面向用户
10
11然后映射:
12
13| 分数 | 努力级别 | 席位 |
14|---|---|---|
15| 0-1 || codex -e low,或 profile fast(Luna)。永远不要将前沿席位放在上面。 |
16| 2 || Terra 在中等努力级别是合适的席位。 |
17| 3+ || 这是真正工作的默认设置,也是最佳点所在。 |
18
19只有当高努力级别已经尝试过但失败时:才推荐最高级别,并明确说明额外的思考预期能带来什么。你正在反驳的基础概率大约是成本翻倍,而收益通常无法弥补。
20
21
22在推荐升级之前有两个提醒:
23 1. 低努力级别的更好模型通常优于高努力级别的较弱模型。先更换席位,再调整调节器。
24 2. 如果此任务会生成子 Agent,请明确说明它们的努力级别(除非有证据,否则默认为低)。子 Agent 继承父级设置,一个满负荷的集群在一次消息中就能清空上下文窗口。
25
26精确输出:
27 EFFORT: low | medium | high | max
28 SEAT: <model>
29 WHY: <one line, naming the points that scored>
30 SUBAGENTS: <effort to pin, or none>
31然后停止。人类按照你指定的级别运行任务。

一个实时的答案看起来像这样,它花费几百个 Token 来避免几十万个:

text
1EFFORT: high
2SEAT: gpt-5.6-sol
3WHY: contains "why", touches auth and sessions, prior attempt failed
4SUBAGENTS: low

plan-stop.md 成为 /plan-stop,即花费前的检查点:

markdown
1# /plan-stop - 计划工作,然后停止
2
3这些模型运行时间长。当计划正确时,这是一个特性;当计划错误时,这是一种昂贵的犯错方式。此命令在花费之前购买检查点。
4
5计划任务。不要编辑任何文件。不要运行构建。不要开始。
6
7生成:
8 GOAL: <one line>
9 ASSUMPTIONS: <what you take for granted; if these are wrong, so is the plan>
10 STEPS: <numbered, each one commit's worth of work>
11 DONE_WHEN: <the exact shell command that proves each step landed>
12 BLAST RADIUS: <files and systems touched; name auth, payments, migrations, prod
13 config explicitly>
14 COST: <rough tokens or dollars, and which seat runs each step>
15 UNKNOWNS: <what you would ask a human if you could ask exactly one question>
16
17然后停止并等待。
18
19计划时的规则:
20 - 歧义放在 UNKNOWNS 中。不要通过猜测并继续来解决它。一个在计划中猜测并延续到执行中的问题,其成本是一个问题的一百倍。
21 - 如果计划需要的凭据、端点或约定没有记录在此仓库中,请停止并说明。永远不要凭空发明一个。
22 - 如果任何 DONE_WHEN 不是一个 shell 命令,请重写该步骤直到它是一个 shell 命令为止。如果 shell 无法检查它,那么审查者也同样无法检查。
23 - 如果影响范围触及 AGENTS.md 中的“永不”列表,请将其放在顶部,并建议排队等待人类处理。
24
25你在这里为计划付费,而不是为差异付费。一个简短、诚实、包含真实未知数的计划,胜过一份自信满满但悄悄假设了错误内容的计划。

fable-advice.mdreview-hostile.md 成为 /fable-advice 和 /review-hostile。两者都是你已经写好的文件的 Codex 端镜像:来自构建 5 的顾问简报,以及来自构建 6 的敌对审查者合同。相同的规则,相同的上限,只是方向调转,跨过供应商界限。

compost.md 成为 /compost,即第 4 级的每周制度构建者:

markdown
1# /compost - 将本周的失败转化为下周的规则
2
3阅读本周的所有输出,仅此而已:
4 - progress.log 中的 BLOCKED 行(击败了三次顾问咨询的任务)
5 - GATE: REFUSED 条目(无法证明完成运行的记录)
6 - VIOLATED standing goals(某事完成后不再成立)
7 - 断路器和预算退出(代码 2 和 3)
8 - 由循环打开但未合并关闭的 PR(人类默默表示反对)
9 - 任何通过率低于 90% 的任务类
10
11最多提取三个提案。三个是硬性上限,而非目标。干净的一周是有效的发现,说出来比制造工作更有用。
12
13每个提案必须是以下之一:
14 1. 针对 CLAUDE.md 或 AGENTS.md 的新规则。引用本可以防止的事件。只有一个事件支持的规则是巧合;等待第二个事件。
15 2. 技能修复,当同样的失败在同个地方重复出现时。命名技能、模式以及能打破它的最小改动。
16 3. 你缺失的持续性目标,当有东西在无声中腐烂时。将谓词写成一个 shell 命令,否则不要提出它。
17
18输出:
19 WEEK: <dates>
20 EXHAUST: <counts: blocked, refused, violated, reverted>
21 PROPOSAL n: <law | skill fix | standing goal>
22 EVIDENCE: <the incidents, quoted>
23 CHANGE: <the exact text or predicate to add>
24 COST OF NOT DOING IT: <one line>
25 VERDICT: <what you would do first if you could only do one>
26
27硬性规则:
28 - 仅提议。不要编辑 CLAUDE.md、AGENTS.md、任何技能或任何目标文件。人类签字,否则不执行。
29 - 不要提议放宽门禁、提高预算或放松“永不”列表的规则。那些是系统在请求被允许更舒适地失败。
30 - 空输出:说“干净的一周”并停止。不要去寻找工作来证明运行的价值。

CLI 片段

将这些保存在一个草稿文件中。它们是整个系统,可从终端访问:

bash
1# the daily tick, capped in both dimensions
2BUDGET_USD=5 MAX_ITERS=20 ./loop/ralph.sh
3
4# plan first, spend later (the single highest-leverage habit here)
5codex -e high exec "$(cat ~/.codex/prompts/plan-stop.md)
6
7TASK: migrate the session store off the legacy adapter"
8
9# cross-vendor review of the last commit, in Sol's native harness
10codex --profile deep exec "$(cat ~/.codex/prompts/review-hostile.md)"
11
12# the mirrored lane: Codex stuck, Claude advises
13claude --model claude-fable-5 --effort high -p "$(cat ~/.codex/prompts/fable-advice.md)"
14
15# the goal loop: Fable plans, the fleet runs, Fable scores
16CYCLES=3 FLEET=4 WORKER_EFFORT=low ./swarm/swarm.sh "split the auth migration"
17
18# the system loop: nothing that passed once goes unwatched
19python3 system/verify_goals.py goals/ # exit 1 names what rotted
20python3 gate/eval_gate.py eval/cases.jsonl # exit 1 blocks the routing change
21
22# rung 3, the factory: rows decide, not transcripts
23./factory/factory.sh "build the kanban and notes app per PRD.md"
24python3 factory/factory_gate.py gate factory.db
25
26# the weekly institution-building run
27codex --profile deep exec "$(cat ~/.codex/prompts/compost.md)"
28
29# the one number that says whether any of this worked
30grep '^route' progress.log | awk -F'\t' \
31 '{n++; if($3!="frontier") c++} END{printf "cheap share: %.0f%%\n", c/n*100}'

完整策略位于构建 4 的 ROUTING.md 中,两个工作台都读取它。

规则(打印此页)

  1. 规则,而非提示:一个数字、一个“永不”列表,或一个能检查它的命令。
  2. 模型是租用的。循环是你的。你生活在第 5 级。
  3. 没有中止条件的循环就是一张账单。每个循环都有两个上限:迭代次数和美元金额。
  4. 证据向上流动,控制向下流动。没有一级能根据来自其下级的报告关闭。
  5. 循环可以停止但仍然可能是错误的。在合并之前检查它的最后一次提交。
  6. 在边界处路由。先选择努力级别,再选择模型。缓存投票反对切换。
  7. 默认设置为高。最高级别是深度,超高级别是宽度,快速模式是 2.5 倍的税,子 Agent 继承父级的席位和调节器。
  8. 路由器的状态是有罪,直到它在你的评估中击败最好的单一模型。
  9. 节省在于流量分流。关注廉价份额,而不是费率卡。
  10. 执行是批量,建议是按克。将咨询次数限制为三次。
  11. 没有人给自己打分。全新的上下文、其他血统、原生工作台。
  12. 线程是追踪记录。行是证据。门禁读取行。
  13. 永远不要为了通过测试而编辑测试。永远不要在门禁为 BLOCKED 状态时合并。
  14. 你只验证一次的目标,就是一个带时间戳的假设。
  15. 一次晋升一步。每个月,删除一些东西。

结语

三十天后,如果你完成了检查:

  • 一个循环在无人值守的情况下自动完成无聊的工作,背后是一个确定性的门禁
  • 一个廉价的驱动程序只在遇到困难时才咨询前沿专家
  • 每一个有意义的差异都交由一个非编写它的模型来判断
  • progress.log 中的一个数字会告诉你经济效益是否在累积

模型从来都不是困难的部分。一个在你停止关注时仍能保持诚实的系统,才是困难的部分,这也是为什么第 5 级上仍然有你的名字。

今晚就从那能证明它的二十分钟开始。构建 2 的 verify.sh。手动运行一次构建 3 的 Tick。从另一个血统对你上次提交进行一次审查。

当第一次,一个与编写者没有共享任何上下文的审查者,在你确信已完成的工作中发现了真正的错误时,你会对剩下的部分深信不疑。

今晚就构建门禁。回复它在第一次运行时抓住了什么。

免责声明

本文根据作者的研究笔记和经过验证的来源撰写,并在 Claude 的协助下进行了起草和事实核查。所有价格和模型行为在发表当周均与官方定价和文档页面进行了核对;它们会发生变化,因此在预算前请核实。

本文根据前述段落中提到的作者笔记撰写,并使用 Claude Opus 4.7 进行了编辑。

如果你想添加任何其他更正,请在评论中补充。

二次创作

使用 YouMind 创作爆款文章

收集素材、拆解爆点、生成视觉资产、撰写内容,并在一个 AI 工作空间里完成分发。

了解 YouMind
写给创作者

把你的 Markdown 变成干净的 𝕏 文章

图片上传、表格、代码块,往 𝕏 上手动重排太痛苦。YouMind 把整篇 Markdown 一键转成干净、可直接发布的 𝕏 文章草稿。

试试 Markdown 转 𝕏

更多可拆解样本

近期爆款文章

探索更多爆款文章