工程文档管理
文档是代码之外最重要的工程上下文。目标不是写更多文档,而是让正确的读者在需要时拿到准确、最小、可维护的信息。
核心约束
- 默认不新增。 先搜索现有资产,再从更新、删除、合并、压缩、归档、晋升和新建中选择长期维护成本最低的动作。
- 文档债是技术债。 遇到漂移、重复、过长或无人消费的文档,或进行指令优化时,在当前任务范围内优先替换、合并或删除旧内容;指令尤其要清理针对旧模型的重复约束和过时补丁,避免只追加例外、越写越多。保留有效事实与行为边界,不为减字削弱契约。
- 一个事实只有一个当前信息源。 其他入口只导航,不复制正文。代码、schema、配置或生成物已经能可靠表达的事实,不再手工维护第二份。
- 先确定消费者。 用户未明确指定读者时,默认面向 Agent;工程指令优先维护适用作用域的
AGENTS.md,工程资料按类型维护,不默认新建README.md。用户明确指定人类或共同读者时按其用途组织;同一事实保持唯一来源,提供必要的发现入口。 - 按使用条件建立引用。
AGENTS.md只索引当前工作确实需要的资料并说明读取条件。人类指南包含唯一权威安装步骤或约束时,可以直接引用对应章节,不为隔离读者复制事实;只提供背景或叙事、不会影响执行的材料不挂进入口。 - 区分 Agent 资料与 Agent 指令。 Agent 阅读的架构文档、接口契约、ADR 等工程资料沿用各自的文档结构;只有提示词、项目规则或标准操作流程(SOP)等直接控制 Agent 行为的指令,才按目标、成功标准、约束、权限边界、工具路由、输出契约和停止条件组织。
- 长期文档不记过程流水账。
AGENTS.md、docs/rules/、README、运行手册、当前架构文档和 ADR 等长期资产只保存能脱离当前任务独立成立的当前事实或正式决定。未经用户明确授权,不记录本次实施、评审、修订、提交或上线经过;过程证据放在计划、worklog、拉取请求或问题记录。ADR 保留决定的背景、真实备选、取舍和后果,不保存方案如何逐轮收敛的转录。 - 归档记录保存当时事实。 归档是治理动作,不是直接移动文件:迁移前先评估其中是否有应晋升为 ADR 或稳定文档的长期决定,迁移时同步修复或移除指向旧路径的活文档链接。worklog 和已被取代的决策记录通常不追赶当前实现;当前入口应指向新的有效事实。
- 区分证据所证明的事实。 仓库配置与代码说明预期状态;当前部署状态以目标环境的实时读回为准,并注明环境和时间;历史决定依据当时已确认记录。发现差异时分别说明,不用文档互相证明,也不把预期配置写成已经生效。
流程
1. 建立文档上下文
- 用
git rev-parse --show-toplevel确认仓库根,读取适用指令和仓库文档目录约定;AGENTS.md、CLAUDE.md等入口指向同一内容时只读一次,已读取且仍有效的上下文直接复用。 - 说明本次变化的事实、消费者、消费场景、当前信息源和预期寿命。
- 搜索同主题的活文档、代码注释、schema、示例和归档记录;区分当前事实与历史快照。
2. 选择资产与动作
| 需要承载的上下文 | 首选资产 |
|---|---|
| 人类安装、理解和日常开发入口 | README 或开发指南 |
| 人类执行生产操作、排障和恢复 | 运行手册 |
| 公共接口契约 | 类型、schema、OpenAPI 或接口参考 |
| 当前稳定架构、模块关系和数据流 | docs/architecture/ 下的架构文档 |
| 昂贵、长期且难以逆转的已确认技术决定 | ADR |
| 代码附近才看得懂的不明显原因或约束 | 内联注释 |
| Agent 的项目约束与导航 | AGENTS.md、兼容入口和 docs/rules/ |
| 当前拉取请求的临时设计与规划 | docs/specs/,就绪前晋升、归档或删除 |
| 跨多个拉取请求的共同契约和状态 | docs/long-running-specs/ |
| 当时过程与决定的历史证据 | docs/worklog/ |
validation-results.md 是交付证据,不是长期设计文档;按 spec-design 的结果生命周期归档,保留当次交付范围、验收来源及证据引用。删除或迁移契约时修复结果引用,必要时保留当时要求的简短快照;不把结果晋升为架构文档,也不因规格已归档而丢失后续复验入口。
若现有资产已承担相同职责,先通读相关段落,再按以下顺序收敛,而不是默认在列表末尾追加一行:
- 删除失效、重复、无人消费或只描述本次过程的内容。
- 将零散但仍有效的内容合并、抽象为当前规则或事实。
- 重写原有段落,使结构和措辞与当前状态一致。
- 只有新的独立长期事实无法被现有结构吸收时才新增内容。
内部自检新增内容是否应替换、合并到旧结构,或留在过程记录;真实新增事实可以直接添加,不为让差异好看删除有效内容,也不逐次向用户解释为何只有新增。
3. 按主要读者写作
面向人类
- 以 overview 为主,配图(如 mermaid)帮助读者建立心智模型;细节交给代码、接口定义和 Agent 文档。
- 以任务和认知路径组织内容,提供足够背景、示例和导航,但不复制可由工具生成的完整事实。
- 命令、路径、默认值、截图和操作步骤必须能从当前工程验证。
- 只保留项目实际采用的章节,不为套模板制造空内容。
面向 Agent
- 先判断资产是供 Agent 查询的工程资料,还是直接约束 Agent 行为的指令。前者遵循架构文档、接口文档、ADR 等对应规范,不强行改写成提示词结构。
- Agent 文档优先承载代码推不出来的事实:外部系统行为、第三方约束、运维事实、领域知识,以及决策的为什么与真实备选。复述代码细节是坏味道,处理动作是下沉为行内注释或删除,不是维护第二份。
- 提示词、项目规则和标准操作流程使用结果优先的短指令:按需写清目标、成功标准、真实不变量、证据要求、授权范围、工具路由、输出契约和停止条件,让模型自行选择高效路径;同一规则只写一次。
- 把稳定、通用的前缀保持精简;任务特定信息放在更近的目录规则、技能或当前任务中,避免污染所有会话。
- 用决策规则代替关键词表和宽泛绝对命令;
必须、禁止、仅只用于真正的不变量。 - 分层维护
AGENTS.md:仓库根只放全局规则与导航;具有独立职责、命令或约束的子包在自己的根目录维护AGENTS.md。子级只补充或收窄祖先规则,不复制继承内容;每层保持CLAUDE.md -> AGENTS.md兼容软链。 - 子作用域
AGENTS.md必须由父级单行指针提供发现入口;已发现的适用规则不因缺少指针而失效。 - 其余文档索引是可选优化,不是义务:只索引 Agent 工作真正承重的文档并写明读取条件,说不出读取条件的条目删掉。索引本身也进入上下文,过长的索引清单就是反渐进式披露。多个子包共同使用的文档提升到最近公共祖先,不把局部上下文全部挂到仓库根。
双方共同消费
- schema、公共契约、稳定架构事实和 ADR 可以同时服务人类与 Agent;不要因内容可读就把它们一律归为人类文档。
- 共同资产保持事实或决策中心,不混入只服务某一类读者的冗长教学。若 Agent 工作确实需要它,由最近作用域的
AGENTS.md索引,并写清读取条件。
4. 处理架构决策记录
- 只记录已经确认、长期有效且未来可能被重新争论的昂贵决定。普通实现细节、易逆选择、需求行为和临时计划不写 ADR。
- 价值排序是为什么 > 是什么:背景、约束和真实备选与取舍才是长期价值,结论本身只需要一句话;不记录初稿、评审轮次、修订提交或上线经过。
- 从已确认的
arch_design.md提炼决定,不复制整份设计,不重新打开已经完成的方案评审。 - 遵循项目已有 ADR 约定;没有约定时写入
docs/architecture/ADR-<连续序号>-<标题>.md。 - 已接受的 ADR 不静默改写历史理由。决定变化时新增 ADR,并把旧记录标为被取代或已废弃;草稿、重复或从未生效的记录可以按仓库规则删除。
各类文档的最小内容规范见 references/document-standards.md。只读取本次涉及的部分。
5. 验证与交接
- 验证文档中的命令、链接、路径、版本、接口和示例;无法执行时说明证据缺口。
- 按变化选择验证:改名或迁移时反查旧名称、路径与活链接;修改默认值时核对相关配置、示例与说明;合并资产时检查重复来源。描述当前生产状态时实时读回,不能访问则明确缺口,不声称已验证。
- 检查长期文档是否混入未经授权的过程流水账;修改已有资产时,确认漂移内容已优先删除、合并或抽象。新增事实按前述内部自检处理。
- Agent 上下文额外检查:资料是否沿用正确的文档类型,指令是否由正确作用域的
AGENTS.md发现、无冲突、无重复并按需明确成功与停止条件,以及引用是否有实际消费场景、是否复制了已有权威事实。 - 报告本次新增、更新、合并、压缩、归档或删除的资产,以及剩余风险。文档变更仍由
deep-review的docs-sync独立审查;本技能不代替审查者。