你有没有发现,很多AI编码工具用起来总是"差点意思"?模型说"测试通过了",其实根本没运行;说"代码已修改",其实改错了文件;说"修复完成",其实引入了三个新bug。

这些问题的根源不是模型不够聪明,而是缺乏"工程化"的约束。今天咱们聊聊Claude Code的六个生产级模式——看起来简单到不值一提,但在实际生产中被反复验证为必要。

模式一:编辑前先读取(Read Before Edit)

你有没有试过不看说明书就组装宜家家具?结果螺丝拧错孔、板子装反了、最后多出三个零件。

AI模型也会干这种事——在没有读取文件当前内容的情况下尝试编辑。可能基于过时或错误的假设,结果把代码改得乱七八糟。

双层保障设计

Claude Code通过"软硬兼施"来解决:

软约束(提示词层):FileEditTool的描述明确写着:

“你必须在对话中至少使用过一次Read工具后才能编辑。如果你在未读取文件的情况下尝试编辑,该工具会报错。”

硬约束(代码层):FileEditTool的call()方法在执行编辑前检查——当前对话是否包含对目标文件的Read调用。没有则直接返回错误。

为什么要双层?提示词是"软约束"——模型大多数时候会遵守,但在特定条件下(上下文过长导致指令被"遗忘"、多轮对话中注意力漂移)可能被忽略。代码层是"硬约束"——即使模型忽略提示词,工具本身也拒绝执行。

这就像:交通标志提醒"禁止闯红灯"是软约束,路口的减速带是硬约束——你看到了就停,没看到也会被颠一下停下来。

模式二:渐进式自主(Graduated Autonomy)

你有没有这样的矛盾:既想让AI自动干活提高效率,又怕它搞砸了需要收拾残局?

Claude Code的设计哲学是:自主不是"全有或全无",而是连续光谱,且每个位置都有安全网。

权限模式梯度

default → acceptEdits → plan → bypassPermissions → auto → dontAsk
   │          │          │          │           │        │
   │          │          │          │           │        └── 完全自主
   │          │          │          │           └── 分类器自动决策
   │          │          │          └── 跳过权限检查
   │          │          └── 仅计划不执行
   │          └── 自动接受编辑,其他仍确认
   └── 每步确认

关键设计是"带回退的自动化"。auto模式使用YOLO分类器自动做权限决策,但有两个安全阀:

export const DENIAL_LIMITS = {
  maxConsecutive: 3,  // 连续3次拒绝
  maxTotal: 20,       // 总计20次拒绝
} as const

export function shouldFallbackToPrompting(state: DenialTrackingState): boolean {
  return (
    state.consecutiveDenials >= DENIAL_LIMITS.maxConsecutive ||
    state.totalDenials >= DENIAL_LIMITS.maxTotal
  )
}

当分类器连续3次或总计20次拒绝后,系统永久回退到用户手动确认。这意味着即使在最自主的模式下,也保留了回退到人类决策的能力。

这就像自动驾驶汽车——平时自己开,遇到复杂情况就提醒人类接管,而不是硬撑着撞墙。

模式三:防御性Git(Defensive Git)

你有没有被Git坑过?想"修复上一个commit"用了amend,结果把别人的工作搞没了;想快速提交用了--no-verify,绕过了团队的代码检查;想批量添加用了git add .,结果把.env文件也提交了。

AI模型也会犯这些错,因为训练数据里大量的Git教程推荐用amend来"修复上一个commit"——但不区分hook失败和正常commit的场景。

Git安全协议

Claude Code在BashTool提示词中嵌入了完整的Git安全协议:

  • 绝不跳过hooks--no-verify):pre-commit hooks是项目的质量门禁
  • 绝不amend(除非用户明确要求):git commit --amend修改前一个commit,在hook失败后使用会覆盖用户之前的commit
  • 优先指定文件git add <specific-files>而非git add -A,避免意外添加敏感文件
  • 绝不force push到main/master:即使用户请求也先警告
  • 创建新commit而非amend:hook失败后commit没有发生——此时--amend会修改前一个commit,可能毁掉之前的工作

