模型是支点,
harness 才是杠杆
Claude Code 已实现 agent 主循环,围绕它配置的上下文、工具、编排与验证,构成了这里所说的 harness。同一个 Claude 能承担什么工作,也取决于这套环境如何配置。70 万行遗留系统的接入案例,展示了 harness 在大型项目中的实际作用。
同一个模型,
配置影响实际表现
像接入一名新入职开发者一样,把 Claude 接入项目,有助于推进原本搁置的工作;它能做到什么,仍受所选模型的能力约束。harness 是可调的杠杆,选定的模型是它的支点。配置不会改变这个模型本身的能力,但模型可以选择或更换,harness 也需要随之调整。
harness 需要随模型变化持续调整。模型升级后,原有配置可能失效,此前有用的脚手架也可能成为负担。每层配置都需要考虑保留和退役的时机。
这篇只讲「配 Claude Code」
Claude Code 提供了 Anthropic 已实现的 agent 主循环,使用者无需从零编写这部分。本文讨论如何配置这个现成框架,并区分三类内容:①选定模型本身的能力(第〇层),②围绕任务配置的 harness(本文主体),③从零构建 agent 框架(不在本文范围)。这里的区别是配置现成框架与从零构建框架,而不是是否编写代码。
模型选型、上下文管理、知识与工具配置、subagent 与 Workflow 编排,以及独立验证,都围绕 Claude Code 已有框架展开,也可能用到 hook 或 Workflow 脚本。
另有 ①模型能力:所选模型的能力边界,是 harness 的地基(第〇层)。
prompt caching 设计规则、MCP server 实现、面向 agent 的命令行、单 loop 与多 agent 架构取舍、把产物改造成可验证接口。本文不展开这些自建 agent 或改造外部系统的实现细节。
遇到此类内容本文只点到为止、标明「不在本文范围」,不展开。
五层,按任务需要配置
第〇层:模型能力与使用成本
模型选定后,它本身的能力就是配置 harness 的前提。认清这些能力及其边界,才能判断哪些配置仍有必要,哪些可以精简。
上下文窗口容纳系统提示词、完整对话、所有工具输出和已读文件。窗口容量可达 100 万 token:截至 2026 年 10 月,Fable 5.x、Opus 4.7 及之后、Sonnet 5 及之后、Haiku 5.5 原生支持 1M,老模型标准为 200K。容量更大,并不等于可以不加选择地填入内容。
状态栏可以加上 context 进度条。它实时显示上下文窗口的用量,无需反复运行 /context 查看:
/compact 或 subagent,无需反复运行 /context 查看。effort 从模型的默认档起步,再按评测调整。在 Claude Code 里,支持 effort 的模型多数默认 high;例外是 Opus 5.5、Sonnet 5.5、Haiku 5.5 默认 medium,Opus 4.7 默认 xhigh。官方的依据是,Anthropic 测试中 Opus 5.5 的 medium 在编码和知识工作评测上达到或超过 Opus 5 的 high,而同一档位下 Opus 5.5 每轮想得更多,所以从 Opus 5 换过来应从 medium 起步,不要沿用旧档位。
档位共五档(Opus 4.6、Sonnet 4.6 没有 xhigh)。
只要评测显示质量没有下降,就该优先用 low 和 medium,官方把它们定位成控制 token 成本与响应时间的主要开关;高要求的编码与 agentic 工作适合调高到 high 或 xhigh。max 只适合确实值得无约束消耗 token 的任务,因为它仍有收益递减和容易过度思考的问题。
从上一代沿用的设置也不能直接照搬,官方要求在自家评测上重新跑一次 effort 扫描。(默认 effort 在 Opus 4.7 那代是 xhigh,4.8 回到 high,5.5 这代又降到 medium,这几次来回本身就是下面 D 点的例子。)
开局先确认自己在哪一档。新会话先跑一次 /model 和 /effort:两者都会记住上次选的,所以这个选择应当是有意为之。明知这次是粗活,MAX_THINKING_TOKENS=0 可以关掉这一个会话的思考,它是 /effort low 之下的一档;但在 Opus 5.5、Sonnet 5.5、Haiku 5.5 和所有 Fable 模型上思考关不掉,这个变量不起作用。中途切换模型和(老模型上的)effort 的缓存代价见 0.4。
/effort 五档之外还有 auto,由 Claude 按每次请求自己选档;滑块里另有一个 Ultracode 开关,它是设置不是档位(见 3.7)。
max 消耗用量额度更快,官方建议按会话开启,只留给难调的 bug 和架构决策。(官方帮助中心的技巧合集里,Claude Code 团队成员的个人口径是「所有事都用 Opus 加 thinking」:引导次数少、工具用得好,总耗时反而比小模型短。这是工程师个人经验,说的是选哪个模型,与上面「从模型默认档起步、按评测调整」的档位建议不冲突。)
截至 2026 年 10 月,Claude Code 在 Pro、Max、Team、Enterprise 和 Anthropic API 上的默认模型都是 Opus 5.5(2026-09-22 发布,需 v2.1.280 及以上;官方称它在多数工作上达到 Fable 5.1 的水平,价格比 Opus 5 低 40%)。官方文档把 Fable 5.1 与 Fable 5 列为能力最强的模型,但它们不是任何套餐的默认模型,用量可能计入 usage credits;同期还有 Sonnet 5.5(09-28)和 Haiku 5.5(10-07)。
7 月 24 日发布的 Opus 5 此前是 Max 的默认模型。默认型号会继续变化,模型选择和 effort 设置仍需结合任务与评测来调整。
| 这一代变了什么 | 具体 | 你要做的 |
|---|---|---|
| 默认 effort 变了 | 4.7 时 Claude Code 默认 xhigh,4.8 改回 high,5.5 这代降到 medium | 换代时按自家评测重新扫一遍档位,别沿用旧值 |
| 长上下文检索回退(4.7 那代) | 多针检索 MRCR:256k 91.9%→59.2%、1M 78.3%→32.2%;连带重度联网研究 BrowseComp 约 −4.4pp | RAG / 长文 / 纯联网调研,升级前按场景 A/B,别只看版本号 |
在这组报告核查记录中,4.8 这一代的幻觉问题明显减少,验证返工也随之减少。2026 年 5 到 6 月,同一套 fact-check 流程核查了 11 篇报告:独立 subagent 在干净上下文中逐条比对原文,发现问题后修改,再换新的 subagent 复核,直到没有发现问题。切换到 Opus 4.8 前后的记录如下:
这组记录中,切换 4.8 后减少的是验证返工次数,验证本身仍然必要。生成与评估承担不同职责。执行者可以运行客观测试,但不能用自我评价代替独立 agent 的验收;独立评审与执行者自测相互补充。
按 token 计费,实际支付的是推理所占用的计算时间。模型处理这些 token,需要占用 GPU。一个 token 的价格由三件事决定:使用哪个模型、属于输入还是输出、是否命中缓存。模型选择见 0.2,下面各项价格都以所选模型的单价为基础。
| 一个 token | 相对输入价 | 为什么 |
|---|---|---|
| 输入 · prefill | 基准 | 模型把这次发来的全部内容读一遍:系统提示词、CLAUDE.md、你的消息,加上会话里已经进来的文件与命令输出 |
| 输出 · decode | 约 5x | 一个 token 一个 token 地生成,200 token 的回复就是接连跑 200 次;按单个 token 算,占住 GPU 的时间长得多 |
| 缓存读 | 0.1x | 服务端把已经算好的状态装回来,不重算 |
| 缓存写 | 最高 2x | 要额外把状态留住;但写只发生一次,之后每一轮都按 0.1x 读 |
以「修 utils.test.ts 里挂掉的测试」为例。在这个示例中,Claude Code 共发出 5 次请求,每次都带着截至当时的完整对话:
缓存从请求开头逐字节匹配相同的内容,而请求顺序是固定的:工具定义、系统提示词、对话,CLAUDE.md 位于对话最前面。追加到末尾的工具结果不会改变已有前缀。改动请求前部,或改动用于区分缓存的条件,也就是缓存键,则会影响缓存复用。以下几项会改变前缀或缓存键:
/model:每个模型有自己的缓存,切换后下一轮整段对话按全价重算。opusplan 也算,它每次进出 plan mode 都换模型。/effort:多数模型上 effort 也在缓存键上,中途切换会要你确认。例外是 Opus 5.5、Sonnet 5.5、Haiku 5.5 和 Fable 5.1:用 API key 或 Claude 订阅时改 effort 不破缓存,也不再弹确认(Bedrock、Google Cloud、Claude apps gateway 和 HIPAA 配置下仍会破)。/compact:对话被换成更短的一段,里面的内容都对不上了,前面的系统提示词仍然保留。ENABLE_PROMPT_CACHING_1H=1 把两类都改成一小时,更细的控制是 v2.1.242 起的 promptCacheTtl 与 subagentPromptCacheTtl。隔得更久回来,下一轮重新 prefill 整段对话;resume 旧会话几乎总是如此,缓存那时通常已经没了,系统提示词在启动时本来就会重建。Anthropic 内部把缓存命中率(cache hit rate)跌破阈值视为生产事故(SEV)。其描述的成本链条是:缓存未命中(cache miss)让每轮请求按全价重新计算,成本翻倍,进而把订阅计划的用量限制(rate limit)砍半。命中率因此直接影响 Pro/Max 的可用配额。
模型和 effort 可以按任务需要调整,切换成本则与时机有关。对于会使缓存失效的切换,会话开头或刚 /clear 之后成本较低,长对话中途成本较高。由此有两条会话管理建议:
缓存另有 5 条面向「从零搭 agent」的设计准则:tools 不中途增删、使用 defer_loading、不跨模型、通过消息传递更新而非修改 system prompt,以及让生成 compaction 摘要的请求延续父对话前缀。这些属于框架实现层面的设计,不在本文范围。
上下文:输入、保留与清理
内容只要仍在对话里,就会随后续每一轮再次发送。这包括 Claude 读过的文件和命令输出。一轮是指你或工具给出输入、模型作出回应的一次完整往返。命中缓存会降低重复发送的成本,但不等于免费;这些内容也持续占用上下文,模型每一轮都要处理。一次会话的成本可以从三个方面来看:
会话启动时已经加载的内容,可以用 /context 查看。CLAUDE.md 只保留具体指令,特定工作流的指令放进按需加载的 skill;本次不用的 MCP server 则用 /mcp 关闭。会话开始后,新增内容几乎都是工具结果。Claude 需要读取多少材料,很大程度上取决于任务描述留下了多少信息需要它自行查找:
| 同一件事的三种说法 | 代价 |
|---|---|
| 「测试挂了」 | 先 grep 找是哪个测试、翻开几个文件看哪个相关,这些结果在不再有用之后还一直待着 |
「修 utils.test.ts 里挂掉的那个测试」 | 省掉搜索,只花一次 Read 调用 |
「修 @utils.test.ts 里挂掉的那个测试」 | 连 Read 也省掉:@ 在发送前就把文件附在消息上,第一个请求里就有它 |
用 @ 附加文件与让 Claude 读取文件,占用的上下文空间一样大。一个会话里 @ 一次就够,再 @ 一次通常会附上第二份。
另一类持续占用上下文的内容是命令输出。测试、构建和 git log 的输出,会像读入的文件一样追加到对话里,并随后续轮次反复发送。它们如何留在对话中,取决于是否超过输出阈值:
反倒安全
Claude Code 会把输出写进文件,对话里只留约 2,000 字符的预览和路径。想改留在对话里的上限,用 v2.1.261 起的 bashOutputMaxChars 设置(最高 128,000);BASH_MAX_OUTPUT_LENGTH 现在管的是回读窗口。失败的命令只留约 10,000 字符,取头尾两段。
才是长期负担
一个 runner 逐行打出 400 个通过的测试,刚好在限额以内,那 400 行从此跟着剩下的每一轮走。
Claude 常会自行添加 flag,或用 tail 缩短命令输出。需要固定控制时,官方文档提供了一个 hook,在命令执行前改写命令,只返回要紧的行。也可以把每天反复使用的那两三条命令连同 quiet flag 一起写进 CLAUDE.md,保留平时实际输入的形式。例如,跑单个测试文件用 npx vitest run --reporter=dot,既省一轮交互,也省掉之后每个会话里几百行输出。
内容停留的轮数同样影响成本。同样的工作放在一个长会话里,比拆成几个短会话更贵。因此,开始新任务时用 /clear,避免继续携带上一项任务的上下文;同一任务的前半段完成后,则可以用 /compact 清理已经不再需要的细节。
如果之后还需要回到当前会话,可以在 /clear 前先用 /rename 命名。运行 /compact 时说明需要保留什么;如果每次要求相同,就在 CLAUDE.md 里写一段 Compact instructions。
使用 1M 模型时,如果希望把自动 compact 的触发位置恢复到原来的水平,可以用 /autocompact 200k。这需要 Claude Code v2.1.221 及以上,v2.1.288 起会按模型分别记住该设置。
没有手动输入时,会话也可能继续产生轮次。/loop 每次触发,都会在设置它的会话里运行完整一轮,并携带整段对话;距上一轮超过一小时,还会发生一次 cache miss。因此,可以在另一个终端开启新会话,专门运行这个 loop。/loop 只在本机运行,一次最长 3 天;合上电脑后仍需继续运行的任务,则使用云端的 /schedule。两者的分工见 官方给 loop 下定义。
Claude Code 提供了现成的 loop,也就是 agent 主循环。上下文是使用过程中需要管理的一项重要资源:输入什么、保留什么、何时清理,都会影响后续工作。Claude 每完成一步,都有 5 个选择,其中 4 个直接用于调整上下文:
compaction 会把整段对话总结成摘要,模型随后在全新窗口里基于摘要继续工作,因此它是一种有损压缩。风险之一在于自动触发的时机:窗口接近上限时,上下文已经变长,模型需要在可靠度下降的状态下决定哪些信息应当保留:
Claude 已读完 5 个文件,尝试方案 A 失败,接下来准备改用 B。此时可以直接纠正,也可以回退到尝试 A 之前:
失败连同纠正都留着
「那个不行,试试 B」,失败的方案 + 你的纠正全留在上下文里,继续增加噪音、干扰判断。
回到岔路口,干净换路
退到「读完 5 文件、还没试 A」的点,再说「别用 A,foo 没暴露那接口,直接用 B」。留下文件读取,丢掉失败尝试。
配套的 "Summarize from here" 可以让 Claude 把已经学到的内容写成一条交接消息,例如「我试了 A,因……行不通」。将尝试过的方案和失败原因留下,有助于减少后续会话重复同样的尝试。
回退最后几轮时,rewind 的缓存成本也更低。它只从末尾移除这些轮次,前面仍有效的缓存可以继续复用,不会因回退而产生缓存重建费用。/compact 则需要生成摘要,后续请求使用的对话前缀也会改变,因此仍有成本。如果只是最后几轮走偏,适合 rewind 到它们之前,而不是用 /compact 整理整段对话。
分叉与 rewind 处理的是不同需求。rewind 把当前会话退回到此前的位置;/branch(命令行用 claude --resume <session-id> --fork-session)则从当前会话复制出一条新支线,原会话保持不变。需要尝试不确定的方向、同时保留当前进展时,可以使用分叉。
/compact 把对话压缩成摘要,/clear 清空对话后重新开始。两者的关键区别在于由谁决定保留什么:
| 维度 | /compact | /clear |
|---|---|---|
| 工作量 | 低,Claude 自动总结 | 高,你手动提炼 |
| 控制精度 | Claude 决定保留什么 | 你决定携带什么 |
| Context Rot | 部分缓解 | 清除旧会话上下文 |
| 适用 | 任务中途清冗余 | 开始全新任务 |
| 场景 | 推荐 | 原因 |
|---|---|---|
| 同任务,上下文仍相关 | Continue | 窗口内容都还在起作用 |
| Claude 走错了路 | Rewind | 留文件读取、丢失败尝试 |
| 会话堆满过时调试信息 | /compact + 指令 | 省力,你引导方向 |
| 开始全新任务 | /clear | 旧对话清空,自行携带要点 |
| 下一步大量只需结论的输出 | Subagent | 中间噪音留子上下文 |
| 要离开键盘一阵子 | /compact | 趁旧对话还在缓存里,写摘要便宜 |
| Claude 正在干活,你有个小问题 | /btw | 只答一轮、不调工具,但看得到完整对话,不打断主任务 |
| 想试另一个方向但保留现状 | /branch | 原会话不动,新支线继承到此为止的上下文 |
新任务适合新会话。关联度高的任务可以继续当前会话,省去重读材料的开销;关联度低则适合 /clear。
是否使用 subagent,可以从所需结果来判断:「我要的是工具输出本身,还是只要结论?」只需结论时,可以把工作交给 subagent,让中间输出留在它的独立上下文里。但它没有主会话的对话,有时需要重读主会话已有的材料,这些轮次也消耗用量。小任务交出去可能只增加开销,主会话也只能拿回它选择汇报的部分。
同类、输出较多的任务如果需要反复委派,可以建立专用的 subagent 定义,写上 model: haiku;未指定时,它会沿用主会话当前的模型。
知识与工具:各自放在合适的位置
知识如何组织、工具如何配置,是 harness 影响工作结果的重要部分。除了模型能力,harness 本身也值得投入。Claude Code 找代码用的是 agentic search,即调用工具直接探索当前代码库,而不是依靠预建索引的 RAG(检索增强生成):
| 维度 | RAG 工具 | Claude Code · agentic search |
|---|---|---|
| 索引维护 | 需 embedding pipeline | 不需要 |
| 时效性 | 滞后(小时/天/周) | 实时操作 live codebase |
| 失败模式 | 返回已删/改名的函数,无提示 | 无此问题 |
| 扩展性 | 数千人并发提交时跟不上 | 每个实例独立运行 |
直接探索代码库也需要足够的起始上下文,让 Claude 知道从哪里开始找。导航质量取决于 codebase setup,也就是代码库的上下文与导航配置。投入 codebase setup 的团队能拿到更好的结果。
| 层 | 最常见的错误用法 |
|---|---|
| L1 CLAUDE.md | 塞可复用专业知识(该进 skill) |
| L2 Hooks | 用 prompt 实现本该自动跑的 |
| L3 Skills | 全塞 CLAUDE.md |
| L4 Plugins | 让好配置停在个人手里 |
| L5 LSP | 以为是自动的(要装 plugin 加 language server) |
| L6 MCP | 基础没搞好就先建 |
| L7 Subagents | 同一 session 同时探索与编辑 |
2.2 从能力配置的角度组织七项能力;具体指令放在哪种载体,则是另一个问题。官方把可用载体归为七种,选择时可以比较四个方面:何时加载、压缩后是否还在、上下文成本,以及强制力。
Rules 是其中一种约束载体,放在 .claude/rules/。通过 paths: 字段限定作用域后,规则只在 Claude 读到匹配路径的文件时加载。不限定路径范围的规则,会像 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 读到匹配路径的文件时才加载。这体现了路径范围对规则加载的影响。| 载体 | 何时加载 | 压缩后还在? | 上下文成本 | 适合承载 |
|---|---|---|---|---|
| CLAUDE.md · 根 | 会话开始,全程常驻 | 在,会被重读 | 高,每行都占 | 构建命令、代码库特有的坑、团队约定 |
| CLAUDE.md · 子目录 | 读到该目录文件时 | 目录不再被碰就丢 | 低 | 某目录的局部约定 |
| Rules | 碰到匹配 paths 时 | 重新注入 | 中(不限范围则常驻) | 跨多目录的局部硬约束 |
| Skills | 名字常驻,正文调用时加载 | 按共享预算重注入,最旧先丢 | 低 | 过程性工作流 |
| Subagents | 名字常驻,正文仅被调用时 | 只有结论回主会话 | 主上下文近乎零 | 该隔离、只取结论的旁支 |
| Hooks | 生命周期事件触发 | 完全绕过压缩 | 低,配置在上下文外 | 必须确定性发生的动作 |
| Output styles | 会话开始,注入系统提示 | 永不压缩 | 高,且覆盖默认系统提示 | 角色级改变(慎用) |
| Append-system-prompt | CLI flag,仅本次调用 | 永不压缩 | 中,首次后缓存 | 语气、长度、格式偏好 |
绿色列「压缩后还在?」说明了载体在长会话中的保留方式。指令如果放在会被压缩丢弃的载体里,到会话后半程可能已不在上下文中。子目录 CLAUDE.md 在对应目录不再被访问时也会丢失。
哪些 CLAUDE.md 会在启动时加载,取决于会话的启动目录。启动时会加载 ~/.claude/ 中的用户级约定,以及通向启动目录的祖先链上每个 CLAUDE.md / CLAUDE.local.md;只有启动目录以下的子目录文件才按需加载。从子目录启动,会把整条链上的约定一并预载,既能获得所需的局部上下文,也会增加启动时的上下文负担。
Output styles 和 Append-system-prompt 多数情况下无需使用。Output styles 会覆盖默认系统提示;除非设置 keep-coding-instructions: true,原有的「你是软件工程助手」角色设定及其安全与验证习惯也会被移除。调整风格可以先考虑内置的 Proactive / Concise / Explanatory / Learning。其中,后加入的 Concise 会先给结果,省去开场白和复述。Append-system-prompt 只对本次调用生效,以叠加方式添加指令,不改变角色,但叠加的指令越多,遵从度越容易下降。
指令的内容也能帮助判断该用哪种载体。前面的表格比较各类载体的属性;「症状 → 换载体」速查则从 CLAUDE.md 中的内容出发,判断哪些指令适合移到其他位置。
| 你正在 CLAUDE.md 里写… | 它其实该放 | 为什么 |
|---|---|---|
| 「每次 X 都要做 Y」(每次编辑后跑 prettier、完成时发 Slack) | settings.json 里的 hook | 模型「选择」去跑 formatter,和 formatter「自动」跑,是两回事;要它可靠发生就交给 harness,别指望模型每次都记得 |
| 一段三十行的操作流程(部署 runbook、发布或审查清单) | .claude/skills/ 里的 skill | CLAUDE.md 放「始终为真」的事实(构建命令、代码库特有的坑、团队约定);流程正文只在被调用时加载,常驻只会白白消耗 token |
| 个人偏好(如「commit 一律用 semantic message」) | 用户级文件(~/.claude/ 或 CLAUDE.local.md) | 所有基于文件的载体都有一份用户级副本、跨 repo 全程加载;个人口味放用户级,项目级文件只留「团队共享但只对这个库成立」的约定 |
「绝不能发生 X」需要 hook 加权限来约束,组织级强制约束则依靠 managed settings。只适用于 src/api/** 的规则,如果没有设置 paths:,仍会像写进根目录 CLAUDE.md 一样常驻上下文。
自动记忆与团队约定
过去,用户通过 # 热键把内容写进 CLAUDE.md 充当记忆;现在,Claude 会自动保存与工作和用户相关的记忆。自动记忆写在 ~/.claude/projects/<project>/memory/,每个 git 仓库根目录一份,与手写的 ~/.claude/CLAUDE.md、./CLAUDE.md 分开存储。/memory 用于配置,/dream 负责整理;后者的名字取自 REM 睡眠将短期记忆巩固为长期记忆的过程。
官方技巧合集也保留了团队的长期做法:纠正错误后,让 Claude「更新 CLAUDE.md,别再犯」;或在 PR 评论里 @claude,把 review 结论写进去。后者需要先运行 /install-github-app,团队称这种做法为 Compounding Engineering。被反复纠正、全团队都应遵守的具体约定,适合进入签入 git 的 CLAUDE.md;个人偏好和零散上下文则交给自动记忆。官方删减的是为防最坏情况而累积的宽泛禁令,不是具体的纠错记录。
permissions.deny 提交进版本控制、全团队共享。Skill 是一个文件夹,SKILL.md 是它的入口。除 SKILL.md 外,文件夹里还可以放脚本、参考资料、模板,甚至专用的 hooks。它承载的不只是一段提示词,还包括执行流程所需的材料与工具。
SKILL.md 给方法,scripts/ 给手脚,references/ 按需加载省上下文。每个 skill 的名字和描述都放在系统提示里,供 Claude 判断何时使用。选定 skill 后,Claude 通过一次普通的 Bash 调用,用 cat 读取对应的 SKILL.md,正文才进入上下文。文件中引用的 references/api.md 等资料,也等到实际需要时再用 cat 读取。正文和参考资料都由 Claude 通过通用工具按需获取,不由框架预先全部加载。
官方将 Skills 的常见用途归为九类,覆盖文档查询、开发工作流和运维:
Anthropic 从内部上百个 Skills 的实践中总结了九条最佳实践:
把 skill 写对
- 不讲废话:聚焦能把 Claude 推出默认思维的信息(例:叮嘱避免 Inter 字体和紫色渐变)
- 建 Gotchas 章节:最值钱的内容,逐条记录失败点并持续更新
- 文件系统做渐进式揭露:细节拆进
references/api.md,要用才读 - 避免过度约束,极重要领域除外;Description 是触发条件,不是摘要
让 skill 持久好用
- 存脚本让 Claude 组合,而非重建重复模板
- 按需 Hooks:
/careful拦rm -rf、DROP TABLE - 持久化用
CLAUDE_PLUGIN_DATA(skill 目录升级会被删) - 用户配置用
config.json,没设就让 agent 用 AskUserQuestion 问
小团队可以把 skill 签入 .claude/skills 共享;规模化分发则使用 plugin marketplace,并做好质量筛选。PreToolUse hook 可以记录调用量,帮助了解哪些 skill 更常用。好 skill 往往从几行说明开始,再随着实际遇到的问题逐步完善。
用具体材料表达规格
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.”
Hook 可以挂在不同的事件上。截至 2026 年 10 月,已有三十多个事件,包括 PostToolUseFailure、PermissionDenied、PreModelSwitch / PostModelSwitch、InstructionsLoaded、ConfigChange、FileChanged。v2.1.295 起,还可以设置 onFailure: "block",在 hook 自身出错时阻断操作。官方帮助中心的技巧合集列出了团队最常用的六种组合,其中 PermissionRequest 用于处理权限请求,让审批本身也能自动化。
| 事件 | 团队拿它做什么 |
|---|---|
| SessionStart | 每次启动时动态加载上下文 |
| PreToolUse | 记录模型跑过的每一条 bash 命令 |
| PostToolUse | Write/Edit 之后自动格式化,免得到 CI 才挂 |
| PermissionRequest | 把权限请求转到 Slack、WhatsApp,或交给 Opus 审 |
| Stop | 长任务结束时跑确定性检查,或催 Claude 继续 |
| PostCompact | 压缩后把关键指令重新注入 |
"PostToolUse": [ { "matcher": "Write|Edit", "hooks": [{ "type": "command", "command": "bun run format || true" }] } ]
settings.json。|| true 让格式化失败也不拦住这次编辑。写进 CLAUDE.md、Rules、Skills 的都是指令,而指令是请求,不是保证。长会话、模糊情境、或读到一份带 prompt 注入的文件时,模型就可能漏掉。所以「绝不能发生」的事,删库、改生产、碰禁区,靠写一句「不要这样做」不够,只有 hook 和权限能做确定性拦截。
Hook 的触发点覆盖 agentic loop,也就是智能体执行任务的循环过程,从 SessionStart 延伸到 SessionEnd。每轮工具调用都会经过 PreToolUse → 工具执行 → PostToolUse。Hook 配置保存在主上下文之外,不随 compaction(上下文压缩)被压缩;其中 PreToolUse 可以在工具执行前确定性地阻断调用,hook 以 exit code 2 退出即可拦下这次调用。图中右侧的虚线簇表示旁路或异步事件,它们独立于主流程触发。
MCP 用于把外部数据源和系统接入会话。这里讨论接入侧的使用,不涉及 MCP server 的设计。接入侧有两项降低开销的能力,都由客户端提供:
MCP 与 Skills 互补:MCP 提供工具和数据,Skills 提供操作知识,两者可以配合使用。(MCP server 五大设计模式不在本文范围。)
早在 2024 年末,Claude 3.5 Sonnet 仅用 Bash 和 Text Editor 两个通用工具就拿下 49% 的 SWE-bench Verified,当时的 SOTA。Claude Code 的架构基础至今仍是这两个通用工具,Skills、Memory 都是它们的组合。
2026 年 7 月 24 日,Anthropic 随 Claude Opus 5 发布了 Thariq Shihipar 撰写的官方博客,给出了一份减少过度约束的具体清单。面向 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.”
问题不只是提示词太长,也在于旧指令彼此冲突。指令本身会占用上下文;冲突指令还会带来注意力成本,模型必须先消解矛盾,才能开始执行任务。
| 旧做法 | 新做法 | 变了什么 |
|---|---|---|
| 给规则 | 让模型判断 | 从禁写注释,改为匹配代码库自身的注释密度与惯例 |
| 给示例 | 设计接口 | 示例会锁定探索空间,参数与枚举应直接表达用法 |
| 全部前置 | 按需加载 | 内建工具也可延迟加载完整定义 |
| 重复提醒 | 简化工具描述 | 用法集中在工具描述,减少重复提醒 |
| 手动写入记忆 | 自动记忆 | 不再靠 # 热键写入,改由系统保存相关记忆 |
| 简单规格 | 丰富引用 | 代码、测试、现有实现或评分标准都可以承载规格 |
渐进式揭露不只用于 skill,也用于工具。Claude Code 的部分工具采用 deferred loading(延迟加载),agent 必须先用 ToolSearch 找到完整定义,才能调用。官方列举的例子是自家的 Task tools。这样,系统可以挂载更多工具,而完整定义在实际使用前不会占用上下文。2.7 节讨论的是 MCP 客户端如何降低外部工具的上下文开销,同一机制也用于 Claude Code 的内建工具。
早期模型有时需要重复提醒,也更倾向于遵从上下文末尾的指令,因此系统提示词会重复工具说明。现在这些重复内容可以删去,把用法直接保留在工具描述里。
官方提供了命令 claude doctor 来执行这类检查。在 Claude Code 中可以运行 /doctor,它现在是内置 skill,别名为 /checkup。它会从上下文成本出发,检查用不到的 skill、MCP server 和 plugin,也检查 CLAUDE.md 的重复内容与体量,以及拖慢会话的 hook。v2.1.283 起,还提供了 /doctor prompt-audit。
编排:计划该交给谁
编排要解决的是:任务计划由谁保存和推进,是让 Claude 在对话中逐回合决定下一步,还是交给脚本管理。基本原则是:小任务不拆分,大任务不让模型在上下文中独自记忆整个计划。
它是什么
- 三特性:全新起点(不继承历史)、并行、权限隔离(研究只读 / 实现可编辑)
- 可嵌套:subagent 还能再往下派 subagent,默认到主会话以下三层(
CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH可调),这正是动态编排把一个任务摊到成百上千个 agent 的结构基础 - General-purpose:全工具,复杂多步
- Plan Agent:只读,研究加规划
- Explore Agent:只读,快速搜索
什么时候派出
- 研究密集(读几十个文件)
- 多个独立任务(并行)
- 需要全新视角(不继承假设/偏见)
- 提交前验证(独立检查)
- 流水线工作流(明确阶段/交接)
编排可以从自然语言开始,再把反复出现的做法固化下来:先对话,后自动化。
.claude/agents/,description 写触发条件该用的姿势
- 先研究再实现(从摘要谈起,而非 20 个原始文件)
- 并行批量改(独立文件套同一模式)
- 独立代码审查(全新视角更客观)
- 流水线(设计/实现/测试,用文件交接)
别这么用
- 顺序依赖:单会话顺着做更干净
- 同文件编辑:并行改同一文件会冲突
- 小任务:委派有开销,直接做
- 专家 agent 过多:降低自动委派可靠性
- 需 agent 间协调:彼此不能通信,该用 Agent Teams
自定义 agent 既能接受委派,也能直接作为主会话运行。用 claude --agent <name> 按它的定义启动,或在 settings.json 中通过 "agent" 将它设为默认,就能为主会话指定相应的系统提示词。每个定义还可以单独设置 color、可用与禁用的工具、permission mode 和 model。官方给出的只读 agent 示例只开放 Read 工具:
# .claude/agents/ReadOnly.md --- name: ReadOnly description: Read-only agent restricted to the Read tool only color: blue tools: Read --- You are a read-only agent that cannot edit files or run bash.
除了在单个会话内编排任务,也可以同时运行多个会话。官方帮助中心的技巧合集于 2026-10-16 更新,汇集了 Claude Code 团队工程师的日常用法。合集将这项做法称为最大的效率提升:同时跑 3 到 5 个会话,每个放在自己的 git worktree 里。每个会话使用独立的工作目录,避免同时修改同一份工作文件。
| 入口 | 怎么开 |
|---|---|
| 命令行 | claude --worktree(或 claude --worktree my_worktree 指定名字),加 --tmux 开在独立 tmux 会话 |
| Desktop | Code 标签页勾选 worktree |
| 非 git 版本库 | Mercurial / Perforce / SVN:在 settings.json 定义 WorktreeCreate 与 WorktreeRemove 两个 hook |
| subagent | frontmatter 加 isolation: worktree |
# .claude/agents/worktree-worker.md --- name: worktree-worker model: haiku isolation: worktree ---
/batch migrate src/ from JavaScript to TypeScript,它会先就迁移问你几个问题再分派。多个会话并行时,还需要能区分各自的任务和状态。团队会给 worktree 起名,用 za/zb/zc 这类 shell 别名切换目录,并为终端标签配色;/color 可以改变输入框颜色。终端通知则用于提醒哪个 Claude 需要人工处理。不少工程师还会专门保留一个 analysis worktree,只用于看日志、跑查询。
并行的前提仍是子任务彼此独立。worktree 可以隔离两个会话对工作文件的修改,却不能消除任务本身的顺序依赖(见 3.2 反模式)。合集将验证列为首要做法:每个并行 agent 都应能运行检查,为自己的改动提供验证依据。执行者自测与独立验收是不同的环节。
并行和长时间运行需要减少不必要的人工中断。权限清单、自动审批和沙箱各有作用,减少确认仍需以明确的权限边界为前提。
官方推荐预先放行安全操作,作为跳过权限检查的替代方案。这样既能减少弹窗,也保留了可审计的放行清单。规则支持完整通配,例如 "Bash(bun run *)"、"Edit(/docs/**)"。Claude Code 自带一小组预先批准的安全命令,/permissions 中添加的规则叠加在这组基线之上。整套权限机制包含提示注入检测、静态分析、沙箱和人工监督等层次。
/sandbox 提供三种模式:沙箱化 BashTool 并自动放行;沙箱化 BashTool,但保留常规权限检查;不用沙箱。沙箱、远程控制和云端定时任务默认关闭,也可能被组织策略禁用。命令返回 "not available" 时,多半是管理员尚未开放。
Stop hook 跑确定性检查
需要可审计流程时的首选。也可以让 Claude 完成后派一个后台 agent 验证,或用 PermissionRequest hook 把权限请求交给 Opus 扫描攻击迹象、安全的自动批准(见 2.6)。
社区插件 ralph-wiggum
不经 Anthropic 审核,受管环境里装第三方插件前先问管理员。--dangerously-skip-permissions 同理,只在沙箱里用。
与 2.6 的权限边界一致:需要强制执行的约束应落实到权限和 hook 中,而不能只写在指令里。
编排:从委派到脚本
Subagent、Skill 与 Workflow 的区别,不只在任务规模,还在于那枚标着 PLAN 的方块由谁持有。使用 Subagent 或 Skill 时,Claude 逐回合推进计划,中间结果进入上下文;使用 Workflow 时,脚本持有计划和中间结果,Claude 只接收最终答案。
| Subagents | Skills | Workflows | |
|---|---|---|---|
| 谁决定下一步 | Claude,逐回合 | Claude,跟 prompt | 脚本 |
| 中间结果存哪 | Claude 的上下文 | Claude 的上下文 | 脚本变量 |
| 可复现什么 | worker 定义 | 指令 | 编排本身 |
| 规模 | 每回合几个 | 同 subagent | 每 run 几十到几百 |
| 中断时 | 重启该回合 | 重启该回合 | 同会话内可 resume |
Workflow 与 Skill 分别解决编排和知识问题,可以组合使用。Skill 改变「模型知道什么」,Workflow 改变「如何确定性地编排」。一个 workflow 可以并行派出多个 agent,这些 agent 也可以先加载 skill,再执行各自的任务。
默认 harness 将规划与执行放在同一上下文中。长时间运行、大规模并行或对抗性任务,会暴露出三类失败模式。把计划交给脚本管理,正是为了减少这些风险:
偷懒
50 项审查做到 35 项就宣布「搞定」。
自我偏袒
评判自己刚做的东西时倾向回护。
目标漂移
多回合后忠实度流失,compaction 丢掉「别做 X」。
Workflow 为这三类问题提供了结构上的约束:脚本保存完整清单,循环未遍历到末尾就不算完成,以此减少遗漏任务却提前结束的情况;验证交给另一个独立 agent,减少执行者对自己产出的偏袒;目标保存在脚本中,减少对 compaction 后对话记忆的依赖,降低目标漂移的风险。
/workflows 选满意的 run,按 s 存成 command。循环以满足收敛条件为终点,不预设固定轮数。Workflow 可以通过 prompt 直接触发,例如写 ultracode 或说「use a workflow」;也可以用 /effort ultracode 打开 Ultracode 设置,或运行已保存的 command。它还自带 /deep-research。单次 parallel() 或 pipeline() 最多处理 4,096 项。
截至 2026 年 10 月,所有付费套餐,以及 Anthropic API、Bedrock、Google Cloud、Microsoft Foundry 都可使用 Workflow;Pro 需在 /config 中开启。组织可通过 managed settings 中的 "disableWorkflows": true 整体关闭。Workflow 的 token 消耗远高于普通会话,适合先用小任务试验。大 run 开始前,可通过 /model 将不需要最强模型的阶段路由到小模型。
Classify-and-act
分类器判断任务属哪类,路由到不同 agent。给流水线装个分诊台。
Fan-out-and-synthesize
拆成多步各一 agent,合成是 barrier:唯一要等齐的。
Adversarial verification
每个干活 agent 配一个专门 agent 拿 rubric 对抗式验证,减少自我偏袒。
Generate-and-filter
先发散一堆想法,按 rubric 筛、去重,只留最优几个。
Tournament
N 个 agent 各用不同打法做同题,两两比较直到分出胜者。
Loop until done
任务量未知时不设固定轮数,循环到停止条件成立。
成对比较(comparative judgment),即把两个候选放在一起判断,通常比逐个给出绝对分数更可靠,尤其适合排序类任务。
用 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 修复循环,能把按季度估的工程压到天级。先挑这样一块试点,而非照搬时间承诺。
Workflow 的用途不限于编写代码。官方列出的九个用例中,过半与写代码无关:
读取不可信公开内容的 agent 不得执行高权限动作,高权限动作交给另一批专责执行的 agent。读取与执行分离,这是防 prompt injection 的结构性手段。
并非每个任务都需要 Workflow。它的 token 消耗高得多,是否采用,取决于任务是否确实需要更多算力。多数传统编程任务并不需要一个五人评审团。
使用时,详细的 prompt 最关键。小任务可以采用 quick workflow,也可以配合 /loop、/goal,或写入 use 10k tokens 设置上限。满意的 run 可按 s 保存到 ~/.claude/workflows,或纳入 skill,作为继续探索其他用法的基础。
在脚本、CI 或 SDK 中调用 Claude Code,需要明确它会加载哪些配置。claude -p 以及 TypeScript / Python SDK 默认会搜索本地的 CLAUDE.md、settings 和 MCP。非交互场景应通过 --system-prompt、--mcp-config、--settings 显式传入配置,并加上 --bare,启动快约 10 倍:
claude -p "summarize this codebase" \ --output-format=stream-json \ --verbose \ --bare
--bare,眼下需要手动加。显式配置可以避免脚本中的 Claude 意外继承开发机上的个人设置,也让调用条件更容易复现。跨仓库工作时,用 --add-dir 指定其他目录的访问和权限,会话内则用 /add-dir。团队固定需要访问的目录,可以写入 settings.json 的 "additionalDirectories"。
云端会话和 Desktop 还支持 setup 脚本,用于在每次新建云端会话前安装依赖、修改设置、设置环境变量;resume 时跳过。
验证:自测之后,独立验收
独立验收并不取代执行过程中的自测。官方帮助中心的技巧合集将这项做法列为全文第一条:如果只采纳一个做法,就给 Claude 一个检查自己产出的手段。Claude 可以根据检查结果继续修改,形成反馈回路;这有助于发现和修正错误,但不等于结果必然正确。检查方式因领域而异,可以是 bash 命令、测试套件、模拟器或浏览器测试。
前端有两条现成路径:Claude Code 的 Chrome 扩展支持 Chrome、Edge,团队每次修改 Web 代码都会使用;Desktop 应用则能自动启动 Web 服务器,并在内置浏览器中测试。合集用一个类比说明浏览器的重要性:让人做网站却不给浏览器,结果不会好看。改完后在提示词末尾加 /simplify,会并行派出几个 agent,审查复用、质量、效率及 CLAUDE.md 合规情况(挂载方式见 用 skill 搭验证闭环)。
| 提示词 | 逼出什么 |
|---|---|
| “Grill me on these changes and don’t make a PR until I pass your test.” | Claude 先考你,你通过了才开 PR |
| “Prove to me this works.” | 让它对比 main 与功能分支的实际行为 |
| “Knowing everything you know now, scrap this and implement the elegant solution.” | 第一版做得平庸之后推倒重来 |
代码生成成本降低后,验证更容易成为瓶颈。执行者可以自测,但生成与独立验收应当分开。只让干活的 agent 评价自己刚完成的产出,容易得到偏向肯定的判断,如同让开发者独自审查自己的代码。在这套分工中,Generator 负责生成,Evaluator 负责评估。把独立 Evaluator 的标准调严,比让 Generator 学会自我批评更容易。
用独立 review subagent,或 Workflow 的对抗式验证 pattern,让不同的 agent 分别承担执行与验收,并使用独立上下文。使用 Claude Code 已有的委派与编排能力,不重建 agent 主循环。
把产物改造成 agent 可读可验的接口(data-verify-* 契约、window.__verify API、.verify.ts)。核心论点是「经济学翻转」:agent 将验证的边际成本降至接近零,contract testing 才第一次能够在前端规模化开展。这是改造自有产品才会做的事。
70 万行遗留代码库的接入
Skyline 的实践将前述四层能力组合起来使用。核心方法是把 Claude 当作新员工来 onboard:像带实习生一样,先交代足够的背景,让它完成范围有限的项目,再把任务中积累的知识整理成下一轮可用的 context。整个过程形成五步闭环,逐轮积累上下文,再扩大任务范围:
pwiz-ai,而非代码仓库,否则会被分支隔离,每个分支上的 Claude 成了「不同的人」。团队当正式工程产物维护、打版本。这个案例有四条实践经验:先隔离 scope,将大型遗留代码库中的任务切分,再逐步扩大范围;在团队流程中要求加载 debugging skill,避免在 70 万行代码中盲目修改、引发连锁问题;让 context 独立于代码分支;通过 MCP 接通测试基础设施。这套方法需要有人持续维护 context 层,并渐进推进。这不是装上就能用的方案,而是一套随任务持续维护的工作环境。
边搭边砍:harness 的半衰期
harness 的半衰期,来自模型能力的变化。每个组件都建立在某种能力假设上,假设过时,组件也可能失去作用。哪些部分可以删减,取决于所选模型的实际能力。
此前的模型迭代中已有这样的案例:Sonnet 4.5 接近上下文上限时,会因「上下文焦虑」提前结束任务,团队因此加入 context reset 逻辑。Opus 4.5 上线后,这一行为消失,相应的补偿代码也就不再需要。类似地,曾有 hook 通过拦截文件写入,强制先执行 Perforce p4 edit;原生支持到位后,这个 hook 也变得多余。审视 harness 时,除了「怎么让 Claude 更强」,还可以问「我能停止做什么」。
这些案例中,Planner 与 Evaluator 的分工仍然保留了下来。没有 Planner,Generator 会 under-scope,也就是把任务范围收得过小;没有 Evaluator,边界任务中的 bug 会被遗漏。补偿特定模型弱点的脚手架,与上下文纪律、分工验证,需要分别判断是否保留。
建议每 3 到 6 个月审计一次 harness,先运行 /doctor,检查 skills 和 CLAUDE.md 的体量。Anthropic 在这一轮精简中删掉了 80% 以上的系统提示词。这个幅度可以作为参照,但不是固定指标。