news 2026/9/12 13:27:04

ADR 模板选型指南:AI SDK 仓库 adr-skill 中 Simple 与 MADR 两种模板的适用场景与实战选择

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ADR 模板选型指南:AI SDK 仓库 adr-skill 中 Simple 与 MADR 两种模板的适用场景与实战选择

ADR 模板选型指南:AI SDK 仓库 adr-skill 中 Simple 与 MADR 两种模板的适用场景与实战选择

【免费下载链接】aiThe AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents项目地址: https://gitcode.com/GitHub_Trending/ai/ai

导读

在 AI SDK 开源仓库中,adr-skill(位于 skills/adr-skill)为架构决策记录(ADR)的创建与维护提供了一整套面向 Agent 的工作流,而其核心选型问题是:该用哪种模板起草一份 ADR?本指南以 template-variants.md 为骨架,完整讲解adr-simple.mdadr-madr.md两套模板的设计意图、章节结构、共享特性,以及基于选项数量、团队规模、可逆性、生命周期与评审需求的量化选择标准。读完本文,你将能在“快速记录决策”与“结构化多方案权衡”之间做出正确判断,并掌握用new_adr.js --template命令把选型落到实处的完整操作方式。

一、模板变体的整体定位

adr-skillassets/templates/目录下内置了两套 ADR 模板,供起草阶段按需选用:

  • assets/templates/adr-simple.md——轻量模板,面向结论明确、权衡极少的直接决策;
  • assets/templates/adr-madr.md——MADR 4.0 风格模板,面向存在多个真实可选方案、需要结构化记录权衡过程的重型决策。

两套模板共享同一套“Agent 优先”的设计哲学。根据 SKILL.md 中的定义,用该技能产出的 ADR 本质是给编码 Agent 的可执行规范(executable specifications for coding agents):由人类批准决策,由 Agent 负责实现,因此文档必须自包含——约束要明确且可度量,决策要具体到可执行(如"使用 PostgreSQL 16 配 pgvector",而不是"使用一个数据库"),后果要能映射为具体的后续任务,并且必须包含实现计划。模板选型本身也是这一哲学的体现:选择哪一种骨架,取决于你要给未来的 Agent(或人类读者)呈现多少决策信息。

二、Simple 模板:结论明确的轻量决策

文件:assets/templates/adr-simple.md

2.1 适用条件

Simple 模板适用于以下场景:

  • 决策过程直接——存在一个明确的胜出方案,权衡取舍极少;
  • 只需要交代“为什么、是什么、后果、怎么实现”
  • 备选方案很少,每个备选可以用一两句话否定掉;
  • 速度优先——相比穷举式对比,记录效率更重要。

典型例子:团队决定"本地开发数据库改用 SQLite(better-sqlite3)",备选方案只有"每轮 CI 起一个 Docker PostgreSQL"和"pg-mem",各用一句话即可说明否决理由——这种场景完全不需要展开成多方案的论证结构。

2.2 章节结构

Simple 模板的章节顺序为:

Context and Problem Statement(上下文与问题陈述)→ Decision(决策)→ Consequences(后果)→ Implementation Plan(实现计划)→ Verification(验证)→ Alternatives Considered(备选方案,可选)→ More Information(更多信息,可选)

对应到 adr-simple.md 中的实际占位内容:

  • YAML front matterstatusdatedecision-makers三个必填元数据字段;
  • Context and Problem Statement:说明"为什么现在必须做这个决策、存在哪些约束",要求背景足够完整,让第一次读到的人(或 Agent)无需追问就能理解;
  • Decision:明确"我们选择做什么",要求具体,并包含范围(scope)与非目标(non-goals);
  • Consequences:以Good, because .../Bad, because ...列表呈现正负后果;
  • Implementation Plan:列出受影响路径(Affected paths)、依赖变更(Dependencies)、应遵循的模式(Patterns to follow)、应避免的模式(Patterns to avoid);
  • Verification:以复选框形式给出可验证的验收标准;
  • Alternatives Considered(可选):每个备选方案用一两句话说明为何被否决;
  • More Information(可选):相关 ADR、PR、issue 或触发重新审视该决策的条件。

2.3 与仓库真实实践的对照

