一份好的 CLAUDE.md AGENTS.md,不应该重新介绍整个产品

A good CLAUDE.md shouldn't re-explain the product

刚开始使用 Claude Code 时,很容易不断往 CLAUDE.md 里加内容。

Agent 犯一次错,就补一条。

新做一个功能,就把背景复制进去。

架构调整了,再贴一段最新说明。

最后文件越来越长,看起来很完整,Agent 的表现却不一定更稳定。

原因是:

CLAUDE.md 的职责不是保存所有项目知识,而是告诉 Agent 在这个 repo 里应该怎样工作。

它最应该解决什么问题?

一份有用的 Agent instructions,主要解决四件事。

1. 去哪里找正确事实

例如:

- Product definition: docs/PRODUCT.md

- Current feature specs: docs/specs/

- Architecture: docs/ARCHITECTURE.md

- Design rules: docs/DESIGN.md

- Important decisions: docs/adr/

这比把这些文件的内容重新复制一遍更可靠。

因为一旦产品发生变化,只需要维护 canonical source,不需要同时更新五份重复说明。

2. 在这个 repo 里怎样工作

例如:

  • 使用什么 package manager
  • 常用开发、测试和 lint 命令
  • 新文件应该放在哪里
  • 哪些模块可以依赖哪些模块
  • 数据库 schema 如何变更
  • 环境变量如何管理
  • 生成文件能不能手动修改

这些内容应该具体到可以执行。

无效规则:

Always write clean, maintainable code.

更有效的规则:

Before completing a task, run: pnpm lint pnpm typecheck pnpm test Do not mark the task complete if any command fails.

3. 哪些事情不能擅自决定

coding agent 经常不是“做不到”,而是发挥过头。

可以明确:

  • 不擅自改变产品 scope
  • 不重命名核心业务概念
  • 不为修复局部问题重构无关模块
  • 不删除看似未使用但用途不明的文件
  • 不自行修改全局设计 tokens
  • 不绕过类型、测试或权限检查
  • 不在没有批准时增加新的依赖

边界应该围绕真实风险,而不是把所有可能性都写一遍。

4. 哪些错误已经反复发生

这是最值得持续补充的部分。

例如 Agent 曾经多次:

  • 把临时脚本放进项目根目录
  • 创建重复组件
  • 用 mock data 覆盖真实数据
  • 修一个页面时修改全局 CSS
  • 更新代码却忘记同步 schema
  • 根据文件名猜功能,而不读相关 spec

反复出现的错误,才值得成为长期规则。

一次性的意外,不一定需要永久写进 instructions。

哪些内容不应该放进去?

大段产品背景

产品服务谁、解决什么问题、核心流程是什么,应放在 PRODUCT.md。

Agent instructions 只需要说明什么时候应读取它。

当前功能的详细需求

当前任务应该有独立 spec。

否则功能做完后,这些内容会继续留在 CLAUDE.md 中,成为过期上下文。

所有历史决策

历史原因应放在 decision log 或 ADR。

CLAUDE.md 只保留当前仍需遵守的结论。

复制其他文档

同一条规则维护两份,迟早会不一致。

无法执行的要求

例如:

Make the best possible UX. Think carefully. Write production-quality code.

这些话没有检查标准,也无法解决 repo-specific 问题。

CLAUDE.md 和 AGENTS.md 怎样分工?

同时使用多个 coding agent 时,我更倾向于:

选择某一个保存跨工具通用的工作规则:

  • repo 结构
  • canonical sources
  • 测试要求
  • 修改边界
  • 通用开发约定

另一个只补充它特有的行为或使用方式。

例如:

  • 优先读取哪些目录
  • 特定工具调用习惯
  • 已知的 Claude/Codex-specific 问题

不要在两个文件里分别维护两套产品事实。

否则 Claude Code、Codex 和人类开发者看到的会是不同版本的项目。

一个够用的结构

# Agent Instructions

## 1. Canonical Sources

## 2. Repository Structure

## 3. Development Commands

## 4. Implementation Rules

## 5. Validation Requirements

## 6. Do Not

## 7. Known Failure Modes

每一条都应该直接影响行为。

例如:

Before editing a feature:

1. Read the relevant spec in docs/specs/.

2. Check related decisions in docs/adr/.

3. Reuse existing components before creating new ones.

4. Run lint, typecheck and relevant tests.

5. Update documentation only when the canonical fact changes.

不要追求“越短越好”

CLAUDE.md 太长会带来噪音,但太短也可能没有约束力。

真正的标准是:

这条信息是否会帮助 Agent 做出不同的决定?

会,就保留。

不会,就删除或移到更合适的文档。

我现在会把 CLAUDE.md 看成一张工作地图,而不是产品百科。

它不需要告诉 Agent 所有答案。

它需要告诉 Agent:

  • 正确答案在哪里
  • 哪些规则必须遵守
  • 哪些事情不能猜
  • 完成任务前怎样证明自己没有搞坏项目