Agent阿新聊ai

常用工作流:解释代码、修 Bug、补测试、写文档

常用工作流:解释代码、修 Bug、补测试、写文档 TL;DR: 解释代码、修 Bug、补测试、更新文档——四个高频低风险工作流。跑通这四个,等于验证了 CLAUDE.md、测试闭环和模块边界。跑不通就别做复杂任务。 为什么要从这四个工作流开始 团队引入 Claude Code 后最常见的错误:直接甩一个大需求过去,结...

常用工作流:解释代码、修 Bug、补测试、写文档

TL;DR: 解释代码、修 Bug、补测试、更新文档——四个高频低风险工作流。跑通这四个,等于验证了 CLAUDE.md、测试闭环和模块边界。跑不通就别做复杂任务。

为什么要从这四个工作流开始

团队引入 Claude Code 后最常见的错误:直接甩一个大需求过去,结果改了一堆不该改的文件、没跑测试、引入回归,然后得出结论"AI 不靠谱"。

问题不在 AI。问题在于你没有先验证基础设施。

这四个工作流的共同特征:高频、低风险、可快速验证。它们不是目的,是诊断工具。每个工作流都会暴露一类配置缺陷:

工作流 诊断什么 暴露的问题
解释代码 项目地图是否完整 CLAUDE.md 缺少架构描述
修 Bug 模块边界是否清晰 Claude Code 改了不该改的文件
补测试 测试命令是否正确 CLAUDE.md 的 Commands 段有误
写文档 文档规则是否明确 Claude Code 不知道文档放哪里

如果这四个工作流都跑不顺,说明你的 CLAUDE.md、Hooks 和权限配置还不支持复杂任务。先把基础诊断能力校准好。

工作流 1:解释代码

目的

新人 onboarding、Code review 前准备、理解不熟悉的模块。解释代码不需要 Claude Code 修改任何文件,是纯只读操作,零风险。

提示词模式

解释 src/services/payment/ 目录的架构。
列出每个文件的职责、导出的函数、和调用它的模块。
标注哪些函数有测试覆盖,哪些没有。

关键约束:只读,不修改。如果 Claude Code 在解释过程中顺手改了代码,说明你的权限或规则配置有问题。

验证方式

人工确认 Claude Code 的解释和实际代码一致。重点检查:

  • 文件职责描述是否准确(不是泛泛而谈)
  • 函数列表是否完整(没有遗漏导出函数)
  • 调用关系是否正确(确实是被那些模块调用)
  • 测试覆盖标注是否和实际测试文件对应

暴露的配置问题

如果 Claude Code 解释不准确,原因通常是:

  1. CLAUDE.md 缺少项目地图 —— Claude Code 不知道模块之间的依赖关系,只能靠文件名猜。
  2. 路径规则缺失 —— monorepo 中,Claude Code 把不同 package 的职责搞混。
  3. CLAUDE.md 中的架构描述过期 —— 写的时候是对的,重构后没更新。

验证清单

解释代码验证清单:
[ ] 文件职责描述与代码注释一致
[ ] 导出函数列表完整(手动 spot check 3 个文件)
[ ] 调用关系与 grep 结果匹配
[ ] 测试覆盖标注与实际 test 文件对应
[ ] Claude Code 没有修改任何文件(纯只读)

如果五个都通过,说明项目地图配置有效。如果第二个和第五个失败,优先修 CLAUDE.md 的架构描述段。

工作流 2:修 Bug

目的

小范围行为修复。关键词是"小范围"——一个 bug 最多涉及 2 个文件。超过 2 个文件的修改已经不算简单 bug fix 了。

完整提示词模式

Bug: 用户注册后欢迎邮件没有发送。

1. 先定位相关代码:注册逻辑在哪个文件,邮件发送在哪个文件
2. 解释当前行为和预期行为的差异
3. 提出最小修改方案(只改必要的代码)
4. 修改后运行最小相关测试
5. 总结:改了什么、为什么、测试结果、剩余风险

