Spec-Driven Development

先文档后代码
人做判断题
AI 做填空题

SpecCanon 是 SDD 方法论的 CLI 工具与操作手册。把文档变成 AI 可依赖的系统上下文,让 AI Coding Agent 的产出质量显著提升。

GitHub

AI Coding 的典型痛点

用 AI 写代码已经不新鲜了,但用 AI 写出"对的代码"仍然困难。

🔍

上下文不完整

AI 只看到当前文件,不了解系统全局,生成的代码与已有模块冲突。

💨

变更意图漂移

口头描述需求后 AI 开始编码,过程中意图逐渐偏离原始目标。

🔃

重复踩坑

上次踩过的坑没有留痕,下次换一个 session 又犯同样的错。

跨模块影响遗漏

改了签到模块的接口,没有意识到积分模块也在调用。

有无 SDD 的对比

维度没有 SDD有 SDD
AI 的上下文当前文件 + 口头描述结构化的系统全景 + 变更链
变更意图容易在对话中漂移锚定在 01_requirement.md
历史经验散落在聊天记录和个人记忆沉淀在 SKILL.md 和 domain_spec
跨模块影响靠人脑记忆域间关系图自动追踪
新人上手读代码 + 问老人读 domain_spec 即可了解现状

核心理念

SDD 通过持续维护一套结构化的 Spec 文档体系来弥合知识断层。

人机分工 Core

需求取舍、架构选型由人负责;在明确约束下填充由 AI 负责。

角色职责类比
人(工程师)决策、审阅、判断对不对做判断题
AI(Agent)生成、补全、确保全不全做填空题

文档状态机 Pattern

每份 Spec 是一个状态节点,开发过程就是状态转移。文档即进度。

00_context 01_requirement 02_interface 03_implementation 04_test_spec

Domain Spec 即 Canon Canon

domain_spec.md 是系统行为的长期真相(正典),不是一次性的需求稿。每次变更完成后关键信息回填,使其持续演化。

domain_spec.md(系统正典)
↓ 新变更启动 → 读取系统现状
00_context → 01 → 02 → 03 → 04
↓ 变更完成 → 关键信息回填
domain_spec.md(演化更新)

三层文档体系

各有不同的生命周期和职责,形成知识持续累积的闭环。

系统级 · 持续更新

域间关系与系统正典

始终反映系统的当前行为,是 AI 生成上下文时的首要参考。

  • domains/README.md — 域间关系全景
  • domain_spec.md — 业务域的长期真相
Change 级 · 单次生命周期

变更文档链条

5 份文档组成严格的依赖链,后者建立在前者的上下文之上。

  • 00_context — 系统现状快照
  • 01_requirement — 需求规格与验收标准
  • 02_interface — 接口契约
  • 03_implementation — 实施计划
  • 04_test_spec — 测试策略
项目级 · 持续累积

团队经验与决策留痕

跨越所有变更持续沉淀,让团队越来越聪明。

  • SKILL.md — 团队经验库,避免重复犯错
  • AI_CHANGELOG.md — 技术决策留痕

六步工作流

先对齐现状,再定义目标,再落实施工,再验证结果,最后回填知识。

0
Context 00_context.md
从 domain_spec 读取系统现状,识别涉及的上下游域,生成变更前的世界快照。
🛡 审阅系统现状,补充技术约束
1
Requirement 01_requirement.md
在上下文约束下定义需求,明确验收标准(AC)。验收标准是整个变更的"合约"。
✅ AC Sign-off — 人工确认验收标准
2
Design 02_interface / 03_impl / 04_test
参考现有接口风格设计新接口,基于前三者规划实施方案和测试策略。
📐 审阅接口设计、文件路径、步骤顺序
3
Execute 分步编码
逐步编码,每个步骤完成后运行验证命令。不通过不进入下一步。
🚧 Gate 验证 — 编译/测试逐步确认
4
Review 代码审查 + AI_CHANGELOG
代码审查,记录技术决策和风险,更新 AI_CHANGELOG。
📋 最终确认
5
Archive 回填 domain_spec
将关键信息回填到 Domain Spec,更新域间关系。知识不随变更归档而消散。
📚 审阅回填草稿后写入

任务规模裁剪

不是所有任务都需要走完整流程。根据规模裁剪最小文档集,消除"文档负担"。

任务规模最小文档集归档回填
小 Bugfix 仅 AI_CHANGELOG(追加一条) 不回填
小需求 01_requirement(精简版)+ AI_CHANGELOG 仅回填新增接口/规则
中等需求 01 + 02_interface + AI_CHANGELOG 回填接口 + 业务规则
复杂需求 完整 00 → 01 → 02 → 03 → 04 + AI_CHANGELOG 完整回填 + 检查跨域依赖

裁剪三问

AI 是否需要理解系统现状?

如果是,需要 00_context。复杂模块的改动不能跳过上下文。

是否涉及接口或数据模型变更?

如果是,需要 02_interface。接口契约是前后端的唯一真相。

是否产生系统级知识?

如果是,需要归档回填 domain_spec。不回填,知识会消散。

CLI 工具与快速开始

spec-canon 帮你标准化执行 SDD 流程:初始化目录、管理变更、获取标准提示词。

