Files
msd-core/docs/zh-CN/reference/plan-md.md
Jakub Zych a9a7a328e6 refactor: hard-fork GSD -> MSD (Make Software Done)
Mechanical rename produced by scripts/msd-rename.cjs: gsd/Gsd/GSD -> msd/Msd/MSD
across contents and paths, upstream package/repo coordinates -> @golem15/msd-core
and golem15com/msd-core. Deep links into upstream history, sibling upstream
packages, the GSD-2 import feature, CHANGELOG.md and .changeset/ are kept as-is.

Hand edits on top: MSD block-letter banner and logos, LICENSE copyright line,
package/plugin identity, regenerated lockfile, install-tree fixtures, derived
registries and benchmark baseline; migration checksum baseline re-locked
(MSD keeps its own install state, so no install had applied the old sums);
sort-order and regex-escaped expectations in tests adjusted.
2026-10-06 01:47:40 +02:00

12 KiB
Raw Blame History

PLAN.md 模式参考

每个计划的 PLAN.md 是 MSD Core 的可执行工作单元——一份结构化文档,精确告知执行器代理需要构建什么以及如何验证构建是否正确完成。本页记录其结构。参见文档索引。


概述

计划存放在以下位置的阶段目录中:

.planning/phases/<NN>-<slug>/<NN>-<PP>-PLAN.md

例如:.planning/phases/03-post-feed/03-02-PLAN.md(第 3 阶段,第 2 计划)。

计划由 msd-planner 代理生成(由 /msd-plan-phase 触发),并由 execute-phase 消费。一个阶段通常包含一到四个计划;同一阶段内的计划被分配到执行波次,以便独立工作并行运行。


YAML 前置元数据

每个 PLAN.md 以位于 --- 分隔符之间的 YAML 前置元数据块开头。

注释示例

---
phase: 03-post-feed
plan: 02
type: execute
wave: 2
depends_on: ["03-01"]
files_modified:
  - src/components/PostFeed.tsx
  - src/components/PostCard.tsx
  - src/app/feed/page.tsx
autonomous: true
requirements: ["FEED-01", "FEED-03"]
user_setup: []

must_haves:
  truths:
    - "User can scroll through posts from followed accounts"
    - "Each post shows author avatar, name, timestamp, and content"
    - "Empty state appears when no posts exist"
  artifacts:
    - path: "src/components/PostFeed.tsx"
      provides: "Scrollable post list"
      min_lines: 40
    - path: "src/components/PostCard.tsx"
      provides: "Individual post card"
      exports: ["PostCard"]
  key_links:
    - from: "src/components/PostFeed.tsx"
      to: "/api/feed"
      via: "fetch in useEffect"
      pattern: "fetch.*api/feed"
---

前置元数据字段参考

字段 是否必填 类型 用途
phase 是 string 阶段标识符,例如 03-post-feed。
plan 是 string 阶段内的计划编号,例如 02。
type 是 execute 或 tdd 标准计划使用 execute;测试驱动计划使用 tdd,测试在实现之前编写。
wave 是 integer 执行波次。波次 1 中的计划并行运行(无依赖关系)。波次 2 及以上的计划等待上一波次的所有计划完成后才开始。由 msd-planner 在规划时预先计算。
depends_on 是 array of plan IDs 该计划必须等待的前置计划。空数组表示波次 1。示例:["03-01"] 表示该计划在第 3 阶段计划 01 完成后运行。
files_modified 是 array of paths 该计划创建或修改的所有文件。被计划检查器用于检测同波次文件冲突,也被 execute-phase 用于合并跟踪。
autonomous 是 boolean 当所有任务类型均为 auto 时为 true。当计划包含任何需要人工交互的 checkpoint:* 任务时为 false。
requirements 是 array of IDs 该计划所对应的 ROADMAP.md 中的需求 ID。每个阶段需求 ID 必须出现在至少一个计划的 requirements 字段中。空数组是阻断项(BLOCKER)。
user_setup 否 array of objects Claude 无法自动化的外部服务设置步骤(账户创建、密钥获取、控制台配置)。存在时,execute-phase 会为开发者生成 USER-SETUP.md 检查清单。
must_haves 是 object 以目标为导向的验证标准。详见下文。