本仓库自身的第一份 ADR——contributing/decisions/2026-03-11-adopt-architecture-decision-records.md——正是这种轻量结构的实际样例:它包含 Context(隐性决策导致的问题)、Decision(采用 MADR 4.0 格式、存放于contributing/decisions/)、Consequences(Good/Bad/Neutral 三类)、Alternatives Considered(无正式记录、Wiki/Notion、轻量 RFC 三个备选各用一句否决)和 More Information。这份已 accepted 的 ADR 证明了 Simple 结构足以承载一个真实、完整、可被后续 Agent 执行的架构决策。

三、MADR 模板:多方案权衡的结构化记录

文件:assets/templates/adr-madr.md

3.1 适用条件

MADR(Options-Heavy,选项密集型)模板适用于以下场景:

  • 存在多个真实可选的方案,需要文档化地记录结构化权衡;
  • 需要显式捕获决策驱动因素(decision drivers)——即当时真正影响取舍的标准;
  • 该决策很可能被重新审视,因此比较过程需要长期留存;
  • 干系人需要看到推理过程,而不只是最终结论

该模板对齐 MADR 4.0 规范,并在此基础上扩展了面向 Agent 的章节(即实现计划与验证)。原文档明确指出:"This template aligns with MADR 4.0 and extends it with agent-first sections."

3.2 章节结构

MADR 模板的章节顺序为:

Context and Problem Statement → Decision Drivers(决策驱动因素,可选)→ Considered Options(候选方案)→ Decision Outcome(决策结果)→ Consequences(后果)→ Implementation Plan → Verification → Pros and Cons of the Options(各方案优缺点,可选)→ More Information(可选)

对照 adr-madr.md 中的占位内容,各章节要点如下:

  • YAML front matter:在 Simple 的statusdatedecision-makers基础上,增加可选的consulted(被咨询的专家,双向沟通)与informed(被告知的干系人,单向沟通)两个字段,遵循 RACI 模型;
  • Context and Problem Statement:鼓励以问题形式表述("How can we ...?"),并可链接相关 issue、ticket 或既有 ADR;
  • Decision Drivers(可选):逐一列出约束、需求或影响力(force),如"CI 速度""测试隔离""生产环境兼容性";
  • Considered Options:列出全部候选方案标题;
  • Decision Outcome:明确写出被选方案及理由(引用驱动因素与权衡),其下挂 Consequences——与 Simple 模板不同的是,MADR 的后果列表除了Good, becauseBad, because,还引入了第三种类别Neutral, because(既非正面也非负面的后果);
  • Implementation Plan:比 Simple 模板更完整,除 Affected paths / Dependencies / Patterns to follow / Patterns to avoid 外,还要求列出Configuration(env vars、配置文件、feature flags)与Migration steps(迁移步骤,并说明是否可增量进行);
  • Verification:同样以复选框列出具体、可测试的验收标准(例如"npm test在 SQLite 测试库下通过""src/db/之外不允许出现直接pgimport");
  • Pros and Cons of the Options(可选):为每个候选方案分别建立### 标题小节,用 Good / Neutral / Bad 三类论点展开对比;
  • More Information:兜底存放相关链接、团队约定、实现笔记或触发重新审视的条件。

3.3 长版示例的价值

references/examples.md 中提供了同一决策("本地开发数据库用 SQLite")的短版与长版两份完整成稿。长版(MADR)示范了Decision Drivers(5 条量化驱动因素)、Considered Options(3 个候选)、Pros and Cons of the Options(每个候选 3~6 条论证)、带编号的 Migration steps(5 步渐进式迁移)以及 8 条具体可执行的 Verification 复选框。这份示例是理解两套模板在"信息密度"上差异的最佳参照物:同一决策,Simple 用一页讲清结论,MADR 则把推理全过程留存下来。

四、两套模板共享的 Agent 优先特性