spec-canon — core commands
# 初始化 SDD 目录结构
spec-canon init --domain auth
spec-canon sync                  # 补齐新版本骨架

# 管理当前 change
spec-canon change start -g @docs/prd.md
spec-canon change status
spec-canon change next

# 提示词系统
spec-canon prompt list
spec-canon prompt show req
spec-canon prompt guide
scenario-a — new project
# 1. 安装并初始化
npm install -g spec-canon
# → 全局安装 spec-canon CLI
spec-canon init --domain checkin
# → 创建 spec-canon/ 目录树 + checkin 域骨架

# 2. 建立 active change,开始首个变更
# 新项目跳过 ctx,直接命名 change
spec-canon change start -g @docs/prd.md -c feat-001-checkin
# → 创建 active change 并确认命名为 feat-001-checkin
spec-canon change next --type feat
# → 列出当前候选 next prompts(feat 类型裁剪)
spec-canon prompt show req
# → 输出 req 提示词(自动替换 {{CHANGE}} 等变量)
# → 将输出的提示词喂给 AI,生成 01_requirement.md
# → 人工审阅 AC,Sign-off

# 3. 依次生成设计文档
spec-canon prompt show iface
# → 输出接口设计提示词,喂给 AI 生成 02_interface.md
spec-canon prompt show impl-spec
# → 输出实施计划提示词,喂给 AI 生成 03_implementation.md
spec-canon prompt show test-spec
# → 输出测试策略提示词,喂给 AI 生成 04_test_spec.md

# 4. 编码执行
spec-canon prompt show impl
# → 输出分步编码提示词,AI 按 03 中的步骤逐步实现

# 5. 审查 + 归档
spec-canon prompt show review
# → 输出代码审查提示词,AI 审查改动并生成 AI_CHANGELOG 条目
spec-canon prompt show domain-sync
# → 输出域回填提示词,AI 将关键信息回填到 domain_spec
spec-canon change clear
# → 清除当前 active change,准备下一个变更
scenario-b — existing project
# 路径 A:懒加载(推荐)
# 第一个触碰某域的变更"顺手"创建 domain_spec
spec-canon init
# → 创建 spec-canon/ 目录树(已有文件不覆盖)
spec-canon change start -g "修复认证模块重复登录导致的 session 异常"
# → 创建 active change(待命名状态)
spec-canon change next --type fix
# → 列出 fix 类型的候选 next prompts
spec-canon prompt show ctx
# → AI 从 goal 出发扫描代码库并生成 00_context,建议 change 名
spec-canon change start -g "修复认证模块重复登录导致的 session 异常" -c fix-001-dup-session
# → 确认命名后继续后续步骤;变更完成后归档时,创建首份 domain_spec

# 路径 B:批量基线(有 1-2 天空档时)
spec-canon prompt show domain-identify
# → 输出域识别提示词,扫描代码库
spec-canon prompt show domain-setup
# → 输出域目录创建提示词
spec-canon prompt show domain-base -d checkin
# → 输出基线提示词,逐域生成 domain_spec
scenario-c — upgrade skeleton
# CLI 新版本新增了模板或目录约定时
spec-canon sync

# sync 的默认策略:
# ✓ 只补缺失文件,不覆盖已有文件
# ✓ 已有文件与模板不同时,保留现状并提示人工比对
# ✓ 写入 .template-manifest.json
scenario-d — daily development
# 小 Bugfix → 直接修复 + AI_CHANGELOG
# (无需提示词,修完后让 AI 追加 AI_CHANGELOG)

# 中等需求 → 有接口变更时
spec-canon change start -g @docs/prd.md -c feat-003-bonus
# → 创建 active change 并确认命名
spec-canon change next
# → 列出候选 next prompts
spec-canon prompt show req
# → 输出 req 提示词,生成 01_requirement.md
spec-canon prompt show iface
# → 输出 iface 提示词,生成 02_interface.md
spec-canon prompt show impl
# → 输出 impl 提示词,分步编码
spec-canon prompt show review
# → 输出 review 提示词,审查改动 + 生成 AI_CHANGELOG

# 复杂需求 → 完整流程
spec-canon change start -g @docs/prd-cross-domain.md
# → 创建 active change(待命名状态)
spec-canon change next --type feat
# → 列出 feat 类型的候选 next prompts
spec-canon prompt show ctx
# → 输出 ctx 提示词,生成 00_context.md,AI 建议 change 名
spec-canon change start -g @docs/prd-cross-domain.md -c feat-004-cross-domain
# → 确认 change 命名
spec-canon change next
# → 列出当前候选 next prompts
spec-canon prompt show req
# → 输出 req 提示词,生成 01_requirement.md
spec-canon prompt show iface
# → 输出 iface 提示词,生成 02_interface.md
spec-canon prompt show impl-spec
# → 输出 impl-spec 提示词,生成 03_implementation.md
spec-canon prompt show test-spec
# → 输出 test-spec 提示词,生成 04_test_spec.md
spec-canon prompt show impl
# → 输出 impl 提示词,分步编码
spec-canon prompt show review
# → 输出 review 提示词,审查改动 + 生成 AI_CHANGELOG
spec-canon prompt show domain-sync
# → 输出 domain-sync 提示词,自动发现受影响域并回填 domain_spec