CLAUDE CODE · 2026 · 详尽总集图号 GP-HARNESS-01 · 施工手册

模型是支点,
harness 才是杠杆

Claude Code 把 agent 主循环替你写好了,循环之外那一圈得你自己搭。同一个 Claude,这一圈搭得好不好,决定它是只能改几行的工具,还是能扛 70 万行遗留系统的开发者

项目用好 Claude Code 的 harness 图别施工总说明 · 共 0–4 层 审核承重数字逐条事实核查 日期2026-06 · 版次 v3
支点 · 模型(给定) harness(你配的) 产出上限 ↑ 杠杆臂 = 本文第 0–4 层,逐层加长
GenAI Playbook · 十余篇 Claude Code 使用经验的整合 · 读完这一篇,不必再回头翻那十余篇
为什么先搭 harness

同一个模型,
环境决定它的上限

把 Claude 当一名新入职开发者认真接入,原本搁置的工作会重新推进;而模型本身的能力又确实是天花板。两面合起来:harness 是可调的杠杆,模型是固定的支点。支点换不了,能动手的只有杠杆。

两周
华盛顿大学 Skyline:搁置一年的功能两周完成;停更三年的夜间测试不到一天重启
11 天
用 Workflow 把 Bun 从 Zig 迁到 Rust,约 75 万行,测试通过率 99.8%
43→84%
同一套 harness 只换模型,compaction 质量从 Sonnet 4.5 升到 Opus 4.6

一条贯穿全文的纪律:harness 会随时间失效。模型一升级,此前搭的脚手架可能反成负担。所以下文每介绍一层,都要同时想它的退役时机,这点留到结语。

先把范围说清楚

这篇只讲「配 Claude Code」

Claude Code 提供的是 Anthropic 已实现好的主循环,无需自己编写 agent 主循环。本文只讨论一件事:这个现成框架该怎么配。三类东西不要混:①模型给的(改不了,第〇层)、②你配的(本文主体)、③你从零建的(不在本文范围)。

▸ ②配 Claude Code(本文主体)

底座选型、上下文管理、知识与工具的搭建顺序、用 subagent 与 Workflow 编排、把验证独立出来。全是在 Claude Code 里只配不建的东西。

另有 ①模型能力:给定项,改不了只能绕,是 harness 的地基(第〇层)。

▸ 不在本文范围:从零搭 agent

prompt caching 设计规则、MCP server 实现、面向 agent 的命令行、单 loop 与多 agent 架构取舍、把产物改造成可验证接口。这些是用 API/SDK 从零搭 agent 才会碰到的。

遇到此类内容本文只点到为止、标明「不在本文范围」,不展开。

全文施工图 · 点任意一层直达

五层,自下而上

0 · 地基:模型能力给定项 · 只能认不能改 1 · 上下文:唯一真正在管的资源5 分支点 2 · 知识与工具:7 层施工图CLAUDE.md → MCP 3 · 编排:计划该交给谁subagent / Workflow 4 · 验证:生成 ≠ 评估独立 Evaluator 实战 · 70 万行接入 + 结语 · 边搭边砍 施工顺序 · 自下而上
每层建立在下一层之上:地基认清了再管上下文,上下文管好了再添知识工具,然后才谈编排与验证。左侧导航全程跟着你,读到哪层亮哪层。
0Sheet 00 · 地基①模型能力 · 给定项,不是你搭的

第〇层:你绕不开的地基

这层不是搭出来的,是给定的。但要先认清它,因为它决定了 harness 能精简到什么程度。

0.1上下文窗口与 context rot

窗口是 100 万 token(系统提示词 + 完整对话 + 所有工具输出 + 已读文件),但窗口大不等于可以随意填。

窗口容量 噪声占比 ↑(旧的、无关的) 可用注意力 / 信号 ↓ 0 token 1M token
注意力机制的固有特性,不是 bug:上下文越长,信噪比越低。1M 不是用来塞下一切,是让单个任务更可靠地完成。

实用 tip:给状态栏装个 context 进度条。不用反复敲 /context 打断手感,剩多少窗口一眼可见:

claude — acme-monorepo
› 把 payments 服务改成用新的 ledger 客户端
Read services/payments/ledger.ts (+2.1K tokens)
Edit services/payments/charge.ts
~/acme-monorepo⎇ mainopus-4.8 · xhighcontext720K / 1M · 72%
这条就是插件加在状态栏的东西:剩多少窗口实时可见。过了七八成它会从绿转黄变红,提醒你该 /compact 或开 subagent,不用再敲 /context 打断手感。
0.2选对模型,本身就是 harness 设计

当前最强的编码模型是 Opus 5,2026 年 7 月 24 日发布,也是 Claude Max 的默认模型。但型号会继续更新,比版本号更重要的,仍是几条不会随换代失效的原则。

