架构决策记录¶
在编码会话期间,将架构决策记录为结构化文档。决策不再只存在于 Slack 线程、PR 评论或某人的记忆中,本技能会生成与代码并行存在的结构化 ADR 文档。
触发时机¶
- 用户明确说“记录这个决定”或“创建这个 ADR”
- 在重要备选方案之间做出选择(框架、库、模式、数据库、API 设计)
- 用户说“我们选择了……”或“我们之所以用 X 而不是 Y,是因为……”
- 用户问“为什么选择 X”(阅读现有的 ADR)
- 在规划阶段讨论架构权衡时
ADR 格式¶
使用 Michael Nygard 提出的 ADR 格式,并针对 AI 辅助开发进行了调整:
# ADR-NNNN: [決定タイトル]
**Date**: YYYY-MM-DD
**Status**: proposed | accepted | deprecated | superseded by ADR-NNNN
**Deciders**: [関係者]
## Context
この決定または変更を促すどのような問題や状況が見られるのか?
[2~5文で状況、制約条件、作用する力について説明]
## Decision
提案または実施する変更は何か?
[決定を明確に述べる1~3文]
## Alternatives Considered(検討された代替案)
### Alternative 1: [名前]
- **Pros**: [利点]
- **Cons**: [欠点]
- **Why not**: [この選択肢が拒否された特定の理由]
### Alternative 2: [名前]
- **Pros**: [利点]
- **Cons**: [欠点]
- **Why not**: [この選択肢が拒否された特定の理由]
## Consequences(結果)
この変更により、何がより簡単になり、何がより難しくなるか?
### Positive
- [利点1]
- [利点2]
### Negative
- [トレードオフ1]
- [トレードオフ2]
### Risks
- [リスクと軽減策]
工作流程¶
捕获新的 ADR¶
当检测到决策时刻时:
- 初始化(仅首次) — 如果
docs/adr/不存在,在获得用户确认后,创建该目录、以索引表头填充的README.md(参见下面的 ADR 索引格式),以及供手动使用的空白template.md。未经明确同意,不得创建文件。 - 识别决策 — 提取正在做出的核心架构选择
- 收集上下文 — 导致此问题的背景是什么?存在哪些约束条件?
- 记录备选方案 — 考虑过哪些其他选项?为什么被否决?
- 说明结果 — 有什么权衡?什么变得更容易/更困难?
- 分配编号 — 扫描
docs/adr/中现有的 ADR 并递增编号 - 确认并写入 — 向用户展示 ADR 草稿以供审阅。仅在明确批准后写入
docs/adr/NNNN-decision-title.md。如果用户拒绝,则丢弃草稿,不写入任何文件。 - 更新索引 — 在
docs/adr/README.md中追加条目
阅读现有的 ADR¶
当用户问“为什么选择 X”时:
- 检查
docs/adr/是否存在 — 如果不存在,则回复“在此项目中未找到 ADR。您想开始记录架构决策吗?” - 如果存在,扫描
docs/adr/README.md索引中的相关条目 - 读取匹配的 ADR 文件,显示 Context 和 Decision 部分
- 如果未找到匹配项,则回复“未找到关于该决策的 ADR。现在要记录它吗?”
ADR 目录结构¶
docs/
└── adr/
├── README.md ← すべてのADRのインデックス
├── 0001-use-nextjs.md
├── 0002-postgres-over-mongo.md
├── 0003-rest-over-graphql.md
└── template.md ← 手動使用用の空白テンプレート
ADR 索引格式¶
# Architecture Decision Records
| ADR | Title | Status | Date |
|-----|-------|--------|------|
| 0001 | Use Next.js as frontend framework | accepted | 2026-01-15 |
| 0002 | PostgreSQL over MongoDB for primary datastore | accepted | 2026-01-20 |
| 0003 | REST API over GraphQL | accepted | 2026-02-01 |
决策检测信号¶
注意对话中这些表明架构决策的模式:
显式信号 - “我们采用 X 吧” - “应该用 X 而不是 Y” - “这个权衡是值得的,因为……” - “把这个记录为 ADR”
隐式信号(建议记录 ADR — 未经用户确认不要自动创建) - 比较两个框架或库并得出结论 - 做出有明确依据的数据库模式设计选择 - 在架构模式之间进行选择(单体 vs 微服务、REST vs GraphQL) - 决定认证/授权策略 - 在评估备选方案后选择部署基础设施
好的 ADR 是什么样的¶
应该做的事¶
- 具体明确 — 使用“Prisma ORM”,而不是“使用 ORM”
- 记录理由 — 理由比什么都重要
- 包含被否决的备选方案 — 未来的开发者需要知道考虑过哪些选项
- 如实说明结果 — 每个决定都有权衡
- 保持简短 — ADR 应在 2 分钟内读完
- 使用现在时 — 使用“我们使用 X”,而不是“将使用 X”
不应该做的事¶
- 记录琐碎的决定 — 变量名或格式选择不需要 ADR
- 写成散文 — Context 部分超过 10 行就太长了
- 省略备选方案 — “只是选了它”不是有效的理由
- 不加标记地补记 — 如果记录过去的决定,请注明原始日期
- 让 ADR 过时 — 被取代的决定必须引用取代它的 ADR
ADR 生命周期¶
- proposed:决定正在考虑中,尚未最终确定
- accepted:决定有效,并且正在遵循
- deprecated:决定已不再相关(例如:功能已被移除)
- superseded:新的 ADR 取代了它(始终链接到取代它的 ADR)
值得记录的决策类别¶
| 类别 | 示例 |
|---|---|
| 技术选型 | 框架、语言、数据库、云提供商 |
| 架构模式 | 单体 vs 微服务、事件驱动、CQRS |
| API 设计 | REST vs GraphQL、版本控制策略、认证机制 |
| 数据建模 | 模式设计、规范化决策、缓存策略 |
| 基础设施 | 部署模型、CI/CD 管道、监控技术栈 |
| 安全 | 认证策略、加密方法、机密管理 |
| 测试 | 测试框架、覆盖率目标、E2E 与集成测试的平衡 |
| 流程 | 分支策略、评审流程、发布节奏 |
与其他技能的集成¶
- Planner 智能体:当 Planner 提出架构更改时,建议创建 ADR
- Code reviewer 智能体:对引入架构更改但没有对应 ADR 的 PR 标记提示
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC