和 AI 一起开发产品,repo 里到底该留下什么?

Building with AI: what belongs in the repo?

最近做产品时,我逐渐发现:

使用 coding agent 后,repo 里的文档不再只是“留给以后看的记录”。

这里说的不是传统意义上的工程脚手架。

工程脚手架解决的是:项目使用什么框架、目录结构、数据库、认证、测试和部署方式。

这篇更关心的是另一层:当项目开始持续迭代、多个 Agent 参与开发后,产品事实、当前需求、技术结构和历史决策应该分别放在哪里。

前者让项目快速跑起来;后者让人和 Agent 不会越做越乱。

它们会直接影响 Agent 如何理解产品、怎样修改代码,以及遇到模糊问题时会往哪个方向猜。

文档太少,Agent 每次都要重新猜。

文档太多,同一个问题散落在几份文件里,Agent 也不知道该信哪一份。

所以真正的问题不是:

一个专业项目应该有多少份文档?

而是:

哪些信息需要长期保留?哪些只对当前阶段有效?每一种信息的 source of truth 在哪里?

1. 产品定义:我们在做什么

可以使用:

PRODUCT.md PRODUCT_DEFINITION.md

它应该回答相对稳定的问题:

  • 产品服务谁
  • 解决什么问题
  • 核心流程是什么
  • 主要产品原则是什么
  • 当前明确不做什么

产品定义不是需求仓库。

不要把每次迭代的页面细节、临时方案和当前任务都塞进去。否则文件会越来越长,真正稳定的产品事实反而被埋掉。

创建时机: 产品方向开始形成时。更新时机: 目标用户、核心价值、主要流程或产品边界发生变化时。

2. 阶段或功能 Spec:这一次具体做什么

可以放在:

specs/ stage-05-fit-report.md application-pipeline.md

它负责当前阶段的执行范围,例如:

  • 这次要解决什么问题
  • 包含哪些场景
  • 不包含哪些场景
  • 页面和流程如何工作
  • 验收标准是什么
  • 哪些问题仍未决定

Product Definition 说的是:

产品现在是什么。

Spec 说的是:

这一轮具体准备实现什么。

不要把当前功能需求长期堆积在 PRODUCT.md 里,也不要让 Agent 只凭聊天记录理解正在做的功能。

创建时机: 一个任务已经大到不能只靠几句聊天说明时。更新时机: scope、流程或验收标准发生变化时。完成后冻结或归档,不必无限维护。

3. 系统文档:产品如何被实现

这一类通常包括:

ARCHITECTURE.md TECHNICAL_DESIGN.md DATA_MODEL.md DESIGN.md EVALS.md

不一定全部都需要。

ARCHITECTURE.md

记录当前系统结构、模块关系、主要数据流和外部依赖。

重点是系统现在如何运行,不是逐个解释代码文件。

TECHNICAL_DESIGN.md

更适合较大的功能或技术改动:

  • 准备如何实现
  • 涉及哪些模块
  • 数据怎样变化
  • 有什么风险
  • 如何迁移和验证

它通常是阶段性的,实施完成后,应让 ARCHITECTURE.md 反映最终状态。

DESIGN.md

记录产品体验、信息结构、视觉和组件规则,以及 Agent 在设计上的发挥边界。

它不应该只是颜色、字体和圆角清单。

EVALS.md

当 AI 输出是产品核心能力时,需要明确:

  • 什么算好结果
  • 哪些错误不可接受
  • 使用什么样例测试
  • 如何区分模型问题、Prompt 问题和产品逻辑问题

创建时机: 当相关系统开始复杂,单靠代码已经无法解释重要约束时。更新时机: 真实实现发生变化时,而不是只在方案讨论时修改文档。

4. Decision Log:为什么这样决定

可以使用:

DECISIONS.md docs/adr/

它不负责记录“现在是什么”,而是记录:

  • 当时遇到了什么问题
  • 考虑过哪些方案
  • 最后选择了什么
  • 为什么
  • 在什么条件下需要重新评估

这类信息很重要,因为几个月后,人和 Agent 都可能看到一个方案“不够完美”,却不知道它当时解决了什么问题。

但不是每个小决定都要写。

只记录那些:

  • 会长期影响系统
  • 修改成本较高
  • 容易被后来的人重新质疑
  • 有明确取舍的决定

创建时机: 第一次出现真正需要保留依据的重要选择时。更新机制: 以追加为主。决策被推翻时,新建一条,不要悄悄改写历史。

5. Agent Instructions:Agent 应该怎样工作

通常会看到:

CLAUDE.md AGENTS.md

它们应该告诉 Agent:

  • 哪些文件是 canonical source
  • 开始任务前需要读什么
  • 代码和目录有哪些约定
  • 修改后必须运行什么检查
  • 哪些内容不能擅自改变
  • 哪些重复错误需要避免

它不应该重新复制产品定义、完整架构和每个功能需求。

更好的做法是路由:

Product definition → PRODUCT.md

Current feature → specs/

Architecture → ARCHITECTURE.md

Design rules → DESIGN.md

Decision history → docs/adr/

Agent working rules → AGENTS.md / CLAUDE.md

Agent instructions 负责告诉 Agent 去哪里获取正确上下文,而不是吞掉所有上下文。

Iteration Log 是否必要?

不一定。

代码变化已经可以通过 commits、PR 和 changelog 追踪。

只有这些内容值得额外记录:

  • 用户反馈改变了什么判断
  • 做过哪些没有进入代码的实验
  • 某个方案为什么失败
  • Agent 反复出现了什么问题
  • 哪些发现以后可能用于复盘或作品集

否则,手工维护 iteration log 很容易变成另一份重复记录。

一个实用判断

不要在项目第一天一次性创建十几份空文档。

先问:

这个问题是否会反复影响未来的判断?

如果会,就给它一个明确的 source of truth。

如果只影响当前任务,放进当前 spec。

如果代码本身已经足够说明,就不要再复制一遍。

好的文档体系不是文件很多,而是:

  • 每份文档职责明确
  • 同一个事实只维护一次
  • 知道什么时候创建
  • 知道什么时候更新
  • 过期内容能被归档或删除

Agent 需要的也不是更多文字。

它需要的是一套清楚、不冲突、能找到正确答案的上下文。