Files
Alfred/openspec/schemas/code-drive/schema.yaml

1088 lines
65 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: code-drive
version: 1
description: 代码开发 OpenSpec workflow - requirements -> design -> plan -> tasks -> apply
artifacts:
- id: requirements
generates: requirements.md
description: 需求确认与澄清,包含业务需求、技术需求和全局审查
template: requirements.md
instruction: |
## 目标
撰写 requirements.md把"要解决什么、为什么、需要用户决策哪些业务和技术边界"固定为事实来源。
requirements.md 的职责是**确认和澄清**通过对话把需求、边界、取舍和用户决策固定下来。design.md 负责把它们**翻译**为可执行方案——不要在 requirements 展开详细实现步骤、具体文件修改清单或任务 checkbox。
本阶段承接 explore、前序讨论、用户请求和代码库调查结果。文档面向项目开发者而非外部需求方因此既要确认业务需求也要确认技术需求技术选型、架构方向、集成边界、代码约束、验收方式。
## 输入
- explore / 前序讨论 / 用户原始请求 / 代码库调查结果
- 已有 requirements.md如存在则增量修订不重写未变部分
## 工具使用(先决说明)
本阶段开始前必须确认可用工具,并在整个工作流中按以下规则使用:
- **todo / plan 工具**(如 Claude Code 的 TodoWrite、OpenCode 的 todowrite
- 复杂变更**必须**使用它跟踪撰写流程
- **颗粒度细化到子步骤**——每个工作流的"X.Y"编号子步骤对应一个 todo item例如步骤 1 拆为 1.1 收集上下文、1.2 评估范围、1.3 拆细提问,每项独立 todo
- 简单变更可不使用,但判断"简单"的标准是"单一模块、单一决策点、预期 < 100 行文档"
- **question / choice 工具**:触发提问流程时**必须优先**使用,而非让用户开放回答
- **只读工具**Read / Grep / Glob / Bash 只读命令):在工作流任意步骤中都允许使用,不视为决策型交互
- **注意**todo 跟踪的是**文档撰写进度**,不是整体变更实现进度——后者由 apply 阶段和 tasks.md checkbox 跟踪
## 向用户提问的标准流程(强制协议,适用于本阶段所有提问环节)
本流程是 requirements 阶段用户决策唯一入口,**任何步骤触发以下条件时必须按本流程执行,不得跳过、不得自行决定、不得延迟到下游**。
### 触发条件(命中任一即必须启动提问流程)
1. 检测到**潜在冲突**——任意两条需求/约束/决策之间存在矛盾、取舍未定、可解读不一致或可能相互排斥
2. 遇到**开放问题**——任何形式的"开放问题""TBD""待确认""待讨论"章节或条目
3. **技术决策点未定**——技术选型有多个合理选项且未排除、架构方向存在分歧、集成边界或代码约束未确认
4. **YAGNI 取舍未定**——某条需求是否真需要、是否应简化、是否应排除本次范围,存在合理质疑
5. **需求边界不清**——功能范围、行为定义、验收标准存在一种以上合理理解
6. **依赖约束未定**——上下游依赖、兼容性要求、外部约束未确认
7. **范围过大需要拆细**——本次变更涉及多个独立维度、子系统或大量决策点;此时**不是询问用户"是否拆分变更"**,而是 AI 主动把范围拆解为 N 个细粒度问题,按提问格式逐项让用户确认
8. **最终确认**(步骤 7——即使前 7 条全部未命中,最终确认仍是强制提问
### 提问格式(强制)
每次提问必须按以下格式输出,不得让用户从零开放回答(除非真的没有任何可选项):
- **2-3 个候选选项**:每个选项给出明确含义,避免"方案 A""方案 B"这种无信息标签
- **推荐方案**:明确标注推荐哪一个,不得以"都可以""由你决定"回避
- **取舍说明**:每个非推荐选项说明未选的理由;推荐选项说明取舍的代价
- **使用工具**:工具支持 question/choice 时**必须**使用结构化选项;不支持时用 markdown 列表呈现
### 强制语义(不得跳过)
- 触发条件命中时**必须**启动提问流程,即使你倾向"自己决定"或"延后处理"
- 即使用户回复"你看着办",也必须回复"推荐方案 + 主要代价",请用户**显式确认**推荐方案,不得默认接受"你看着办"作为决策
- 任何触发条件**不得以"待协调""需进一步讨论""开放问题""TBD"形式残留**在 requirements.md 中
- 简单问题可以合并提问,复杂问题必须拆细逐项提问;但不得一次抛出大量无关问题
### 决策归档规则
用户给出决策后:
1. **按性质归入对应章节**——功能需求 / 非功能需求 / 技术需求 / 被否决方案等
2. **冲突本身不得以任何形式单独保留**——不设"冲突解决记录"章节
3. **被否决方案**归入"讨论记录/被否决方案",并写明否决理由
4. **新结论引发新冲突**时回到触发条件 1重新启动提问流程
5. **决策结论应可在下游 artifact 直接引用**——明确到 design 阶段无需重新提问
## 工作流
### 步骤 1: 收集上下文、评估范围、拆细问题
合并"理解现状、判断范围、拆分提问粒度"三件事,避免在范围未定时就深入细节。
**子步骤 1.1: 收集上下文**
- 读取相关讨论、代码库现状、用户原始请求,形成初步理解
- **先读再问**:不要询问代码库或文档中已经能确认的信息——这种提问会被视为"未做功课"
**子步骤 1.2: 评估范围**
- 判断本次变更是否涉及多个独立维度、子系统或大量决策点
- 不涉及 → 进入步骤 2
- 涉及 → 进入子步骤 1.3
**子步骤 1.3: 拆细问题**
- AI 主动识别范围内的独立维度(如:业务流程、数据模型、外部集成、迁移路径、性能约束……)
- 把每个维度拆成 1-3 个具体问题(每个问题独立可决策)
- **触发提问流程**(触发条件 7按维度逐项让用户确认
- 用户全部决策归档后进入步骤 2
**注意**:本步骤的"拆细"不是询问用户"是否要把变更拆为多次提交",而是 AI **主动**把大范围内的决策点拆为细粒度问题逐项确认。变更本身仍可能保持单一 requirements.md。
### 步骤 2: 撰写初稿
按必需章节填写:**背景与目标 / 讨论记录 / 功能需求 / 非功能需求 / 技术需求 / 全局审查**。
撰写要求:
- **面向看不到早期对话的人**:必须保留关键上下文、用户偏好、已确认结论、约束和被否决方案
- **分段呈现**:复杂内容每段约 200-300 字,确认后再继续下一段
- **功能需求**必须带验收标准
- **非功能需求**只记录本次变更相关内容
- **技术需求**记录已确认的选型、架构方向、集成边界、代码约束或禁止事项
- **不写**具体文件修改步骤、代码结构、任务 checkbox 或详细实现计划
撰写过程中遇到触发条件 3/4/5/6 时,立即**启动提问流程**;用户决策归档后继续撰写。
简单变更保持精炼;复杂或横切变更必须写足够细节,避免后续 design/plan/apply 依赖未写入文档的聊天上下文。
### 步骤 3: 全局审查 + YAGNI 挑战
对初稿做两个角度的挑战,发现的问题立即纳入步骤 4 或启动提问流程。
**子步骤 3.1: 全局审查**
从系统边界、既有行为、相邻模块、配置、文档、迁移、兼容性、安全、性能和用户流程角度挑战当前需求。
**子步骤 3.2: YAGNI 挑战**
对每条需求问——是否真的需要、能否更简单、是否存在更轻量替代方案、是否超出本次范围。
**子步骤 3.3: 结果分类处理**
- 发现**潜在冲突** → 进入步骤 4
- 发现**开放问题 / 技术决策未定 / YAGNI 取舍未定 / 边界不清** → **启动提问流程**
- 无问题 → 进入步骤 5
### 步骤 4: 冲突检测与解决
扫描任意两条需求/约束/决策之间是否存在矛盾、取舍未定、可解读不一致或可能相互排斥。
- **发现潜在冲突** → 立即暂停撰写,**启动提问流程**(触发条件 1
- 用户决策后,结论按性质归入对应章节,冲突本身不得以任何形式单独保留
- 无冲突 → 进入步骤 5
### 步骤 5: 开放问题清零
全文扫描是否存在"开放问题""TBD""待确认""待讨论"章节或条目(包括步骤 2-4 撰写过程中产生的疑问)。
- **发现开放问题** → **启动提问流程**(触发条件 2/3/4/5/6
- 某问题确实需要延续到 design 或 apply 阶段才能解决 → **启动提问流程**,让用户决定是否拆分变更或暂时排除本次范围
- 全部问题已通过用户决策解决并归档 → 进入步骤 6
- **不得**在 requirements.md 中以"开放问题"形式保留任何条目
### 步骤 6: 自检(逐项内联修复,无需二次 review
按以下清单逐项检查,发现问题立即修复后**重跑该项**
- [ ] **占位符扫描**无模板注释、英文模板句子、TBD、待补充、空表格行或"开放问题"章节
- [ ] **章节完整性**:必需章节齐全(背景与目标 / 讨论记录 / 功能需求 / 非功能需求 / 技术需求 / 全局审查);各章节无遗漏
- [ ] **上下文一致性**:讨论记录的"已确认结论"都已落入对应章节;被否决方案没有被复用
- [ ] **冲突清零**:所有需求、约束之间无矛盾/歧义/未决取舍;无"待协调""需进一步讨论"
- [ ] **待确认问题清零**:全文无"开放问题""TBD""待确认""待讨论"等未决条目
- [ ] **全局审查充分性**:系统边界、既有行为、相邻模块、配置、迁移、兼容性都被审视过
- [ ] **YAGNI**:每条需求都经过挑战,没有"未来可能需要但本次不必需"的功能
- [ ] **范围合适**:能用单一 design.md 承接,或已建议拆分为多个子变更
自检全部通过后进入步骤 7任一项失败 → 修复后从该项重跑,必要时回到步骤 2-5。
### 步骤 7: 用户最终确认(不得跳过)
**强制触发提问流程**(触发条件 8即使用户在前 6 步中已经多次决策。工具调用或正文明确提问均可。
**提问内容**
1. **展示关键决策点**:功能需求、技术需求各一句话总结
2. **仍有待确认内容**(步骤 6 自检后发现遗漏)→ 按"提问格式"逐项提问
3. **无任何待确认内容** → 必须输出最后一问:"当前已无更多内容待确认,是否进入下一步"
**结束条件**
- 用户**明确肯定**(同意 / 进入下一步)→ 本阶段结束,进入 design
- 用户选择补充或修改 → 根据反馈调整内容,重跑步骤 6 + 步骤 7
## 完成标准
- 工作流步骤 1-7 全部走过
- 步骤 6 自检 8 项全部通过
- 步骤 7 收到用户明确肯定
- 所有触发条件命中时都执行了提问流程(事后可被审计)
## 规则速查
### 阶段职责(强制,适用于整个 code-drive workflow
- 正常流程requirements 是用户决策入口design / plan / tasks / apply 自治执行,不发起决策型提问
- 异常流程下游无法独立解决时回退上游apply 生成 blocker.md由 blocker-revise 决定修订入口
- 非决策交互仅限读取文件、运行命令、报告回退或 blocker 事实
requires: []
- id: design
generates: design.md
description: 基于 requirements.md 和必要技术探索的概要技术设计
template: design.md
instruction: |
## 目标
撰写 design.md把 requirements.md 确认的需求**翻译**为概要技术方案——回答"采用什么总体技术方向、关键决策是什么、影响哪些范围"。
design.md 的职责是**翻译与补充探索**:基于 requirements.md 已确认的需求和技术方向,补充代码库层面的探索发现,固定为可执行的设计依据。不要在本阶段写详细实现步骤或任务 checkbox详细实现属于 plan.mdcheckbox 只属于 tasks.md。
本阶段承接 requirements.md、前序讨论和代码库。文档面向项目开发者。
## 输入
- requirements.md必需作为决策唯一来源
- 前序讨论 / 代码库(用于补充探索)
- 已有 design.md如存在则增量修订不重写未变部分
## 工具使用(先决说明)
本阶段可用工具:
- **todo / plan 工具**:复杂变更必须跟踪到工作流 X.Y 子步骤简单变更可省略标准requirements.md 决策充分、无新增探索、预期 < 100 行文档)
- **只读工具**Read / Grep / Glob / Bash 只读命令可用于代码库探索,不视为决策型交互
- **禁止**:不得使用 question / choice 发起决策型提问;决策型分歧必须走"回退上游流程"
- **注意**todo 跟踪文档撰写进度,不跟踪实现进度
## 回退上游流程(强制协议,适用于本阶段所有"无法独立解决"环节)
本流程是 design 阶段**唯一**的异常出口。design 的默认行为是**自治执行**——AI 自己消化探索发现并写入 design.md**只在真正无法独立解决时才回流**。回退的成本是打断整个流程让用户重新决策,因此触发条件 reserved 给"AI 真处理不了的高价值错误"**而不是任何信息增量**。
### AI 自决范围(不触发回退,直接处理并写入 design.md
以下情况 AI **自行决策**并落地到 design.md 对应章节,**不**触发回退:
- **代码可复用** → 优先复用,记录到"代码库探索/已有代码与模式"
- **依赖版本细节不符但兼容** → 选兼容方案,记录到"代码库探索/依赖状态"
- **次要模块需要触碰但不影响核心决策** → 探索后纳入"影响范围"
- **实现层取舍**API 设计、数据结构、代码组织、命名)→ AI 给出理由 + 至少一个被否决方案,写入"关键决策"
- **全局审查发现的非核心边界**(次要配置、文档同步、日志格式)→ 直接补全到"影响范围"或"风险/权衡"
- **requirements.md 未明确但可从既有代码/项目规范推断** → 按推断方向走,标注"基于代码库规范推断"
### 触发条件(命中任一即必须启动回退流程,仅 3 条)
1. **核心方向决策真空**——requirements.md 对本次变更的**核心技术方向 / 架构方向 / 业务边界**未给出唯一决策,存在 2 个以上互相排斥且都合理的选择,**且选哪个会导致整体方案有本质差异**(不是细节差异)
- 不触发示例API 风格选 REST vs RPC业务边界已定纯实现层差异选 PostgreSQL vs MySQLrequirements.md 已说明"关系型数据库"且项目无既有约束)
2. **核心前提错误**——代码库探索发现 requirements.md 的**核心前提**(如"项目已有 X 模块""Y 依赖可用""Z 接口存在")与事实**不符,且这种不符会让整个方案失效**(必须重新设计才能继续)
- 不触发示例:依赖版本 v5 vs v6兼容Y 接口存在但参数略不同AI 适配X 模块存在但需要小修改
3. **必须扩展本次业务范围或引入核心新依赖**——发现要实现 requirements.md 已确认的功能,**必须**做以下之一:
- (a) **扩展本次变更的业务范围**(如发现功能 A 必须连同功能 B 一起做才合理)
- (b) **引入 requirements.md 未确认的核心外部依赖**(业务运行依赖,非纯开发/构建工具)
- 不触发示例新增开发依赖lint 插件、类型定义包);引入项目内已有但未被点名的工具函数
### 暂停报告格式(强制)
触发回退时,**必须暂停撰写**,按以下格式输出报告,不得在 design.md 中以任何形式保留"待确认/TBD/待讨论"条目:
- **触发条件编号 + 命中证据**:明确指出命中了第几条触发条件,附上具体证据(引用 requirements.md 的相关段落或代码库发现),并说明为何不属于"AI 自决范围"
- **影响的设计章节**:列出哪些章节因此无法继续撰写
- **回退到哪个 artifact**:明确指向 requirements默认或其他上游
- **需要在回退阶段补充的具体决策点**:列出上游需要补充回答的具体问题,每个问题给出 2-3 个候选选项 + 推荐方案 + 取舍说明(与 requirements 提问格式一致)
- **本阶段当前进度**:当前已完成到哪个步骤、暂停时正在撰写什么
### 强制语义(不得跳过)
- 触发条件命中时**必须**启动回退流程,即使你倾向"自己决定"或"假设一个合理默认"
- **不得**用"等用户回复后再继续"模糊处理——必须明确暂停并报告
- **不得**在 design.md 中以"待确认""TBD""待讨论""开放问题"形式保留任何条目
- **反向约束**:未命中触发条件时**不得**主动询问用户——AI 自决范围内的情况一律自决,不得以"为求保险"为由把决策推回用户
- 用户在 requirements 阶段补充决策后,回到 design 步骤 1 重新评估(不重写已确定章节,但需重跑回退触发条件检查)
### 回退归档规则
用户在 requirements 阶段补充决策后:
1. requirements.md 更新为最新版本design.md 引用更新后的决策
2. design 中此前无法继续的章节,按新决策补全
3. 此前的暂停报告**不得以任何形式保留**在 design.md 中(不设"回退记录"章节)
4. 新决策若引发新的回退触发条件 → 回到回退流程
## 工作流
### 步骤 1: 读取上游并评估探索充分性
合并"读上游、判断是否需要补充探索"两件事,避免在判断未定时就深入代码库。
**子步骤 1.1: 读取 requirements.md 与前序讨论**
- 完整读取 requirements.md识别其中已确认的技术选型、架构方向、集成边界、约束
- 识别 requirements.md 中已经做过的代码库探索发现(避免重复劳动)
**子步骤 1.2: 评估探索充分性**
按 3 个判断点逐一检查:
- requirements.md 确认了技术选型,是否已检查项目中该依赖的安装状态或版本约束?
- requirements.md 确认了架构方向是否已检查现有代码中可复用的组件、工具函数、数据结构、API 模式或架构约定?
- 需求涉及的模块,是否在 requirements.md 或前序讨论中已被探索过?
**子步骤 1.3: 判断是否需要补充探索**
- 三项均已充分 → 直接进入步骤 3跳过步骤 2
- 任一项不充分 → 进入步骤 2
### 步骤 2: 代码库补充探索(仅当步骤 1.3 判断需要)
**子步骤 2.1: 检查依赖状态**
- 验证 requirements.md 中确认的技术选型在项目中的实际状态(已安装 / 未安装 / 版本不符)
- 记录到 design.md "代码库探索 / 依赖状态" 子章节
**子步骤 2.2: 检查可复用代码**
- 探索现有组件、工具函数、数据结构、API 模式、架构约定
- 记录到 design.md "代码库探索 / 已有代码与模式" 子章节
**子步骤 2.3: 检查项目规范约束**
- 探索项目编码规范、命名约定、架构约束、质量门禁
- 记录到 design.md "代码库探索 / 开发规范约束" 子章节
**子步骤 2.4: 检查回退触发条件**
- 探索发现 → 先判断是否属于"AI 自决范围"(如可复用代码、依赖兼容、次要模块触碰);属于则直接落地到对应章节,不触发回退
- 不属于自决范围 → 检查是否命中触发条件 1/2/3
- 命中 → 立即**启动回退流程**,暂停本阶段
- 未命中 → 进入步骤 3
### 步骤 3: 撰写初稿
按模板的 8 个章节顺序撰写:**代码库探索 / 整体方案 / 目标·非目标 / 关键决策 / 影响范围 / 依赖与约束 / 风险·权衡 / 验证方向**。
撰写要求:
- **整体方案**:描述模块、组件或流程如何组织和协作,概要说明为什么该方案满足 requirements.md
- **目标 / 非目标**:目标对齐 requirements.md 的功能需求;非目标明确划界
- **关键决策**:引用 requirements.md 已确认的决策,仅补充实现层决策(具体 API 设计、数据结构、代码组织方式等)
- **影响范围**:列出受影响的模块、文件、配置、接口、文档、流程或外部依赖,附"关键实现路径"
- **依赖与约束**:依赖、兼容性、质量门禁、禁止事项四项必备
- **风险 / 权衡**:每条风险对应缓解措施
- **验证方向**:覆盖 requirements.md 的功能验收标准和非功能需求
撰写过程中遇到触发条件 1/2/3 时,立即**启动回退流程**;上游补充后继续撰写。注意:实现层取舍属于"AI 自决范围",直接写入"关键决策"章节即可,不触发回退。
简单变更保持精炼;复杂或横切变更必须写足够细节,避免 plan/apply 依赖未写入文档的设计推理。
### 步骤 4: 关键决策挑战
对初稿做关键决策合理性挑战。
**子步骤 4.1: 决策合理性检查**
- 每个关键决策是否有理由
- 每个关键决策是否记录了至少一个被否决方案或主要取舍
- 不满足 → 补全。注意:取舍的"理由"由 AI 自己给出(属于"AI 自决范围"),不触发回退;**仅当**发现取舍属于"核心方向决策真空"(触发条件 1才启动回退流程
**子步骤 4.2: 回退触发条件复查**
- 全文扫描是否在撰写过程中暴露出此前未发现的触发条件 1/2/3
- 先判断是否属于"AI 自决范围";不属于再判断是否命中触发条件
- 命中 → **启动回退流程**
- 未命中 → 进入步骤 5
### 步骤 5: 自检(逐项内联修复,无需二次 review
按以下清单逐项检查,发现问题立即修复后**重跑该项**
- [ ] **占位符扫描**无模板注释、英文模板句子、TBD、待补充、空表格行或"待确认事项"章节
- [ ] **需求覆盖**requirements.md 的每条功能需求都有决策覆盖;技术需求被正确引用或落地
- [ ] **决策合理性**:每个关键决策有理由,并记录至少一个被否决方案或主要取舍
- [ ] **代码库现实**:设计基于代码库探索发现,而非从零假设;没有引入 requirements.md 未确认的新依赖
- [ ] **验证方向对齐**:验证方向覆盖 requirements.md 的功能验收标准和非功能需求
- [ ] **待确认清零**:全文无"待确认""TBD""待讨论""开放问题"等未决条目
自检全部通过 → 本阶段完成;任一项失败 → 修复后从该项重跑,必要时回到步骤 3-4。
### 步骤 6: 触发回退(异常路径)
此步骤仅在步骤 1-5 中触发回退条件时进入,是**异常出口**而非主线:
- 输出**暂停报告**(按"暂停报告格式"执行)
- 暂停 design 撰写,等待用户回到 requirements 解决
- 用户补充决策后,从步骤 1 重新评估(不重写已确定章节,但需重跑触发条件检查)
## 完成标准
- 工作流步骤 1-5 全部走过(步骤 6 是异常路径,正常路径不进入)
- 步骤 5 自检 6 项全部通过
- 未触发任何回退条件,或触发的回退已被解决并重新走过工作流
- design.md 无任何形式的"待确认 / TBD / 待讨论 / 开放问题"
- 所有触发条件命中时都执行了回退流程(事后可被审计)
## 规则速查
### 阶段职责(强制,适用于整个 code-drive workflow
- 正常流程requirements 是用户决策入口design / plan / tasks / apply 自治执行,不发起决策型提问
- 异常流程下游无法独立解决时回退上游apply 生成 blocker.md由 blocker-revise 决定修订入口
- 非决策交互仅限读取文件、运行命令、报告回退或 blocker 事实
requires:
- requirements
- id: plan
generates: plan.md
description: 从 design.md 派生的详细实现计划
template: plan.md
instruction: |
## 目标
撰写 plan.md把 design.md 的概要设计**展开**为可独立理解、可验证、可执行的实现阶段——回答"分几个阶段实现、每阶段做什么、如何验证"。
plan.md 的职责是**展开与具体化**:把 design.md 的关键决策展开为具体阶段、文件、函数签名、调用流程,使 tasks.md 可以只写 checkbox 而不必重新设计实现方案。不要在本阶段写 checkboxcheckbox 只属于 tasks.md。
tasks.md 的分组必须与 plan.md 的阶段一一对应,因此 plan.md 是 apply 阶段理解关键实现细节的主要依据。
本阶段承接 requirements.md、design.md。文档面向项目开发者。
## 输入
- requirements.md必需作为需求来源
- design.md必需作为设计唯一来源
- 已有 plan.md如存在则增量修订不重写未变部分
## 工具使用(先决说明)
本阶段可用工具:
- **todo / plan 工具**:复杂变更必须跟踪到工作流 X.Y 子步骤简单变更可省略标准design.md 阶段划分已明确、单文件变更、预期 < 100 行文档)
- **只读工具**Read / Grep / Glob / Bash 只读命令可用于核实函数签名、依赖路径、API 契约,不视为决策型交互
- **禁止**:不得使用 question / choice 发起决策型提问;决策型分歧必须走"回退上游流程"
- **注意**todo 跟踪文档撰写进度,不跟踪实现进度
## 回退上游流程(强制协议,适用于本阶段所有"无法独立解决"环节)
本流程是 plan 阶段**唯一**的异常出口。plan 的默认行为是**自治执行**——AI 自己把 design.md 展开为阶段,**只在真正无法独立解决时才回流**。回退的成本是打断整个流程让上游重新决策,因此触发条件 reserved 给"AI 真处理不了的高价值错误"**而不是任何信息增量**。
### AI 自决范围(不触发回退,直接处理并写入 plan.md
以下情况 AI **自行决策**并落地到 plan.md 对应章节,**不**触发回退:
- **阶段划分细节**design.md 未明确阶段顺序时)→ AI 给出阶段顺序并写明理由,写入"实现概览"
- **函数/数据结构具体化**design.md 给出方向但 plan 需要具体签名)→ AI 自决具体签名,写入"关键代码模式"
- **次要文件归类**design.md 影响范围列出但未明确归阶段)→ AI 直接归阶段,写入"涉及文件"
- **验证方式细节**design.md 验证方向较粗)→ AI 给出具体验证步骤,写入"验证方式"
- **阶段间依赖关系标注**(阶段间依赖关系)→ AI 自决并标注前置条件
- **可从 design.md/requirements.md 推断**的细节 → 按推断方向走,标注"基于 design.md/requirements.md 推断"
- **实现层取舍**API 风格、命名、错误处理模式)→ AI 给出理由 + 至少一个被否决方案,写入"关键代码模式/约定·模式"
### 触发条件(命中任一即必须启动回退流程,仅 3 条)
1. **核心实现方向决策真空**——展开 design.md 时发现**核心实现路径**(如阶段边界、关键模块的接入方式、关键数据流的走向)存在 2 个以上互相排斥且都合理的选择,**且选哪个会导致整体阶段划分或文件结构有本质差异**(不是细节差异)
- 不触发示例:某个函数的参数顺序(实现层);某个阶段内部步骤的顺序(细节);新增 vs 复用工具函数design.md 已暗示方向)
- 触发示例design.md 只说"用 ORM 屏蔽数据库差异"但 plan 展开发现需要先重构数据访问层,重构方向有 2 个互斥选项
2. **核心前提错误**——展开阶段细节时发现 design.md 的**核心设计前提**(如"某接口存在且契约稳定""某依赖 API 满足需求""某模块可独立修改不影响其他")与代码库事实**不符,且这种不符会让整个实现计划失效**(必须重新设计才能继续)
- 不触发示例API 参数略不同AI 适配);版本差异但兼容;某模块需要小修改
- 触发示例design.md 假设"调用 X 库的 Y 接口",但展开时发现 Y 接口已被废弃且替代接口契约完全不同
3. **必须扩展本次业务范围或引入核心新依赖**——发现要落地 design.md 已确认的设计,**必须**做以下之一:
- (a) **扩展本次变更的业务范围**(如发现某个阶段实际需要重写相邻模块才合理)
- (b) **引入 design.md 未确认的核心外部依赖**(业务运行依赖,非纯开发/构建工具)
- 不触发示例新增开发依赖lint、类型定义引用项目内已有但未被点名的工具函数新增测试用 mock 库
### 暂停报告格式(强制)
触发回退时,**必须暂停撰写**,按以下格式输出报告,不得在 plan.md 中以任何形式保留"待确认/TBD/待讨论"条目:
- **触发条件编号 + 命中证据**:明确指出命中了第几条触发条件,附上具体证据(引用 design.md / requirements.md 的相关段落或代码库发现),并说明为何不属于"AI 自决范围"
- **回退到哪个 artifact**:明确指向 design默认或 requirements仅当问题源于需求层决策
- **影响 plan.md 哪些阶段或章节**:列出哪些阶段或章节因此无法继续撰写
- **需要在上游补充的具体决策点**:列出上游需要补充回答的具体问题,每个问题给出 2-3 个候选选项 + 推荐方案 + 取舍说明(与 requirements 提问格式一致)
- **本阶段当前进度**:当前已完成到哪个步骤、暂停时正在撰写什么
### 强制语义(不得跳过)
- 触发条件命中时**必须**启动回退流程,即使你倾向"自己决定"或"假设一个合理默认"
- **不得**用"等用户回复后再继续"模糊处理——必须明确暂停并报告
- **不得**在 plan.md 中以"待确认""TBD""待讨论""开放问题""待补充"形式保留任何条目
- **反向约束**:未命中触发条件时**不得**主动询问用户——AI 自决范围内的情况一律自决,不得以"为求保险"为由把决策推回用户
- 用户在上游补充决策后,回到 plan 步骤 1 重新评估(不重写已确定章节,但需重跑回退触发条件检查)
### 回退归档规则
用户在 design / requirements 阶段补充决策后:
1. 上游 .md 更新为最新版本plan.md 引用更新后的内容
2. plan 中此前无法继续的阶段或章节,按新决策补全
3. 此前的暂停报告**不得以任何形式保留**在 plan.md 中(不设"回退记录"章节)
4. 新决策若引发新的回退触发条件 → 回到回退流程
## 工作流
### 步骤 1: 读取上游并评估展开充分性
合并"读上游、判断 design 是否够细到可展开"两件事,避免在判断未定时就深入阶段划分。
**子步骤 1.1: 读取 requirements.md 与 design.md**
- 完整读取 design.md识别关键决策、影响范围、关键实现路径、验证方向
- 完整读取 requirements.md对齐功能需求与非功能需求的验收标准
**子步骤 1.2: 评估展开充分性**
按 3 个判断点逐一检查:
- design.md 的关键决策是否细到可以拆出明确阶段?(如只说"重构数据层"→ 太粗;说"分 3 步:先抽象接口、再实现、再迁移调用方"→ 够细)
- design.md 的影响范围是否明确到文件级别?
- design.md 的"关键实现路径"是否给出优先级?
**子步骤 1.3: 判断走向**
- 三项均已充分 → 进入步骤 2
- 任一项不充分但属于 AI 自决范围(如阶段顺序推断)→ 标注推断后进入步骤 2
- 任一项不充分且命中触发条件 1/2/3 → 立即启动回退流程,进入步骤 6
### 步骤 2: 阶段划分与"涉及文件"汇总
**子步骤 2.1: 划分主要阶段**
- 基于 design.md 的"关键实现路径"和"影响范围"识别主要实现阶段
- 每个阶段必须有明确目标、能独立验证或显式声明前置依赖
- 阶段顺序按依赖关系排(如先抽象、后实现、再迁移)
**子步骤 2.2: 撰写每个阶段的"目标 / 前置条件 / 关联需求"**
- 目标:本阶段要完成什么(对齐 design.md 的关键决策)
- 前置条件:本阶段开始前必须满足什么(依赖哪个前置阶段);没有则写"无"
- 关联需求:对齐 requirements.md 的功能编号(如 F1、F2
**子步骤 2.3: 汇总"涉及文件"**
- 按阶段列出涉及的核心文件路径、变更类型(新增/修改/删除)
- 写入 plan.md "涉及文件" 章节(统一表格)
**子步骤 2.4: 检查回退触发条件**
- 阶段划分过程中是否暴露触发条件 1/2/3
- 先判断是否属于"AI 自决范围";不属于再判断是否命中触发条件
- 命中 → 启动回退流程;未命中 → 进入步骤 3
### 步骤 3: 撰写各阶段细节
逐阶段填写"详细实现步骤 / 关键代码模式 / 验证方式 / 验收标准"。
**子步骤 3.1: 详细实现步骤**
- 写清楚关键文件、函数、数据结构、流程或配置变化
- **不要使用 checkbox**checkbox 只属于 tasks.md
- 步骤要具体到函数签名级别或调用流程级别,不得只描述"做什么"而不展示"怎么做"
**子步骤 3.2: 关键代码模式**
- 新增/修改的函数或方法(签名、参数、返回值、核心逻辑)
- 新增/修改的数据结构(类型定义、字段、约束)
- 调用顺序/流程(关键调用链、异步流程、状态转换)
- 约定/模式(命名规范、错误处理模式、日志规范)
- 没有则写"无"
**子步骤 3.3: 验证方式 + 验收标准**
- 验证方式:本阶段如何独立验证(自动化测试/手动检查/具体步骤)
- 验收标准:本阶段完成的可验证标准,对齐 requirements.md 验收标准
撰写过程中遇到触发条件 1/2/3 时,立即启动回退流程;上游补充后继续撰写。注意:函数签名、数据结构、命名等实现层取舍属于"AI 自决范围",直接写入对应章节即可,不触发回退。
### 步骤 4: 撰写全局章节
**子步骤 4.1: 实现概览**
- 概述实现阶段、依赖顺序,以及各阶段如何对应 requirements.md 和 design.md
**子步骤 4.2: 验证策略**
- 汇总各阶段验证方式 + 整体验证
- 把 design.md 的"验证方向"作为输入,确保验证角度对齐
**子步骤 4.3: 回退/兼容性说明**
- 回退策略 / 错误处理 / 兼容性 / 迁移注意事项;没有则写"无"
**子步骤 4.4: 检查回退触发条件**
- 全文撰写完成后是否暴露此前未发现的触发条件 1/2/3
- 先判断是否属于"AI 自决范围";不属于再判断是否命中触发条件
- 命中 → 启动回退流程;未命中 → 进入步骤 5
### 步骤 5: 自检(逐项内联修复,无需二次 review
按以下清单逐项检查,发现问题立即修复后**重跑该项**
- [ ] **design 覆盖**design.md 的每个关键决策在 plan.md 中都有实现路径;影响范围的所有项都被某个阶段覆盖
- [ ] **阶段独立性**:每个阶段能独立验证,或明确说明依赖哪个前置阶段
- [ ] **占位符扫描**:详细实现步骤和关键代码模式无含糊;以下都属于占位符,必须用具体内容替换:
- "TBD"、"TODO"、"待补充"、"implement later"、"fill in details"
- "添加适当的错误处理"、"add validation"、"handle edge cases"(没有具体策略)
- "类似阶段 N"、"Similar to Task N"(必须重复写出实际内容)
- 只描述做什么不展示怎么做的步骤(代码步骤必须有具体函数签名、数据结构或调用流程)
- 引用任何阶段都未定义的函数、类型或方法名
- [ ] **类型一致性**:后续阶段引用的函数名、参数、类型签名与前置阶段定义的匹配
- [ ] **验证闭环**每个阶段的验证方式能独立确认该阶段完成design.md 的"验证方向"在"验证策略"中有体现
- [ ] **待确认清零**:全文无"待确认""TBD""待讨论""待补充""开放问题"等未决条目
自检全部通过 → 本阶段完成;任一项失败 → 修复后从该项重跑,必要时回到步骤 3-4。
### 步骤 6: 触发回退(异常路径)
此步骤仅在步骤 1-5 中触发回退条件时进入,是**异常出口**而非主线:
- 输出**暂停报告**(按"暂停报告格式"执行)
- 暂停 plan 撰写,等待用户回到上游解决
- 用户补充决策后,从步骤 1 重新评估(不重写已确定章节,但需重跑触发条件检查)
## 完成标准
- 工作流步骤 1-5 全部走过(步骤 6 是异常路径,正常路径不进入)
- 步骤 5 自检 6 项全部通过
- 未触发任何回退条件,或触发的回退已被解决并重新走过工作流
- plan.md 无任何形式的"待确认 / TBD / 待讨论 / 待补充 / 开放问题"
- 所有触发条件命中时都执行了回退流程(事后可被审计)
## 规则速查
### 阶段职责(强制,适用于整个 code-drive workflow
- 正常流程requirements 是用户决策入口design / plan / tasks / apply 自治执行,不发起决策型提问
- 异常流程下游无法独立解决时回退上游apply 生成 blocker.md由 blocker-revise 决定修订入口
- 非决策交互仅限读取文件、运行命令、报告回退或 blocker 事实
requires:
- requirements
- design
- id: tasks
generates: tasks.md
description: 从 plan.md 派生的可跟踪执行清单
template: tasks.md
instruction: |
## 目标
撰写 tasks.md把 plan.md 的实现阶段**拆解**为 OpenSpec apply 可跟踪的 checkbox 任务清单——回答"每个阶段具体做哪几个动作、按什么顺序、何时验证"。
tasks.md 的职责是**拆解为可执行动作**每个任务是单个文件、单个函数或单个可验证行为级别的具体动作apply 阶段据此执行并跟踪进度。**不要在本阶段重新发明实现方案**——需要关键实现细节时引用 plan.md。
本阶段承接 requirements.md、design.md、plan.md。文档面向项目开发者和 apply 阶段的 AI 执行者。
## 输入
- requirements.md必需作为验收标准来源
- design.md必需作为关键决策来源
- plan.md**主要依据**,作为阶段划分和实现细节来源)
- 已有 tasks.md如存在则增量修订不重写未变部分
## 工具使用(先决说明)
本阶段可用工具:
- **todo / plan 工具**:复杂变更必须跟踪到工作流 X.Y 子步骤简单变更可省略标准plan.md 阶段数 ≤ 2、单文件变更、预期 < 50 行文档)
- **只读工具**Read / Grep / Glob / Bash 只读命令可用于核实文件路径、函数签名、命令是否可执行,不视为决策型交互
- **禁止**:不得使用 question / choice 发起决策型提问;决策型分歧必须走"回退上游流程"
- **注意**todo 跟踪文档撰写进度,不跟踪实现进度
## 回退上游流程(强制协议,适用于本阶段所有"无法独立解决"环节)
本流程是 tasks 阶段**唯一**的异常出口。tasks 的默认行为是**自治执行**——plan.md 已经把决策做完AI 只需把决策拆为 checkbox**只在真正无法独立解决时才回流**。回退的成本是打断整个流程让上游重新决策,因此触发条件 reserved 给"AI 真处理不了的高价值错误"**而不是任何信息增量**。
### AI 自决范围(不触发回退,直接处理并写入 tasks.md范围最广
以下情况 AI **自行决策**并落地到 tasks.md**不**触发回退:
- **任务拆分粒度**(每阶段 3-6 任务如何分布)→ AI 自决
- **任务描述措辞**(动词 + 文件路径 + 具体动作)→ AI 自决
- **测试穿插位置**(哪个验证任务放在哪个阶段)→ AI 自决
- **阶段内任务的依赖顺序**→ AI 自决
- **任务编号 X.Y**X 跟随 plan 阶段编号)→ AI 自决
- **plan.md 未给出明确函数签名但暗示了方向**→ AI 推断具体动作,描述写"基于 plan 阶段 N 推断"
- **"验证与收尾"分组的具体条目数**3-6 条之间调整)→ AI 自决
- **plan.md 的实现步骤较粗但可拆**(如 plan 说"添加参数校验"→ AI 拆为"定义校验 schema"+"接入到入口函数"+"补单元测试")→ AI 自决
- **plan.md 阶段命名需要细化**(如 plan 阶段名过于宽泛时tasks 分组标题可加补充限定)→ AI 自决
### 触发条件(命中任一即必须启动回退流程,仅 3 条,比 plan 阶段更严)
1. **plan.md 核心实现路径完全缺失**——某个 plan 阶段完全没有"详细实现步骤"或"关键代码模式"AI 无法从中拆出任何具体动作,**且该阶段是本次变更的核心**(不是次要阶段、非验证收尾阶段)
- 不触发plan 阶段描述较粗但可推断(属于 AI 自决次要阶段如纯文档更新plan 给出方向但细节较粗
- 触发plan 的核心阶段只写"实现 X 模块"没有任何路径细节AI 无法拆出任何具体动作
2. **核心前提错误**——plan.md 假设的**核心接口、函数或数据结构**与代码库事实不符,且这种不符会让整个阶段的任务无法执行(必须重新设计阶段实现路径才能继续)
- 不触发函数签名略不同AI 适配);版本差异但兼容;某文件路径需要小调整
- 触发plan 假设"调用 X 库的 Y 接口",但拆任务时发现 Y 接口已被废弃且替代接口契约完全不同
3. **必须扩展本次业务范围或引入核心新依赖**——执行 plan 阶段时发现需要扩展本次变更的业务范围,或引入 plan.md 未确认的核心外部依赖(业务运行依赖,非纯开发/构建工具)
- 不触发新增开发依赖lint、类型定义引用项目内已有但未被点名的工具函数新增测试用 mock 库
### 暂停报告格式(强制)
触发回退时,**必须暂停撰写**,按以下格式输出报告,不得在 tasks.md 中以任何形式保留"待确认/TBD/待讨论"条目:
- **触发条件编号 + 命中证据**:明确指出命中了第几条触发条件,附上具体证据(引用 plan.md 的相关段落或代码库发现),并说明为何不属于"AI 自决范围"
- **回退到哪个 artifact**:明确指向 plan默认或 design/requirements仅当问题源于更上游
- **影响 tasks.md 哪些分组或任务**:列出哪些分组因此无法继续撰写
- **需要在上游补充的具体决策点**:列出上游需要补充回答的具体问题,每个问题给出 2-3 个候选选项 + 推荐方案 + 取舍说明(与 requirements 提问格式一致)
- **本阶段当前进度**:当前已完成到哪个步骤、暂停时正在撰写哪个分组
### 强制语义(不得跳过)
- 触发条件命中时**必须**启动回退流程,即使你倾向"硬拆任务"或"先做能拆的部分"
- **不得**用"等用户回复后再继续"模糊处理——必须明确暂停并报告
- **不得**在 tasks.md 中以"待确认""TBD""待讨论""开放问题""待补充"形式保留任何条目
- **反向约束**:未命中触发条件时**不得**主动询问用户——AI 自决范围内的情况一律自决,不得以"为求保险"为由把决策推回用户
- 用户在上游补充决策后,回到 tasks 步骤 1 重新评估(不重写已确定分组,但需重跑回退触发条件检查)
### 回退归档规则
用户在上游补充决策后:
1. 上游 .md 更新为最新版本tasks.md 引用更新后的内容
2. tasks 中此前无法继续的分组,按新决策补全
3. 此前的暂停报告**不得以任何形式保留**在 tasks.md 中(不设"回退记录"章节)
4. 新决策若引发新的回退触发条件 → 回到回退流程
## 工作流
### 步骤 1: 读取上游并评估可拆分性
合并"读上游、判断 plan 是否够细到可拆任务"两件事。
**子步骤 1.1: 读取 plan.md主要依据**
- 完整读取 plan.md识别阶段划分、每阶段的"详细实现步骤"和"关键代码模式"
- 对齐 requirements.md 的验收标准和 design.md 的关键决策(避免拆解时偏离)
**子步骤 1.2: 评估可拆分性**
按 3 个判断点逐一检查每个 plan 阶段:
- 该阶段是否有足够细节让你拆出 3-6 个具体动作(每个动作能落到单文件、单函数或单可验证行为级别)?
- 该阶段的"详细实现步骤"和"关键代码模式"是否覆盖了该阶段要做的事?
- 该阶段的"验收标准"是否能转化为 1-2 个验证任务?
**子步骤 1.3: 判断走向**
- 所有阶段均可拆 → 进入步骤 2
- 某个阶段较粗但属于 AI 自决范围(如实现步骤较粗但可拆)→ 标注推断后进入步骤 2
- 某个阶段命中触发条件 1/2/3 → 立即启动回退流程,进入步骤 5
### 步骤 2: 拆分各 plan 阶段任务
逐阶段处理。每个 plan 阶段生成一个 `## X. <分组标题>` 任务分组。
**子步骤 2.1: 建立分组对应**
- 每个 plan.md 阶段必须有一个对应的 `##` 编号任务分组
- 分组编号 X 与 plan 阶段编号一致
- 分组标题应与 plan.md 阶段名称一致或明显对应plan 阶段名过于宽泛时可加补充限定)
**子步骤 2.2: 拆分动作任务3-6 个/阶段)**
- 每个阶段拆解为 3-6 个具体动作任务(不含"阅读 plan.md"的元任务)
- 每个任务 MUST 是单行 checkbox`- [ ] X.Y 任务描述`
- 任务描述格式:动词 + 文件/模块 + 具体动作(如"修改 src/auth.ts 的 login 函数,添加参数校验"
- 粒度控制在**单个文件、单个函数或单个可验证行为**级别
- 按依赖顺序排;可并行任务也明确前置条件
- 任务粒度控制在"能在单个会话内完成、完成标准明确"
**子步骤 2.3: 穿插验证任务**
- 每个阶段必须有至少 1 个验证任务(运行测试、手动检查或具体验证命令)
- 验证任务穿插在阶段内(紧跟关键实现任务之后),**不要**全部集中到最后
- 阶段最后一个任务建议是"按 plan.md 阶段 N 的验收标准确认阶段完成"
**子步骤 2.4: 元任务(每阶段第一条)**
- 每个分组的第一条任务建议是"阅读 plan.md 阶段 N确认涉及文件、关键代码模式和验收标准"
- 这是给 apply 阶段的"加载上下文"提示,不是实际执行任务
**子步骤 2.5: 检查回退触发条件**
- 拆分过程中是否暴露触发条件 1/2/3
- 先判断是否属于"AI 自决范围";不属于再判断是否命中触发条件
- 命中 → 启动回退流程;未命中 → 进入步骤 3
### 步骤 3: 撰写"验证与收尾"分组
最后一个分组**必须是**"验证与收尾"(编号紧接前一阶段 +1
**子步骤 3.1: 必需条目**
至少包含以下条目(具体可调整数量):
- 阅读 plan.md 验证策略,确认所有验证项已执行
- 执行完整测试套件,确认无回归
- 逐项对照 requirements.md 验收标准,确认全部满足
- 检查 design.md 关键决策是否被正确实现
**子步骤 3.2: 可选条目(按需添加)**
- 如果行为、流程、接口、配置或使用方式发生变化,更新相关文档或交接说明
- 检查依赖与约束章节,确认无遗漏
- 确认所有任务已标记为 `[x]`,未完成或阻塞事项已记录
**子步骤 3.3: 检查回退触发条件**
- 撰写收尾分组时是否暴露此前未发现的触发条件 1/2/3
- 先判断是否属于"AI 自决范围";不属于再判断是否命中触发条件
- 命中 → 启动回退流程;未命中 → 进入步骤 4
### 步骤 4: 自检(逐项内联修复,无需二次 review
按以下清单逐项检查,发现问题立即修复后**重跑该项**
- [ ] **checkbox 格式**:每个任务都是 `- [ ] X.Y 任务描述` 单行格式apply 阶段会解析此格式,**未使用 `- [ ]` 的任务不会被跟踪**
- [ ] **分组对应**:每个 plan.md 阶段都有对应的 `##` 分组;分组编号与 plan 阶段编号一致
- [ ] **占位符扫描**:无模板注释(`<!-- ... -->`)、英文模板任务、"待补充""TBD""TODO"或占位任务文本;所有任务描述都是具体动作
- [ ] **粒度合理**:每阶段 3-6 个具体动作任务;每个任务落到单文件/单函数/单可验证行为级别
- [ ] **测试穿插**:每阶段至少 1 个验证任务,穿插在阶段内而非全部集中到最后
- [ ] **plan 覆盖**plan.md 每个阶段的"详细实现步骤"和"关键代码模式"都被拆到任务里plan 的"验证策略"被收尾分组覆盖
- [ ] **依赖顺序**:任务按依赖顺序排;可并行任务明确前置条件
- [ ] **待确认清零**:全文无"待确认""TBD""待讨论""待补充""开放问题"等未决条目
自检全部通过 → 本阶段完成;任一项失败 → 修复后从该项重跑,必要时回到步骤 2-3。
### 步骤 5: 触发回退(异常路径)
此步骤仅在步骤 1-4 中触发回退条件时进入,是**异常出口**而非主线:
- 输出**暂停报告**(按"暂停报告格式"执行)
- 暂停 tasks 撰写,等待用户回到上游解决
- 用户补充决策后,从步骤 1 重新评估(不重写已确定分组,但需重跑触发条件检查)
## 完成标准
- 工作流步骤 1-4 全部走过(步骤 5 是异常路径,正常路径不进入)
- 步骤 4 自检 8 项全部通过
- 未触发任何回退条件,或触发的回退已被解决并重新走过工作流
- tasks.md 无任何形式的"待确认 / TBD / 待讨论 / 待补充 / 开放问题 / 模板注释"
- 所有 checkbox 都是 `- [ ] X.Y 任务描述` 格式apply 可跟踪)
- 所有触发条件命中时都执行了回退流程(事后可被审计)
## 规则速查
### 阶段职责(强制,适用于整个 code-drive workflow
- 正常流程requirements 是用户决策入口design / plan / tasks / apply 自治执行,不发起决策型提问
- 异常流程下游无法独立解决时回退上游apply 生成 blocker.md由 blocker-revise 决定修订入口
- 非决策交互仅限读取文件、运行命令、报告回退或 blocker 事实
requires:
- requirements
- design
- plan
apply:
requires:
- requirements
- design
- plan
- tasks
tracks: tasks.md
instruction: |
## 目标
按 tasks.md 的 checkbox 顺序**执行变更**——逐项实现任务、收集验证证据、标记完成状态,使本次变更落到代码库中并可被审计。
apply 的职责是**执行而非设计**:所有实现路径、函数签名、依赖选择、阶段划分都已在 plan.md / design.md / requirements.md 中确定apply 只负责把这些设计转化为代码、测试、配置或文档的实际变更。**不要在本阶段重新决策实现方向**——遇到决策型分歧必须走 blocker 机制。
本阶段承接 requirements.md / design.md / plan.md / tasks.md4 份 fact 来源)+ 项目代码库。
## 输入
- requirements.md需求/范围/验收/全局审查的事实来源)
- design.md技术方向/关键决策的事实来源)
- plan.md实现计划/关键代码模式的事实来源)
- tasks.md执行进度的事实来源apply 跟踪其 checkbox
- openspec/config.yaml 及 workflow context项目约束
- 项目代码库(实际变更对象)
## 工具使用(先决说明)
本阶段可用工具:
- **todo / plan 工具**:必须跟踪执行进度;每个未完成任务标记为 in_progress 或 pending完成后标记 completed并同步回 tasks.md checkbox
- **subagent / task 派发工具**:用于并行执行独立任务(详见步骤 4
- **读写工具**Read / Edit / Write / Grep / Glob / Bash 是主要工具
- **禁止**:不得使用 question / choice 发起决策型提问;决策型分歧必须走 blocker 机制
- **注意**todo 跟踪实际执行进度,不同于上游文档撰写进度
## Blocker 机制(强制协议,适用于本阶段所有"无法独立解决"环节)
本机制是 apply 阶段**唯一**的异常出口。apply 的默认行为是**按计划执行**——只在真正无法独立解决时才生成 blocker.md 中断流程。生成 blocker 的成本是中断整个变更流程让用户介入修订上游,因此触发条件 reserved 给"AI 真处理不了的高价值错误"**而不是任何信息增量**。
### AI 自决范围(不触发 blocker直接处理并落地到代码
以下情况 AI **自行决策**并落地到代码实现,**不**触发 blocker
- **函数体内部实现**plan.md 给出签名但未给出具体逻辑)→ AI 自决具体实现代码
- **次要 bug 修复**(执行过程中发现非核心 bug→ 顺手修复,在 PR 描述或 commit 信息中说明
- **命名/格式/注释调整**plan.md 未限定时)→ AI 自决
- **测试用例具体数据**plan.md 给出测试方向但未给数据)→ AI 自决具体测试数据
- **错误消息措辞**plan.md 未限定时)→ AI 自决
- **依赖路径或导入顺序调整**(兼容范围内)→ AI 自决
- **plan.md 阶段内步骤的微调**(不改变阶段目标或文件归属)→ AI 自决
- **可从 design.md/requirements.md/既有代码规范推断**的细节 → 按推断方向走
### 触发条件(命中任一即必须生成 blocker.md仅 3 条)
1. **核心实现路径不可行**——执行过程中发现 plan.md 的核心实现路径(核心模块的接入方式、关键数据流、关键算法)在代码库中**无法落地**,且没有可推断的替代路径
- 不触发函数签名略不同AI 适配);某 API 调用方式略不同AI 适配);某依赖版本差异但兼容
- 触发plan 假设"通过 X 库的 Y 接口实现",但 Y 接口不存在且替代接口契约差异巨大plan 的核心算法在目标语言中无法实现
2. **核心前提错误**——执行过程中发现 requirements.md/design.md/plan.md 的核心假设("某接口存在且稳定""某依赖满足需求""某模块可独立修改")与代码库事实不符,**且这种不符会让整个变更方向失效**
- 不触发API 参数略不同;模块需要小修改;版本差异兼容
- 触发design 假设的核心抽象在重构后已不存在plan 假设的核心数据结构已被替换
3. **必须扩展本次业务范围或引入核心新依赖**——执行过程中发现要落地已确认的设计,**必须**做以下之一:
- (a) **扩展本次变更的业务范围**(如发现某个核心模块实际需要重写相邻模块才合理)
- (b) **引入 plan.md/design.md/requirements.md 未确认的核心外部依赖**(业务运行依赖,非纯开发/构建工具)
- 不触发新增开发依赖lint、类型定义引用项目内已有但未被点名的工具函数新增测试用 mock 库
### Blocker 触发动作(强制)
触发 blocker 时,**必须暂停执行**,在当前 change 目录生成 blocker.md
- 按 `openspec/schemas/code-drive/templates/blocker.md` 模板结构填写
- 模板要求的具体章节、字段和填写规范由模板本身和 `openspec/schemas/code-drive/prompts/blocker-revise.md` 定义
- **apply 阶段不重新发明 blocker.md 的结构**
生成 blocker.md 后,明确告诉用户:
> 阻塞已记录在 blocker.md。请读取并执行 `openspec/schemas/code-drive/prompts/blocker-revise.md` 中的修订流程。修订完成后可重新运行 apply已完成的 checkbox 任务会被跳过。
### 强制语义(不得跳过)
- 触发条件命中时**必须**生成 blocker.md即使你倾向"先做完能做的"或"假设一个合理默认"
- **不得**用"等用户回复后再继续"模糊处理——必须明确暂停并生成 blocker.md
- **不得**在 tasks.md 或代码注释中以"待确认""TBD""待讨论""开放问题"形式保留任何条目
- **反向约束**:未命中触发条件时**不得**主动询问用户——AI 自决范围内的情况一律自决,不得以"为求保险"为由把决策推回用户
- 用户通过 blocker-revise 解决阻塞后apply 从中断点继续(已完成的 checkbox 会被跳过)
### Blocker 归档规则
用户通过 blocker-revise 解决阻塞后:
1. 上游 .md 更新为最新版本(按 blocker-revise 指引)
2. apply 重新读取上游,从中断点继续;如有任务编号或描述变更,先同步 tasks.md
3. blocker.md 文件本身**保留**作为审计记录,但不得在任何 artifact 中引用其内容作为决策依据
4. 新决策若引发新的 blocker 触发条件 → 回到 blocker 流程
## 工作流
### 步骤 1: 加载上下文
**子步骤 1.1: 阅读上游 4 份 artifact**
按顺序读取requirements.md → design.md → plan.md → tasks.md。
**子步骤 1.2: 阅读项目 context**
读取 openspec/config.yaml 及 workflow context按 artifacts 引用读取相关项目或 workflow 文档。
**子步骤 1.3: 建立 fact 来源映射**
明确以下映射(后续步骤遇到分歧时按此优先级判断):
- 需求 / 范围 / 验收 / 全局审查 → requirements.md
- 技术方向 / 关键决策 → design.md
- 实现计划 / 关键代码模式 → plan.md
- 执行进度 / 任务依赖顺序 → tasks.md
### 步骤 2: 规划执行
**子步骤 2.1: 扫描 tasks.md**
- 识别所有未完成的 `- [ ]` 任务
- 按依赖顺序排序tasks.md 已给出依赖关系)
- 识别可并行任务(属于不同 plan.md 阶段或同阶段内明确独立的工作单元)
**子步骤 2.2: 建立 todo 列表**
- 每个未完成任务对应一个 todo item
- todo 顺序与 tasks.md 一致
- 复杂任务可拆为多个 todo item颗粒度由 AI 自决)
**子步骤 2.3: 检查 blocker 触发条件**
- 扫描阶段是否暴露触发条件 1/2/3
- 先判断是否属于"AI 自决范围";不属于再判断是否命中触发条件
- 命中 → 启动 blocker 流程;未命中 → 进入步骤 3
### 步骤 3: 逐任务执行(核心循环)
对每个未完成任务循环执行子步骤 3.1-3.5。
**子步骤 3.1: 加载任务上下文**
- 读取该任务在 tasks.md 中的描述
- 读取 plan.md 对应阶段的"涉及文件""关键代码模式""验收标准"
- **不要只凭 tasks.md 的短描述自行设计实现方案**
**子步骤 3.2: 执行实现**
- 按 plan.md 的关键代码模式实现(修改代码、新增文件、调整配置等)
- 实现 layer 取舍(命名、错误处理、内部逻辑)属于 AI 自决范围
- 涉及决策型分歧 → 检查触发条件 1/2/3
**子步骤 3.3: 收集验证证据**
- 运行 plan.md 该阶段"验证方式"指定的命令测试、构建、lint、手动检查
- 必须用**实际命令输出、测试结果或可观察行为**作为证据
- 完成声明禁用模糊措辞:不得用"应该""大概""看起来"作为完成依据
**子步骤 3.4: 标记完成(仅在有证据时)**
- 任务执行完成且**获得新的实际验证证据**后,才能将 tasks.md 中对应行标记为 `[x]`
- 不得基于假设、推测或"应该可以"标记完成
- 同步更新 todo 工具状态为 completed
**子步骤 3.5: 检查 blocker 触发条件**
- 本任务执行过程中是否暴露触发条件 1/2/3
- 先判断是否属于"AI 自决范围";不属于再判断是否命中触发条件
- 命中 → 立即启动 blocker 流程(暂停后续任务);未命中 → 进入下一个任务
### 步骤 4: 并行执行(如可用)
仅在工具支持 subagent / task 派发时启用。
**子步骤 4.1: 识别可并行任务**
满足以下**全部**条件的任务可并行:
- 与已派发或正在执行的任务没有文件依赖
- 不依赖前置任务的输出或运行时副作用
- 属于不同 plan.md 阶段或同阶段内明确独立的工作单元
**子步骤 4.2: 派发 subagent**
每个 subagent 完成后必须返回:
- 执行结果摘要
- 变更文件列表
- 验证证据(命令输出或测试结果)
**子步骤 4.3: 合并结果**
主 agent 负责:
- 合并 subagent 结果
- 更新 tasks.md checkbox**不让 subagent 直接写 tasks.md**
- 处理冲突(如不同 subagent 改了同一文件的不同部分)
**子步骤 4.4: subagent 不可用时**
退化为串行执行(步骤 3不影响正确性。
### 步骤 5: 触发 blocker异常路径
此步骤仅在步骤 2-4 中触发 blocker 条件时进入,是**异常出口**而非主线:
- 生成 blocker.md按"Blocker 触发动作"执行)
- 暂停执行,等待用户运行 blocker-revise
- 用户解决阻塞后apply 从中断点继续
### 步骤 6: 完成确认(最后一个任务后)
**子步骤 6.1: 扫描完成状态**
- tasks.md 中所有任务都是 `[x]`
- todo 工具中所有 item 都是 completed
- 最后一个"验证与收尾"分组的所有验证任务都已通过
**子步骤 6.2: 最终一致性检查**
- 任意任务中产生的 blocker.md 是否已通过 blocker-revise 解决
- 任意任务中残留的"待确认""TBD""待讨论"是否已清零
**子步骤 6.3: 输出完成报告**
简要总结:
- 完成任务总数
- 变更文件列表
- 验证证据汇总(关键测试输出 / lint 结果)
- 是否产生过 blocker.md如有记录解决路径
## 完成标准
- tasks.md 中所有任务都已标记为 `[x]`
- 所有任务都有实际验证证据(命令输出 / 测试结果 / 可观察行为)
- 未触发任何 blocker 条件,或触发的 blocker 已通过 blocker-revise 解决并继续执行
- 代码库 / tasks.md / 任何文件中无"待确认 / TBD / 待讨论 / 待补充 / 开放问题"残留
- 所有触发条件命中时都生成了 blocker.md事后可被审计
- 输出了完成报告
## 规则速查
### 阶段职责(强制,适用于整个 code-drive workflow
- 正常流程requirements 是用户决策入口design / plan / tasks / apply 自治执行,不发起决策型提问
- 异常流程下游无法独立解决时回退上游apply 生成 blocker.md由 blocker-revise 决定修订入口
- 非决策交互仅限读取文件、运行命令、报告回退或 blocker 事实