name: project-sdd-planning description: | 在 PRD 基础上产出 Solution Design Document(SDD),采用 MVCP 四件套(Model/View/Controller/Process)形成 可执行的实施边界与约束合同。 tags:
- planning
- sdd
- mvcp
- architecture
- code-agent version: 1.2.0 metadata: hermes: tags: [planning, sdd, mvcp, code-agent, architecture] ---
SKILL:project-sdd-planning
一、先说结论:你说的 SDD 我同意
SDD(Solution Design Document)在本技能里定义为:
- 基于 BRD 与已评审 PRD 的“可执行设计合同”;
- 它不是“灵感稿”,而是能直接驱动实现与测试的约束集;
- 交付物默认以 MVCP(Model/View/Controller/Process) 四块来组织。
你的理解与本技能完全一致:
- M(Model):数据结构/状态/约束;
- V(View):界面/交互/字段校验与权限可见性;
- C(Controller):接口、操作流、幂等与错误码;
- P(Process):流程状态机、定时/异步、补偿与回滚。
二、要追溯的外部方法论(在线参考)
在编写本技能时借鉴了三类成熟方法论:
- arc42:将文档按目标、上下文、结构、运行视图、部署等拆解,强调约束和运行时语义。
- 参考:
https://r.jina.ai/http://arc42.org/overview/
- 参考:
- C4:用上下文/容器/组件层次统一架构视图,帮助边界定义与依赖可读性。
- 参考:
https://r.jina.ai/http://c4model.com/
- 参考:
- UML/REST/API 设计实践:用于结构图(语义图)和资源接口约束表达。
- 参考:
https://r.jina.ai/http://www.uml.org/what-is-uml.htm(建模思路) - 参考:
https://r.jina.ai/http://restfulapi.net/resource-naming/(资源接口约定)
- 参考:
注:网络访问在当前环境有波动,以上地址采用镜像可读源,若失效请手工替换为团队内部知识库同义来源。
三、SDD 目标与触发条件
适用场景
- PRD 已通过对齐且可执行;
- 需要把“产品要求”转为“工程约束”;
- 下游出现“每个开发者理解不一致/接口先后定义不一致/测试边界不清”的频发问题;
- 需要自动化拆分 Development Unit。
不适用场景
- 仅做战略、市场文档输出,不含实施细节;
- 研发能力未稳定,需求仍在频繁试错(此时先 PRD/实验设计)。
四、输入清单(必须齐备)
- PRD 主干(至少包含功能/流程/界面);
- 领域对象列表(实体名、术语表);
- 现有系统边界:已有服务、数据库、权限系统、队列、对象存储、第三方 SDK;
- 非功能目标(P95 延迟、可用性、合规);
- 既有数据迁移和发布约束;
- 关键验收目标(业务指标 + 风险边界)。
五、产出物(强制)
每份 SDD 必须同时输出以下 4 类核心章节(文件化建议):
01-M-模型设计.md02-V-界面与交互.md03-C-控制与接口.md04-P-流程与状态流转.md
并附带 2 类执行文件:
05-实施约束与依赖.md06-验收与测试锚点.md
其中 5/6 是为 Code Agent 提供“可执行边界”;没有这两项则不进入代码开发。
六、MVCP 产出模板(最小字段,禁止空口号)
6.1 M:模型(Model)——数据库 + 业务状态定义
每个实体必须写:
- 实体名(中文名/英文名);
- 目的(为何必须存在);
- 字段列表(类型、约束、默认值、是否可空、是否唯一/索引);
- 生命周期与状态集合(若有);
- 关联关系(1-N、N-N、聚合边界);
- 并发与幂等策略(唯一键、乐观锁、事务边界);
- 迁移与回滚约束(上线顺序、兼容性)。
最低输出格式(建议):
entity:userspk:idfields:idbigint pktenant_idbigint not null fknamevarchar(50) not null
indexes: [tenant_id, user_name]unique: [tenant_id + external_id]state_machine: [DRAFT, ACTIVE, FROZEN, DELETED]rules: [同 tenant 下同名用户禁止]
6.2 V:视图(View)——界面、组件、字段和可见性
每个界面必须写:
- 页面 ID 与路由;
- 权限矩阵(角色 × 字段可见性);
- 输入项(字段名、类型、校验、必填、错误信息);
- 提交流程(提交前校验、确认态、成功/失败反馈);
- 异常态(空态、错误态、无权限态);
- 交互事件对 C/P 的映射。
输出要求:
- “前端字段集合”必须在 C 和 M 中有明确对应关系;
- 所有按钮事件必须映射到唯一 Controller 动作;
- 每个视图必须标注“无可执行变化时可回归条件”。
6.3 C:控制(Controller)——接口与操作
每个接口必须写:
operation_id;method + path;auth:会话/签名/角色;input_contract(示例:类型、必填、范围、正则);output_contract(成功/失败字段);errors(可重试/不可重试);idempotent;transaction;side_effects;audit_trace(trace_id、actor、business_id);owner_team。
6.4 P:流程(Process)——状态机与异步
每个流程必须写:
- 初始态、终态;
- 状态转移与触发器;
- 条件守卫(guard)与失败回退;
- 并发控制(串行/乐观锁/队列)
- 超时、重试、重试上限、补偿策略;
- 人工干预点(工单/客服)。
输出要求:
- 每条转移都能追溯到一个 controller/action 或 scheduler/事件;
- 每个异常路径必须有错误码 + 对应界面反馈。
七、Code Agents 自动化执行规范(核心)
目标:让 Code Agent 直接接收一份“可执行约束包”开始开发。
7.1 约束包最小格式(建议交付,供工具解析)
必须从 SDD 生成 sdd-mvcp-contract.json,字段示意:
meta:project, version, owner, effective_dateassumptions: 待验证假设facts: 已确认事实model_contract: 实体数组(含字段和索引)view_contract: 页面数组(含字段、权限、事件)controller_contract: 接口数组(含入参、出参、错误码)process_contract: 流程数组(含状态机)non_goals: 不做列表risks: 风险项acceptance_matrix: 需求→模型/视图/控制/流程的映射矩阵
Code Agent 开发前必须先完成:
- 逐项核对
non_goals; - 对齐每个
controller_contract与model/view/process的依赖; - 将
acceptance_matrix转成开发 Unit; - 任何缺字段、无 owner、无错误码字段都不得进入 coding。
7.2 Code Agent 单任务输入模板
每个 Development Unit 的约束输入只包含:
- 相关实体(M);
- 相关页面(V);
- 相关接口(C);
- 相关状态流(P);
- 验收标准列表(最小 3 条:happy path、边界、异常)。
7.3 代码约束映射到测试
对每个 C / P 条目必须至少有一条自动化验证:
- 接口合约测试(入参/出参、错误码);
- 数据约束测试(唯一约束、外键约束、事务一致性);
- 流程测试(状态转移与幂等);
- 视图端到端核验(按钮→接口→结果态)。
八、反模式门禁(未通过则退回)
以下项出现之一即阻断交付:
- M、V、C、P 有一部分缺失;
- 有“空目标”条目(不写字段/接口/状态只写大段描述);
- C 侧无法映射到 M 或 V;
- P 侧转移缺少失败态或超时态;
- 无 “验收矩阵”与“非目标列表”;
- 无迁移/回滚条件。
九、分解与交付映射(SDD→Unit)
默认拆分规则:
- M 大改动可单独形成数据迁移/模型实现 Unit;
- V 与 C 一起形成“前后端联动 Unit”;
- P 单独形成“流程与调度 Unit”;
- 每个 Unit 都有
depends_on和deliverable_contract。
十、验收标准(可观察)
SDD 达成条件:
- 四块内容齐备且互相引用无缺口;
- 所有实体/接口/流程都有唯一 ID;
acceptance_matrix覆盖 PRD 全量需求;- 每个接口至少包含成功 + 典型失败 + 并发失败场景;
- 每个流程至少有超时/重试/回滚条件;
- Code Agent 约束包可被下游消费(不依赖自然语言推断);
- 若本任务的验收依赖另一任务/流程已经产出的真实数据(而非本任务自己创建的数据),Benchmark 必须点名一个真实存在的具体对象作为验收锚点,不能只描述“机制应该正确”(真实教训 2026-08-06:Skill 内容迁移与详情页展示分属两个任务,谁都没被要求验证“真实迁移的内容能否被真实查到”,这条数据链路因此从未被真正接通过)。
十一、质量门禁(给自审与下一轮)
- 事实/决策/假设分离:
- 已有事实:来自 BRD/PRD/仓库/历史问题。
- 设计决策:基于约束与代价权衡。
- 假设:必须标注 owner + 验证计划。
- 任何假设不得进入“代码不可选条件”;若未在验证后确认,保留为阻塞。
- 仅在约束包完整后,才输出 Development Unit;否则回退到 PRD 对齐。
十二、生成器模板版本(推荐默认流程)
为避免“手工重复填充”,新增生成器模板版本,支持在 PRD 落库后批量生成 SDD 骨架:
- 目标输入:PRD 目录、项目名、版本、owner。
- 输出产物:
01~06章节骨架 +00-SDD-生成记录.md+sdd-mvcp-contract.json+ (默认)sdd_exec_graph_manifest.json+sdd-graph.mmd+sdd-graph.runbook.json+unit_matrix.json+handoff_bundle.md。- 启用
--disable-graph时,不输出执行图相关产物(manifest/mmd/runbook/unit_matrix/handoff)。
- 启用
12.1 一键生成(半自动)
python3 scripts/sdd_mvcp_generator.py \
--project-name "<project_name>" \
--version "v1.0.0" \
--owner "<owner>" \
--prd-root "/path/to/PRD" \
--out "./SDD" \
[--requirements-json "/path/to/requirements.json"] \
[--manifest "/path/to/manifest.json"] \
[--agent-pool "agent-1,agent-2,agent-3"] \
[--graph-parallel-threshold 3] \
[--graph-loop-round 2] \
[--disable-graph]
生成器默认行为(1 条):
- 自动生成骨架:
00~06+sdd-mvcp-contract.json。 - 默认自动构建执行图(可通过
--disable-graph关闭);默认产物:sdd_exec_graph_manifest.jsonsdd-graph.mmdsdd-graph.runbook.json
- 并行策略:默认优先依据 PRD 文本语义规则 + 规模阈值(而非单一规模阈值);显式传入
--manifest时,规则不参与。 - 回灌策略:
q_gate的失败触发max_loop_round回灌(默认 2 轮)。
12.2 PRD 文本语义推导 manifest 默认规则
规则用于“无显式 manifest”时,作为
build_workflow_manifest的默认输入;显式 manifest 一律顶层覆盖。
规则输入源(只读):prd-root 下的 .md/.markdown/.txt 文本。规则命中集合为 derived_rules 写入 manifest meta,用于追溯。
默认推导规则:
enable_mv_parallel(并行):- 条件1:
requirements_count >= graph_parallel_threshold; - 条件2:未触发高风险阻断关键字。
- 条件1:
strict_contract_mode(高风险阻断):命中文本中的任一词时,默认收紧并行,支付、财务、对账、扣费、结算、退款、税、风控、权限、审计、合规、资金、并发- 在该模式下:
M/V并行标记下降为FalseC依赖P(c_depends_on_process=True)P额外依赖V(p_depends_on_view=True)
flow_boundary(流程边界提示):命中审批/审核/异步/回调/超时/重试/补偿/状态机/队列/任务/通知/消息/人工干预时,提升P与V先后约束。scope_hint(范围提示):命中页面/视图/表单/界面/功能/场景/接口/流程会记录到matched_keywords,用于审计,不直接强改结构。
回退策略:当 PRD 文本不可读取或特征不充分时,回退到原 requirements_count + 阈值行为;requirements_count 仍由文件内编号或默认位次占位。
12.3 自动化可观测(推荐)
- 运行后立即检查标准输出是否有:
sdd_skeleton_written=ok。 - 如带图:确认
sdd-graph.runbook.json可解析,且outcome.total_nodes与outcome.total_waves及waves长度一致。 - 关键字段存在性:
manifest.meta.requirements_countmanifest.loop_rulesrunbook.source_manifestrunbook.sdd_dirrunbook.outcome.require_parallel
- 若执行图子进程失败,主生成器会退出并报
执行图生成失败(不产出半成品)——避免主 Agent 接收不完整图。
12.3.1 一键自检命令(推荐)
从 project-sdd-planning 目录运行,支持一条命令覆盖“生成 → 校验 → 回归”:
py_compile:校验sdd_mvcp_generator.py、sdd_exec_graph.py- 4 个生成场景重放:
1) 默认图
2)
--disable-graph3) 外部 manifest(constraints=null) 4) 外部 manifest(constraints=非法类型) - 每个场景统一做:
sdd-mvcp-contract.json四块非空unit_matrix.json/handoff_bundle.mdsdd-graph.runbook.json(含manifest_meta、constraints)- schema 与 trace 校验
# 可按需覆盖
export PRD_ROOT="/tmp/sdd_100_a"
export PROJECT_NAME="DemoProj"
export VERSION="v1.0.0"
export OWNER="ops"
bash scripts/sdd_selfcheck.sh ./SDD/selfcheck
检查某个既有输出目录(仅验收,不重放):
bash scripts/sdd_selfcheck.sh check ./SDD/selfcheck/default_graph
12.4 生成后补齐规则
- 使用
references/sdd_mvcp_contract_schema.json验证 json 可解析; - 用
templates/sdd-mvcp-checklist.md逐项补齐; - 将
requirements映射到acceptance_matrix,覆盖 PRD 全量条目; - 缺失 owner / non-goals / 错误码 / timeout / error_state 的条目不得进入 coding。
十三、SDD 写作的执行图(Graph/Loop/Harness)
为了让主 Agent 在多子任务场景下可控分工,默认采用以下执行图。
本版本新增:
- 若执行
sdd_mvcp_generator.py,会自动基于 PRD 规模生成sdd_exec_graph_manifest.json,并落盘输出sdd-graph.mmd+sdd-graph.runbook.json。 - 这样主 Agent 在启动后就能直接从
runbook取waves作为子 Agent 派发输入。
13.1 阶段与依赖
P0-输入与边界:读取 PRD/BRD、事实清单、非目标清单(串行起点)M-模型:建立模型实体与约束V-视图:建立页面、字段、校验、权限C-控制:建立接口与错误码P-流程:建立流程图与异常链路S-约束聚合:汇总为sdd-mvcp-contract.jsonQ-质量门禁:反模式门禁 + 关键核验U-拆分:映射为 Development Unit 并产出分工
推荐依赖关系
graph TD
A[P0 输入与边界] --> M[M-模型]
A --> V[V-视图]
M --> C[C-控制]
V --> C
M --> P[P-流程]
C --> S[并行汇聚]
V --> S
P --> S
S --> Q[Q-质量门禁]
Q --> U[U-拆分与发布]
说明:M 与 V 默认可并行(在同一约束前提下);
C 建议等待 M 与 V 完成后开始;P 建议等待 M 完成后开始,且可与 C 平行。
13.2 并行执行分配(示例)
{
"wave_1": ["agent-1: P0 输入与边界"],
"wave_2": ["agent-2: M-模型", "agent-3: V-视图"],
"wave_3": ["agent-2: C-控制", "agent-4: P-流程"],
"wave_4": ["agent-5: S-约束聚合/验收映射"],
"wave_5": ["agent-1: Q-质量门禁与 U-拆分"]
}
13.3 自我修正 Loop(可回灌重跑)
- 当
Q-质量门禁任意项失败:- 只回灌最小影响的上游阶段(如缺字段回到 M,接口错误码回到 C);
- 记录 loop 轮次与失败原因。
- 回灌后只启动受影响子图,不强制重跑完整链路。
13.4 Harness 约束(子 Agent 交接)
每个 Agent 的交付必须包含:
- 输入与边界(引用文件/任务 ID);
- 输出产物路径;
- 本阶段验收断言(至少一条可观察结果);
- 异常与阻塞项(如发生,必须在下一波带回)。
建议交付对象:
wave_<N>的 markdown 交付包;sdd-graph.mmd(流程图);sdd-graph.runbook.json(下一波 plan)。
13.5 生成器可视化(默认自动,或手工重算)
默认执行 sdd_mvcp_generator.py 时,自动产出并写入 sdd_exec_graph_manifest.json、sdd-graph.mmd、sdd-graph.runbook.json。
runbook 结构最少包含:
source_manifest: manifest 文件路径sdd_dir: 运行时 SDD 根目录manifest_meta: 完整 manifest 元信息(包含derived_rules)waves: 分波列表(每波包含 agent + node_id)edges: 依赖边loop_rules: 质量门禁触发回灌规则outcome:total_nodes/total_waves/require_parallel
若需重算(例如 manifest 被改动后),可用下列脚本:
python3 scripts/sdd_exec_graph.py \
--sdd-dir /path/to/SDD \
--manifest /path/to/manifest.json \
--out-dir ./SDD
十四、可选产物(建议)
templates/sdd-mvcp-checklist.md:执行清单;templates/sdd_mvcp_contract_sample.json:可直接改填的sdd-mvcp-contract.json示例;templates/sdd_mvcp_generator_prompt.md:生成器执行清单(模板版);templates/sdd_mvcp_generator_input.yaml:生成器输入清单;templates/sdd_exec_graph_manifest.json:子任务执行图的输入清单;scripts/sdd_mvcp_generator.py:生成器脚本;scripts/sdd_exec_graph.py:执行图生成与分波脚本;references/sdd_mvcp_contract_schema.json:Code Agent 约束 JSON Schema;references/sdd_code_agent_checklist.md:代码约束输入标准。