这个提示词强制 Claude Code 走一条结构化路径:定位 → 诊断 → 方案 → 执行 → 验证。不是让它自由发挥,而是每一步都有可检查的产出。

质量指标

指标 标准 不达标时的含义
修改文件数 ≤ 2 超过说明模块边界不清或诊断有误
测试通过 最小相关测试全部通过 要么测试没跑,要么改坏了
无关变更 0 Claude Code 在"顺手优化",需要加强规则
诊断准确 root cause 和实际一致 上下文不足,需要补 CLAUDE.md

失败诊断树

Bug 修失败了,按这个顺序排查:

1. Bug 没修好?
   → 诊断错误(Claude Code 定位到了错误的代码)
   → 上下文不足(Claude Code 不知道关键的调用链)
   → 修复:补 CLAUDE.md 的架构描述和模块依赖

2. 改了太多文件?
   → 范围蔓延(Claude Code 觉得"顺便重构一下")
   → 边界规则缺失(CLAUDE.md 没有明确哪些模块不能动)
   → 修复:补 CLAUDE.md 的 Working Rules 和模块边界

3. 测试没跑?
   → 没有验证习惯(Claude Code 改完就结束了)
   → CLAUDE.md 没有要求修改后必须运行测试
   → 修复:加 PostToolUse Hook 或在 CLAUDE.md Commands 段强调测试

4. 引入了回归?
   → 没有覆盖原始行为的测试
   → 修改影响了其他调用方
   → 修复:先补回归测试,再修 bug

实战检查

修完 bug 后,对照这个 diff 检查清单:

Bug Fix 验证清单:
[ ] 修改文件数 ≤ 2
[ ] 每个 hunk 都和 bug 直接相关(无"顺手"改动)
[ ] 最小相关测试已运行且通过
[ ] Claude Code 解释了 root cause
[ ] Claude Code 列出了剩余风险
[ ] 没有引入新的 typecheck 或 lint 错误

工作流 3:补测试

目的

提高回归保护。补测试和修 Bug 互为镜像:修 Bug 是"测试告诉你行为错了",补测试是"先写好网,以后改坏了能知道"。

提示词模式

为 src/services/payment/processRefund.ts 补测试。
要求:
1. 先读源文件,列出所有导出函数和分支
2. 列出需要覆盖的场景(正常、边界、异常)
3. 写测试,每个测试只验证一个行为
4. 确认测试先失败再通过(验证测试本身有效)
5. 报告覆盖率

第五步"报告覆盖率"容易被忽略,但它是判断测试质量的关键。如果 Claude Code 报告覆盖率从 40% 提升到 65%,你至少知道测试确实在测代码。如果覆盖率没变,说明测试可能测的是无关路径。

质量标准

什么样的测试是有效的:

// 无效测试:测的是 mock 本身,不是业务逻辑
it('should work', () => {
  mockDb.query.mockResolvedValue({ rows: [] });
  const result = processRefund('order-123');
  expect(result).toBeDefined(); // 永远通过
});

// 有效测试:测的是具体行为
it('拒绝已退款的订单二次退款', async () => {
  mockDb.query.mockResolvedValue({
    rows: [{ status: 'refunded' }]
  });
  await expect(processRefund('order-123'))
    .rejects.toThrow('ORDER_ALREADY_REFUNDED');
});

有效测试的判断标准:

  • 测试名字描述具体行为,不是 "should work" 或 "test case 1"
  • 断言具体值,不是 toBeDefined() 这种永远通过的断言
  • 每个测试只验证一个行为,一个 it 块里不要测三件事
  • 先失败再通过,确保测试真的能捕获 bug

暴露的配置问题

如果 Claude Code 补的测试跑不起来,通常只有一个原因:CLAUDE.md 里的测试命令是错的

