作者一年实战经验总结:将硬规则移至 PreToolUse hooks、用 grep 精准定位读取、用子 agent 处理探索任务,大幅减少上下文浪费和重复纠正。
我每天使用 Claude Code 超过一年,但在大部分时间里,我的 CLAUDE.md 一直在帮倒忙。不是那种戏剧性的反转,只是持续地消耗:重复纠正、遗忘的规则,以及随着一天过去变得越来越慢、越来越迟钝的会话。
以下是我一直犯的错误,以及真正有效的修复方法。
好几个月,我都在聊天里敲同样的纠正内容。"用 pnpm,不用 npm。""不要碰 migrations 文件夹。""文档用英式拼写。"每个会话都重复一遍。
明显的代价是我的时间。不那么明显的代价是 token。每次在聊天中重复的指令都会消耗那个会话中的上下文,而且会话结束时它就消失了。而 CLAUDE.md 中的指令只会加载一次,自动加载,每个会话都加载,永久有效。
我现在的规则:如果同一个纠正内容我打了两次,它就要进 CLAUDE.md,在我打第三次之前。这个习惯消除了一天中大部分的摩擦。
它们没有。CLAUDE.md 中的指令是一条请求。模型会读取它,通常会遵守,但偶尔不会,尤其是在长会话深入下去、早期上下文已经模糊的时候。
当"不要直接提交到 main"恰好在关键时刻失效时,我意识到了这一点。修复方法是意识到 Claude Code 有两个不同的工具来处理两种不同的工作:
CLAUDE.md 用于偏好和约定,那些 95% 遵守率就够用的场景。
Hooks 用于规则,那些 95% 是一种失败的场景。一个检查命令并以非零退出的 PreToolUse hook 会确定性地阻止操作。模型不会忘记一个 hook,因为 hook 不是模型。
现在,任何我会描述为"绝不能发生"的东西都变成 hook。任何我会描述为"偏好这个"的东西留在 CLAUDE.md。把我的规则分成这两个桶花了二十分钟,但消除了一整类事故。
默认情况下,我说"看一下 auth 模块",然后看着它拉入数千行,其中大部分是不相关的。每一行无关的代码都占用了本可以装有用信息的上下文空间。
修复方法:在提示中具体化("读取 auth/session.ts 中的 validateSession 函数,在 token 检查附近的行"),并在 CLAUDE.md 中加一行,要求优先做针对性读取而非整文件读取。先 grep,读取匹配区域,只在需要时扩展。会话明显能更长时间保持敏锐。
我曾经习惯让一个会话整天保持活跃。早上重构,午后调试,结束前写文档。到下午,模型在每次响应中都拖着超过 10 万 token 的早晨上下文,质量下降很容易怪到模型头上,而不是怪我自己。
按领域分新鲜会话,永远比一个长拖沓的会话好。重构的上下文在文档工作期间不仅仅是浪费空间,它还会主动干扰它。当我切换任务类型时,我会全新开始,让 CLAUDE.md 携带持久规则跨会话传递。
压缩总结对话以便继续工作,而总结是有损的。在一个精细变化的中间压缩,被丢弃的细节恰恰是你正需要的那些。
修复方法是时机。我在边界压缩:任务完成、测试套件变绿、决策记录在案。压缩前我确保当前状态写在磁盘上某个位置,一个笔记文件或计划文档,这样恢复的会话可以从文件而不是从总结中恢复具体细节。
这个让我意外。每个启用的 MCP 服务器在每次请求时都会将其完整的工具定义注入上下文,无论你是否使用它。我积累了十几个服务器,每请求数千 token 花在为那些一个月才碰一次的工具上。
审计你的配置。禁用两周内没使用过的任何东西。需要时重新启用只需几秒钟,而省下来的上下文给你的实际代码用。
当我不知道某样东西在哪里时,我会让主会话搜索、打开文件、跟随死胡同。所有那些探索,包括死胡同,都会留在上下文中供会话剩余部分使用。
子代理修复了这个问题。把探索委托出去("找出限流在哪里应用,报告文件路径和关键函数"),只有答案返回主线程。错误的转折随子代理一起被丢弃。主会话保持在实际变化上的专注。
以上每个错误都是同一个错误穿着不同的外衣:把上下文当作免费的。它不是。它是整个设置中最稀缺的资源,几乎所有看起来像模型问题的东西实际上都是我亲手造成的上下文问题。
持久规则放 CLAUDE.md。硬规则放 hooks。针对性读取。按领域开新鲜会话。在边界压缩。精简 MCP 列表。委托探索。
这些都不聪明。但它们都会产生复合效应。
Originally published on gentic.news