无论选择哪套模板,以下设计是二者共有的,也是 adr-skill 区别于传统 ADR 工具的关键:

  1. YAML front matter 元数据——统一记录statusdatedecision-makers,MADR 版额外支持consultedinformed。这些字段被 new_adr.js 的渲染逻辑直接消费:有值则替换占位符,无值则整行删除,避免把{list everyone whose expertise was sought}之类的占位文本泄漏到真实 ADR 中;
  2. Implementation Plan(实现计划)——包含受影响路径、依赖、应遵循/避免的模式、配置、迁移步骤。这是让 ADR 变成"Agent 可执行规范"的关键:new_adr.js脚本通过--deciders--consulted--informed--technical-story--chosen-option等参数把这些信息注入模板;
  3. Verification 以复选框呈现——验收标准必须可测试,Agent 在实现完成后可以逐项勾选核验;
  4. Agent 优先的措辞——占位文本引导撰写者写得具体、可度量、自包含(例如模板要求"agent should be able to start coding from this without asking follow-up questions");
  5. More Information 小节——用于交叉链接、后续跟进与重新审视的触发条件;
  6. Neutral, because...作为第三种论证类别——与 Good、Bad 并列,帮助记录那些"既非利好也非利空"的中性后果(如"抽象层增加约 200 行代码,但让未来的数据库迁移更简单")。

此外,references/adr-conventions.md 为两套模板共同遵守的约定提供了补充:目录命名(docs/decisions/adr/等的检测顺序)、文件名规范(YYYY-MM-DD-title-with-dashes.md)、状态机(proposedaccepted/rejected/deprecated/superseded)以及"追加而非重写"的变更原则。状态变更可由 set_adr_status.js 脚本就地完成。

五、如何选择:量化决策信号

原文档给出了一张精炼的选择对照表,是模板选型的核心依据:

决策信号使用 Simple使用 MADR
真实可选方案数量1–23+
受影响的团队规模小团队 / 个人跨团队
可逆性容易回退难以撤销
预期存续周期数月数年
是否需要干系人评审

使用建议:拿不准时,先选 Simple。如果讨论过程中暴露出更多复杂性,随时可以升级为 MADR(原文档原话:"When in doubt, start with Simple. You can always expand to MADR if the discussion reveals more complexity.")。

在 adr-skill 的四阶段工作流中,模板选择发生在Phase 2(Draft the ADR)的第三步。完整的流程为:Phase 0 扫描代码库(查找既有 ADR、技术栈、相关代码模式与代码↔ADR 引用)→ Phase 1 苏格拉底式提问捕获意图(经 Intent Summary Gate 确认后)→ Phase 2 起草(选择目录、命名策略与模板)→ Phase 3 对照 references/review-checklist.md 的 Agent 就绪检查清单评审。评审清单中与 MADR 模板直接相关的检查项包括:至少两个真实考虑的方案、每个方案有真实的优缺点、被选方案的理由引用具体驱动因素、被否决方案说明否决原因。

六、把选型落地:new_adr.js 的命令行操作

模板选型最终要通过scripts/new_adr.js落地为真实文件。该脚本(见 skills/adr-skill/scripts/new_adr.js)的设计目标是无外部依赖、安全默认值(自动检测 ADR 目录与命名策略),且在没有既有 ADR 的仓库中也能工作。

从目标仓库根目录执行:

# Simple 模板(默认):结论明确的决策 node /path/to/adr-skill/scripts/new_adr.js --title "Choose database" --status proposed # MADR 模板:多方案结构化权衡 node /path/to/adr-skill/scripts/new_adr.js --title "Choose database" --template madr --status proposed # 同时更新索引(README.md 或 index.md) node /path/to/adr-skill/scripts/new_adr.js --title "Choose database" --status proposed --update-index # 在尚无 ADR 的仓库中初始化:创建目录、索引和第一份 ADR node /path/to/adr-skill/scripts/bootstrap_adr.js --dir docs/decisions

脚本行为要点(均可从源码验证):

  • 模板加载loadTemplate()依据--template simple|madrassets/templates/adr-simple.mdadr-madr.md读取原始模板;
  • 占位符渲染renderTemplate()用正则替换 YAML front matter 占位符(如status: "{proposed | accepted | ...}"status: proposed),consulted/informed无值时整行删除,MADR 标题占位符替换为--title传入的值,同时支持{TITLE}{STATUS}{DATE}{DECIDERS}{CHOSEN_OPTION}等内联占位符——因此--chosen-option参数专门用于填充 MADR 模板的 "Chosen option" 一行;
  • 目录自动检测detectAdrDir()contributing/decisions/docs/decisions/adr/docs/adr/docs/adrs/decisions/的顺序探测,找不到时默认落到adr/
  • 命名策略--strategy auto|date|slug,auto 模式通过扫描目录内既有.md文件名判断是日期前缀还是纯 slug;日期前缀格式为YYYY-MM-DD-{slug}.md,slug 由标题小写化、去除引号、非字母数字字符转连字符后生成;
  • 索引更新--update-index会定位README.mdindex.md,优先把- title (status, date)条目插入## ADRs标题下,否则追加到文件末尾;
  • 机器可读输出--json输出包含adrDircreatedAdrRelPathtemplatestrategyindexChanged等字段的 JSON,便于 CI 或 Agent 程序化消费。

