🏠 总目录📚 本教程 05 · Claude Code 实操
📑 本页目录(点开跳转)

05 · Claude Code 实操:指令到底该放哪

30 分钟 | ⭐⭐ 每天都在用的一章


🎯 一句话

新手把所有规矩都往 CLAUDE.md 里堆,结果它变成一个没人看的垃圾桶。 七种引导方式各有各的加载时机和强制力,选对了才有用。


🧲 先说最重要的一条心法:给它一个能自己跑的验证

问题:Claude 在「看起来完成」时就会停。没有可运行的检查,你就成了人肉验证环节——每个错误都要等你发现、你指出、它再改。

解法:给它一个能产生「通过 / 失败」信号的东西,循环就自己闭合了:

Claude 自己转的一圈Claude 做工作跑检查读结果不过就改没过 → 自己再来一轮只在最后看结果
看虚线框的边界在哪:四步全在框里自己转,你被画在框外。⭐ 所以决定这一圈能不能转起来的,是「跑检查」那一步 —— 没有能自己跑的验证,模型读不到结果,闭环就断了,只能一路往前编到你来收拾。

检查可以是:测试套件、构建退出码、linter、对比 fixture 的 diff 脚本、跟设计稿对比的浏览器截图。

验证的四个升级档位

档位 做法 适用
单次提示内 同一条消息里要求「实现后跑测试并迭代到通过」 任何任务,今天就能用 ⭐
跨会话 设为持续目标,每轮后由独立评估器复查 需要持续到达标的任务
确定性闸门 Stop hook 跑检查脚本,不通过就阻止回合结束 无人值守运行
第二意见 验证子 Agent 用全新上下文试图推翻结果 高风险变更

🔑 还要求它出示证据:跑了什么命令、返回什么、测试输出、截图。 审阅证据比你自己重跑一遍快得多。

🎯 什么样的验证才算「好验证」

   ⭐ 好验证的四个特征:

   ① 能自动跑        —— 一条命令,不需要人操作
   ② 输出是二元的    —— 通过/失败,不是"看起来还行"
   ③ 快              —— 几秒到几十秒。要跑 10 分钟的验证,它不会主动跑
   ④ 错误信息可操作  —— "第 42 行期望 X 得到 Y",不是"失败了"

对照一下三种常见验证的质量

验证 自动 二元 信息可操作 结论
单元测试 ⭐ 最好的验证
linter / 类型检查 ⭐ 几乎白赚
完整 E2E 测试 ❌ 慢 🟡 只在最后跑
"你自己看一眼对不对" 这不是验证

💡 一个立刻能做的改进如果你的项目没有测试,先加类型检查mypy / tsc --noEmit 这类几秒就能跑完,且能挡掉一大批错误—— 它是"从零到有"性价比最高的一步。

⚠️ 一个反直觉的现实验证的价值不在于它有多全面,而在于它有多快被跑。 一个覆盖 60% 但 3 秒跑完的测试套件,比覆盖 95% 但要 10 分钟的有用得多—— 因为前者会在每一轮迭代里被跑,后者只会在最后被跑一次。


🔄 基本工作流:探索 → 规划 → 编码 → 提交

探索 → 规划 → 编码 → 提交,而且要能自己转起来探索只读代码,先别写规划先出方案再动手编码小步 + 每步跑验证提交一次只提一件事验证没过 → 退回规划,别在编码里硬扛⭐ 心法:先给它一个能自己跑的验证(测试 / lint / 脚本),它才谈得上「自己判断做对没有」
⭐ 真正决定成败的是那条红色回退线:没有能自己跑的验证,模型就没法判断「我做对了没有」,只能一路往前编,你到最后才发现方向早就歪了。

直接让 Claude 开写,最常见的后果是——它高质量地解决了错误的问题

   ① 探索  进 plan mode:只读文件、回答问题,不做任何修改
   ② 规划  让它产出详细实现计划(你可以直接改这份计划)
   ③ 编码  退出 plan mode,按计划实现 + 对照验证
   ④ 提交  描述性 commit + 开 PR

什么时候可以跳过规划:改错字、加日志、改名——一句话能描述清楚 diff 的任务,直接做。

规划最值钱的三个场景:方案不确定 / 改动跨多文件 / 你不熟这段代码。

🎤 大功能的杀手锏:让 Claude 面试你

   你:一句话描述需求
   然后要求:「就技术实现、UI/UX、边界情况、权衡逐项追问我,
              问完产出 SPEC.md」
        ↓
   它会问到一堆你没想过的点
        ↓
   产出 SPEC.md
        ↓
   ⭐ 开一个全新会话执行这份规格
     (干净的上下文全部用于实现,不被讨论过程占用)

