spec-plan(I1:实现计划 / plan.md SSOT)
概览
I1 的目标是把 {FEATURE_DIR}/requirements/* 与 {FEATURE_DIR}/design/* 转换为可直接执行的实现编排:主产物为 {FEATURE_DIR}/implementation/plan.md(Spec 级 SSOT:任务列表、依赖、AC 映射、分支映射、Phase C 门禁、整体进度摘要)。
启用 Task Pack / 多任务协作 时,同步在 {FEATURE_DIR}/implementation/tasks/<TASK_DIR>/ 落盘任务级 SSOT(task.md、status.yaml、review.md,按需 research.md、design.md),将高频执行态从 plan.md 下沉,避免多人争抢单文件。
单人单分支退化:可不创建 implementation/tasks/,仍在 plan.md 内展开完整步骤与勾选(与历史 I1 兼容)。
开始时宣布:「我正在使用 spec-plan 技能创建实现计划(plan.md SSOT)。」
何时使用 / 不使用
- 使用时机
- 你需要产出或更新
{FEATURE_DIR}/implementation/plan.md(I1 必做)。 - 你准备进入 I2 执行,但当前没有“可勾选 + 可执行”的任务清单。
- 你需要产出或更新
- 不要用在
spec-context失败、拿不到FEATURE_DIR(此时必须停止)。- 输入侧 SSOT 不足:
requirements/solution.md与requirements/prd.md都不存在,且无法追溯范围/验收(必须在 plan.md 标注 NEEDS CLARIFICATION 并阻断进入 I2)。
门禁 / 停止(严格执行)
REQUIRED SUB-SKILL:正在执行 spec-context 获取上下文,并在对话中回显 FEATURE_DIR=...(允许 (reuse))。
立刻停止(满足其一即可):
- 未得到
FEATURE_DIR - 分支/目录不确定(你发现自己想“猜
.aidlc/specs/...路径”) requirements/solution.md与requirements/prd.md均缺失,导致目标/范围/验收口径无法追溯- 任何关键不确定性无法在输入中证据化(必须写入
plan.md/## NEEDS CLARIFICATION,并明确“阻断进入 I2”)
输入 / 输出(落盘约定)
- 读取(渐进式披露,最少必要)
- 项目级(必读其索引或必要片段):
project/memory/*、project/contracts/、project/adr/- 优雅降级:若
.aidlc/project/不存在或上述索引文件缺失,标注CONTEXT GAP但不阻断 I1 流程;在plan.md的"影响范围与约束"段落中注明相应缺口来源为 CONTEXT GAP,并建议后续通过 Discover 或实际验证补齐
- 优雅降级:若
- Spec 级(按需最少读):
{FEATURE_DIR}/requirements/solution.md或{FEATURE_DIR}/requirements/prd.md(至少其一) - 影响分析(强制,若有 solution.md):必须读取
{FEATURE_DIR}/requirements/solution.md#impact-analysis,提取受影响模块清单与需遵守的不变量,作为 I1 的约束输入(缺失则停止并回到 R1 补齐) - Spec 级(如存在且相关):
{FEATURE_DIR}/design/design.md、{FEATURE_DIR}/design/research.md .gitmodules(如存在;用于识别可参与实现的 submodule 静态清单)
- 项目级(必读其索引或必要片段):
- 写入
- 必写:
{FEATURE_DIR}/implementation/plan.md - 可选(多任务 / 协作):对每个任务目录
{FEATURE_DIR}/implementation/tasks/<TASK_DIR>/初始化 Task Pack(从本技能assets/模板复制并填实):task.md←assets/task-template.mdstatus.yaml←assets/task-status.template.yamlreview.md←assets/task-review-template.md- 按需:
research.md←assets/task-research-template.md;design.md←assets/task-design-template.md
- 必写:
协作脚本(设计稿 §13.2 / §13.3)
以下脚本位于本技能 ./scripts/(源文件为 ASCII,避免 Windows PowerShell 5.1 在无 BOM 下解析 UTF-8 中文失败)。在消费仓库执行;当前分支可为 Spec 分支或任务分支(001-foo/T1-bar),亦可用 -FeatureDir 显式传入 Spec Pack 路径。
| 脚本 | 作用 |
|---|---|
task-collab-common.ps1 |
内部模块:点号加载,勿单独执行 |
init-task-pack.ps1 |
从 assets/ 模板生成 implementation/tasks/<TaskDir>/ |
new-task-branch.ps1 |
从 Spec 分支创建并切换 SpecBranch/TaskDir |
sync-task-status-summary.ps1 |
只读汇总各 status.yaml(可加 -Json) |
test-phase-c-gate.ps1 |
Phase B→C 任务级门禁(routing_status 全为 done、无 blocked) |
validate-task-branch.ps1 |
§13.3:任务分支门禁(Task Pack 目录须存在,可挂 pre-push) |
set-task-review-state.ps1 |
§13.3:写 in_review / task-review |
update-task-status-after-merge.ps1 |
§13.3:合回 Spec 后将任务标为 done |
test-spec-integration-gate.ps1 |
§13.3:调用 phase-c gate + 可选 -RequireCleanWorkingTree |
Git hook 样例:assets/githooks-pre-push-validate-task-branch.sample.ps1
示例(在消费仓库根目录,且已切到对应 Spec 或任务分支):
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>/scripts/init-task-pack.ps1" -TaskDir T1-user-api -Title "Login API"
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>/scripts/new-task-branch.ps1" -TaskDir T1-user-api
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>/scripts/sync-task-status-summary.ps1"
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>/scripts/test-phase-c-gate.ps1"
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>/scripts/validate-task-branch.ps1"
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>/scripts/set-task-review-state.ps1" -TaskDir T1-user-api
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>/scripts/update-task-status-after-merge.ps1" -TaskDir T1-user-api -PrUrl "https://example.com/pr/1"
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>/scripts/test-spec-integration-gate.ps1" -RequireCleanWorkingTree
与
spec-context的关系:spec-context已支持任务分支并输出TASK_WORK_BRANCH/TASK_DIR/TASK_PACK_DIR;worker 仍须先spec-context拿FEATURE_DIR。脚本面向人机 / CI,通过分支名或-FeatureDir解析,不替代spec-context门禁。Router 补充见using-aidlc的router/routing-collaboration.md。
小块任务粒度(重用 writing-plans)
每一步是一个动作(2–5 分钟),并在 plan.md 中写到“任何人照抄即可执行”:
- 「写失败测试」(如适用)- 一步
- 「运行确保失败」- 一步
- 「实现让测试通过的最少代码」- 一步
- 「运行验证确保通过」- 一步
- 「提交」(频繁提交;受 AUTO_COMMIT 控制,
AUTO_COMMIT=false时标记为"跳过(AUTO_COMMIT=false)"并列出变更文件清单)- 一步
约束:I1 只写计划,不写代码;但每个任务必须声明其最小验证方式(命令 + 期望信号)。
plan.md 头部(必须)
必须以该头部开头(完整结构见 ./assets/plan-template.md,含 AC 映射、任务依赖、任务索引、Phase C 门禁 等协作字段):
# [需求名] 实现计划(SSOT)
> **必需技能:** `spec-execute`(按批次执行本计划)
> **上下文获取:** 必须先执行 `spec-context` 获取上下文,定位 `{FEATURE_DIR}`,失败即停止
**目标:** [一句话描述要交付什么]
**范围:** In / Out
**架构:** [2–3 句方法说明 + 关键约束]
**验收口径:** [引用 requirements/solution.md 或 requirements/prd.md 的 AC/验收点]
**影响范围:** [引用 requirements/solution.md#impact-analysis 的受影响模块清单]
**需遵守的不变量:** [从 requirements/solution.md#impact-analysis 提取的关键 API/Data 契约不变量]
**子仓范围:** [若存在 `.gitmodules`,列出本次需求涉及的 submodule;无则写“无”]
---
计划正文(必须)
- TL;DR:一句话概括计划目标与范围
- 范围与边界:In/Out(对齐需求与设计)
- AC 映射:需求 AC → Task(协作模式推荐)
- 任务依赖:依赖图或表(与各 Task Pack
status.yaml中的depends_on一致) - 任务索引:Task ID、Owner、任务分支、
implementation/tasks/...路径(启用 Task Pack 时推荐) - Phase C 进入条件:门禁勾选(见模板)
- 影响范围与约束(必填):
- 受影响模块清单及影响类型(引用
requirements/solution.md#impact-analysis) - 需遵守的 API/Data 契约不变量(逐条列出,标注来源模块/锚点)
- 跨模块影响与协调事项(基于依赖关系图/影响分析)
- 受影响模块清单及影响类型(引用
- 代码工作区清单(如适用,必填):
- 从
.gitmodules引用受影响子仓路径 - 标记每个子仓是否
required - 默认分支要求:与根项目
CURRENT_BRANCH同名 - 若存在例外,显式记录
exception_reason
- 从
- 里程碑与节奏:阶段拆分、时间预估、交付物清单
- 依赖与资源:外部系统/团队/权限/环境/数据依赖
- 风险与验证:风险清单、验证方式、Owner
- 验收口径:对应 PRD/方案的关键 AC 与验收人
- NEEDS CLARIFICATION(必须有):统一列出未消除的不确定项(未消除前不得进入 I2)
任务结构(重用 writing-plans,但加入 SSOT/审计/门禁)
plan.md 内必须包含可勾选的任务清单(- [ ]/- [x])。勾选粒度为任务完成(Task done),而非每一个微步骤。
- 未启用 Task Pack:每个任务可在
plan.md内写全量步骤、验证与审计(历史模式)。 - 已启用 Task Pack:
plan.md保留任务级摘要、索引与完成勾选;完整步骤与高频状态写入对应目录的task.md与status.yaml(详见./assets/task-template.md)。
每个任务必须包含(在 plan.md 和/或对应 task.md 中补全,整体不可缺):
- 精确文件路径(创建/修改/测试)
- 可验证验收点(可测试条件)
- 可执行步骤(命令 + 期望输出/信号)
- 提交点与最小审计信息(按 repo 记录
branch/commit/pr/changed_files)
任务模板(示例骨架):
## 任务清单(SSOT)
### Task T1: [任务标题]
- [ ] **状态**:未开始 / 进行中 / 完成 / 阻塞(阻塞必须写明取证路径)
**代码仓范围:**
- 根项目:
- 子仓:(如适用;填写 `.gitmodules` 中的路径,并注明 `required=true/false`)
**文件:**
- 创建:`exact/path/to/new.file`
- 修改:`exact/path/to/existing.file`(可选:精确到段落/函数)
- 测试:`tests/exact/path/to/test.file`(如适用)
**验收点:**
- [可验证条件 1]
- [可验证条件 2]
**步骤 1:写失败测试(如适用)**
- 修改点:`tests/...`
- Run: `[精确命令]`
- Expected: FAIL(写出期望看到的关键失败信号)
**步骤 2:写最少实现**
- 修改点:`path/to/file`
**步骤 3:运行验证**
- Run: `[精确命令]`
- Expected: PASS(写出期望看到的关键通过信号)
**步骤 4:提交(受 AUTO_COMMIT 控制)**
- `AUTO_COMMIT=true`(默认):频繁提交;commit message 必须中文
- Commit message: `[一句话说明 why(中文)]`
- `AUTO_COMMIT=false`:跳过自动提交,输出"以下文件已变更,请手动提交:"及变更文件清单
- 审计信息:
- repo: `root`
branch: `{CURRENT_BRANCH}`
commit: `<TBD>`(`AUTO_COMMIT=false` 时填"手动提交")
pr: `<TBD>`
changed_files: `<TBD>`
- repo: `<submodule path>`(如适用)
branch: `{CURRENT_BRANCH}`
commit: `<TBD>`(`AUTO_COMMIT=false` 时填"手动提交")
pr: `<TBD>`
changed_files: `<TBD>`
命令书写约定:默认面向 PowerShell;同一行多命令请用
;分隔(不要用&&)。
I1-DoD(门禁:缺一不可)
- 计划范围与
{FEATURE_DIR}/requirements/*、{FEATURE_DIR}/design/*一致且可追溯 - 里程碑明确且可验收(每一项有对应产物或可验证标准)
- 依赖与风险已列出,并有最小验证/缓解动作(含 Owner)
- 关键验收口径可追溯(至少引用
requirements/prd.md或requirements/solution.md) - 影响范围与约束已注入:
plan.md包含"影响范围与约束"段落,受影响模块与需遵守的不变量已从requirements/solution.md#impact-analysis提取并逐条列出 - 若
.gitmodules存在且影响分析命中子仓:plan.md已声明受影响子仓、required标记、默认同名分支要求与例外原因 plan.md内存在“任务清单(SSOT)”,且每个任务包含:文件路径、验收点、最小验证方式、提交点与审计信息(可分布在plan.md与 Task Packtask.md中,但合并后须满足)- 若已创建 Task Pack:
plan.md含 任务索引(指向implementation/tasks/...),且各包内status.yaml的routing_status/activity_stage/depends_on与计划一致 - 任何不确定项均进入
NEEDS CLARIFICATION,且未消除前不得进入 I2
牢记(高频规则速查)
- 始终先执行
spec-context获取上下文,拿到FEATURE_DIR=...,失败就停止 - 始终写精确路径、精确命令与期望信号
- 不要把不确定性写成已知;统一进入
NEEDS CLARIFICATION并阻断 I2 - DRY、YAGNI、TDD、频繁提交(计划里也要体现提交节奏;
AUTO_COMMIT=false时提交步骤标记为"跳过(AUTO_COMMIT=false)"并改为列出变更文件清单) - 若本次实现涉及子仓:在 I1 中先写清受影响子仓与同名分支要求;子仓分支创建/校验发生在 I1 -> I2 之间
执行交接(写完 plan.md 之后)
保存计划后,本技能不再决定“下一步/执行方式”。统一做法:
- 宣布:
{FEATURE_DIR}/implementation/plan.md已落盘,且是 Spec 级编排 SSOT(若已初始化 Task Pack,任务级执行 SSOT 在implementation/tasks/*) - 提示:立即调用
using-aidlc路由下一步(通常路由到 I2:spec-execute,再到 Finish:finishing-development) - 若用户明确要求“本会话使用 subagent-driven-development 并行执行”,也应先调用
using-aidlc明确路由结论后再开始执行(避免出现第二个路由源)
完成后输出与自动路由(必须执行)
plan.md 落盘后,必须完成以下动作(按顺序,不可省略):
- 输出 ROUTER_SUMMARY(YAML 形态,供 Router 决策):
ROUTER_SUMMARY:
stage: I1
artifacts:
- "{FEATURE_DIR}/implementation/plan.md"
needs_human_review: false
blocked: false
block_reason: ""
notes: "软检查点:plan.md 建议评审;如不触发硬中断 Router 可继续自动推进"
立即执行
using-aidlc:将上述ROUTER_SUMMARY作为路由输入传递给 using-aidlc,由 Router 判定下一步并自动推进(无需等待用户说「继续」)。- 若 Router 判定可自动续跑:在同一轮对话内继续执行下一步 worker skill(如 I2、Finish 等)
- 若 Router 触发硬中断:停下并输出阻断原因、需要的输入、候选下一步
对话输出:在调用 using-aidlc 前,可简短说明「本阶段产物已落盘,正在调用 using-aidlc 路由下一步。」