Claude Code 反复问不必要的问题:6 个噪音原因 + Defaults 设计

你要执行,agent 每 30 秒停下来问「用 TypeScript 还是 JS」——在 CLAUDE.md 写默认值 + 「只在破坏性操作前问」规则。

你说「加一个 billing API endpoint」。Claude Code 回:「用 TypeScript 还是 JavaScript?文件放哪儿?要不要加测试?你倾向哪种错误格式?REST 还是 GraphQL?」每一条看代码库都明显有答案——但是这个 session 写一行代码之前先来回 10 分钟。

Claude Code 不确定就问。Prompt 模糊代码库没明显约定时,它就用”问”换”安全”。修法不是”叫它别问”那太脆——耐久修法是 CLAUDE.md 写明默认值、task 里点 canonical example、明确授权它「除破坏性操作外不要问」。

常见原因

按命中率从高到低:

1. CLAUDE.md 没 Defaults 段

没写默认值,Claude 把每个隐式选择都当需要确认。“用 TypeScript” / “测试用 vitest” / “API 响应 { data, error } 形状”——这些都能是默认值,前提是明确声明。

如何判断cat CLAUDE.md | grep -i "default"——没 default 段,每个决定都变问题。

2. Prompt 把明显决定留隐式了

“加一个 endpoint” 没说什么风格、放哪儿、什么框架。Claude 本可以读现有代码推断,但安全默认让它先问。

如何判断:你的 prompt 不到 30 字、不指 canonical example、不指框架/位置——问题就是在补你没写的。

3. Agent 安全默认就是「不清楚就问」

Claude Code 内建策略偏向问。破坏性操作这是对的;可逆代码修改就是噪音。Agent 需要显式授权才能不问就走。

如何判断:问的是可逆决定(文件位置、命名)不是破坏性的(删文件、drop 表)——这是噪音模式。

4. 代码库本身就不一致

代码库一半 findUser 一半 getUser。Claude 读到两种,看到歧义就问——这不是 Claude 的错,是你的 repo 没单一 canonical。

如何判断:Claude 问的恰好是代码库真的没做选择的(“错误格式 { error: string } 还是 { message: string }”)——code 里搜,两种都有。

5. Task 真的歧义

有些问题合理:「文件放哪」——你有 5 个合理位置就是真问题。区分噪音问题(默认值存在)和有效问题(真歧义)。

如何判断:打开 codebase 后你也回答不出来——就是有效问题。

6. Plan 模式触发了、它在等确认

Plan 模式设计成每步前问——你没打算进 plan 模式时就感觉它问太多。

如何判断:每个”问题”看着像 plan 的一步在等批准——退出 plan 模式(或简单任务不要进)。

最短修复路径

按收益从高到低。Step 1 是耐久修法,其余再收紧。

Step 1:CLAUDE.md 加 Defaults 段

单杠杆最高的一步:

## Defaults(不要问,直接用)

- 语言:TypeScript(strict)
- 测试框架:vitest
- 测试位置:紧挨源文件,`*.test.ts`
- 包管理:pnpm
- API 响应形状:`{ data: T | null, error: string | null }`
- 错误类:extend `src/lib/errors.ts``AppError`
- 新组件:arrow function、props 解构、export default
- 命名:`findX` 可空查找,`getX` 必有查找(缺则 throw)

## 这些事必须先问:

- 删 task 直接范围外的文件
- 在生产跑数据库 migration
-`.env``package.json` engines、CI 配置
- 改公开 API 合同
- 强推或 `git reset --hard`

「必须先问」让「其他时候别问」变安全。

Step 2:Prompt 里指 canonical example

不要写「加一个 endpoint」,写:

加 `GET /api/orgs/:id`。
完全照 `src/app/api/users/[id]/route.ts`——同结构、同错误格式、同测试布局。
位置、命名、框架不要问,照这个文件。

一个 canonical 指针消掉 5 个问题。

Step 3:用「decisive mode」prompt 前缀

执行模式:

模式:执行,不咨询。
读 CLAUDE.md 取默认值,基于现有代码做合理决定。
只在以下情况问:
1. 决定是破坏性的(删数据 / 破坏 API 合同)
2. 决定和 CLAUDE.md 冲突
3. 多种模式共存且你判定不出 canonical

存成 slash command 或模板,不要每次重打。

Step 4:在 prompt 里提前回答常见问题

重复工作流:

加测试:是,vitest,紧挨源。
文件位置:src/services/billing/。
命名:camelCase,interface 不要 I 前缀。
文档:JSDoc 只在 export 上。

前置 agent 本会问的,它就直接走。

Step 5:消除 repo 内不一致

Claude 之所以问,是 repo 没选——修 repo:

# 数对立模式
grep -rc "findUser" src/ | awk -F: '{s+=$2} END {print "find:", s}'
grep -rc "getUser" src/ | awk -F: '{s+=$2} END {print "get:", s}'

CLAUDE.md 钦定一个,少数派迁移(这本身可以是 Claude 的活儿)。未来 task 不再撞这个歧义。

Step 6:区分噪音 vs 有效问题

Claude 一问,先判断:补真空缺还是问默认?真空缺 → 回答 + 加进 CLAUDE.md(不再问第二次);默认问题 → 回答 + 加进 CLAUDE.md(永不再问)。

Q:「新 endpoint 要 auth 吗?」
→ 真问题。回答 + 加进 CLAUDE.md:「所有 /api/* 需 auth,除了 /api/public/*」

Q:「TypeScript 还是 JS?」
→ 默认问题。回答 + 加进:「永远 TypeScript strict」

每个问题都当文档缺口处理——就成耐久知识。

预防建议

  • CLAUDE.md 的 Defaults 段当活文档维护——每个 Claude 问的问题进 doc
  • 每个代码 task 配一个 canonical example,让 Claude 照抄
  • CLAUDE.md 写「必须先问」清单——破坏性操作仍然停,非破坏性不停才安全
  • repo 内不一致先收敛(一个模式胜)——代码本身不选,Claude 没法选对
  • 重复工作流存 slash command,预先答好所有默认
  • 把噪音问题当文档缺口,不要当”Claude 烦”

相关阅读

标签: #排查 #Claude Code #排查 #交互问询