常见错误:
- CLAUDE.md 写的是 npm test,项目实际用的是 pnpm test
- CLAUDE.md 写的是 pnpm test,但单测命令是 pnpm test:unit
- 测试需要环境变量,CLAUDE.md 没提
- 测试框架用的是 vitest,CLAUDE.md 写的是 jest

这类问题修一次就好——更新 CLAUDE.md 的 Commands 段。

验证清单

补测试验证清单:
[ ] Claude Code 列出了所有导出函数和分支
[ ] 场景覆盖了正常路径、边界值和异常情况
[ ] 每个测试只验证一个行为
[ ] 测试先失败再通过(不是天生就通过)
[ ] 覆盖率有提升
[ ] 测试命令和 CLAUDE.md 一致

工作流 4:更新文档

目的

文档和代码同步。这是最容易被跳过的工作流,但它的诊断价值不低——如果 Claude Code 不知道文档在哪、用什么格式、遵循什么规范,说明 CLAUDE.md 缺少文档规则。

提示词模式

src/services/payment/processRefund.ts 刚修改了退款策略:
- 超过 30 天的订单不再支持退款
- 新增部分退款逻辑

更新所有受影响的文档:
1. 找到引用旧退款策略的文档
2. 用现有文档风格更新内容
3. 更新 API 示例中的请求和响应
4. 确认文档内的链接仍然有效

验证方式

文档验证比代码验证更难自动化,需要人工检查:

  • 位置正确:文档放在项目约定的位置,不是随便找个地方新建
  • 格式一致:和现有文档的 markdown 风格、标题层级、代码块格式一致
  • 内容准确:示例命令能跑、API 参数和实际代码一致
  • 链接有效:文档内引用的其他文档路径仍然可访问

暴露的配置问题

常见问题:
- 文档放在 /docs 而不是 /wiki
- 用的是中文文档,Claude Code 写了英文
- API 文档用 OpenAPI 格式,Claude Code 写了纯 markdown
- CHANGELOG 更新规范没写进 CLAUDE.md

工作流质量诊断矩阵

四个工作流跑完后,用这个矩阵判断项目配置的健康度:

工作流 暴露的配置问题 失败指标 修复方法
解释代码 项目地图缺失 结构描述不准确、调用关系错误 补 CLAUDE.md 架构描述
修 Bug 模块边界不清 改了不该改的文件、无关变更 > 0 补 CLAUDE.md Working Rules 和边界说明
补测试 测试命令错误 测试跑不起来、命令不匹配 修正 CLAUDE.md Commands 段
写文档 文档规则缺失 写错位置、格式不统一 补 CLAUDE.md 文档规则段

诊断方法:每个工作流跑两轮。第一轮暴露问题,修复配置后跑第二轮验证。如果第二轮全部通过,基础配置合格。

真实失败案例

背景

一个 6 人团队在支付系统仓库里引入 Claude Code。仓库没有 CLAUDE.md,没有 Hooks,权限完全开放。第一天,后端工程师让 Claude Code 修一个"简单"的 bug:用户登录后偶尔出现 session 过期的提示。

事件经过

Claude Code 的操作:

1. 定位到 auth middleware 中的 session 校验逻辑
2. 修改了 auth-middleware.ts —— 修改了 session 过期判断
3. 修改了 session-store.ts —— "优化"了 session 刷新逻辑
4. 修改了 user-service.ts —— 调整了用户信息查询的缓存策略
5. 修改了 logout-handler.ts —— "顺便"统一了错误处理
6. 修改了 api-gateway.ts —— 调整了路由匹配顺序

5 个文件被修改,原始 bug 只涉及 1 个文件。Claude Code "顺手"做了一些"优化"。

后果

- logout 流程被破坏(用户无法正常退出)
- session store 的刷新逻辑和 Redis 配置不兼容(生产环境 session 全部失效)
- 没有运行任何测试
- 部署后 15 分钟内收到 200+ 用户反馈

