Claude Code 输出和 prompt 不符:6 个 plan 阶段误读 + restate-before-execute

Diff 是漂亮代码但解决了**别的**问题——misalignment 几乎总是 plan 阶段,不是 code 阶段。强制让它先 restate task 再动手。

你让 Claude Code「修 invoice 渲染里的时区 bug」。PR 漂亮地回来——测试全、文档全——但完全是 invoice 列表的缓存失效 bug。它读文件时确实发现了那个 bug。但不是你要的那个。原时区 bug 还在那里。

输出和 prompt 不符几乎总发生在 plan 阶段,不在代码阶段。Claude 读 prompt、读文件、读相关 context,然后 commit 一个漂离你写的的心智任务。代码落地时 plan 已经错——而代码忠实反映了那个 plan。修法:强制 restate-before-execute,让你在便宜的阶段 catch 偏差。

常见原因

按命中率从高到低:

1. Prompt 歧义、Claude 挑了合理一种解读

「修时区 bug」可以是:渲染 bug、存储 bug、解析 bug、比较 bug。Claude 看到撞上的第一个就动手——你想的是另一个。

如何判断:事后用新眼光看你的原 prompt——能找出 2+ 个合理解读,就是歧义。

2. 长 prompt 被略读,关键句被略掉

prompt > 200 字时常被 Claude 总结成”主要的诉求”——你后面加的次要约束 / 具体限定就丢了。它按摘要工作。

如何判断:工作匹配你 prompt 里第一个大指令,但忽略了后面加的条件(「但别影响 email 路径」)。

3. CLAUDE.md 注入了竞争性默认值

prompt 说「做 X」,CLAUDE.md 说「这块我们一直 Y」。Claude 调和成「按 Y 的风格做 X」——不是你要的。

如何判断:输出匹配某条你忘了存在的 CLAUDE.md 约定,尽管 prompt 写的不同。

4. Claude 从文件 context 推 intent,不从 prompt

你说「修 bug」,Claude 读 invoice.ts 看到一个明显的 code smell,判定那是 bug 就”修”了——真 bug 在另一个文件。

如何判断:diff 在你没点名、也没预期会动的文件里。

5. Claude 解决了相关但更容易的问题

你要的是难的修法。Claude 看到一个相关但容易的问题,修了就当完事——真要的修法需要更深的查证而 Claude 不想做。

如何判断:你本来准备花数小时修的问题,改动小而干净——可疑。

6. Prompt 描述了症状,Claude 修了另一个原因

「用户看到错时间戳」可能是:时区 / 格式化 / 服务器钟 / 浏览器 locale / DB 列类型。Claude 挑一个原因修了,但真因是另一个。

如何判断:Claude”修”完 bug 还能复现——上报的症状没钉死哪个根因。

最短修复路径

按收益从高到低。Step 1 在便宜阶段(planning)逮住 80% 的 misalignment。

Step 1:强制 restate-before-execute

每个非琐碎 prompt 加:

任何 tool use 之前:
1. 用 3 条 bullet 重述任务:
   - 我要你做什么(一句话)
   - 成功是什么样(一个可观察标准)
   - 什么**不**在 scope 里
2. 列 2 个你考虑过但拒绝的替代解读。
3. 等我确认再 proceed。

「替代解读」一行是杠杆——逼 Claude 把歧义显出来,而不是闷头挑一种。

Step 2:修 bug 时先要复现

开修之前:
1. 复现 bug。给我精确触发输入 + 精确错误输出。
2. 把失败 trace 到负责的代码 file:line。
3. 提出 fix。
4. 等我批准再写代码。

「修错 bug」会因为你先看到复现而 catch。

Step 3:多步任务每步要 status 更新

每步(改文件 / 加测试 / 跑 migration)后:
- 贴一行总结
- 停,等 "proceed"
- 我说继续才进下一步

中途能打断,不是到最后才发现 misalign。

Step 4:偏差发生时诊断 plan 而非 diff

输出不符,不要光改代码——找哪里误读了:

你的输出是 X 的正确代码,我要的是 Y。

走一遍:
1. 你理解的 task 是什么?
2. 我 prompt 里的什么导致了这个理解?
3. 什么信号会让你理解成 Y?

回答改善下次的 prompt。

Step 5:非琐碎工作用结构化 prompt 模板

Goal: [一句话]
Acceptance: [一个可观察标准]
Scope: [允许动的文件]
Out of scope: [不要动的文件 / 关切]
Constraints: [必须 / 不允许]
Context: [Claude 推不出的领域信息]

6 行模板消掉绝大多数歧义驱动的误读。

Step 6:重复偏差就升级到 prompt 类别

类似 prompt 反复出错(“修 bug” → 修错 bug),就是 prompt 类别的问题。每类一个模板:

prompts/fix-bug.md
prompts/add-feature.md
prompts/refactor.md

每个用上面结构化布局,按那个类别校准——复用而不是重打。

预防建议

  • 非琐碎工作的 restate-before-execute 不可省
  • 修 bug 必须先要复现再要 fix 方案
  • 按类别(bug、feature、refactor)维护结构化 prompt 模板
  • 多步任务要每步 status,偏差可被打断
  • 偏差发生时诊断 plan(不是 diff)、升级 prompt 类别模板
  • 5 行具体的 prompt 胜过 50 行含糊——具体 > 长

相关阅读

标签: #排查 #Claude Code #排查 #输出不符