若环境不允许运行脚本,也可以直接从assets/templates/复制对应模板手动填写(SKILL.md 中明确给出了这条回退路径)。

七、选型实战:一个完整决策示例的两种写法

以 references/examples.md 中的"SQLite 本地开发数据库"决策为例,直观对比两套模板的产出差异:

Simple 写法只需回答:为什么现在换(CI 共享 PostgreSQL 导致 flaky 与 3 分钟+ 慢设置)、决定做什么(SQLite + better-sqlite3,生产仍用 PostgreSQL,非目标是不迁移生产也不建完整 ORM)、后果(CI 3+ 分钟降到约 2 秒 / 需维护双方言兼容)、实现计划(src/db/client.ts抽象层 + 两个具体实现 + 测试配置)、验证(两条npm test环境 + import 约束 + CI 时长)、两个备选各一句否决。

MADR 写法额外增加:5 条量化 Decision Drivers(CI 速度、测试隔离、生产一致性、离线 DX、维护成本)、3 个候选方案的完整 Pros/Cons 小节(每个 3~6 条论证)、含 9 处受影响路径和 5 步编号迁移步骤的 Implementation Plan、8 条含 grep 命令的可执行验证项、Neutral 后果记录,以及每周 PostgreSQL 兼容性 CI 作业这一后续任务。

判断要点:决策被推翻的成本越高、未来被重新审视的概率越大、需要说服的干系人越多,就越应该选择 MADR;反之,一个数周内即可验证、容易回退的小团队决策,用 Simple 记录反而更高效。

八、总结与延伸阅读

模板选型不是风格偏好,而是信息策略:Simple 记录结论,MADR 留存推理过程。无论选哪套,都要保证实现计划具体到文件路径与模式、验证标准可勾选可执行,让一份 ADR 真正成为 Agent 可以直接开工的规范文档。当前仓库自身就是一个活样本——contributing/decisions/2026-03-11-adopt-architecture-decision-records.md 用 Simple 结构记录了"采用 ADR"这一决策,而其内容恰好论证了为何需要这套机制。

进一步深入可查阅:

  • 模板正文:assets/templates/adr-simple.md 与 assets/templates/adr-madr.md;
  • 完整技能说明与四阶段工作流:skills/adr-skill/SKILL.md;
  • 起草后的评审依据:references/review-checklist.md;
  • 目录、命名、状态与生命周期约定:references/adr-conventions.md;
  • 同一决策的短/长版成稿对照:references/examples.md;
  • 支撑选型落地的脚本:scripts/new_adr.js、scripts/bootstrap_adr.js、scripts/set_adr_status.js。

【免费下载链接】aiThe AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents项目地址: https://gitcode.com/GitHub_Trending/ai/ai

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 13:24:31

生成式引擎优化(GEO)技术解析与应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 13:22:26

OpenClaw框架实战:构建专属AI编程助手全流程指南

1. 项目概述 OpenClaw是一款开源的AI编程助手框架,它允许开发者构建专属的AI编程助手。这个项目标题"基于OpenClaw搭建专属编码龙虾从安装到生产级的AI编程助手实战指南"清晰地指出了几个关键点:使用OpenClaw框架、构建专属AI编程助手、涵盖从…

作者头像 李华
网站建设 2026/9/12 13:20:02

基于SwinTransformer与小波分析的轴承故障诊断实践

1. 项目概述轴承故障诊断一直是工业设备健康监测领域的重要课题。传统方法通常依赖专家经验或简单的频谱分析,而基于深度学习的智能诊断方法正在逐步改变这一局面。这个项目提出了一种结合小波时频分析和SwinTransformer的创新方法,通过Python和PyTorch实…

作者头像 李华
网站建设 2026/9/12 13:19:30

STM32定时器时钟源、PSC与ARR三大陷阱深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华