第 3 节的「让模型面试你」在编码场景的完整用法。这是单条提示词和一个想清楚的项目之间的差别。


🗂️ 七种引导方式(本章核心)

先问三个问题,答案决定用哪种

   ① 这该【什么时候加载】?   永远 / 按需 / 被调用时 / 事件触发
   ② 它该【如何持久】?       缓存 / 每轮重注入 / 绕过压缩 / 只回摘要
   ③ 必须被【多严格遵守】?   建议性 / 具体约束 / 确定性保证 ⭐

第 ③ 问最关键:需要「确定性保证」的东西,永远不要写进提示词——提示词是概率性的(第 13 节同款铁律)。

速查表

方式 上下文成本 加载时机 该放什么
CLAUDE.md 高(常驻) 永远 项目概览、构建命令、目录结构、团队约定。控制在 200 行内
Rules 匹配路径时 横切约束,用 paths: 限定只在相关文件加载
Skills 判断相关时 程序性工作流——部署检查单、审查流程、发布步骤(第 10 节)
子 Agent 零(调用前) 被调用时 隔离的支线任务——深度搜索、日志分析、依赖审计
Hooks 事件触发 必须每次都发生、零例外的确定性动作 ⭐
Output Styles 永远 罕见的重大角色转变。会覆盖默认指令,慎用
append-system-prompt 本次会话 一次性会话的领域知识

🚫 四个反模式(照着改能立刻见效)