A
effort 默认 high,高要求编码适合使用 xhigh在 Claude Code 里,所有支持 effort 的模型都默认使用 high,唯一例外是 Opus 4.7,它默认使用 xhigh。Opus 5 的五档设置齐全,官方建议先从 high 起步,再按照自家评测向两个方向调整。只要评测显示质量没有下降,就该优先用 lowmedium,官方把它们定位成控制 token 成本与响应时间的主要开关;高要求的编码与 agentic 工作则适合调到 xhighmax 只适合确实值得无约束消耗 token 的任务,因为它仍有收益递减和容易过度思考的问题。从上一代沿用的设置也不能直接照搬,官方要求在自家评测上重新跑一次 effort 扫描。(Claude Code 在 Opus 4.7 那代把默认 effort 设为 xhigh,到 Opus 4.8 又回调为 high,这次来回本身就是下面 C 点的例子。)
B
思考预算自适应。需要加压就在提示词写「先逐步仔细推理,此题难度高于表象」,需要提速就写「优先快速响应,不确定时直接作答」。
C
每换一代默认行为都会变。为旧模型调好的提示词需要重看:响应长度、推理 vs 调工具、默认 subagent 数都可能变。别假设「全面超越」,每代都有取舍。下表是三类最常踩的变化。
D
把 Claude 当工程师委派,而非结对伙伴。每轮交互都增加推理开销,应充分授权:首轮就把意图、约束、验收标准、文件位置讲清,批量化让它持续推进。
这一代变了什么具体你要做的
默认 effort 变了4.7 时 Claude Code 默认 xhigh,4.8 改回 high编码手动设回 xhigh
长上下文检索回退(4.7 那代)多针检索 MRCR:256k 91.9%→59.2%、1M 78.3%→32.2%;连带重度联网研究 BrowseComp 约 −4.4ppRAG / 长文 / 纯联网调研,升级前按场景 A/B,别只看版本号
0.3模型越可靠,验证 harness 越能薄

4.8 这一代幻觉显著下降,直接改变你要在验证上花多少力气。同一套 fact-check 流程核 11 篇报告(独立 subagent 在干净上下文逐条比对原文、有问题就改、换新 subagent 复核到零问题),切到 Opus 4.8 那天是一道清晰的分水岭:

切 4.8 前 切 4.8 后 平均核查轮次 3.2 1.2 首轮零问题 0/6 4/5
数字密度最高的一篇(832 账号 / 13873 观测 / 33%→56% / r=0.28)也一轮零修正。幻觉率直接决定验证返工次数。

但别误读成「4.8 之后不用验证了」。变薄的是返工次数,不是验证本身。生成不等于评估、由独立 agent 验收而非执行者自评,这套分工制衡删不掉(详见第四层)。

0.4缓存决定你的配额:几条顺着来的规矩

prompt caching 是一层「不可见但花钱」的机制:前缀逐字节匹配,任何位置变一字节、其后缓存全失效。cache miss 让每轮全价重算、成本翻倍,进而把订阅计划的 rate limit 砍半,命中率直接决定 Pro/Max 给你多少配额。顺着它来即可:

·
不在长对话中途切模型。10 万 token 的 Opus 对话切到 Haiku 反而更贵(要为新模型重建缓存)。留在当前模型,或开 subagent(独立前缀链,不污染主缓存)。
·
窗口仍有余量时主动 /compact。compaction 被设计为复用父对话前缀以不破缓存,顺应系统而非对抗。原因见第一层。

caching 另有 5 条面向「从零搭 agent」的设计准则(tools 不中途增删、defer_loading、不跨模型、消息传递更新而非改 system prompt、compaction 伪装成父对话延续),不在本文范围,不展开。

1Sheet 01 · 上下文②配 Claude Code

上下文:你唯一真正在管的资源

loop 是现成的,你管的是输入什么、何时清。几乎所有使用差异都源于对窗口的管理。Claude 每完成一步,你都站在一个分支点上,5 个选择,4 个是为了管上下文质量:

完成 一步 Continue继续当前对话,上下文不变 /rewind回退,留文件读取、丢失败尝试 /clear清空重来,自写要点带入 /compact压缩为摘要后继续 Subagent独立全新窗口,只返回结论
悬停看清每条分支。最自然的是「继续」,但另外四个才是管上下文的杠杆。
1.2 / 1.3compaction 机制,与自动 compact 的坑

compaction 是有损压缩:接近上限时把整段对话总结成摘要,模型在全新窗口里基于摘要继续。问题出在自动触发的时机,它恰好落在模型最弱的时刻:

会话开始 上下文填满 → 模型可靠度(随 context rot 下降) ✓ 主动 /compact 状态尚佳、你清楚下一步 ✗ 自动 compact 在此触发 最弱时做最关键的总结决策
典型失败链:长 debug 后自动 compact,摘要聚焦调试;你说「去修 bar.ts 的警告」,可警告细节已被丢掉。对策:利用 1M 余量,趁状态好时提前主动 compact。
1.4Rewind 优于纠正

场景:读了 5 个文件、试方案 A 失败、要换 B。

直接口头纠正

失败连同纠正都留着

「那个不行,试试 B」,失败的方案 + 你的纠正全留在上下文里,继续增加噪音、干扰判断

/rewind(双击 Esc)

回到岔路口,干净换路

退到「读完 5 文件、还没试 A」的点,再说「别用 A,foo 没暴露那接口,直接用 B」。留下文件读取,丢掉失败尝试。

配套 "Summarize from here":让 Claude 把所学写成一条交接消息,相当于未来的 Claude 给过去的自己写信(「我试了 A,因……行不通」),避免后续会话重蹈覆辙。

1.5 / 1.8怎么选:两张速查表

/compact 与 /clear 都清上下文,区别在谁决定保留什么