根因分析

三个配置缺失导致的连锁失败:

1. 没有 CLAUDE.md
   → Claude Code 不知道 session-store.ts 是共享基础设施,不能随便改
   → Claude Code 不知道 logout-handler.ts 的错误处理是刻意设计的

2. 没有 PostToolUse Hook
   → 修改文件后没有自动提醒运行测试
   → Claude Code 改完就认为任务完成了

3. 没有模块边界规则
   → Claude Code 的"顺手优化"没有被任何规则约束
   → 没有告知哪些文件属于共享层、不能在 bug fix 中修改

成本

时间成本:
- 4 小时紧急排查和修复
- 1 小时回滚部署
- 2 小时事后复盘和补写 CLAUDE.md

信任成本:
- 团队对 Claude Code 的信心从"期待"降到"怀疑"
- 两周没人愿意再用 Claude Code

修复措施

事后团队做了三件事:

1. 创建 CLAUDE.md,包含:
   - 模块边界说明(共享层 vs 业务层)
   - 修改规则(bug fix 最多改 2 个文件)
   - 测试命令和验证要求

2. 添加 PostToolUse Hook:
   - 修改 src/ 下文件后,自动运行最小相关测试
   - 测试失败时提醒 Claude Code 回退修改

3. 配置 .claude/rules/ 路径规则:
   - 共享模块(session-store, cache)需要确认才能修改
   - 修改 API 网关需要安全审查

如果团队先跑通四个基础工作流,这个失败不会发生。修 Bug 工作流会立刻暴露"改了太多文件"的问题。补测试工作流会暴露"测试没跑"的问题。解释代码工作流会暴露"没有项目地图"的问题。

何时超越基础工作流

四个基础工作流能覆盖日常 60-70% 的任务。但有些任务超出了它们的范围。

复杂度判断矩阵

信号 说明 基础工作流还能用吗 下一步
可能改动 > 3 个文件 超出简单 bug 范围 不适合 用 plan 模式先拆分任务
需要先研究影响范围 不确定改了会怎样 解释代码可以,修 Bug 不行 用 Explorer subagent 调研
跨模块影响 改动涉及多个服务 不适合 用 parallel exploration 并行调研
安全敏感 涉及认证、权限、数据 不适合直接改 用 security-reviewer subagent 审查
需要设计决策 多种实现方案 不适合 先讨论方案,再拆成小任务

判断标准很简单:如果你自己也不确定怎么改,就不要让 Claude Code 直接改。先让它调研、解释、列方案,你确认方案后再执行。

从基础到复杂的过渡路径

Level 1: 四个基础工作流(本篇)
         解释代码 → 修 Bug → 补测试 → 写文档

Level 2: 有结构的复杂任务
         先 plan → 拆成多个 Level 1 任务 → 逐个执行验证

Level 3: 需要专项角色
         调研用 Explorer、安全用 Reviewer、测试用 QA subagent

Level 4: 多角色协作
         多个 subagent 并行 + 主会话整合结果

不要跳级。Level 1 没跑通就去 Level 3,只会得到更混乱的结果。

进阶提示词工程模式

四个基础工作流的提示词模板可以进一步系统化。以下是每种工作流在不同复杂度下的提示词变体,以及为什么这些变体能引导 Claude Code 产生更好的输出。

解释代码的分层提示词

Level 1 — 快速概览(适合陌生模块首次接触):
  列出 src/services/auth/ 下的所有文件。
  每个文件用一句话描述职责。

Level 2 — 结构分析(适合理解模块间关系):
  解释 src/services/auth/ 的架构。
  列出每个文件的职责、导出的函数、和调用它的模块。
  用箭头标注文件之间的调用方向(A → B 表示 A 调用 B)。

