CLAUDE.md 的12条规则

1 阅读7分钟

这是一套旨在将 AI 编程助手(如 Claude)的错误率从 41% 降至 3%CLAUDE.md 指令规范。既保留了 Karpathy 提出的 4 条基础代码编写原则,又补充了 8 条面向 AI 代理协作的高级规则,并对每一条都给出可操作的说明。


一、Karpathy 的 4 条基础规则(针对代码编写)

这些规则从根本上改变“人给指令,AI 写代码”的模式,强调思考、克制、精准和目标导向

规则 1:编码前先思考 (Think Before Coding)

不要急于生成代码,先把问题想清楚。

  • 明确陈述假设:你依赖的环境、版本、业务前提要显式写出来,例如“假设用户已登录且 token 有效”。
  • 不确定的地方要提问:遇到歧义需求时,主动列出模糊点并请人澄清,不要靠猜去填补空白。
  • 提供多种解释:如果某个需求天然存在多种理解方式,列出 2~3 种可能,并说明各自的取舍。
  • 反驳更简单的方法:如果你能想到一种明显更简单的实现路径,要主动提出并分析它是否可行,防止过度工程化。

规则 2:简约至上 (Simplicity First)

只解决问题本身,不要替未来做多余的决策。

  • 只写能通过当前测试的最少代码,不添加任何“以后可能用到”的功能。
  • 不写投机性功能:虽然某个扩展点以后可能有用,但今天没有明确需求就坚决不写。
  • 不为单次使用的代码创建抽象:如果一个函数只被一个地方调用,且看不出复用的必然性,就不要提取成通用库。

规则 3:外科手术式修改 (Surgical Changes)

每一次变更都要像外科手术一样精准,只碰必须碰的部分。

  • 只修改与任务直接相关的行、函数或模块。
  • 不要顺手“优化”无关的代码、注释、格式;即便是明显的坏味道,如果不影响当前任务,也留在下一次专门的重构里。
  • 即使发现有更优写法,只要原有代码仍在正常工作,就不要去修复“没坏的东西”。
  • 严格匹配现有代码风格(缩进、命名、注释习惯),让 diff 干净到只能看到业务逻辑的变化。

规则 4:目标驱动执行 (Goal-Driven Execution)

告诉 AI “成功长什么样”,而不是手把手教它怎么走路。

  • 为任务定义一个可验证的成功标准(例如“所有单测通过并且输出日志里不出现 ERROR”)。
  • 不要给 Claude 逐步操作清单,而是说明最终状态,让它自己规划并迭代。
  • 形成“尝试 → 验证 → 调整”的闭环,直到成功标准被满足。

二、新增的 8 条高级规则(针对 AI 代理协作)

当 AI 不再是简单的代码补全工具,而是以“代理”身份参与协作时,需要这 8 条规则防止它越界、忘掉上下文或隐藏风险。

规则 5:仅将模型用于判断 (Judgment Calls Only)

模型只做它擅长的事,确定性逻辑留给代码。

  • 负责:分类、草稿撰写、摘要提炼、语义理解、模式识别等需要“判断”的任务。
  • 代码负责:路由分发、重试机制、确定性数据转换、精确计算等需要 100% 准确和可预测的逻辑。
    不要让模型去计算 2+3,也不要让它决定哪个微服务处理请求——这是代码层的职责。

规则 6:严格的 Token 预算 (Hard Token Budgets)

像管理金钱一样管理上下文窗口,避免注意力稀释。

  • 单次任务消耗上限:4,000 tokens;单次会话总计上限:30,000 tokens
  • 当接近预算时,必须在当前任务完成后,对已完成工作进行摘要压缩,并开启一个新会话继续,让关键信息浓缩传递,而不是让上下文无限膨胀。
  • 这一规则强制养成“定期总结、重新对齐”的习惯,极大降低长链推理丢失关键信息的风险。

规则 7:暴露冲突而非中庸化 (Surface Conflicts)

遇到代码库中的模式冲突,不要缝合,要亮出来。

  • 如果发现同一概念有两种互斥的实现方式(例如同时存在 snake_casecamelCase 的命名),选择其中一种作为本次任务的标准,并在注释或消息中明确标记另一种为“待统一”
  • 严禁为了表面和谐而把两种风格混合在一起(Blend),那会让后续维护者完全不知道应该遵循哪一套。
  • 这种显式暴露冲突的做法,让技术债务可见、可控。

规则 8:先读后写 (Read Before You Write)

每一次新增代码之前,必须先理解现有的依赖和接口,杜绝重复造轮子。

  • 阅读将被调用函数的导出签名上游调用者的用法、以及已有的共享工具库
  • 在 CLADE.md 或注释中记录你的发现:“已检查 utils/helper.ts,其中 formatDate 可复用,无需新写”。
  • 这直接防止 AI 因不了解现有代码而写出功能重复的冗余代码,是降低错误率的关键。

规则 9:测试验证意图而非行为 (Tests Verify Intent)

测试的锚点是“为什么这么做”,不是“怎么做”。

  • 测试名和断言必须直接反映业务意图,比如 should not allow checkout with expired coupon,而不是 should call validateCoupon with false
  • 如果只是重构实现却导致测试大面积失败,那测试就是无效的——它耦合了实现细节而不是接口契约。
  • 这种测试即使逻辑改变也能保持稳定,反过来保护重构的安全。

规则 10:重要步骤后设置检查点 (Checkpoints)

在多步流程中主动插入“心跳”,防止偏离主线。

  • 每完成一个关键步骤(例如:环境搭建、数据迁移、算法实现),就向协作方/日志输出一条总结:已完成×,下一步将执行 Y,当前状态符合预期/存在偏差
  • 如果在任何时刻感到“逻辑跟丢”,立即停止当前操作,重述已知事实和目标,请求对齐。
  • 这能防止连锁错误,把排查成本控制在最小单元。

规则 11:惯例胜过新奇 (Convention Beats Novelty)

融入现有代码库的习惯,比引入个人偏好重要得多。

  • 即使你认为自己的写法更优雅、更现代,也必须服从项目当前的命名、文件结构、架构模式等既定惯例。
  • 例如项目使用 snake_case 命名变量,那么即使你钟爱 camelCase,也要坚持用 snake_case
  • 代码库的一致性价值远超单点处的新奇写法,因为它直接降低所有人的认知负荷。

规则 12:失败必须显性化 (Fail Loud)

不确定的成功等同于隐藏的炸弹,必须让它发出声响。

  • 如果任务不能 100% 确认成功(例如:部分数据因权限不足未处理、某些测试因环境问题跳过、边缘情况未覆盖),必须在返回结果中显式说明
  • 严禁给出看起来 OK、实际上悄悄吞掉了异常的输出。失败要“大声”到无法被忽视。
  • 这确保人和系统可以在第一时间处理不完整信息,而不是在数步之后才暴露一个难以追踪的故障。

这 12 条规则组合在一起,构成了一个严谨的 AI 协作契约:它既要求人类思考清楚、设定边界,也要求 AI 在约束下交出可信、可控、低噪声的代码。实践表明,严格执行这份 CLAUDE.md,代码生成的错误率可以从 41% 大幅压降到 3% 左右,将 AI 编程从“能写”真正推向“敢用”。