维度/compact/clear
工作量低,Claude 自动总结高,你手动提炼
控制精度Claude 决定保留什么你决定携带什么
Context Rot部分缓解完全消除
适用任务中途清冗余开始全新任务
场景推荐原因
同任务,上下文仍相关Continue窗口内容都还在起作用
Claude 走错了路Rewind留文件读取、丢失败尝试
会话堆满过时调试信息/compact + 指令省力,你引导方向
开始全新任务/clear零 rot,你完全控制
下一步大量只需结论的输出Subagent中间噪音留子上下文

新任务 = 新会话。关联任务权衡:高度相关就继续(省去重读),否则 /clear。subagent 的心智测试,「我要的是工具输出本身,还是只要结论?」只需结论就派出去,更多用法见第三层。

2Sheet 02 · 知识与工具②配 Claude Code · 核心框架

知识与工具:7 层施工图

这层是全文核心框架。一个常被忽略的前提:harness 的重要性等于甚至超过模型本身。先说底层机制,Claude 找代码用的是 agentic search,不是 RAG:

维度RAG 工具Claude Code · agentic search
索引维护需 embedding pipeline不需要
时效性滞后(小时/天/周)实时操作 live codebase
失败模式返回已删/改名的函数,无提示无此问题
扩展性数千人并发提交时跟不上每个实例独立运行

代价:它需要足够起始上下文知道「从哪开始找」,导航质量取决于 setup 质量。结论:投入 codebase setup 的团队拿到更好的结果

2.2搭建顺序:七层,自下而上
自下而上构建 L1 · CLAUDE.md自动读取 L2 · Hooks自我进化 L3 · Skills本层重点 L4 · Plugins打包分发 L5 · LSP附加能力 L6 · MCP接外部系统 L7 · Subagents附加能力
每层建立在前一层之上,不宜跳跃。实线 = 五个扩展点,虚线 = LSP / Subagents 两项附加能力。另:从子目录初始化优于从仓库根(Claude 自动向上遍历,反而拿到更聚焦的上下文)。
最常见的错误用法
L1 CLAUDE.md塞可复用专业知识(该进 skill)
L2 Hooks用 prompt 实现本该自动跑的
L3 Skills全塞 CLAUDE.md
L4 Plugins让好配置停在个人手里
L5 LSP以为是自动的(要装 plugin 加 language server)
L6 MCP基础没搞好就先建
L7 Subagents同一 session 同时探索与编辑
2.3让代码库可导航:六个实践
1
CLAUDE.md 精简且分层:root 给全局、子目录给局部,叠加加载;root 只放指针和关键 gotcha。
2
从子目录初始化,而非 repo 根:Claude 自动向上遍历、加载沿途每个 CLAUDE.md,root 上下文不丢。
3
按子目录 scope test/lint:否则改一个 service 却跑全部测试,超时又费上下文。
4
.ignore 排除生成物/构建产物/第三方,把 permissions.deny 提交进版本控制、全团队共享。
5
结构不清晰时建 codebase map:repo 根放轻量 markdown,每个顶级目录一行描述。
6
跑 LSP 按 symbol 而非字符串搜:过滤发生在 Claude 读取之前,不必逐个打开判断。
acme-monorepo/
├── CLAUDE.md root:只放指针 + gotcha
├── .claude/
│   └── settings.json permissions.deny 入库
├── apps/web/
│   ├── CLAUDE.md 子目录级 test / lint
│   └── src/
├── services/payments/
│   └── CLAUDE.md 从这里 init,不从根
├── codebase-map.md 目录级索引
└── (LSP: clangd) 按 symbol 搜,不按字符串
六个实践不是「让 Claude 更聪明」,是「让代码库更好被探索」。Claude 在大库里的上限 = 它找到正确 context 的能力。
2.4Skills 深入:它是文件夹,不是一个 md

很多人以为 Skill 就是一个 SKILL.md。其实它是一个文件夹,SKILL.md 只是入口,旁边还能挂脚本、参考资料、模板、甚至自己的 hooks,这正是它比一段提示词强的地方。

my-skill/
├── SKILL.md 入口:description = 触发条件
├── scripts/ 可复用脚本,让 Claude 组合而非重写
├── references/ 渐进式揭露,要用才读(api.md…)
├── assets/ 模板、样例文件
├── hooks/ 按需拦截,如 /careful 拦 rm -rf
└── config.json 用户配置,没设就 AskUserQuestion
文件夹结构才是 Skill 的本体:SKILL.md 给方法,scripts/ 给手脚,references/ 按需加载省上下文。

机制上,每个 skill 的名字和描述是挂在系统提示里的,这正是它们能当触发开关的原因:Claude 扫一遍这些条目、决定用哪个,就发一次普通的 Bash 调用把对应的 SKILL.md cat 出来读进上下文,正文这才进来;里面引用的 references/api.md 之类,同样等真用到了才再 cat 一次。整条加载链都是 Claude 用通用工具按需拉取,不是框架预先塞好。

官方把 Skills 的常见用途归成九类,从查文档一路覆盖到运维:

库 / API 参考
产品验证
数据分析
流程自动化
脚手架生成
代码审查
CI / CD
Runbook
基础设施运维

来自 Anthropic 内部上百个 Skills 的九条最佳实践:

写法 · 前五条

把 skill 写对

  • 不讲废话:聚焦能把 Claude 推出默认思维的信息(例:叮嘱避免 Inter 字体和紫色渐变)
  • 建 Gotchas 章节:最值钱的内容,逐条记录失败点并持续更新
  • 文件系统做渐进式揭露:细节拆进 references/api.md,要用才读
  • 避免过度约束,极重要领域除外Description 是触发条件,不是摘要