Level 3 — 深度审计(适合 code review 前准备):
  对 src/services/auth/ 做完整的代码审计准备:
  1. 列出每个导出函数的签名、参数类型和返回类型
  2. 标注每个函数的测试覆盖状态(有测试/无测试/部分覆盖)
  3. 标注错误处理路径(哪些异常被 catch,哪些没有)
  4. 标注外部依赖(调用了哪些其他模块、第三方库、API)
  5. 列出你注意到的潜在问题(不修改代码,只列出观察)

分层的原因:Level 1 消耗约 2000 token 的输出,Level 3 消耗约 8000 token。如果你只需要知道一个模块大概做什么,Level 3 的输出反而增加了审查负担。反过来,如果要做代码审查前的准备,Level 1 的信息不够用。

修 Bug 的结构化提示词变体

基础版适合简单 bug。以下变体处理更复杂的场景:

变体 A — 不确定 bug 所在位置:
  Bug 报告:[现象描述]
  
  1. 先用 Grep 搜索相关关键词,定位可能出错的代码区域
  2. 列出你找到的所有可疑位置,标注可能性(高/中/低)
  3. 解释每个位置为什么可疑
  4. 等我确认后,再提出修改方案
  
  约束:只做诊断,不做任何修改。

变体 B — Bug 涉及多个模块:
  Bug 报告:[现象描述]
  
  1. 定位 bug 涉及的所有文件
  2. 画出调用链:从入口到出错位置,经过哪些文件和函数
  3. 在调用链上标注每一步的数据流(输入什么、输出什么、在哪一步出错)
  4. 提出最小修改方案,解释为什么改动这些文件就足够
  5. 列出调用链上其他可能受影响的调用方
  6. 修改后运行所有相关测试,不只是出错的那个文件的测试
  
  约束:修改前先画调用链,确认我同意后再改代码。

变体 C — 间歇性 bug(难以稳定复现):
  Bug 报告:[间歇性现象描述,复现条件不明确]
  
  1. 搜索代码中所有和该现象相关的代码路径
  2. 识别可能导致间歇性行为的代码模式:
     - 竞态条件(并发访问共享状态)
     - 时序依赖(setTimeout、事件顺序)
     - 外部状态(缓存、数据库、第三方 API)
     - 条件分支中未处理的边界情况
  3. 对每个可疑模式,解释为什么它可能导致间歇性行为
  4. 建议添加哪些日志或断言来帮助缩小范围
  5. 不要修改代码,只输出诊断报告

变体 A 增加了一个交互检查点("等我确认后"),避免 Claude Code 在错误的位置做修改。变体 B 强制画出调用链,这在多文件 bug 中能暴露真正的 root cause。变体 C 的重点是诊断而非修复——间歇性 bug 在没有充分信息时贸然修改,往往引入新问题。

补测试的提示词工程

进阶版 — 带覆盖率分析的测试补充:

为 src/services/payment/processRefund.ts 补测试。

执行步骤:
1. 读源文件,列出所有导出函数
2. 对每个函数,列出所有分支(if/else, switch, try/catch, ?. , ??)
3. 标注已有测试覆盖的分支(读取现有测试文件对比)
4. 只为未覆盖的分支写测试
5. 每个测试用 describe/it 结构组织,it 描述具体行为
6. 运行测试前报告:新增了几个测试、覆盖了哪些分支
7. 运行测试,报告通过率和覆盖率变化

输出格式要求:
- 测试文件路径:[和源文件对应的测试路径]
- 新增测试数量:[N]
- 覆盖分支列表:[列出]
- 运行命令:[精确命令]
- 覆盖率变化:[从 X% 到 Y%]

这个变体的关键是步骤 3——"标注已有测试覆盖的分支"。没有这一步,Claude Code 可能重复写已有的测试场景,浪费 token 且不增加覆盖率。

写文档的提示词工程

进阶版 — 变更影响分析驱动的文档更新:

刚完成了以下变更:
[列出变更内容]

请更新所有受影响的文档:

