一句话区别
- ADR(Architecture Decision Record,架构决策记录)回答 「为什么这么定」——记录一个决策和它的理由,拍板后基本不动。
- Task Spec(任务规格)回答 「要做什么、怎么做、做到什么算完」——指导一次具体落地,随实施更新,是活文档。
一个朝后看(沉淀已做的决策),一个朝前看(驱动待做的执行)。
ADR 是什么
ADR 记录一个「架构上重要」的决策:背景、考虑过的方案、最终选择、以及由此带来的后果。它的价值在于把「当初为什么选 A 而不是 B」留存下来,避免几个月后自己或他人重新踩坑、甚至无意推翻。
典型结构(Michael Nygard 的经典五段):
# ADR-0001: 标题
## 状态
Accepted / Proposed / Superseded
## 背景
什么力量/约束逼出了这个决策
## 决策
我们选了什么
## 后果
接受了哪些代价、带来哪些影响
关键特性:
- 不可变:决策变了不要改旧文件,而是新写一条 ADR,引用并标记旧的为 superseded。删除会抹掉历史,正是它要避免的。
- 短小:通常 200–500 字,只讲决策本身,不写实现细节。
- 进版本库:和代码放一起(常见
docs/adr/),让「为什么」就在工程师能找到的地方。
Task Spec 是什么
Task Spec 描述一个待完成任务的规格:目标、范围(含「不做什么」)、接口/行为契约、约束、验收标准。它是给「这次要做的事」立一个清晰的「完成」定义,让人和 AI 都按同一份契约推进。
## 目标
实现用户登录 API
## 范围
- 包含:POST /api/login、JWT 签发
- 不包含:注册、OAuth
## 约束
- 密码不得明文记录
## 验收
- [ ] 正确凭证返回 JWT
- [ ] 错误凭证返回 401
关键特性:
- 活文档:随实施推进更新状态、勾选验收项,完成后归档。
- 面向执行:聚焦「怎么做、做到什么程度」,可直接转化为测试用例。
- 复杂才写:小改动几句话即可,不必为每个任务都立 Spec。
核心区别
| 维度 | ADR | Task Spec |
|---|---|---|
| 回答 | 为什么这么定 | 做什么 / 怎么做 / 怎样算完 |
| 时间朝向 | 朝后(已做的决策) | 朝前(待做的执行) |
| 结构 | 背景 / 方案 / 决策 / 后果 | 目标 / 范围 / 约束 / 验收 |
| 生命周期 | 拍板后不可变(变更另开新 ADR) | 活文档,随实施更新后归档 |
| 篇幅 | 短(200–500 字) | 视任务复杂度,可长可短 |
| 典型位置 | docs/adr/ |
docs/tasks/ 等 |
它们是哪个领域的概念
这是容易混淆的地方——ADR、Task Spec、SDD、Harness Engineering 不在同一抽象层级:
| 概念 | 性质 | 来源领域 |
|---|---|---|
| ADR | 具体文档类型 | 软件架构实践。Michael Nygard 于 2011 年提出,后被 ThoughtWorks 技术雷达列入 Adopt |
| Task Spec | 具体文档类型 | 软件工程通用规格说明,由来已久 |
| SDD | 方法论 | Spec-Driven Development:先写 spec 再实现,AI 辅助开发时代被重新强调 |
| Harness Engineering | 工程学科 / 体系 | AI agent 领域,2026 年初兴起 |
换句话说:
- ADR 和 Task Spec 是「文档」——你手里实际写出来的东西。
- SDD 是「方法论」——主张「先把规格(spec)写清楚,再让 AI/人去实现」。Task Spec 是 SDD 流程里的核心产物之一;ADR 不是 SDD 专属,它来自更早的软件架构实践。
- Harness Engineering 是「学科」——围绕 AI agent 的可靠性,把 ADR、Task Spec、状态锚点、约定文件(
AGENTS.md)等都纳入 agent 的「外层 harness / 记忆层」。它的公式是Agent = Model + Harness:模型之外的一切(上下文、工具、约束、反馈)都是 harness。
所以三者是包含关系:Harness Engineering(学科)⊃ SDD(方法论)⊃ Task Spec / ADR(文档)。ADR 严格说先于这三者存在,AI 时代被这套体系「收编」进来当作 agent 的长期记忆。
详见本站 Harness Engineering 与状态锚点 与 Spec-Driven Development 与 Vibe Coding。
何时用哪个
| 场景 | 用什么 |
|---|---|
| 做了个有取舍、将来要解释「为什么」的选择 | ADR |
| 要落地一个有点复杂、需要对齐「完成标准」的任务 | Task Spec |
| 既有取舍又有落地 | 两个都写,分开 |
| 小改动、一次性脚本 | 都不用,提交信息说清即可 |
两者如何配合
最自然的用法是一对组合:ADR 锁定方向,Task Spec 负责落地。
以本站把任务管理升级为 Linear Cycle 为例:
- ADR-0001 记录「为什么采用 1 周 Cycle」——候选方案对比、为什么不选 2 周、承诺方式如何改变。拍板后不动。
- TASK-SPEC-linear-cycle-adoption 记录「怎么落地」——要改哪些设置、迁移哪些 issue、成功标准、回滚步骤。随实施打勾更新。
两份用链接互相引用:Spec 顶部「决策依据 → ADR」,ADR 底部「落地 → Spec」。这样「为什么」和「怎么做」各有归属,互不污染:
ADR(为什么 + 拍板,稳定)
│ 引用
▼
Task Spec(怎么做 + 验收,活文档)
│ 产出
▼
实现 + 测试
小结
- ADR = 决策的墓碑:刻下来就不改,要变就立新碑(superseded)。
- Task Spec = 施工图:边干边改,完工归档。
- 它们是「文档」;SDD 是「用 spec 驱动实现」的方法论;Harness Engineering 是把这些文档组织成 AI agent 可靠运行环境的学科。
- 实战里常常成对出现:先写 ADR 定方向,再写 Task Spec 管落地。