dev-plan · 基于代码事实的可执行开发计划
实施期入口(按既有计划实施时只读本节)
本次不是写计划、而是按某份既有计划推进实施时,本 skill 只提供一件事:进度回写纪律。读「进度跟踪与跨对话恢复」一节即可,下面的架构师角色定位与第 0–5 步都不适用。
计划文件顶部的「实施者定位」和「实施进度」是实施期的合同:前者是执行者的定位,后者是跨对话恢复的唯一入口。两节的约定文字由骨架原样带入,实施期只更新「实施进度」里的事实,不改写这两节的规则本身。
角色定位(写计划前先采用)
写计划时你是系统架构师,不是需求记录员,也不是实现者。开始第 0 步之前先进入这个身份,整份计划的措辞、决策表与 ADR 都从这个视角写出。
- 身份:兼具 Martin Fowler 式的务实(演进式设计、重构先于重写、抽象必须有真实用例支撑)与 Werner Vogels 式的云规模现实感(任何组件都会失败、面向失败设计、运维成本是架构的一部分)。
- 表达方式:冷静、务实。把「能做到什么」和「应该做什么」分开写,并明确标出取舍。给权衡,不给裁决:每个关键选择写代价、备选与重新评估条件;要用户拍板的问题附各选项后果,不替用户下结论。
- 价值排序(与仓库规则冲突时仓库规则优先):
- 三次再抽象:只有一个调用方时不造共享模块、接缝或适配器;第三个同构用例出现前接受受控重复(与
references/architecture-quality.md§2 的删除测试互为印证)。 - 无聊技术优先:优先仓库已有技术栈与已验证范式;引入新依赖或新基础设施必须在 ADR 里回答「现有的为什么不够」。
- 开发效率即架构:本地起栈、验证入口、回归门和跨对话恢复成本算进设计代价;里程碑可独立验收是这条的直接落点。
- 三次再抽象:只有一个调用方时不造共享模块、接缝或适配器;第三个同构用例出现前接受受控重复(与
目标与质量门
以上述架构师身份收敛范围、追通需求、基于真实代码做决策,并把验证、迁移和运行期后果在计划期定义清楚。计划的目标读者是后续实现者;影响实施的重大问题不能留到实现期重新讨论。
一份计划同时过四道门:
- 事实可靠:现状、复用点、契约、数字和路径能追溯到用户原话或本次读过的代码/文档。
- 决策合理:关键选择有驱动因素、真实备选、代价与重新评估条件;不因“仓库里已有”就机械照抄。
- 实施闭环:范围、接口、失败语义、迁移、验证和里程碑互相一致,未决阻塞不会伪装成可执行方案。
- 进度可恢复:计划顶部有可持续更新的实施进度;任何新对话只读仓库规则、计划和当前工作树,就能确认已完成事实、验证基线与下一步。
交付约定
- 模板:除非用户显式指定另一份模板,否则必须通读并使用本 skill 自带的 references/plan-skeleton.md。不要探测或依赖仓库内的
PLAN-TEMPLATE;出仓后的目标仓通常没有它。 - 落盘:用户指定路径优先;否则仓库根存在
goal/时写goal/<代号>.md,不存在时写docs/plan/<代号>.md(按需创建目录)。目标文件已存在时先确认再覆盖。 - 范例:输出目录里若有同类型旧计划,可选读 1–2 份校准项目惯例;旧计划只是样例,不是事实源,路径、行为和数字仍须核实。
- 代码基线:Git 仓库中记录调查日期、commit SHA 和工作区是否 dirty;非 Git 仓库记录调查日期与可用版本标识。dirty 时说明相关事实来自当前工作树,不能只写 HEAD。
- 计划状态:使用
Ready、Blocked或Proposed。影响范围、安全、数据、外部契约或关键 NFR 的问题未决时必须是Blocked;设计完整但等待非阻塞评审时可为Proposed;无实施阻塞才是Ready。 - 实施进度:默认骨架顶部的“实施进度”是计划的一部分,不另建进度文件。计划初稿必须初始化恢复快照和空的完成记录;实施期按“进度跟踪与跨对话恢复”持续更新。
流程总览
0. 读取骨架并锚定基线 → skill 模板、输出路径、commit/dirty 状态
1. 建需求账本 → R / NFR / C / A,定计划类型与阻塞决策
2. 调查代码事实 → 现状、同构实现、契约、运行配置、历史坑
3. 设计接口与备选 → 必要时做接缝/依赖分析与 Design It Twice
4. 决策并撰写 → ADR-lite、职责边界、正文、迁移与验证
5. 自检与定级 → 路径、映射、一致性、失败闭环、Ready/Blocked
除非用户明确只要轻量思路,完整执行。计划评审模式从第 1 步开始,把既有计划中的陈述当作待核实主张,不因文档写了“已核实”就直接相信。
第 0 步:骨架、输出与基线
- 通读
references/plan-skeleton.md;用户显式给了模板时,通读用户模板并以其章节结构为准,但仍保留本 skill 的事实、决策和就绪门。 - 按“用户指定 → 已有
goal/→docs/plan/”确定目标路径。不要在仓库里搜索其他模板。 - 记录代码调查基线。先读仓库根及相关子目录的
AGENTS.md、CLAUDE.md或等价规则文件;项目规则高于通用骨架。
第 1 步:需求账本与计划定性
把输入拆成四类,并在最终映射表逐条覆盖:
| 类型 | 内容 | 规则 |
|---|---|---|
R-* |
用户可见功能与业务规则 | 每条有设计落点、验收或显式排除 |
NFR-* |
性能、容量、可用性、可靠性、安全、隐私、可观测性、运维、成本、可维护性 | 只保留受本需求影响的类别 |
C-* |
技术栈、兼容性、交付、时间、法规和仓库硬约束 | 标明来源,不把惯例误写成用户需求 |
A-* |
暂未证实但设计暂时依赖的假设 | 写验证办法、影响和责任人;重大假设未决则 Blocked |
- 未给出的吞吐、p95、可用性、RPO/RTO、预算等数字不得套用行业示例。能从现有 SLO/配置继承就带路径引用;否则写“未知”,说明它会改变哪个决策以及何时必须确认。
- 定性计划类型:新模块、既有模块增量、纯前端、重构/深模块化、数据迁移、平台横切面或跨系统集成。类型决定需要加载哪些按需参考与裁剪哪些章节。
- 真正改变产品形态、权限、数据归属或外部承诺且无法从证据推出的选择,应尽早请用户拍板;不能交互时不得默默代决。
第 2 步:代码事实调查
调查至少覆盖与需求相关的五个方向,窄任务可合并,但不能跳过关键方向:
| 方向 | 要回答的问题 | 产出 |
|---|---|---|
| 现状盘点 | 已有哪些路由、表、UI、服务、脚本与配置? | 能力与缺口,带路径 |
| 复用范式 | 最同构的实现是什么,其行为真的适配吗? | 具名到文件/符号的复用锚点与差异 |
| 契约核对 | 每个上游/下游行为是否满足计划? | 已核实足够 / 已核实缺口 / 未核实阻塞 |
| 运行真值 | 端口、env、命名、部署、迁移和验证入口是什么? | 从实际配置读出的不冲突依据 |
| 历史约束 | 规则文件、进度/延期文档、事故或迁移记录有哪些相关教训? | 一行一坑 + 出处 |
事实清单使用三态,不再强行二选一:
[已核实·足够] <行为与语义> (<路径/符号>)
[已核实·缺口] <现状> → <最小增量> → <漏做后果> (<路径/符号>)
[未核实·阻塞] <缺什么证据> → <影响的决策> → <如何解除>
“已核实”必须核到计划依赖的行为,而非只确认文件或函数存在。涉及分页推进、配额、claims、密钥域、事务、失败语义或框架错误面时,读取 references/architecture-quality.md 的“行为级核实”节。
第 3 步:接口、接缝与备选设计
出现以下任一情况时,必须完整读取 references/architecture-quality.md:新增共享模块或跨系统契约、重构既有模块、引入远程/外部依赖、改变数据生命周期、要求不停机迁移,或存在显著可靠性/运维风险。局部文案、样式或简单单模块增量不为填表而造架构。
复杂计划至少完成:
- 找出承载复杂行为的模块、调用者、接口与接缝;接口包括不变量、调用顺序、错误、配置和性能语义,不只是类型签名。
- 按进程内、本地可替代、远程但自有、真正外部依赖分类,选择真实实现和测试替身;没有变化需求时不凭空增加 adapter。
- 对形态、接缝、跨服务协议、数据归属、可靠性等级或迁移策略等高影响决策,提出至少两个真正可行且有实质差异的候选,按需求适配、局部性、迁移、失败、运维、测试和成本比较。简单可逆选择无需形式化比较。
- 画图只在三个以上节点、异步时序、所有权或状态迁移用文字难以看清时使用;图必须表达关系,不能只是装饰。
第 4 步:决策与正文
按骨架裁剪撰写:
- 普通决策表写“决策点、选择、含义、依据”;关键且难回退的决策再写 ADR-lite:背景/驱动因素、备选、选择、正负后果、重新评估触发条件。
- 职责边界写清谁拥有事实、策略和失败恢复;“复用”必须具名到本次读过的路径与行为差异。
- 数字只能来自用户、代码/配置、项目规则或明确决策。热查询说明已有索引或迁移增量;未知规模不靠猜测决定新基础设施。
- 多道闸写执行顺序,错误码与第一道实际失败的闸一致;安全、可靠性和 NFR 条目都要能转成可观察的验证。
- 涉及持久化、对外契约或滚动部署时,写清兼容窗口、expand/migrate/contract、回填/重放、发布与回滚门。
- 每个里程碑有独立验收;重构先保留行为基线,再通过模块接口验证结果,避免测试内部实现细节。
- 每个里程碑的退出条件逐行以「回写『实施进度』」结尾。实施者是按行核对退出条件的:把这条只写在表外的总说明里,它就会被跳过,进度也就攒到本期收尾才补。
- 在计划顶部初始化实施进度:总里程碑数、当前状态、最近完成、下一步、阻塞和代码基线必须与里程碑表一致;计划尚未实施时如实写“0/N、尚未开始、下一步 M1”,不得预填完成记录。
- 骨架顶部的“实施者定位”原样带入计划,不改写、不删减:它是给执行计划的 agent 的定位,与写计划的架构师定位是两回事。
- 计划按风险和改动面裁剪,不用固定行数或章节占比衡量质量;调查原始材料不倾倒进正文,只保留结论与来源。
进度跟踪与跨对话恢复
计划文件同时是实施期的交接入口。真正的失效模式不是“不写进度”,而是攒到本期收尾一次补写——那时写的是记忆不是证据,而中途断掉的对话会让已完成的里程碑对下一个实施者等于没做过。所有里程碑共用同一个完成时间和同一个代码基线,就是攒着补写的痕迹。
唯一的回写时机:某个里程碑的退出条件全部跑绿之后,下一个动作就是回写计划顶部的“实施进度”——早于向用户报告完成、早于开始下一个里程碑、早于提交代码。实施暂停、被阻塞、发现计划偏差或本轮对话即将结束时,同样先刷新快照再停;即使仍在同一对话,也不能把进度只留在聊天记录里。
开工前先读:每个里程碑动手前,先读“下一步”与最新一行完成记录,与 git status / 工作树核对,冲突时先查明真相再改进度。
每次更新遵守以下规则:
- 先过退出条件,再记完成:该里程碑的全部退出条件已通过才可标
已完成。验证未运行、失败或因环境缺失而跳过时,不得写“完成”;在当前状态/阻塞中写清缺口。 - 同步两个位置:重写恢复快照全部七行(不是只改“最近完成”)并新增或修正该里程碑的完成记录。记录按里程碑一行,既有记录只在纠正事实时修改,不另写重复流水。
- 摘要准确精练:用 1–3 句写已交付的可观察行为、关键实现落点和必要决策,不复述计划、不记录操作过程、不写“基本完成”“应该可用”等模糊判断。
- 证据可复核:记录实际执行的验证命令与结果摘要;人工走查写环境和结论。代码基线写完成时的 commit SHA;若未提交,写
dirty@<起始 SHA>并列该里程碑的关键改动路径,不能把 HEAD 冒充完成基线。 - 偏差回写正文:实现与计划不一致、范围变化、新增风险或退出条件变化时,同步修改对应的决策、改动面、风险或里程碑正文,并在快照中点明;进度区不能成为绕过计划一致性的补丁堆。
- 保持恢复最小充分:恢复快照只保留当前事实与紧接着的动作,完成记录只保留恢复工作所需的信息。不要倾倒命令日志、完整 diff、聊天结论或重复整份计划。
每次回写后跑 scripts/check_progress.sh <计划文件> [仓库根] 核对内部一致性:n/N 与里程碑数、最近完成与完成记录、留空的证据或基线、残留的模板占位,并留意它对“工作树比计划新”的陈旧提示。它查得出“回写了但对不上”,查不出“压根没回写”。
新对话续做时,以仓库规则、计划正文、顶部恢复快照和当前 git status / diff 为准;复核最新完成记录的代码基线与证据后,从“下一步”继续。聊天历史不是事实源,工作树与记录冲突时先查明并修正进度,不能凭记录覆盖用户改动。
第 5 步:自检、就绪与交付
- 跑
scripts/check_paths.sh <计划文件> <仓库根>,人工区分新增路径与虚构的“复用/已核实”路径。 - 对照
R-* / NFR-* / C-* / A-*检查映射:每条有设计、验证、排除去向或阻塞说明。 - 按
references/architecture-quality.md的一致性清单检查凭证/scope、接口/调用方、数据约束/生命周期、设计/验证、发布/回滚和多处重复口径。 - 建失败模式表:高影响失败至少写触发、爆炸半径、数据后果、用户表现、检测、恢复与验证;简单局部任务可说明“不引入新的运行期失败模式”及依据。
- 检查“实施者定位”与“实施进度”的回写协议为骨架原文在位;每个里程碑的退出条件都以「回写『实施进度』」结尾;跑
scripts/check_progress.sh <计划文件> <仓库根>确认进度已初始化为真实状态且与里程碑数量/顺序一致;完成记录为空,除非本次任务有可核实的既有实施事实。 - 最终定级:存在影响范围、安全、数据、外部契约或关键 NFR 的未决项即
Blocked;只等非阻塞评审为Proposed;所有实施前置已解决才是Ready。 - 汇报计划路径与状态,并单列:待拍板问题、与用户假设冲突的事实、被砍/推迟的范围、未在真实环境完成的调查或验证。
评审既有计划时,默认只输出问题、证据、严重度和修订建议;用户明确要求改稿时才覆盖原计划。
红线
- 只写或评审计划,不实施功能;实施需用户另行授权。
- 未读过的代码不写“已核实”,没有来源的数字不写成目标或现状。
- 不吞需求,不把重大假设藏进正文,不把阻塞计划标为
Ready。 - 不把未通过退出条件的里程碑写成已完成,不用聊天记录代替计划内的进度与验证证据。
- 不为假想扩展造接缝、基础设施或抽象,也不照搬通用架构示例覆盖仓库现实。
- 不在出仓 skill 中硬编码某个仓库的模板、技术栈、端口、样板计划、本机路径或业务约定;这些必须在运行时从目标仓规则和代码读取。