❌ 常见错误 ✅ 正确做法
CLAUDE.md 写「每次改完代码都要跑 lint」 hook 确定性执行——写在提示里它会忘
把「绝不要 rm -rf」当提示词规则 PreToolUse hook 退出码 2 直接拦截
CLAUDE.md 塞 30 行部署手册 做成 skill,只在真要部署时加载
API 专用规则不限定路径 paths: src/api/**,别让它污染所有会话

🔑 一句话记忆:把 CLAUDE.md 当索引,不是垃圾桶。

📐 一张决策图(卡住时照着走)

   你有一条想让 Claude 遵守的规矩
        │
        ├─ 它必须【每次都发生、零例外】吗?
        │     ✅ 是  → 🪝 Hook(确定性,代码级保证)⭐
        │     ❌ 否  ↓
        │
        ├─ 它是【一套多步骤的流程】吗(>10 行)?
        │     ✅ 是  → 🎯 Skill(按需加载,不占常驻上下文)
        │     ❌ 否  ↓
        │
        ├─ 它只跟【某些文件/目录】相关吗?
        │     ✅ 是  → 📏 Rule + `paths:` 限定
        │     ❌ 否  ↓
        │
        ├─ 它需要【大量翻阅但只要结论】吗?
        │     ✅ 是  → 🤖 子 Agent(隔离上下文)
        │     ❌ 否  ↓
        │
        └─ 剩下的、简短的、全局都要知道的
              → 📄 CLAUDE.md(严格控制在 200 行内)

💰 为什么「上下文成本」这一列这么重要

   CLAUDE.md 里的每一行,都在【每一轮对话】里被重新读一遍

   一个 500 行的 CLAUDE.md:
   · 常驻占用几千 token
   · 在 20 轮对话里被读了 20 遍
   · ⚠️ 而且它稀释了真正重要的指令 —— 这才是最大的代价 ⭐

🔗 这就是第 4 章上下文工程说的「上下文是有限预算」的具体形态。 CLAUDE.md 膨胀不只是浪费钱,它会让 Claude 更容易忽略你真正在乎的那几条规矩。

💡 一个判断信号:如果你发现「明明写在 CLAUDE.md 里了它还是不听」, 十有八九不是它不听话,是那条规矩被淹没了。 先精简,再加强。

🩺 CLAUDE.md 体检法

逐行问:「删掉这一行,Claude 会犯错吗?」 - 不会 → 删 - 会,且是「每次都必须」→ 改成 hook - 会,且超过 10 行流程 → 改成 skill - 会,且只跟某目录相关 → 改成带 paths: 的 rule

目标:200 行以内,每行都过得了这个测试。


🧹 会话管理:上下文的日常维护

第 4 节讲了上下文腐烂的原理,这里是它的日常操作面。

动作 什么时候用
Esc 它跑偏了,立刻打断 —— 越早越好
Esc Esc / /rewind 回滚到之前的检查点
/clear 任务之间、或上下文已脏
「用子 Agent 调查 X」 需要大量翻阅但只要结论时

⭐ 两次纠正规则

同一个问题纠正超过两次 → 停。/clear 重来。

因为此时上下文里已经堆满了失败的尝试,模型每一轮都在读那些错误示范。 带着吸收了教训的更好提示词重开一局,几乎总是优于在长会话里继续拉扯。

这是第 4 节「上下文腐烂」最实用的一条推论。

五个常见失败模式

失败模式 修复
大杂烩会话(一个会话干五件事) 任务间 /clear
反复纠正同一问题 两次失败后 /clear 重来
过度膨胀的 CLAUDE.md 无情修剪,或转成 hook / skill
信任但不验证 永远提供可运行的验证手段
无边界的调查("看看代码库有什么问题") 限定范围,或交给子 Agent

🔨 动手:三件事,今天就能做

  1. 建一个验证闭环:找出你每次改完代码都手动做的检查 → 变成一条命令 → 下次任务里明确要求「实现后运行它并修到通过」
  2. 审计 CLAUDE.md:按上面的体检法逐行过一遍,压到 200 行内
  3. 改一条 hook:找出一条「每次都要…」的规则,改成 hook

📚 延伸阅读


✅ 检查点

  1. 为什么「给它一个能自己跑的验证」是最重要的一条实践?
  2. 好验证的四个特征是什么?为什么"你自己看一眼"不算验证?
  3. 为什么说「验证的价值不在于全面,而在于多快被跑」?
  4. 项目还没有测试时,性价比最高的第一步是什么?
  5. 「每次编辑后都要跑 linter」该写进 CLAUDE.md 还是做成 hook?为什么?
  6. 决定用哪种引导方式的三个问题是什么?哪个最关键?
  7. CLAUDE.md 膨胀最大的代价是什么(不是钱)?
  8. 「明明写在 CLAUDE.md 里了它还是不听」,最可能的原因是什么?
  9. 什么时候可以跳过规划直接写?
  10. 连续纠正同一个问题三次,最该做什么?为什么?
👀 答案
  1. 没有可运行的检查,你就成了人肉验证环节,每个错误都要等你发现、你指出、它再改。有了它,Claude 能自己闭合「做→测→改」的循环。
  2. ①能自动跑(一条命令)②输出是二元的(通过/失败)③快(几秒到几十秒)④错误信息可操作。"你自己看一眼"四条全不满足——它不自动、不二元、不快、不给可操作信息。
  3. 因为快的验证会在每一轮迭代里被跑,慢的只会在最后被跑一次。覆盖 60% 但 3 秒跑完的,比覆盖 95% 但要 10 分钟的有用得多。
  4. 加类型检查mypy / tsc --noEmit)。几秒跑完,能挡掉一大批错误,是"从零到有"性价比最高的一步。
  5. hook。因为这是「必须每次都发生、零例外」的确定性要求,写进提示词只是概率性的建议,它会忘
  6. ①什么时候加载 ②如何持久 ③必须被多严格遵守第③个最关键——需要确定性保证的绝不能靠提示词。
  7. 它稀释了真正重要的指令。CLAUDE.md 的每一行都在每一轮被重读,500 行的文件会让 Claude 更容易忽略你真正在乎的那几条。
  8. 那条规矩被淹没了——不是它不听话。先精简 CLAUDE.md,再考虑加强措辞。
  9. 一句话能描述清楚 diff 的任务(改错字、加日志、改名)。
  10. /clear 重开,用吸收了教训的新提示词。因为上下文已被失败尝试污染,模型每一轮都在读那些错误示范,继续拉扯只会更糟。

🛑 可以停在这里

走神救援

核心心法:给它能自己跑的验证(四档位:单次提示/跨会话/Stop hook闸门/验证子Agent),并要它出示证据。⭐好验证四特征:能自动跑、输出二元、快、错误信息可操作——"你自己看一眼"四条全不满足所以不算验证;⭐验证的价值不在全面而在多快被跑(3秒跑完覆盖60%的,比10分钟覆盖95%的有用,因为前者每轮都会跑);没测试的项目先加类型检查,性价比最高。工作流:探索(plan mode)→规划→编码→提交;大功能先让它面试你产出SPEC.md,再开新会话实现(干净上下文全用于实现)。七种引导按「何时加载/如何持久/多严格」三问选(第三问最关键:要确定性保证的绝不写进提示词):必须每次发生→hook;多步骤流程→skill;只跟某些目录相关→rule加paths;要大量翻阅但只要结论→子Agent;剩下的短的全局的→CLAUDE.md(限200行)。⭐CLAUDE.md 膨胀最大的代价不是钱,是稀释了真正重要的指令——"写了它还是不听"十有八九是那条被淹没了,先精简再加强。会话管理:⭐同一问题纠正超两次就 /clear 重来(上下文已被失败尝试污染,模型每轮都在读错误示范)。

下一节 👉 06-工作流还是Agent.md

打卡记录保存在你的浏览器里,首页能看到总进度