很多人把 Claude Code 的 Best Practices 当成功能说明书:CLAUDE.md 怎么写、plan mode 怎么开、-p 怎么跑。读完以为「功能都知道了」,上线两周却发现:会话越聊越飘、改完不敢合、自动化一开就埋雷。

本文记录我们如何把 Anthropic 公开文档读成一套工程决策,而不是条目清单。母本是官方 Best Practices(文档 ),不编造内部数据;关键论断均可回溯。上一篇 6 个偷懒技巧 讲「怎么省」;这篇讲为什么官方几乎所有建议,都在回答同一个矛盾。

经验一:Agent 最稀缺的不是智商,是上下文有效带宽。
经验二:没有可跑的 pass/fail,你就永远是验证环。
经验三:建议写进 CLAUDE.md,零例外必须写进 hook。

〇、Agent 开发心法:上下文不是聊天记录,是整机内存

元问题

在传统软件里,你加一个同事、加一台机器,吞吐近似线性上去。
在 Claude Code 里,你加的每一轮对话、每一次读文件、每一段命令输出,都挤进同一块会「变蠢」的内存——上下文窗口。

官方把这句话写在 Best Practices 开篇:

Most best practices are based on one constraint: Claude’s context window fills up fast, and performance degrades as it fills.

这不是文案。窗口里装的是:消息历史 + 读过的文件 + 工具输出。调试一次、探索一遍仓库,轻松烧掉几万 token。窗口越满,早期约束越容易被挤掉,模型越像失忆的外包。

所以真正的矛盾不是:

  • 「要不要用 AI」
  • 「prompt 写得漂不漂亮」

而是:

自主性要求 Agent 多看、多试、多迭代;上下文有限要求你少装、快验证、勤隔离。

忽略它会发生什么?一线最常见的三种现场:

  1. 厨房水槽会话:一个窗口里修登录、改文档、顺便问架构,上下文被无关噪声灌满。
  2. 纠错螺旋:同一 bug 纠正 3~5 次,失败路径比正确路径还长,模型开始「复读错误」。
  3. 看起来做完了:没有测试/构建信号,Agent 在「观感完成」处停下,你变成唯一验收机。

Agent 开发的第一原则:把 context 当预算,不当无限对话框。
后面每一节,都是在回答:这笔预算花在哪、谁来验收、何时必须清零。

上下文预算:把 context 当整机内存,而不是无限对话框

为什么这不是「省 token」的小技巧

省 token 听起来像抠门。工程上它对应三件事:

  1. 保智力:窗口越满,指令遵循越差——不是模型突然变笨,是有效约束被噪声淹没。
  2. 保可回放:失败路径一旦写进历史,后续推理会「继承错误假设」。
  3. 保协作带宽:团队共享 CLAUDE.md / hooks,是在共享「什么不该进上下文」。

我们在维护多语言 Hugo 站点与 Agent 工具链时,反复验证过同一现象:同一个模型,干净会话一次过;脏会话纠三轮仍飘。 差别几乎从不在「再强调一遍要认真」,而在上下文是否干净、验收是否可跑。


一、验证闸门:人盯 vs 可跑信号

传统软件里的答案

传统交付默认有 CI:测试红了合不进去。人可以不盯全过程,因为闸门在流水线里

Agent 语境下的错觉

Claude 会在工作「看起来完成」时停下。若没有它自己能跑、能读的检查,唯一信号就是「看起来行」。
官方原话的工程含义是:

没有 check,你就是验证环;每个错误都要等你发现。

方案对比

方案 A:靠人盯方案 B:给可跑信号
做法「改完告诉我」测试/构建/lint/截图对比/diff fixture
优点零配置闭环可自转
代价人必须在线要写得出验收

淘汰 A 的原因: Agent 的价值在于你能走开;A 把「走开」变成不可能。
决策:任何要合并的改动,至少 L1 闸门。

官方四级闸门(硬度递增)

级别机制适合配置成本
L1同 prompt 要求:实现 + 跑测试 + 失败继续改 + 贴输出日常几乎为 0
L2/goal 条件,每轮复查长会话
L3Stop hook 脚本硬拦截(连续拦截有上限)零例外门禁
L4第二意见:verification subagent / 对抗评审无人值守、合并前中高

中文 L1 模板:

实现 src/auth/validateEmail.ts。
验收:user@example.com→true;invalid→false;user@.com→false。
写测试并运行;失败继续修到全绿。
最后贴命令与完整输出,禁止只说「已完成」。