最后一条尤其重要。提示词显式解释因果关系:

“pre-commit hook失败意味着commit没有发生——所以--amend会修改前一个commit,这可能毁掉之前的工作或丢失变更。应该修复问题、重新stage、创建新commit。”

这就像给新手司机配了个副刹车——不是不信任他,而是防止关键时刻踩错踏板。

模式四:结构化验证(Structured Verification)

你有没有遇到过这种人:说"做完了",但你问他"测试通过了吗",他说"应该通过了"。你问"运行了吗",他说"没有,但看起来是对的"。

AI模型也会这样——声称"测试通过"或"代码正确"而不实际运行验证。

验证链机制

Claude Code在系统提示词中建立明确的验证链:运行测试 → 检查输出 → 如实报告

这个简单流程通过多个机制加固:

可逆性意识:操作按风险分级

操作类型示例要求的模型行为
可逆操作编辑文件、创建文件、只读命令直接执行
不可逆操作删除文件、force push、发送消息确认后执行
高风险操作rm -rf、DROP TABLE、杀进程解释风险 + 确认

范围约束:模型被告知"对X的授权不延伸到Y"——修复bug不等于授权修改测试用例或跳过测试。

ant-only的强化指令

// @[MODEL LAUNCH]: capy v8 thoroughness counterweight
`Before reporting a task complete, verify it actually works: run the
test, execute the script, check the output. Minimum complexity means
no gold-plating, not skipping the finish line. If you can't verify
(no test exists, can't run the code), say so explicitly rather than
claiming success.`

注释@[MODEL LAUNCH]标记说明这是模型版本相关的行为校正——当模型升级时团队会重新评估是否仍需要这段指令。

这就像:不是问"你完成任务了吗",而是要求"给我看看测试输出"——有证据才算数。

模式五:范围匹配响应(Scope-Matched Response)

你有没有遇到过这种人:你让他修个水龙头,他顺便把厨房装修了,还"好心"帮你换了地板——结果工期延长两周,预算超支三倍。

AI模型也有这毛病——“顺便"做额外的事:修复bug时顺便重构,添加功能时顺便更新文档。好心办坏事,导致变更范围失控。

极简主义指令组

Claude Code的系统提示词包含极为具体的范围限制:

“Don’t add features, refactor code, or make ‘improvements’ beyond what was asked. A bug fix doesn’t need surrounding code cleaned up. A simple feature doesn’t need extra configurability. Don’t add docstrings, comments, or type annotations to code you didn’t change.”

“Don’t add error handling, fallbacks, or validation for scenarios that can’t happen. Trust internal code and framework guarantees.”

“Don’t create helpers, utilities, or abstractions for one-time operations. Don’t design for hypothetical future requirements. … Three similar lines of code is better than a premature abstraction.”

注意这些指令的具体程度——不是抽象的"保持简洁”,而是可判定的规则:

  • “不要给你没修改的代码添加docstring”
  • “三行重复优于过早抽象”
  • “不要为不可能发生的场景添加错误处理”

这就像:请工人修水龙头,合同里写明"只修水龙头,不碰其他东西"——越具体越不会扯皮。

模式六:工具级提示词优于通用指令(Tool-Level Prompts)

你有没有试过在人群中喊一个人的名字?他可能听不见,或者听到了但以为是叫别人。

把指令放在系统提示词里就像人群中喊话——内容太多,模型难以在正确时机回忆正确的指令。

时序对齐的设计

Claude Code让每个工具携带自己的行为驾驭器,而非将所有指令塞入系统提示词:

位置内容
系统提示词通用行为指令、输出格式、安全原则
BashTool描述Git安全协议、沙箱配置、后台任务说明
FileEditTool描述“编辑前先读取”、最小唯一old_string、replace_all用法
FileReadTool描述默认行数、offset/limit分页、PDF页码范围
GrepTool描述ripgrep语法、多行匹配、“始终使用Grep而非grep”
AgentTool描述fork指引、隔离模式、“不要偷看fork输出”
SkillTool描述预算约束、三级截断级联、内置技能优先