1. 搜索阶段
   - Grep 搜索所有 .md 文件中引用变更内容的文档
   - 列出搜索结果,标注哪些文档确实需要更新

2. 更新阶段
   - 按现有文档风格更新内容(保持标题层级、代码块格式一致)
   - 如果涉及 API 变更,更新请求/响应示例
   - 如果涉及配置变更,更新环境变量表

3. 验证阶段
   - 确认文档内链接仍然有效(Grep 检查引用路径是否存在)
   - 确认示例命令能运行(如果是 shell 命令,验证命令格式正确)
   - 列出你更新了哪些文件的哪些段落

4. 遗漏检查
   - 列出可能还需要的文档更新但你不确定的(标注"需要确认")

步骤 4 "遗漏检查" 是这个变体的关键创新。Claude Code 可能无法确定某些文档是否需要更新(比如 CHANGELOG、内部的架构决策记录),让它列出不确定项比让它自己做决定更安全。

工作流失败诊断树(完整版)

前文给出了修 Bug 的失败诊断树。以下是所有四个工作流的完整诊断流程:

┌─ 解释代码失败?
│  ├─ 结构描述不准确 → CLAUDE.md 缺少 Structure 段
│  │                    → 补充:每个顶层目录加一句话描述
│  ├─ 调用关系错误 → CLAUDE.md 缺少依赖方向声明
│  │                  → 补充:Boundaries 段加"谁可以调用谁"
│  ├─ 遗漏目录 → CLAUDE.md 的 Structure 段过期
│  │              → 触发条件:新增了目录但没更新 CLAUDE.md
│  └─ 对生成文件做了描述 → CLAUDE.md 缺少 Off-limits 段
│                         → 补充:列出所有不应手动修改的路径
│
├─ 修 Bug 失败?
│  ├─ 改了太多文件
│  │   ├─ Claude Code "顺手优化" → CLAUDE.md 加 "No unrelated changes" 规则
│  │   ├─ 诊断定位错误 → 项目地图不够精确,Claude Code 找错了位置
│  │   └─ 模块边界不清 → Boundaries 段需要更明确的约束
│  ├─ 测试没跑
│  │   ├─ CLAUDE.md 没有要求 → Commands 段补充测试命令
│  │   ├─ Hook 缺失 → 添加 PostToolUse Hook 自动运行测试
│  │   └─ 测试命令错误 → 修正 Commands 段中的命令写法
│  ├─ Bug 没修好
│  │   ├─ Root cause 判断错误 → CLAUDE.md 补充调用链和依赖关系
│  │   ├─ 只修了表面症状 → 提示词增加"解释 root cause"步骤
│  │   └─ 遗漏了相关分支 → 提示词增加"列出所有影响范围"
│  └─ 引入回归
│      ├─ 没有覆盖原始行为的测试 → 先补回归测试,再修 bug
│      ├─ 修改影响了其他调用方 → Boundaries 段补充调用方信息
│      └─ 没有跑全量相关测试 → Commands 段补充"影响范围测试"命令
│
├─ 补测试失败?
│  ├─ 测试跑不起来
│  │   ├─ 命令不存在 → CLAUDE.md Commands 段的测试命令是错的
│  │   │              → 修正:验证命令在终端能跑通再写进 CLAUDE.md
│  │   ├─ 环境变量缺失 → CLAUDE.md 补充测试前置条件
│  │   └─ 测试框架不匹配 → 修正 Commands 段中的框架名称
│  ├─ 测试天生就通过(无效测试)
│  │   ├─ 提示词没有要求"先失败再通过" → 加上"确认测试先失败再通过"步骤
│  │   ├─ 断言太弱 → 提示词增加"断言具体值,不用 toBeDefined()"要求
│  │   └─ Mock 拦截了真实逻辑 → 提示词增加"测试真实行为,不测 mock"
│  └─ 覆盖率没提升
│      ├─ 测试测的是无关路径 → 提示词增加"列出源文件所有分支"步骤
│      └─ 重复已有测试 → 提示词增加"标注已有测试覆盖的分支"步骤
│
└─ 写文档失败?
   ├─ 位置错误 → CLAUDE.md 补充文档目录结构说明
   │            → 说明:/docs 放用户文档,/wiki 放内部文档,根目录放 README
   ├─ 格式不一致 → CLAUDE.md 补充文档格式规范
   │              → 或创建 .claude/rules/docs.md 做路径级加载
   ├─ 内容不准确 → 提示词增加"验证示例命令能运行"步骤
   └─ 遗漏相关文档 → 提示词增加"搜索所有引用旧内容的文档"步骤

