关于 adr-writer
ADR Writer 是用于编写编号架构决策记录的技能,帮助团队留存技术选择背后的原因。它引导记录决策背景、备选方案、后果及状态变更。
主要功能
- 01生成结构化编号 ADR
- 02记录决策背景与理由
- 03评估备选方案及弃用原因
- 04记录后果与权衡
- 05指导状态和替代关系管理
- 06判断决策是否适合写入 ADR
适用场景
- 01记录系统架构选择的理由
- 02选择技术前比较不同方案
- 03为后续维护者记录取舍
- 04用新的 ADR 替代已过时决策
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mathews-tom/ armory --skill adr-writer安装后在 Claude Code 中输入/adr-writer确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/cases.yamlreferences/adr-template.mdalternatives-analysis.mdcontext-capture.mdstatus-lifecycle.md详细介绍
ADR Writer
以轻量、结构化的格式记录架构决策,保留背景、理由、备选方案和后果。生成带编号的 ADR 文档,并妥善管理状态生命周期,避免数月后回顾决策时遇到“我们当时为什么要这么做?”的问题。
参考文件
| 文件 | 内容 | 加载时机 |
|---|---|---|
references/adr-template.md | 标准 ADR 模板,附字段说明和示例 | 始终 |
references/status-lifecycle.md | 状态转换、取代规则、弃用流程 | ADR 引用了现有决策时 |
references/context-capture.md | 引导并记录决策背景的技巧 | 复杂决策或涉及多方利益相关者的决策时 |
references/alternatives-analysis.md | 评估并记录被拒绝备选方案的框架 | 正在考虑多个选项时 |
前提条件
- 一个存放决策的目录(通常为
docs/adr/或docs/decisions/) - 了解正在做出的决策(可能需要提出澄清问题)
工作流
阶段 1:确定决策
- 做出了什么选择? — 提炼核心架构决策。如果用户描述的是一个问题,帮助他们阐明解决该问题的决策。
- 这个决策是否值得记录? — ADR 适用于以下决策:
- 会影响系统结构(组件边界、数据流、API 设计)
- 难以撤销(技术选型、数据库架构、协议)
- 存在不明显的权衡(有多个可行的备选方案)
- 日后会受到质疑(“为什么”会被遗忘)
- 是什么促使做出这个决策? — 新需求、性能问题、扩展性问题、安全审计发现、技术债务、团队扩张。
阶段 2:记录背景
记录影响这一决策的因素:
- 需求 — 有哪些功能或非功能需求促成了这一决策?
- 约束 — 有哪些因素限制了解决方案的范围?(预算、时间安排、团队专长、现有基础设施、监管要求)
- 当前状态 — 目前已有些什么?痛点是什么?
- 利益相关者 — 谁会受到这一决策的影响?需要谁同意?
阶段 3:列出备选方案
对于考虑过的每个备选方案:
- 明确命名 — 写“PostgreSQL”,而不是“选项 A”
- 列出具体优点 — 明确、可衡量的收益
- 列出具体缺点 — 明确、可衡量的不足
- 说明拒绝理由 — 为什么没有选择这个方案。要具体:“无法满足我们每秒处理 10K 次操作的吞吐量要求”,而不是“太慢”。
阶段 4:记录决策
说明选定的方案,以及结合背景和约束选择它的原因。决策应能从背景和备选方案分析中合乎逻辑地得出。
阶段 5:预测后果
记录这一决策会让哪些事情变得更容易或更困难:
- 积极后果 — 有哪些方面得到改善?
- 消极后果 — 接受了哪些权衡?产生了哪些技术债务?
- 中性后果 — 既不好也不坏的副作用。
阶段 6:分配元数据
- 编号 — 按顺序编号:ADR-001、ADR-002 等。检查现有 ADR,确定下一个编号。
- 状态 — 初始状态通常为“Proposed”或“Accepted”
- 日期 — 编写 ADR 的日期
- 作者 — 编写此 ADR 的人
- 取代/被取代 — 如果此决策取代了较早的决策,则链接相关 ADR
输出格式
# ADR-{NNN}: {Descriptive Title}
**Status:** {Proposed | Accepted | Deprecated | Superseded by ADR-XXX}
**Date:** {YYYY-MM-DD}
**Author:** {name}
**Supersedes:** {ADR-XXX (if applicable)}
## Context
{What situation requires a decision? What constraints exist? What forces are at play?
Write in present tense — describe the situation as it exists at decision time.}
## Decision
{State the decision clearly and concisely. "We will use X for Y because Z."
One to three sentences. The reader should understand the decision without reading
the rest of the document.}
## Alternatives Considered
### {Alternative 1 Name}
- **Pros:** {specific benefits}
- **Cons:** {specific drawbacks}
- **Rejected because:** {concrete, specific reason tied to context}
### {Alternative 2 Name}
- **Pros:** {specific benefits}
- **Cons:** {specific drawbacks}
- **Rejected because:** {concrete, specific reason tied to context}
## Consequences
### Positive
- {Concrete benefit 1}
- {Concrete benefit 2}
### Negative
- {Concrete tradeoff 1 — acknowledged and accepted}
- {Technical debt incurred — with plan to address if applicable}
### Neutral
- {Side effect that is neither positive nor negative}
## References
- {Link to related issue, discussion, document, or prior ADR}
校准规则
- 上下文为王。 上下文部分最重要。没有上下文的决策只是一种断言。未来的读者需要了解原因,而不只是结果。
- 明确具体的拒绝理由。“不合适”不是拒绝理由。“不支持跨分区事务,而订单处理需要这一能力”才是。
- **如实说明后果。**每项决策都有缺点。如果负面影响部分为空,说明分析还不完整。引导用户说明权衡取舍。
- **上下文使用现在时。**上下文部分使用现在时——它记录的是做出决策时的实际情况。
- **每份 ADR 只记录一项决策。**如果多项决策相互关联,请分别撰写 ADR 并相互引用。不要把无关的决策打包在一起。
- **通过后不可修改。**已通过的 ADR 不应编辑。如果决策发生变化,请撰写一份取代旧 ADR 的新 ADR。这样可以保留历史记录。
错误处理
| 问题 | 解决方法 |
|---|---|
| 用户说不出其他备选方案 | 通过提问帮助他们集思广益:“你还可以怎么做?考虑过哪些方案,又拒绝了哪些?” |
| 决策无关紧要(没有真正的备选方案) | 建议不必为此编写 ADR。ADR 用于记录并非显而易见且存在权衡取舍的决策。 |
| 决策已经做出,但不记得当时的上下文 | 根据代码、PR 和提交历史重建上下文。将重建出的上下文标注为“当前可获得的最佳信息”。 |
| 不清楚现有 ADR 的编号方案 | 检查 docs/adr/ 或 docs/decisions/。如果目录不存在,建议创建一个并从 001 开始。 |
| 决策范围过于宽泛 | 拆分为多个重点明确的 ADR。例如,数据库选型写一份,缓存策略写一份。 |
何时不应编写 ADR
遇到以下情况时,请提出异议:
- 决策很容易撤销(库版本、代码格式规则)——改用注释或配置
- 决策属于没有其他选择的标准做法(使用 HTTPS、验证输入)——不值得记录为决策
- 用户想记录实现细节——ADR 记录的是决策的原因,而非实现方式
- 决策已被取代——撰写新的 ADR,而不是旧的 ADR
评论
支持 Markdown