要证据,不要口号。 测试输出、退出码、截图对比——复查证据比你自己重跑快。

→ 影响:后面所有「自动化 / auto mode / CI -p」若没有闸门,只是在自动化埋雷。

验证闸门:把「看起来做完了」改成可跑的 pass/fail

现场对照:同一需求两种问法

低效(人盯模式)

帮我把登录超时修好。

Agent 改完说「好了」。你本地跑一下挂了。你贴报错。它再改。三轮后上下文里塞满失败补丁,正确约束反而模糊。

高效(闸门模式)

用户反馈 session 超时后登录失败。
范围:src/auth/,重点 token refresh。
先写能复现的失败测试,再修到测试绿。
贴:测试命令、失败→成功的输出、改动文件列表。
不要改范围外文件。

第二种不是「更啰嗦」,是把 完成定义 从自然语言感觉,改成 Agent 可读的信号。这正是官方表格里 before/after 的工程实质。


二、Plan mode:先探索 vs 直接开写

传统答案

资深工程师改多文件前会先摸清调用链;改一行日志则直接动。

Agent 语境

让 Claude 直接写,容易「完美实现错误目标」。官方推荐 Explore → Plan → Implement → Commit。

方案对比

方案 A:凡事先写长 plan方案 B:按不确定性切换
做法所有任务 plan mode多文件/不熟/路径不清才 plan
风险流程表演、浪费上下文小任务过度设计?

官方自己说:plan 有开销。一句话能描述的 diff(typo、加日志、重命名)应直接做。

淘汰「凡事 plan」的原因: plan 本身也占窗口;对确定性小改动是负收益。
决策:不确定性计费,不按仪式计费。

触发 plan 的信号:

  • 要动 ≥2 个模块
  • 你说不清改哪些文件
  • 需求里有「顺便」「重构一下」

跳过 plan 的信号:

  • 能一句话说清 diff
  • 已有失败测试,只差实现

→ 影响:plan 阶段产出的文件清单与验收步骤,应直接写进 L1 prompt,而不是聊完就丢。


三、CLAUDE.md vs Hooks:建议与零例外

传统答案

规范写 Wiki,靠 code review 盯着。

Agent 语境

CLAUDE.md 每会话加载,是「入职手册」;但官方警告:写太长会被忽略一半

筛选法则极狠:

删掉这一行,Claude 会不会因此犯错?不会就删。

✅ 写❌ 别写
猜不到的 Bash 命令读代码就知道的结构
偏离默认的风格标准语言常识
单测命令与 runner长篇 API 文档
分支/PR 约定频繁变动的信息
环境坑「写干净代码」

方案对比

方案 A:全塞 CLAUDE.md方案 B:建议 vs 零例外分流
做法3000 行百科短 CLAUDE.md + hooks + skills
结果重要规则被淹没关键路径确定性执行

淘汰 A 的原因: 模型对超长说明书的遵循率会塌;你以为写了=生效。
决策:

  • 建议、偏好、命令 → CLAUDE.md(短)
  • 零例外动作(每次改文件跑 eslint、禁止写 migrations)→ hooks
  • 偶尔才用的领域知识/工作流 → skills(按需加载,不污染每会话)

最小 CLAUDE.md:

# Commands
- Typecheck: `npm run typecheck`
- Single test: `npm test -- --grep "pattern"`
- Build: `npm run build`

# Workflow
- Prefer single-test while iterating
- Typecheck after a batch of edits
- Don't touch files outside requested scope

权限侧同理:点同意点到第十次你已不审。用 auto mode / allowlist / sandbox 降低打断,而不是取消边界

CLI 比裸 API 更省上下文:ghaws 等把鉴权与分页封装掉;不会用就先 --help 再干。

→ 影响:skills/subagents/plugins 都是「扩展能力」;若 CLAUDE.md 已臃肿,先做减法再加扩展。


四、会话与 Subagent:主上下文的污染与隔离

传统答案

开分支、开 PR,工作流隔离。

Agent 语境

会话是持久且可回滚的,但持久不等于该无限堆

官方失败模式几乎全是上下文病:

现场处方
厨房水槽一会话多无关任务任务间 /clear
反复纠正同题纠 >2 次clear + 更好首轮 prompt
无限探索「调查一下」读爆文件收窄范围或 subagent
信任-验证缺口看起来对、边界全挂回到第一节闸门

方案对比

方案 A:主会话自己读遍仓库方案 B:调查交给 subagent
代价主窗口被文件内容灌满只要摘要回报
收益「都在一个对话里」实现上下文保持干净

淘汰 A 的原因: 探索的 token 会挤掉实现与约束。
决策:只读大调查默认 subagent;实现留在主会话。

纠偏工具箱:

  • Esc:停,上下文还在
  • /rewind:回到检查点(注意:Bash/外部改动不进 checkpoint,不能替 git
  • /clear/compact:清或摘要
  • /btw:旁路问题不进主历史
  • /rename + resume:长任务当分支用

同一问题纠正超过两次:清会话。 干净窗口 + 更好首轮 prompt,几乎总是打得过又臭又长的纠错局。

→ 影响:Writer/Reviewer 双会话、对抗评审,本质上都是「新鲜上下文当第二意见」。

影响链:一次错误探索如何拖垮整个下午

主会话里说「全面调查认证模块」→ 读 40 个文件 → 窗口 70% 被占满 → 再实现 OAuth 时忘记「不要动支付模块」→ 你纠正 → 再纠正 → 此时失败路径已比需求还长。

若第一步改为 subagent 调查、主会话只收摘要,实现阶段仍有空间装约束与测试输出。隔离不是流程洁癖,是保护实现期的有效内存。


五、规模化:何时自动化,何时别自动化

传统答案

能进 CI 的就进 CI。

Agent 语境

claude -p、fan-out、auto mode 能成倍放大产出,也成倍放大错误。

方案对比

方案 A:无闸门全自动方案 B:闸门先行再放大
做法-p + auto 直接扫全库先 2~3 样本打磨 prompt + --allowedTools
风险批量埋雷慢半拍,但可控

淘汰 A 的原因: 自动化没有验证闭环,是在工业级复制 bug。
决策:L1/L3 闸门就绪前,不上 fan-out。

可用形态:

claude -p "列出所有 API endpoints" --output-format json
claude --permission-mode auto -p "fix all lint errors"

批量迁移:

for file in $(cat files.txt); do
  claude -p "迁移 $file:只返回 OK 或 FAIL" \
    --allowedTools "Edit,Bash(git commit *)"
done

合并前对抗评审(新鲜上下文):

用 subagent 对照 PLAN.md 审查 diff:
需求是否落地、边界是否有测、是否改出范围。
只报正确性缺口,不报风格。

官方提醒:被要求「找缺口」的评审者往往会报一堆——只追正确性与需求,否则会过度工程化。

→ 影响:规模化是第一节~第四节的乘子,不是替代品。


总结

工程决策

设计问题方案 A(淘汰)方案 B(采用)淘汰原因
如何判断做完人盯「看起来行」可跑 pass/fail + 证据人成验证环,无法走开
是否先 plan凡事长 plan按不确定性切换小改动浪费上下文
规范放哪百科全书 CLAUDE.md短手册 + hooks + skills过长被忽略
大调查主会话狂读文件subagent 回报摘要主上下文被污染
自动化无闸门 fan-out样本打磨 + 闸门 + allowedTools批量复制错误
纠错策略同会话死磕两次后 clear 重开失败路径污染推理

Agent 开发原则

原则含义本文落点
上下文是硬通货多看多试也要付内存税〇、四
闸门先于自主能走开的前提是可验收一、五
建议与强制分离偏好进 md,零例外进 hook
隔离探索与实现调查别挤占主会话二、四
放大前先样本自动化是乘子不是魔法

今天就能做的 5 步

  1. 把当前 CLAUDE.md 砍到「删了会犯错」的行
  2. 下一条任务强制 L1:跑什么 + 贴输出
  3. 复杂需求 plan;一句话 diff 直接干
  4. 调查默认 subagent
  5. 同题纠两次 → /clear 重写首轮 prompt

官方最后一节叫 Develop your intuition:指南是起点不是教条。有时该让上下文累积,有时该跳过 plan。注意它什么时候表现好——那是你自己的最佳实践。

上一篇:Claude Code 与 Codex CLI 的 6 个偷懒技巧
母本:Anthropic · Best practices for Claude Code


如果你也在用 Claude Code
你现在最痛的是上下文被污染,还是没有闸门不敢走开?欢迎留言交换现场。

全栈之巅 · 梦兽编程