更多真实工作流案例

案例二:API 版本迁移工作流

场景:后端服务需要把 /api/v1/orders 迁移到 /api/v2/orders,v2 改变了部分响应字段的结构。这是一个跨文件、需要协调前后端的任务,但可以拆成多个基础工作流来执行。

Phase 1 — 解释代码(只读,摸清影响范围):
  列出所有引用 /api/v1/orders 的文件。
  区分:前端调用方、后端 handler、测试文件、文档。
  标注每个引用的上下文(是请求 URL、测试 fixture、还是文档示例)。

Phase 2 — 补测试(先加保护网):
  为 v1 的现有 handler 补充测试(如果覆盖率不足)。
  要求:测试必须验证当前 v1 的响应格式。
  目的:确保迁移后 v1 的行为不变(向后兼容期)。

Phase 3 — 修 Bug(这里是"迁移"而非修 bug,但用同样的约束):
  实现 v2 handler,每个变更控制在 2 个文件以内。
  v2 handler 写在独立文件中(不修改 v1 handler)。
  路由注册在 routes/index.ts 中添加(这个文件会改,但只加路由,不改现有路由)。

Phase 4 — 写文档(更新 API 文档):
  更新 API 文档中的 v2 端点说明。
  添加迁移指南(v1 到 v2 的字段映射)。
  标注 v1 的废弃时间表。

这个案例的关键是按顺序执行四个基础工作流,而不是一次性让 Claude Code "把 v1 迁移到 v2"。顺序执行的好处是每个 phase 都有独立的验证点:Phase 1 的输出是影响范围清单,Phase 2 的输出是测试通过报告,Phase 3 的输出是 diff 和测试结果,Phase 4 的输出是文档更新清单。任何一个 phase 不通过,不会影响前面的成果。

案例三:依赖升级工作流

场景:将项目从 React 17 升级到 React 18。这种任务看起来复杂,但拆成基础工作流后,每一步都是可控的。

Phase 1 — 解释代码(评估影响):
  列出 package.json 中所有 React 相关依赖的当前版本。
  Grep 搜索代码中使用 React 17 特有 API 的位置:
    - ReactDOM.render(React 18 用 createRoot)
    - componentWillMount 等 deprecated 生命周期
    - 依赖 react-scripts 的配置
  列出第三方依赖中可能不兼容 React 18 的包。

Phase 2 — 补测试(升级前的安全网):
  确认所有现有测试在 React 17 下通过。
  如果有组件没有测试,为核心渲染组件补充快照测试。
  快照测试的目的是捕获升级后的渲染输出变化。

Phase 3 — 修 Bug(分步升级):
  步骤 1:更新 package.json 中的 react 和 react-dom 版本
  步骤 2:运行 pnpm install,检查是否有 peer dependency 冲突
  步骤 3:修改 ReactDOM.render → createRoot(Grep 逐个修改)
  步骤 4:运行测试,确认通过。失败则逐个修复。
  约束:每个步骤只做一件事,做完跑测试再进入下一步。

Phase 4 — 写文档:
  更新项目 README 中的 React 版本说明。
  更新 CLAUDE.md 的 frontmatter(如果有 framework 版本声明)。
  记录升级过程中遇到的 breaking changes 和解决方案。