工具级提示词的优势在于时序对齐:当模型决定调用BashTool时,BashTool的描述(含Git安全协议)就在它的注意力焦点内。如果Git安全协议放在系统提示词中,模型需要在数万token的上下文中"回忆"——在长会话中这是不可靠的。

另一个优势是缓存效率。修改工具描述只影响工具列表的哈希,不影响系统提示词段。缓存中断检测中的perToolHashes正是为了精确追踪是哪个工具的描述变化了,而非让整个缓存前缀失效。

这就像:不是在员工手册里写"使用复印机时注意纸张方向",而是在复印机旁边贴张纸条——用时自然看到。

六个模式的关系

执行前 ──────── 执行中 ──────── 执行后
   │               │              │
   ├─ 编辑前先读取  ├─ 防御性Git    └─ 结构化验证
   └─ 范围匹配响应  └─ 渐进式自主
        └──────────────────────────┐
                          贯穿全程:工具级提示词

工具级提示词贯穿全程——其他五个模式都通过工具提示词实现。

编辑前先读取范围匹配响应约束执行前的准备。防御性Git渐进式自主控制执行过程中的安全边界。结构化验证确保执行后的正确性。

双层约束:贯穿所有模式的设计智慧

这六个模式背后有一个共同主题:双层约束

  • 解决的问题:单靠提示词无法100%保证模型遵守规则
  • 核心做法:对高风险行为,用提示词做"软约束",用代码做"硬约束"
  • 代码模板:工具描述写明规则 → call()方法检查前置条件 → 不满足时返回错误

这就像:

  • 软约束:“请勿吸烟"的告示牌
  • 硬约束:烟雾报警器自动喷水

两者结合才能真正降低风险。

实战:应用这些模式

1. 对关键行为实施双层约束

如果某个行为违反时会造成不可逆后果,不要只靠提示词——在工具代码中添加前置条件检查。

2. 设计权限梯度而非二元开关

为Agent提供至少3个自主级别:

  • 手动确认:每一步都问用户
  • 分类器自动决策(带回退):AI辅助但保留安全网
  • 完全自主:信任AI但保留熔断机制

3. 在Git操作提示词中显式说明因果关系

“不要amend"不够——要说明"hook失败后amend会修改前一个commit,导致变更丢失”。

4. 要求模型展示验证输出

不接受"测试通过了"的文字报告——要求展示实际测试输出。没有证据的声称等于没做。

5. 用具体规则替代模糊指令

将"保持代码质量"替换为:

  • “不要给未修改的代码添加注释”
  • “三行重复优于过早抽象”
  • “不要为不可能发生的场景添加错误处理”

6. 将行为指令附加到对应工具

Git安全规则放在Bash工具描述中,文件操作规则放在文件工具描述中——不要全堆在系统提示词里。

总结

六个生产级AI编码模式:

模式核心做法解决的问题
编辑前先读取提示词软约束 + 代码硬约束AI未读取就编辑
渐进式自主多级权限 + 分类器 + 拒绝追踪回退自主性与风险的平衡
防御性Git工具提示词中的完整安全协议AI选择"最短路径"导致数据丢失
结构化验证运行→检查→报告 + 可逆性分级AI声称验证但未实际执行
范围匹配响应具体可判定的范围限制指令AI"顺便"做额外的事
工具级提示词行为指令附加到对应工具通用指令在长会话中遵守率下降

这些模式的共同主题:

  1. 生产级不等于复杂——很多是简单到不值一提的约束
  2. 双层约束优于单层——软约束提醒,硬约束兜底
  3. 具体优于抽象——“不要给未修改的代码加注释"优于"保持简洁”
  4. 时序对齐优于集中存储——指令在需要时出现,而不是藏在手册里

理解这些模式,你就能:

  • 构建更可靠、更可预测的AI编码系统
  • 在模型能力和工程约束之间找到平衡
  • 把Claude Code的生产经验应用到自己的项目中

下篇咱们聊聊不足之处——Claude Code还有哪些不完美的地方。