22 - 项目知识沉淀机制
1. 定位
三个断点
项目开发中有三种知识会在会话结束后丢失:
- 调研结论 — 花了一小时对比三个方案,选完就忘了为什么不选另外两个
- 踩坑经验 — 花了半天定位一个 Bug,修完就过了,下次同类问题从零开始
- 决策上下文 — 为什么用方案 A 而不是方案 B,三个月后只记得结论不记得理由
这三种知识的共同特点:产出时有完整上下文,但不主动记录就会随会话消散。
与体系的三角关系
doc-08 维护 ─────── 体系自身的健康检查、规则老化、版本管理
│ ↑ 进化触发
│ │
doc-20 引入 ─────── 外部知识的评估、吸收、融合
│ ↑ 知识来源
│ │
doc-22 留存 ─────── 项目过程中产生的知识的记录与检索(本文档)- doc-08(维护):向内看,确保体系本身健康
- doc-20(引入):向外看,从外部世界吸收养分
- doc-22(留存):向下看,捕获项目实践中产生的知识
三者互补:留存的踩坑经验可能触发维护更新,引入的外部知识可能沉淀为调研记录。
核心理念:沉淀点
沉淀点(Retention Point):在现有 Skill 工作流的关键时刻植入一个轻量判断 —— "这条知识值得留下吗?"
如果值得,用最小格式存入约定位置。不新建知识管理系统,不新增 Skill,不引入复杂规范。
与 Claude Code Auto Memory 的分工
Claude Code 内置 Auto Memory 机制(~/.claude/projects/*/memory/),会自动记录操作性经验(构建命令、调试模式、代码风格偏好)。
两套机制的分工:
| 维度 | Auto Memory(自动) | 结构化沉淀(本机制) |
|---|---|---|
| 写入方式 | Claude 自动判断 | 人决策,AI 辅助执行 |
| 内容类型 | 操作性知识(怎么做) | 决策性知识(为什么这样做) |
| 版本管理 | 不进 git,机器本地 | 进 git,可追溯可协作 |
| 检索方式 | 每次会话自动加载 | grep tags/title 主动检索 |
| 典型内容 | "这个项目用 cd site && npm run build 构建" | "选 Vite 不选 Webpack 的完整评估" |
原则:Auto Memory 管"肌肉记忆",结构化沉淀管"认知资产"。
沉淀点的判断标准不变(§2.4),但可以额外排除一条:如果知识纯属操作性(构建命令、环境配置),Auto Memory 已自动捕获,无需手动归档。
2. 沉淀点设计
什么是沉淀点
沉淀点是 Skill 执行末尾的一个提示性步骤,不是强制门禁。它在工作流自然完成后提醒一句:"要不要存下来?"
沉淀出口
| 沉淀方式 | 触发时机 | 产出位置 |
|---|---|---|
| /checkpoint 统一路由 | 会话结束或阶段完成时 | adr/、research/、troubleshooting/、plans/ 等 |
| /tech-research 即时归档 | 调研完成后 | docs/research/ |
| /debug 即时归档 | 问题修复后 | docs/troubleshooting/ |
/checkpoint 是主要的知识沉淀出口,负责捕获自由对话中产生的知识。/tech-research 和 /debug 在执行过程中即时归档。两者互补,同一内容不重复归档。
设计原则
- 提示性而非强制性 — 不用 Gate 卡流程,用户说"不需要"就跳过
- 最小格式 — 只要求 3 个 frontmatter 字段(title/date/tags),正文格式不限
- 复用现有输出 — 调研报告直接存,问题记录从修复方案裁剪,不重复写
- AI 辅助判断 — 由 AI 根据标准建议是否归档,人类做最终决定
沉淀判断标准
不是所有产出都值得记录。沉淀的核心问题是:未来还会用到吗?
- 调研:结论会影响后续决策的 → 存;一次性快速验证的 → 不存
- 问题:花了 30+ 分钟才定位的 → 存;一眼看出的笔误 → 不存
- 决策:影响跨模块架构的 → ADR;单模块内部的 → 调研 Recommendations 就够
3. 调研记录
存放位置
docs/research/
├── README.md # 索引表
└── {YYYY-MM-DD}-{slug}.md # 调研记录文件与 docs/prd/、docs/api/ 等平级,是 docs/ 的标准子目录。
文件格式
直接复用 /tech-research 现有输出格式,只需在头部添加最小 frontmatter:
---
title: CRDT 实时同步方案调研
date: 2026-03-01
tags: [crdt, real-time, sync]
---
# Research: CRDT Real-time Sync
> **Goal:** 选择实时协作编辑的同步方案
> **Date:** 2026-03-01
> **Depth:** Deep dive
> **Dimensions:** Open-Source, Best Practices, Performance
## TL;DR
...(/tech-research 标准输出格式,无需改动)frontmatter 三个字段说明:
| 字段 | 用途 | 格式 |
|---|---|---|
title | 索引显示标题 | 中文,一句话 |
date | 调研日期 | YYYY-MM-DD |
tags | 检索标签 | 小写英文数组,2-5 个 |
索引表
docs/research/README.md:
# 调研记录
| 日期 | 主题 | 标签 |
|------|------|------|
| 2026-03-01 | [CRDT 实时同步方案调研](./2026-03-01-crdt-sync.md) | crdt, real-time, sync |新增记录时在表尾追加一行,按日期倒序排列(最新在上)。
调研 → ADR 衔接
当调研结论直接支撑了技术选型决策时:
- 调研记录照常存入
docs/research/ - 提示用户:如果这是跨模块决策,建议用 Prompt 食谱 10 — 食谱 3 转化为 ADR
- ADR 的"上下文"章节中添加调研记录的链接,建立追溯链
这是提示性检查,不强制。日常调研不需要都产出 ADR。
/tech-research Skill 修改
Step 5(等待确认)之后新增 Step 6:
Step 6: 沉淀
调研报告经用户确认后:
1. 保存到 docs/research/{YYYY-MM-DD}-{slug}.md,添加 frontmatter(title/date/tags)
2. 更新 docs/research/README.md 索引表
3. 提示:如果调研支撑了技术选型,建议用食谱 10-食谱 3 转化为 ADR4. 问题记录
筛选三问法
不是每个 Bug 都值得记录。修复完成后,问三个问题:
- 花了超过 30 分钟才定位? — 说明问题不直观,下次可能同样费时
- 根因不在报错的直接指向? — 间接因果链,说明调试路径有陷阱
- 同类问题可能在其他场景复发? — 不是孤立事件
任一为是 → 建议归档。三个都否 → 不需要记录。
存放位置
docs/troubleshooting/
├── README.md # 索引表
└── {YYYY-MM-DD}-{slug}.md # 问题记录文件记录模板
5 个极短章节,每个 1-3 句话:
---
title: Prisma 多对多关系查询返回空数组
date: 2026-03-01
tags: [prisma, relation, query]
---
# Prisma 多对多关系查询返回空数组
## 症状
用户标签查询始终返回空数组,但数据库中确实有关联数据。
## 根因
Prisma 的 `include` 不会自动穿透中间表。需要显式指定
`include: { tags: { include: { tag: true } } }` 两层嵌套。
## 解法
将查询从单层 include 改为嵌套 include,涉及 3 个 API handler。
## 防御
在 Prisma 查询的 code-standards 规则中添加:
"多对多关系必须使用嵌套 include"。
## 经验
> Prisma 的多对多不像 ActiveRecord 那样透明,
> 中间表是显式存在的,查询时必须手动穿透。"经验"字段是核心 — AI 检索时最先阅读这一行。用一句话总结这次踩坑的本质洞察。
索引表
docs/troubleshooting/README.md:
# 问题记录
| 日期 | 问题 | 标签 |
|------|------|------|
| 2026-03-01 | [Prisma 多对多关系查询返回空数组](./2026-03-01-prisma-m2m-include.md) | prisma, relation, query |/debug Skill 修改
Step 5(等待确认后执行修复)之后新增 Step 6:
Step 6: 归档检查
修复完成后,三问法评估:
1. 花了超过 30 分钟才定位?
2. 根因不在报错的直接指向?
3. 同类问题可能在其他场景复发?
任一为是 → 提示用户归档。确认后:
- 生成 docs/troubleshooting/{YYYY-MM-DD}-{slug}.md(5 章节模板)
- 更新 docs/troubleshooting/README.md 索引表5. 决策记录增强
复用已有 ADR 机制
不新建决策记录机制。doc-06 §4 已定义了 ADR 模板和使用场景,本节只做两处增强:
增强 1:ADR "上下文"章节添加调研链接
在 ADR 模板的"上下文"章节中,增加可选的调研参考字段:
## 上下文
[描述面临的问题和背景,2-3 句话]
**调研参考:** [CRDT 实时同步方案调研](../research/2026-03-01-crdt-sync.md)建立从决策到调研的追溯链。这是可选字段,有调研就加,没有就省略。
增强 2:轻量决策分级
不是所有决策都需要 ADR:
| 决策范围 | 记录方式 | 示例 |
|---|---|---|
| 跨模块架构决策 | ADR(docs/adr/) | 从 REST 迁移到 GraphQL |
| 单模块技术选型 | 调研记录的 Recommendations 章节 | 选择 date-fns 而非 dayjs |
| 日常编码决策 | commit message | 变量命名、代码组织 |
这与 doc-06 §4 的指导一致,只是用分级表格让判断更明确。
6. 检索与维护
检索协议
在采用本机制的项目 CLAUDE.md 中写入:
## 知识检索规则
- 技术调研前先搜索 docs/research/(避免重复调研)
- 调试问题前先搜索 docs/troubleshooting/(避免重复踩坑)
- 检索方式:grep tags 或 title 关键词AI 天然擅长 grep 和文件搜索,不需要额外的检索工具或索引系统。
索引维护
索引维护并入 /docaudit Skill,新增第 6 项检查:
6. 知识沉淀检查(如目录存在)
- docs/research/ 和 docs/troubleshooting/ 下的文件是否都在对应 README.md 索引中
- 文件 frontmatter 是否包含 title、date、tags 三个必填字段"如目录存在"是关键条件 — 这是可选机制,未采用的项目不会被检查报错。
/retro 会话回顾增强
在 Q3 之后追加 Q4,引导会话结束时检查是否有知识遗漏:
Q4: 有值得归档的知识吗?
- 本次有费时定位的问题?→ 建议 issue 归档
- 有调研成果未保存?→ 检查 docs/research/
- 有技术决策未记录?→ 建议补充 ADR规模控制
沉淀机制不应成为负担。两个限制:
- 每个目录不超过 50 个文件 — 超过时考虑按年份归档子目录
- 单个记录不超过 200 行 — 超过说明内容应该拆分或简化
7. 与体系的关系
三角互补
doc-08 维护
╱ 体系健康 ╲
╱ ╲
doc-20 引入 ─── doc-22 留存
外部知识 项目知识- 留存 → 维护:踩坑经验可能暴露体系规则缺陷,触发 doc-08 的进化流程
- 引入 → 留存:外部知识吸收后的调研记录存入
docs/research/ - 维护 → 留存:健康检查发现知识目录索引不一致时,触发修复
doc-06 目录更新
本机制在 doc-06 §2 的 docs/ 统一结构中新增两个目录:
| 子目录 | 用途 | 维护方式 |
|---|---|---|
docs/research/ | 调研记录(/tech-research 产出) | 调研完成后自动提示归档 |
docs/troubleshooting/ | 问题记录(/debug 产出) | 问题修复后三问法评估归档 |
关联文档
- 06-文档体系 — 目录结构定义
- 08-运维与持续进化 — 体系内部进化
- 20-体系外部进化机制 — 外部知识引入
- 02-Skills 技能体系 — 沉淀点所在的 Skill
- Prompt 食谱 10-技术调研 — 调研转 ADR 的食谱
关联文档:06-文档体系 | 08-运维与持续进化 | 20-体系外部进化机制 | 02-Skills 技能体系