must_haves 字段

must_haves 描述了阶段目标达成后必须可观测到的真实状态。该字段在规划阶段派生,并在执行后由 msd-verifier 代理验证。

子字段

子字段 类型 用途
truths array of strings 从用户视角可观测到的行为。每项必须可验证。示例:"User can send a message",而非 "WebSocket library installed"。
artifacts array of objects 必须存在且具有实质性实现(非桩代码)的文件。
artifacts[].path string 相对于项目根目录的文件路径。
artifacts[].provides string 该文件所提供的能力。
artifacts[].min_lines integer(可选) 被视为非桩代码的最小行数。
artifacts[].exports array of strings(可选) 需要验证的预期命名导出项。
artifacts[].contains string(可选) 必须出现在文件中的正则表达式或字面量模式。
key_links array of objects 制品之间的关键连接——使系统端到端运行的接线。
key_links[].from string 源文件或组件。
key_links[].to string 目标文件、端点或模块。
key_links[].via string 连接方式描述(例如 fetch in useEffect、Prisma query、import)。
key_links[].pattern string(可选) 用于验证源代码中连接是否存在的正则表达式。

正文结构

前置元数据之后,计划正文使用执行器代理读取的具名 XML 风格块。

<objective>

说明计划所交付的内容及其对项目的重要性:

<objective>
Implement the post feed as a scrollable card list.

Purpose: Core display feature for the social feed phase.
Output: PostFeed and PostCard components wired to /api/feed.
</objective>

<execution_context>

列出执行器在开始前读取的工作流文件。始终包含 execute-plan 工作流;当计划包含检查点任务时,额外添加检查点参考:

<execution_context>
@~/.claude/msd-core/workflows/execute-plan.md
@~/.claude/msd-core/templates/summary.md
</execution_context>

<context>

引用执行器需要读取的源文件。包括项目级规划文档以及计划必须复用其模式或类型的源文件。仅当后续计划对其类型或决策存在真实依赖时,才引用前序计划的 SUMMARY.md 文件——而非无条件引用:

<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@src/components/UserCard.tsx
</context>

<tasks>

包含一个或多个 <task> 元素。对于 type="auto" 的任务,每个任务元素必须包含 <name>、<files>、<read_first>、<action>、<verify>、<acceptance_criteria> 和 <done>。


任务类型

类型 使用场景 自主程度
auto 执行器可独立完成的所有内容。 完全自主。
checkpoint:human-verify 需要人工查看运行中的界面或服务进行视觉或功能验证。 暂停执行;呈现给开发者;批准后恢复。
checkpoint:decision 执行过程中出现的需要开发者输入的实现选择。 暂停执行;呈现选项;选择后恢复。
checkpoint:human-action 真正不可避免的手动步骤(账户创建、硬件交互)。谨慎使用。 暂停执行;确认后恢复。

包含任何检查点任务的计划必须在前置元数据中设置 autonomous: false。


auto 任务结构

<task type="auto">
  <name>Task 1: Create PostCard component</name>
  <files>src/components/PostCard.tsx</files>
  <read_first>src/components/UserCard.tsx, src/types/post.ts</read_first>
  <action>Create PostCard component accepting a Post prop (id, authorId, content, createdAt,
    reactionCount). Render author avatar using UserAvatar from UserCard pattern. Show timestamp
    using date-fns formatDistanceToNow. Export as named export PostCard.</action>
  <verify>npx tsc --noEmit</verify>
  <acceptance_criteria>
    - src/components/PostCard.tsx exports named export PostCard
    - PostCard.tsx contains "reactionCount" prop usage
    - npx tsc --noEmit exits 0
  </acceptance_criteria>
  <done>PostCard renders post content with author and timestamp</done>
</task>

auto 任务必填字段