运维 · 后四条

让 skill 持久好用

  • 存脚本让 Claude 组合,而非重建重复模板
  • 按需 Hooks/carefulrm -rfDROP TABLE
  • 持久化用 CLAUDE_PLUGIN_DATA(skill 目录升级会被删)
  • 用户配置用 config.json,没设就让 agent 用 AskUserQuestion 问

分享:小团队签入 .claude/skills,规模化走 plugin marketplace(需筛选避免烂 skill)。用 PreToolUse hook 记调用量看哪些受欢迎。一条经验:好 skill 多从几行字开始、随踩坑完善。

2.5MCP:接入侧怎么用

MCP 把外部数据源和系统接入会话。本文只讲怎么接进来用,怎么设计一个 MCP server 不在本文范围。接入侧有两个降本开关,都是客户端能力,不是 server 设计:

↓85%
Tool Search:工具众多时不预加载全部定义、运行时按需搜,工具定义 token 降约 85% 而选择准确度不变
↓37%
Programmatic Tool Calling:多次调用在代码沙箱里循环/过滤/聚合,只送最终输出,整体开销约降 37%
10 + 8
一个真实数据分析 plugin 打包 10 skill + 8 MCP server,一次安装从通才变领域专家

MCP 与 Skills 互补:MCP 给工具和数据,Skills 给操作知识,最强的 agent 两者兼用。(MCP server 五大设计模式不在本文范围。)

2.6这一层的暗线:less is more

早在 2024 年末,Claude 3.5 Sonnet 仅用 Bash 和 Text Editor 两个通用工具就拿下 49% 的 SWE-bench Verified,当时的 SOTA。Claude Code 的架构基础至今仍是这两个通用工具,Skills、Memory 都是它们的组合。

工具的 schema 和过长指令都会挤占推理空间。别急着设计复杂工具链,先看通用工具能不能做好。
2.7换个视角:一条指令该放进哪种载体

2.2 给的是施工顺序,回答「按什么次序把哪些能力搭起来」。这里换一个正交的视角:当手里已经有一条具体指令,它该放进哪种载体?官方把可用载体归为七种,区分它们的不是功能,而是四个轴:何时加载、压缩后是否还在、上下文成本、强制力。前面几节没单独提过的有三件,最要紧的是一个独立的约束载体 Rules(放在 .claude/rules/,加一个 paths: 字段限定作用域,只在 Claude 读到匹配路径的文件时才加载)。它和 CLAUDE.md 的分工是:不加路径范围就等同写进 root CLAUDE.md、全程常驻照样烧 token,价值全在 paths 上;某个目录的约定用嵌套 CLAUDE.md,散落在多个目录的跨切面硬约束(如「所有 handler 先校验输入」)用 path-scoped rule 更贴。

---
paths:
  - "src/api/**"
  - "**/*.handler.ts"
