输入 PRD 文档(Markdown 或 PDF),以开发架构师的角色编写字段/接口级精度的功能设计文档(Functional/Technical Design Doc),以 Markdown 格式保存到当前项目 markdown/ 目录。这份文档是开发者、reviewer、测试者三方协作的唯一契约——三者互相隔离、不能看对方的产出物(测试者看不到代码,reviewer 不参与开发),所以必须把每个功能点写到可直接落地、可直接测试的精度:接口请求/响应字段、错误码、状态机、数据模型、异常边界场景都要明确。触发条件:用户提到"功能设计文档"、"技术设计文档"、"tech design"、"functional design"、"从 PRD 生成设计文档"、"帮我把这份 PRD 转成开发文档"、"写一份给开发和测试用的设计文档"、"接口设计 + 验收标准",或者用户上传了一份 PRD 并希望进入开发落地阶段。即使用户只说"基于这个 PRD 帮我写设计文档"或"把这个需求文档详细化成开发能直接看懂的文档",也应立即使用本 skill。不要将本 skill 与 write-prd/write-brd 混淆——那两个 skill 输出的是面向业务评审的需求文档(WHY/WHAT 层),本 skill 输出的是面向研发落地的技术设计文档(HOW 层,包含具体字段和契约),通常以 PRD 作为输入而非从零开始的 idea。
70
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
将一份 PRD(产品需求文档)转化为一份字段/接口级精度的功能设计文档,作为开发者、reviewer、测试者三方协作的唯一书面契约。
核心理念:这份文档要回答的不是"我们要做什么"(PRD 已经回答了),而是"怎么做才算对、怎么验证它对了"。下游三个角色互相看不到对方的产出——测试者看不到代码,reviewer 不参与开发,三方只能依赖这一份文档对齐。任何一处含糊,都会在三方汇合时变成返工。所以写作时始终假设:读者除了这份文档,什么都没有。
PRD 输入(Markdown/PDF/用户描述)
↓
Step 1:解析 PRD,提取功能清单与模块边界
↓
Step 2:判断每个模块的"精度档位"(详见 references/precision-rules.md)
↓
Step 3:生成跨模块整体架构图(模块依赖/调用关系)
↓
Step 4:逐模块编写详细设计(接口契约 + 按需的状态机/数据模型/异常表)
↓
Step 5:汇总全局验收检查清单
↓
输出到 markdown/ 目录读取用户提供的 PRD(可能是 write-prd/write-brd 产出的文件,也可能是用户自己的文档或粘贴的文字)。重点提取:
如果 PRD 信息不足以支撑字段级设计(比如完全没提数据来源、没提第三方依赖),不要凭空编造看起来精确但其实是瞎猜的字段。按 场景 B:信息不足时的处理 处理(见下文)。
这是整个 skill 最容易做错的一步:不是所有模块都需要同样的详细程度,但所有模块都需要同样的"无歧义"程度。差别在于"写多少种文档元素",而不是"写得清不清楚"。
判断时问自己三个问题(详细判断标准见 references/precision-rules.md):
不要因为某个模块"看起来简单"就跳过接口字段级描述——字段级精度是所有模块的底线,三个判断只影响"要不要额外画图/列表",不影响"接口契约写多细"。
在详细设计之前,先画一张图,让三方在看任何模块细节之前,先对"系统长什么样"有共同认知。这张图应该展示:
用 Mermaid 画(graph TD 或 flowchart TD 即可,不强制要求 SVG——这张图的目的是让人一眼看清模块关系,Mermaid 在 Markdown 里能直接渲染,足够清楚)。如果模块数量只有一个(PRD 本身就是单模块的小功能),这张图可以简化成"该模块与外部系统的交互图",不需要强行画一个只有一个节点的"架构图"。
对每个模块,使用 references/module-template.md 中的模板展开。模板里每个章节都标注了"必选"还是"按 Step 2 判断条件选填",照着填即可,不要自己再发明新的章节结构——三份不同模块的文档如果结构不一致,reviewer 和测试者要重新适应格式,这本身就是一种隐性成本。
如果模块在 Step 2 判断里需要状态转换图,写完图之后要立刻反过来检查:图里每一条转换箭头,触发它的机制是什么,这个机制是否已经在文档别处写清楚了? 状态图本身只表达"状态A会变成状态B",不表达"是什么动作让它变成的"——这一步很容易漏,而且漏的方式不止一种:
简单说:状态图回答"会发生什么",文档其余部分要回答"是什么让它发生的",这两半合起来才是完整设计,少了任何一半,测试者都没法设计出对应的测试用例。
写接口契约时心里要绷住一根弦:测试者要靠这一段直接写出测试用例,不能再来问你"这个参数必填吗""失败了返回什么"。所以每个接口最低限度要写清楚:
写到任何具体数值(超时时长、重试次数、限流阈值、字符长度上限等)时,先问自己这个数字是从 PRD 原文来的,还是自己为了让文档显得完整而现场编的。 如果是编的——这是写设计文档时最容易不知不觉犯的错误,因为一个写了具体数字的句子读起来就是比一个写"[待确认]"的句子更像"专业文档",但这种专业感是假的,会让测试者以为这是经过确认的业务规则去设计用例——必须显式标注 [待确认],并汇总进文档末尾的待确认事项表,不能让它看起来和 PRD 明确给出的数字一样确定。
但不要因此变得过度保守、把所有没在 PRD 里逐字出现的数字都标成 [待确认]——那样整份文档会布满标注,反而失去重点。区分标准是:这个数字改变的是"业务规则"还是"工程实现细节"。"订单超过多久算用户放弃不付款了"是业务规则,数字错了会让产品行为本身不对,必须标注;"取件码用几位数字""错误信息的具体文案""重试间隔用几秒"这类纯工程实现选择,只要给出合理默认值并保持内部一致即可,不需要标注,这正是 PRD 场景 B 里"能推断的字段直接写清楚"对应的那一类——架构师的工作本身就包含做这类工程默认值决策,不是每一个都要退回去问产品经理。判断标准很简单:能不能在 PRD 原文里指出这个数字的出处,且这个数字一旦改变会不会让"系统该做什么"本身发生变化;两者都满足,就是业务规则,必须标注;否则是实现细节,正常写,不需要标注。
文档最后要有一份独立的验收检查清单章节,把前面分散在各模块里的验收规则汇总成可以逐项打钩的列表,分两层:
这份清单不是重复前文,而是前文的"可执行索引"——reviewer 不需要重新读一遍长文档找验收点,扫一眼清单就知道该测什么、该 review 什么。
完整模板见 references/module-template.md(文档头部、整体架构图、每个模块章节的详细结构、全局验收清单,一份文件包含全部骨架,按顺序填充即可)。
文件命名:[product-name-en]-tech-design.md(英文小写,连字符分隔,与同源 PRD 文件名保持可关联,比如 PRD 是 smart-order-assistant-prd.md,设计文档就是 smart-order-assistant-tech-design.md)。
输出到当前项目的 markdown/ 目录,与 write-prd/write-brd 等同源 skill 保持一致的输出位置约定,方便用户在同一个目录里管理一整套产品文档。
可以直接基于描述展开,但要在文档开头注明"本设计文档基于用户口头描述生成,未经过正式 PRD 评审,部分边界条件为推断,标注 [待确认]"。不要因为没有正式 PRD 就降低精度要求——精度要求始终成立,只是来源不同。
不要编造看起来精确但其实是瞎猜的字段值(比如凭空编一个"用户等级 1-5"的枚举,而 PRD 根本没提过等级体系)。正确做法:
如果模块之间确实没有调用/依赖关系(比如一个 PRD 里包含"用户反馈"和"系统公告"两个互不相关的功能),Step 3 的架构图可以简化为并列展示,不用强行画出虚构的依赖箭头。如实反映"无依赖"也是一种有效信息——能让 reviewer 知道这两个模块可以完全独立并行开发和测试。
跳过"模块划分"的讨论,Step 3 的架构图改为"该功能与外部系统/已有功能的交互图"。其余步骤照常,字段级精度不因为模块少就降低。
可以先交付架构图 + 各模块的接口契约骨架(请求/响应字段名和类型,暂不展开每个错误码),但要在文档里用 [待补充] 标注哪些部分是简化的,并在交付时明确告知用户"这是简版,XX部分需要进一步细化才能交付测试"——不要让简版看起来像是完整版,否则测试者会基于不完整的契约开始工作。
写完后过一遍,这些是最容易漏的地方:
3b9c83d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.