字段 规则
<files> 任务创建或修改的所有文件。执行器只写入这些文件。
<read_first> 执行器在修改任何内容之前必须读取的文件——包括待修改文件、任何真实来源的模式文件以及必须复用其类型或约定的文件。
<action> 包含精确标识符、文件路径、函数签名和预期值的具体指令。不能在未指定目标状态的情况下说"将 X 与 Y 对齐"。不包含代码围栏块或完整实现。
<verify> 可运行的命令或检查,用于证明任务已成功完成。必须能区分通过与失败——echo "done" 无效。
<acceptance_criteria> 可验证的条件:可通过 grep 验证的字符串、命令退出码、可观测行为。不含主观性语言("看起来正确"、"配置正确")。
<done> 已完成结果的简短可量化陈述。

计划质量维度

msd-plan-checker 代理在执行开始前对每个 PLAN.md 进行 12 个维度的审查。任何未通过 BLOCKER 级别检查的计划将被退回给 msd-planner 修订(最多 3 次迭代):

维度 检查内容
1 — 需求覆盖率 ROADMAP.md 中每个阶段需求 ID 出现在至少一个计划的 requirements 前置元数据字段中,并有相应的覆盖任务。
2 — 任务完整性 每个 auto 任务携带所有必填字段(<files>、<action>、<verify>、<acceptance_criteria>、<done>)。无模糊或空字段。
3 — 依赖正确性 depends_on 引用有效、无循环,并与波次编号一致。第 N 波次计划仅依赖波次 < N 的计划。
4 — 关键链接规划 must_haves.key_links 中的制品有对应的实现接线任务——而非仅创建制品。
5 — 范围合理性 计划保持在上下文预算内:每个计划 2–3 个任务(4 个 = 警告,5 个及以上 = BLOCKER),每个计划 ≤ 8–10 个文件(15 个及以上 = BLOCKER)。
6 — 验证推导 must_haves.truths 是用户可观测行为,而非实现细节。制品映射到真实状态。关键链接覆盖关键接线。
7 — 上下文合规性 CONTEXT.md 中每个 D-NN 决策至少由一个任务处理。没有任务实现 <deferred> 中的内容。
7b — 范围缩减检测 任务操作不会在未交付完整决策范围的情况下,悄悄将已锁定决策降级为"v1"、"桩代码"或"未来增强"。发现时始终为 BLOCKER。
7c — 架构层级合规性 任务按照 RESEARCH.md 架构责任映射(如存在)将能力分配到正确层级。安全敏感能力分配到错误层级时为 BLOCKER。
8 — 奈奎斯特合规性 当 workflow.nyquist_validation 已启用且 RESEARCH.md 存在时,每个任务有 <automated> 验证命令,连续 3 个任务的窗口内不缺少覆盖,且 VALIDATION.md 存在。
9 — 跨计划数据契约 当计划共享数据管道时,其转换相互兼容——没有计划删除另一个计划需要原始形式的数据。
10 — CLAUDE.md 合规性 计划遵守 ./CLAUDE.md 中的项目特定约定、禁止模式、必需工具和安全要求。
11 — 研究解决 当 RESEARCH.md 存在时,其 ## Open Questions 部分在规划继续之前标记为 (RESOLVED)。
12 — 模式合规性 当 PATTERNS.md 存在时,任务为每个新建或修改的文件引用正确的类比模式。

波次执行模型

波次编号在规划阶段预先计算。Execute-phase 按波次编号对计划进行分组,并行运行每个波次的计划:

Wave 1: Plan 01, Plan 02, Plan 03  (all run simultaneously — no dependencies)
Wave 2: Plan 04                    (waits for Wave 1 to complete)
Wave 3: Plan 05                    (waits for Wave 2 to complete)

同一波次中修改重叠文件的计划不得处于同一波次——计划检查器的维度 3 会将此标记为 BLOCKER。


计划输出

计划成功执行后,执行器在以下路径写入 SUMMARY.md:

.planning/phases/<NN>-<slug>/<NN>-<PP>-SUMMARY.md

SUMMARY.md 是所构建内容的权威记录。同一阶段内的后续计划,仅当对其类型或决策存在真实依赖时,才可引用该文件。


相关内容