---
All API handlers must validate input with Zod before processing.
作用域限定在 src/api/** → 在只改文档的会话里它完全不进入上下文,只有 Claude 读到匹配路径的文件时才加载。这就是 Rules 区别于 root CLAUDE.md 的全部价值所在。
载体何时加载压缩后还在?上下文成本适合承载
CLAUDE.md · 根会话开始,全程常驻在,会被重读高,每行都占构建命令、代码库特有的坑、团队约定
CLAUDE.md · 子目录读到该目录文件时目录不再被碰就丢某目录的局部约定
Rules碰到匹配 paths重新注入中(不限范围则常驻)跨多目录的局部硬约束
Skills名字常驻,正文调用时加载按共享预算重注入,最旧先丢过程性工作流
Subagents名字常驻,正文仅被调用时只有结论回主会话主上下文近乎零该隔离、只取结论的旁支
Hooks生命周期事件触发完全绕过压缩低,配置在上下文外必须确定性发生的动作
Output styles会话开始,注入系统提示永不压缩高,且覆盖默认系统提示角色级改变(慎用)
Append-system-promptCLI flag,仅本次调用永不压缩中,首次后缓存语气、长度、格式偏好

绿色那列「压缩后还在?」是此前没系统讲过的轴:放进会被压缩丢掉的载体,长会话到后半程它可能就不在了。子目录 CLAUDE.md 在那个目录不再被碰时会丢,这点尤其容易踩。

场景 A · 从仓库根启动
cwd = ~/project/
~/.claude/
CLAUDE.md
project/CWD
CLAUDE.md
CLAUDE.local.md
packages/
api/
CLAUDE.md
web/
CLAUDE.md
场景 B · 从子目录启动
cwd = ~/project/packages/api/
~/.claude/
CLAUDE.md
project/
CLAUDE.md
CLAUDE.local.md
packages/
api/CWD
CLAUDE.md
web/
CLAUDE.md
会话开始即加载按需(读到该目录文件时)

真正决定哪些 CLAUDE.md 启动即加载的,是会话从哪个目录起:从 ~/.claude/ 到启动目录这条祖先链上的每个 CLAUDE.md / CLAUDE.local.md 都在开始时一起进上下文,只有启动目录以下的子目录才按需。在子目录里起会话,会把整条链的约定一并预载,这既是想要局部上下文时的用法,也是上下文悄悄变重的来源。

系统提示
4.2K
项目 CLAUDE.md
1.8K
auto memory
680
Skill 描述
450
用户 CLAUDE.md
320
环境信息
280
MCP 工具描述
120
用户还没敲第一个字,已加载约 7.8K / 200K(约 4%)。占大头的是系统提示和项目 CLAUDE.md,这正是把 root 控制在 200 行以内有意义的原因;MCP 与 Skill 启动时只载描述(各一两百 token),正文要到调用时才进。数字为官方示意值(illustrative),非固定。

写进 CLAUDE.md、Rules、Skills 的都是指令,而指令是请求,不是保证。长会话、模糊情境、或读到一份带 prompt 注入的文件时,模型就可能漏掉。所以「绝不能发生」的事,删库、改生产、碰禁区,靠写一句「不要这样做」不够,只有 hook 和权限能做确定性拦截。

PreToolUse hook 可在调用前检查、exit code 2 直接拦掉。企业里还有两条:managed settings 是唯一能做组织级强制护栏的机制,用户本地配置覆盖不了;经 MDM 下发的中央 CLAUDE.md 也不能被 claudeMdExcludes 排除。分线很清楚:提效软偏好放 CLAUDE.md / Skills,安全红线放 hook + 权限,这和第四层「执行者不应评判自己的产出」同理。
AGENTIC LOOP · 智能体回合 每轮循环 · EACH TURN Setup 可选启用 · opt-in SessionStart UserPromptSubmit PreToolUse 阻断闸门 · exit code 2 拒绝该调用 PermissionRequest [ 工具执行 · tool executes ] PostToolUse ·(+Failure) PostToolBatch SubagentStart / SubagentStop TaskCreated → TaskCompleted Stop / StopFailure 回合收束 · wind-down TeammateIdle PreCompact → PostCompact SessionEnd 恢复会话 · resumed sessions 旁路 / 异步事件 · OFF-SPINE UserPromptExpansion slash 命令展开 Permission Denied auto-mode 拒绝 Elicitation + ElicitationResult MCP 索取输入 Notification 异步通知 ConfigChange 异步配置变更 WorktreeCreate 隔离 · isolation WorktreeRemove 拆除 · teardown CwdChanged / FileChanged 环境响应 InstructionsLoaded 异步加载 图例 · LEGEND 主干流程 · main spine 旁路 / 异步 · off-spine 阻断闸门 · blocking gate 会话边界 工具执行 收束/压缩

Hook 能在整条 agentic loop 上触发,从 SessionStart 到 SessionEnd 一路埋着事件;每轮工具调用都会重走 PreToolUse → 工具执行 → PostToolUse 这段循环。Hook 的配置活在主上下文之外,不随 compaction 被压缩;其中 PreToolUse 是唯一的确定性阻断闸门,hook 以 exit code 2 退出就能拦下这次调用。右侧虚线簇是离主干的旁路/异步事件,独立于主流程触发。

最后两种载体多数情况别碰。Output styles 会覆盖默认系统提示,把「你是软件工程助手」连同安全与验证习惯一起抹掉,除非设 keep-coding-instructions: true,想改风格先看内置的 Proactive / Explanatory / Learning。Append-system-prompt 只对本次调用生效、纯叠加不改角色,但指令堆越多遵从越差。

收尾给一张「症状 → 换载体」速查。前面的决策表是「给定载体看属性」,这张反过来:发现自己正在 CLAUDE.md 里写某类东西,往往就是该把它挪个地方的信号。

你正在 CLAUDE.md 里写…它其实该放为什么
「每次 X 都要做 Y」(每次编辑后跑 prettier、完成时发 Slack)settings.json 里的 hook模型「选择」去跑 formatter,和 formatter「自动」跑,是两回事;要它可靠发生就交给 harness,别指望模型每次都记得
一段三十行的操作流程(部署 runbook、发布或审查清单).claude/skills/ 里的 skillCLAUDE.md 放「始终为真」的事实(构建命令、代码库特有的坑、团队约定);流程正文只在被调用时加载,常驻只会白白消耗 token
个人偏好(如「commit 一律用 semantic message」)用户级文件(~/.claude/ 或 CLAUDE.local.md)所有基于文件的载体都有一份用户级副本、跨 repo 全程加载;个人口味放用户级,项目级文件只留「团队共享但只对这个库成立」的约定

还有两种症状本节前面已讲过,不再展开:写「绝不能发生 X」要靠 hook 加权限、组织级靠 managed settings(见上面强制力那段);一条只对 src/api/** 生效的约束不写 paths:,机制上就等于塞进了 CLAUDE.md(见 Rules 那段)。

2.8官方的减法清单:被自己推翻的六条

2026 年 7 月 24 日,Anthropic 随 Claude Opus 5 发布了 Thariq Shihipar 撰写的官方博客。2.6 节埋下的 less is more 暗线,在这里被展开成一份明确、可执行的清单:面向 Opus 5 与 Fable 5,Anthropic 删掉了系统提示词中 80% 以上的内容,而自家编码评测没有出现可测量的下滑。作者把根因说得很直接:“Overall, we found that we were overconstraining Claude Code, both through our system prompt and in our CLAUDE.md files and skills.” 问题不只是提示词太长,也在于旧指令彼此冲突。2.6 讲的是指令挤占推理空间的容量成本;这里则是模型动手前必须先消解矛盾,所以花掉的是注意力。

A · 系统提示词的体量 100% <20% 删掉 80% 以上 · 编码评测无可测量下滑 B · 一个请求里的冲突指令 skill / CLAUDE.md / 用户请求 “leave documentation as appropriate” 系统提示词 “DO NOT add comments” 先消解矛盾 额外花掉的是注意力 才开始动手 多数时候仍能读出意图 容量成本 · 2.6 节讲过 指令的 schema 与正文挤占 模型用于推理的空间 注意力成本 · 本节新增 互相打架的指令要先被读懂、 权衡、取舍,之后才轮到干活
任务层要求酌情留下文档,系统层却禁止添加注释。两条指令落进同一请求,模型通常仍能读出用户意图,但官方发现,它在动手前必须先消解重叠约束之间的冲突。
旧做法新做法变了什么
给规则让模型判断从禁写注释,改为匹配代码库自身的注释密度与惯例
给示例设计接口示例会锁定探索空间,参数与枚举应直接表达用法
全部前置按需加载渐进式揭露前文已讲,这里只补内建工具的延迟加载
重复提醒简化工具描述去重前文已讲,这里只补把用法收进工具描述
手动写入记忆自动记忆不再靠 # 热键写入,改由系统保存相关记忆
简单规格丰富引用代码、测试、现有实现或评分标准都可以承载规格

高亮的四行是本文此前没有的。另外两行的主体在 2.1、2.4、2.6、2.7 已经讲过,下面只补它们新增的部分。

渐进式揭露不只用于 skill,也用于工具。Claude Code 的部分工具采用 deferred loading,agent 必须先用 ToolSearch 找到完整定义才能调用,官方点名的例子是自家的 Task tools。所以系统可以挂载更多工具,而这些定义在实际用到之前不会占用上下文。2.5 节讲的是 MCP 客户端侧如何为外部接进来的工具降本,这里讲的则是 Claude Code 内建工具对同一机制的另一半。早期模型有时需要重复提醒,也更偏向听上下文末尾的指令,所以系统提示词会复述一遍工具说明;现在重复内容可以删掉,用法直接留在工具描述里。

记忆机制也变了:过去用 # 热键把内容写进 CLAUDE.md 充当记忆,现在 Claude 会自动保存与工作和用户相关的记忆。rich references 则有四种形态:artifacts 功能生成的 HTML artifact、一套详细的测试套件、另一个代码库里待移植的函数,以及一份 rubric(评分标准,借 dynamic workflows 拉起 verifier agent,去核对某个领域里什么算做得好,官方举的例子是什么算好的 API 设计)。作者给出的排序是代码优先于文字描述和图片:“For example, a HTML mockup of a design will generally produce better results than a description of the design or a screenshot.” 七种载体的分类来自另一篇官方文章《Steering Claude Code》,这次没有修改分类,只是把 references 这一类实践讲得更透。

官方也把这套检查做成了命令 claude doctor:在 Claude Code 里执行 /doctor,它会把 skills 和 CLAUDE.md 调回合适的体量。后文结语讲的删减动作,到这一代有了官方给的自动入口。

3Sheet 03 · 编排②配 Claude Code

编排:计划该交给谁

问题变成:一个任务,让 Claude 自行逐回合承载整个计划,还是把计划交由他处持有。原则:小任务不拆分,大任务不让模型在上下文中独自记忆整个计划

3.1subagent:三特性、内置类型、五场景
三特性 / 三内置类型

它是什么

  • 三特性:全新起点(不继承历史)、并行、权限隔离(研究只读 / 实现可编辑)
  • 可嵌套:subagent 还能再往下派 subagent,最多五层,这正是动态编排把一个任务摊到成百上千个 agent 的结构基础
  • General-purpose:全工具,复杂多步
  • Plan Agent:只读,研究加规划
  • Explore Agent:只读,快速搜索
五个适用场景

什么时候派出

  • 研究密集(读几十个文件)
  • 多个独立任务(并行)
  • 需要全新视角(不继承假设/偏见)
  • 提交前验证(独立检查)
  • 流水线工作流(明确阶段/交接)
10+ 文件
需探索的文件超过此值就派出
3+ 子任务
彼此独立的子任务超过此值就派出
3≈1
3 个并行 subagent 的耗时约等于单个
3.2 / 3.3五种调用,四 pattern,五反模式

成熟度路径一句话:先对话,后自动化。先用自然语言,观察哪些反复出现,再固化:

step 1
对话式
自然语言,可 Ctrl+B 转后台
step 2
自定义 subagent
.claude/agents/,description 写触发条件
step 3
CLAUDE.md 规则
沉淀为长期约定
step 4
Skills 工作流
可复用的成套打法
step 5
Hooks 自动化
最自动,如 Stop hook 测试不过时阻止结束
四个实战 pattern

该用的姿势

  • 先研究再实现(从摘要谈起,而非 20 个原始文件)
  • 并行批量改(独立文件套同一模式)
  • 独立代码审查(全新视角更客观)
  • 流水线(设计/实现/测试,用文件交接)
五个反模式

别这么用

  • 顺序依赖:单会话顺着做更干净
  • 同文件编辑:并行改同一文件会冲突
  • 小任务:委派有开销,直接做
  • 专家 agent 过多:降低自动委派可靠性
  • 需 agent 间协调:彼此不能通信,该用 Agent Teams
3.4升维:Workflow,把计划搬进脚本

区分三者的不是规模,而是一个问题:那枚标着 PLAN 的方块在谁手里。Subagent/Skill 时由 Claude 逐回合持有、中间结果落进上下文;Workflow 让脚本持有,Claude 只看最终答案。

Subagent
Claude 逐回合
CLAUDE 上下文 ◆ PLAN { } 脚本
计划在脑中,每个中间结果都落进上下文
Skill
Claude 跟指令
CLAUDE 上下文 ◆ PLAN { } 脚本
指令是建议不是保证,怎么走仍逐回合定
Workflow
脚本
CLAUDE 只留最终答案 { } 脚本 ◆ PLAN
循环/分支全在脚本,中间结果不进上下文
SubagentsSkillsWorkflows
谁决定下一步Claude,逐回合Claude,跟 prompt脚本
中间结果存哪Claude 的上下文Claude 的上下文脚本变量
可复现什么worker 定义指令编排本身
规模每回合几个同 subagent每 run 几十到几百
中断时重启该回合重启该回合同会话内可 resume

Workflow 不是 Skill 的替代,两者正交:Skill 改变「模型知道什么」,Workflow 改变「如何确定性地编排」。一个 workflow 里 fan-out 的 agent 完全可以先挂 skill 再干活。

3.5 / 3.6计划进代码解锁三件事,与硬限制
1
中间结果不进上下文 → 不腐烂 → 能跑几小时甚至几天。协调发生在对话之外,无论任务多大,计划都保持在轨。
2
质量套路固化成代码强制执行,而非指望模型每次记得,「代码强制每条结论都过 N 个独立 skeptic」。
3
整个编排可保存、可重跑:在 /workflows 选满意的 run,按 s 存成 command。
16
并发 agent 上限(核少更少)
1,000
单次 run agent 总数上限
0
运行中可插入的用户输入
1
resume 仅限同一会话

收敛是退出条件而非固定轮数。触发:prompt 写 workflow / /effort ultracode / 跑已存 command;自带 /deep-research。可用性 Max/Team/API 默认开、Pro 需 /config、Enterprise 默认关。token 消耗远高于普通会话,先在小任务试手,大 run 前看 /model 把不需最强模型的阶段路由到小模型。

⚠ 3.7 · 旗舰案例 Bun 的前提,不能略过

用 workflow 把 Bun 从 Zig 移到 Rust:约 75 万行、11 天、测试通过率 99.8%,四个串联 workflow(① 映射 Rust lifetime ② 逐文件翻译,数百 agent 并行、每文件两个 reviewer ③ 驱动 build/测试到双绿 ④ 夜间优化、每处单独 PR 等人审)。但前提极其特殊,不可理解为「任意迁移都能 11 天」

  • strangler-fig 渐进替换,不是推倒重建,Zig 与 Rust 全程链入同一 binary、按类逐个开关切换
  • 每次切换都过 tests + shadow-diff + 不超过 2% 性能门禁,是验证驱动收敛而非「完成即信任」
  • 极高既有测试覆盖(99.8% 的前提是套件够强)、单作者主导尚未投入生产(99.8% 终究不是 100%)

正确读法:在有强测试与强验证门禁的高价值模块上,确定性脚本 + build/test 修复循环,能把按季度估的工程压到天级。先挑这样一块试点,而非照搬时间承诺。

3.8用 Workflow 前先懂三个失败模式

默认 harness 把规划与执行挤在同一上下文,碰上长时间跑、大规模并行、对抗性任务就会塌,塌法有三种,这正是要把计划搬进脚本的原因:

done! 35 / 50
agentic laziness
偷懒

50 项审查做到 35 项就宣布「搞定」。

产出 自己评 ✓ 全过
self-preferential bias
自我偏袒

评判自己刚做的东西时倾向回护。

别做X
goal drift
目标漂移

多回合后忠实度流失,compaction 丢掉「别做 X」。

Workflow 从结构上治这三样:偷懒,脚本持有完整清单、循环不到末尾不算完;自我偏袒,验证交给另一个独立 agent;目标漂移,目标写在脚本里、不随 compaction 流失。

3.9六个可组合的 pattern

成对比较(comparative judgment)比绝对打分更可靠,排序类任务尤其如此。

3.10 / 3.11用例:相当一部分并非编写代码

反直觉的是,它在非技术工作上常更有用。官方点名的九个用例,过半与写代码无关:

迁移重构每改动一 agent 在自己 worktree 改、另一 agent 对抗审查再 merge
深度研究不止联网,也能从 Slack 上下文汇总状态报告
深度核查一 agent 提取所有事实声明、每条派子 agent 查证标来源
排序淘汰赛 / 两两比较流水线
记忆与规则遵守
根因调查
规模化分诊带出下方的 quarantine 安全 pattern
品味驱动探索
模型路由
🛡 quarantine 隔离

读取不可信公开内容的 agent 不得执行高权限动作,高权限动作交给另一批专责执行的 agent。读取与执行分离,这是防 prompt injection 的结构性手段。

什么时候别用:workflow 能在很多场景做出超常结果,但并非每个任务都需要、且烧多得多的 token。先问「这真需要更多算力吗」。多数传统编程任务并不需要一个五人评审团。窍门:详细 prompt 最关键;小任务可开 quick workflow;配 /loop /goal;写 use 10k tokens 封顶;按 s 存进 ~/.claude/workflows 或纳入 skill。把它当探索新用法的起点,不是终点。

4Sheet 04 · 验证②配 Claude Code

验证:执行者不应评判自己的产出

代码编写成本已经很低,瓶颈后移到验证。核心一句:生成不等于评估,二者必须分离。让干活的 agent 评自己的产出,它几乎总自信地给好评,如同让开发者审自己的代码。一个工程现实:把独立 Evaluator 调严,比让 Generator 学会自我批评容易得多

规格·做什么 交付 verdict·合约回流 Planner需求·只定做什么 Generator按 Sprint 增量构建 Evaluator像真实用户一样测
Evaluator 用 Playwright 真点真填、对每条验收标准逐条打分(一个关卡编辑器就 27 条),抓的是「mouseUp 没触发导致填充工具失效」这种真 bug。Design Quality / Originality 高权重,Craft / Functionality 是 baseline。
▸ ②本文范围内

用独立 review subagent,或 Workflow 的对抗式验证 pattern,让验收与执行不是同一个、也不共享上下文。纯 Claude Code 用法,不写一行额外代码。

▸ 自有产品可更进一步(不在本文范围)

把产物改造成 agent 可读可验的接口(data-verify-* 契约、window.__verify API、.verify.ts)。核心论点是「经济学翻转」:agent 把验证的边际成本压到趋零,contract testing 才第一次在前端规模化可行。这是改造自有产品才会做的事。

Sheet 05 · 集大成案例 · 全程只用现成能力

70 万行遗留代码库的接入

把四层组合用在开篇提到的 Skyline 上。核心方法论:把 Claude 当新员工 onboard,像带实习生一样,解释足够背景让它完成一个有限项目,并为下一轮产出更好的 context。这是个五步闭环,每轮起点更高:

↻ 下一轮,起点更高 限定 scope 提供 context 完成任务 沉淀 context 扩展 scope
正如「你不会让新人第一天就面对 70 万行代码」。每次任务结束都把所学写回 context 层,下一轮 Claude 起点更高。
华盛顿大学 MacCoss 实验室70 万行+ C#20 万+ 夜间测试2008 起 · 17 年
上下文层
context 置于独立 repo pwiz-ai,而非代码仓库,否则会被分支隔离,每个分支上的 Claude 成了「不同的人」。团队当正式工程产物维护、打版本。
知识层
skills 严格遵循 "Reference, Don't Embed"。debugging skill 硬性触发:调查 bug/失败/异常时必须加载,强制根因分析,杜绝改一行试一下。
工具层
两个自建 MCP server:截图 Diff Server 把 2000 余张教程截图重现率提到接近 100%、让 Claude「看见」UI 回归;每日摘要 Server 把 20 万夜间测试的失败直接喂给 Claude。
两周
搁置一年、开发者离职后停摆的 Files View 面板交付,commit 全 co-authored
<1 天
停更三年的 Java/LabKey 夜间测试模块重启,含以前要请设计师的 CSS
4 层全用
连一个原本持怀疑的成员也独立用它完成了一个面板

四条启示:scope 隔离是前提(大屎山不能一把梭,切片喂、逐步扩展)· debugging skill 必须硬约束(70 万行盲改一行可能连锁爆炸)· context 必须独立于代码分支 · MCP 打通测试基础设施。一个诚实的前提:这不是装上就能用的银弹,需要有人维护 context 层、渐进推进。但它在「最不适合 AI 的场景」里跑通了。

Sheet 06 · 结语 · 竣工即开始减法

边搭边砍:harness 的半衰期

harness 不是一次搭就一劳永逸,它有半衰期。每个组件都编码了一个对模型能力的假设,而假设会过期。能删多少,取决于模型多强。

真实案例:Sonnet 4.5 近上限时会「上下文焦虑」提前结束任务,团队加了段 context reset 补偿;Opus 4.5 上线、这行为消失后,那段代码就成了纯负担。同理,一个为强制走 Perforce p4 edit 而拦截写文件的 hook,在原生支持后也变多余。正确心态不是「怎么让 Claude 更强」,而是「我能停止做什么」。

Sonnet 4.5
43%
Opus 4.5
68%
Opus 4.6
84%
compaction 质量天花板:决定上限的是模型能力而非压缩算法。模型越强,越能把控制权交还给它,harness 越能薄。
同一个「造完整应用」任务,模型一升级,脚手架就能砍
Opus 4.5 Planner Generator Evaluator Sprint 拆解 context reset 6h · $200
Opus 4.6 Planner Generator Evaluator Sprint 拆解 context reset 3h50 · $124

但有些东西删不掉。Planner 与 Evaluator 这类分工制衡保留了下来:没有 Planner,Generator 会 under-scope;没有 Evaluator,边界任务的 bug 会遗漏。可删减的(脚手架)与不可删减的(上下文纪律、分工验证)要分清。建议每 3 到 6 个月审计一次 harness,先跑 /doctor 检查 skills 和 CLAUDE.md 的体量。Anthropic 此轮删掉 80% 以上的系统提示词,可作为收缩幅度的参照,但不是固定指标。

134 天 / 126 版
Claude Code 自身迭代节奏,周均 6.6 个版本,近七成日子都在出版本
$200→$124
同产出,模型升级后成本下降、流程更简
只会挪位置
值得关注的 harness 空间不会随模型进步缩小,只会迁移