这个案例的特殊之处在于 Phase 3 被进一步拆分成了多个子步骤。依赖升级的每一小步都可能引入不同的问题,"一次改完"几乎必然导致不可调试的失败。

渐进复杂度决策矩阵

当你拿到一个任务时,用这个矩阵判断应该用哪个级别的提示词:

任务特征                         │ 提示词级别   │ 预期交互轮次
─────────────────────────────────┼─────────────┼─────────────
单文件,行为明确                  │ 基础版       │ 1 轮
单文件,需要先定位                │ 变体 A       │ 2 轮(诊断 + 执行)
多文件,调用链清晰                │ 变体 B       │ 2-3 轮
多文件,影响范围不确定            │ 先解释代码    │ 3-4 轮
                                 │ 再修 Bug     │
间歇性/难以复现                  │ 变体 C       │ 2 轮(纯诊断)
跨服务/API 变更                  │ 拆成多阶段   │ 4-6 轮
依赖升级                         │ 拆成多阶段   │ 4-6 轮

判断的核心逻辑:任务的不确定度越高,提示词中"诊断"部分的权重应该越大,"执行"部分应该越靠后。 如果你在任务描述中用了"可能"、"大概"、"不确定"这类词,说明你应该先用解释代码工作流做诊断,而不是直接让 Claude Code 动手修改。

工作流质量验证检查清单(综合版)

四个工作流全部跑完后,不仅要验证每个工作流的结果,还要验证它们之间的协同是否正常:

单工作流验证:
[ ] 解释代码:输出准确,无修改文件
[ ] 修 Bug:修改 ≤ 2 文件,无无关变更,测试通过
[ ] 补测试:测试先失败再通过,覆盖率提升
[ ] 写文档:位置正确,格式一致,链接有效

跨工作流验证:
[ ] 解释代码识别的问题在修 Bug 中被正确处理
[ ] 修 Bug 后的代码在补测试中获得了覆盖
[ ] 补测试新增的测试在写文档中被引用(如有必要)
[ ] 四个工作流使用的命令全部来自 CLAUDE.md Commands 段

基础设施验证:
[ ] PostToolUse Hook 正确触发(修改文件后自动跑测试)
[ ] .claude/rules/ 中的路径规则被遵守
[ ] CLAUDE.md 的项目地图在四个工作流中都没有暴露过期信息
[ ] Claude Code 的每个输出都包含 diff、验证结果和剩余风险

"跨工作流验证"这个维度容易被忽略。如果解释代码工作流正确识别了模块 A 和模块 B 之间的调用关系,但修 Bug 时 Claude Code 仍然在模块 A 里写了属于模块 B 的逻辑,说明项目地图的 Boundaries 段写对了但 Claude Code 没有遵守——这可能需要在 .claude/rules/ 中加一条路径级的强制规则。

落地清单

四个工作流全部跑通后才算基础配置合格:

基础工作流验证清单:
[ ] 解释代码:Claude Code 能准确描述模块结构和调用关系
[ ] 修 Bug:每次 bug fix 修改 ≤ 2 个文件,无无关变更
[ ] 补测试:测试能跑、先失败再通过、覆盖率有提升
[ ] 写文档:文档位置、格式、内容都正确
[ ] 修改后自动运行最小相关测试(PostToolUse Hook 或 CLAUDE.md 规则)
[ ] Claude Code 每次都报告 diff、验证结果和剩余风险

全通过:项目配置有效,可以开始更复杂的任务。有失败:先修配置,再重来。

权衡

这四个工作流看起来不炫,但它们解决的是最实际的问题:你的项目配置到底有没有效。跑通这四个,后面用 subagent、parallel exploration、Hooks 才有基础。跑不通,复杂工作流只会放大混乱。

交叉参考

评论

0
登录后可以参与评论和讨论。
💬

还没有评论

欢迎留下第一条评论,帮助这篇内容更快形成讨论。