CtrlK
BlogDocsLog inGet started
Tessl Logo

product-feature-tech-design

输入 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

Quality

85%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

SKILL.md
Quality
Evals
Security

Product Feature Tech Design Skill

将一份 PRD(产品需求文档)转化为一份字段/接口级精度的功能设计文档,作为开发者、reviewer、测试者三方协作的唯一书面契约。

核心理念:这份文档要回答的不是"我们要做什么"(PRD 已经回答了),而是"怎么做才算对、怎么验证它对了"。下游三个角色互相看不到对方的产出——测试者看不到代码,reviewer 不参与开发,三方只能依赖这一份文档对齐。任何一处含糊,都会在三方汇合时变成返工。所以写作时始终假设:读者除了这份文档,什么都没有。


工作流总览

PRD 输入(Markdown/PDF/用户描述)
     ↓
Step 1:解析 PRD,提取功能清单与模块边界
     ↓
Step 2:判断每个模块的"精度档位"(详见 references/precision-rules.md)
     ↓
Step 3:生成跨模块整体架构图(模块依赖/调用关系)
     ↓
Step 4:逐模块编写详细设计(接口契约 + 按需的状态机/数据模型/异常表)
     ↓
Step 5:汇总全局验收检查清单
     ↓
输出到 markdown/ 目录

Step 1:解析 PRD,提取功能清单

读取用户提供的 PRD(可能是 write-prd/write-brd 产出的文件,也可能是用户自己的文档或粘贴的文字)。重点提取:

  1. 功能清单:尤其是 Must/Should/Could Have 列表——这些是必须落地到设计文档里的功能点。Won't Have 不需要设计,但可以在文档里简单记一句"本期不做",避免开发误做。
  2. 模块划分:PRD 里的功能通常已经天然分组(比如"订单管理""支付""通知")。如果 PRD 没有明确分组,按业务实体或用户旅程阶段自己划分,并在文档开头说明划分依据。
  3. 已有的验收标准:PRD 里的 Given/When/Then 是设计文档验收标准的起点,不是终点——本 skill 要把它们具体化到字段和错误码层面。
  4. 非功能需求:性能、安全、兼容性等,这些会进入每个模块的设计或者文档末尾的全局章节。

如果 PRD 信息不足以支撑字段级设计(比如完全没提数据来源、没提第三方依赖),不要凭空编造看起来精确但其实是瞎猜的字段。按 场景 B:信息不足时的处理 处理(见下文)。


Step 2:判断每个模块的精度档位

这是整个 skill 最容易做错的一步:不是所有模块都需要同样的详细程度,但所有模块都需要同样的"无歧义"程度。差别在于"写多少种文档元素",而不是"写得清不清楚"。

判断时问自己三个问题(详细判断标准见 references/precision-rules.md):

  1. 这个模块有持久化存储吗?(要建表/存数据)→ 是,则需要独立的数据模型字段表;否(纯计算/纯转发调用),可以省略。
  2. 这个模块有明显的状态机吗?(实体有多个状态、状态间有转换规则,比如订单、工单、审批流)→ 是,则需要画状态转换图;否(普通 CRUD),不需要强行画图。
  3. 这个模块是核心路径还是辅助功能?(核心路径 = 主流程必经、出错影响面大;辅助 = 边缘功能、出错影响小)→ 核心/高风险模块必须列异常与边界场景表;辅助模块可以略写或合并到验收标准里。

不要因为某个模块"看起来简单"就跳过接口字段级描述——字段级精度是所有模块的底线,三个判断只影响"要不要额外画图/列表",不影响"接口契约写多细"。


Step 3:生成跨模块整体架构图

在详细设计之前,先画一张图,让三方在看任何模块细节之前,先对"系统长什么样"有共同认知。这张图应该展示:

  • 模块清单(每个模块一个节点)
  • 模块之间的调用/依赖关系(谁调用谁,是同步调用还是异步消息)
  • 关键的外部依赖(数据库、第三方服务、消息队列等),如果 PRD 或上下文中提到了

用 Mermaid 画(graph TDflowchart TD 即可,不强制要求 SVG——这张图的目的是让人一眼看清模块关系,Mermaid 在 Markdown 里能直接渲染,足够清楚)。如果模块数量只有一个(PRD 本身就是单模块的小功能),这张图可以简化成"该模块与外部系统的交互图",不需要强行画一个只有一个节点的"架构图"。


Step 4:逐模块详细设计

对每个模块,使用 references/module-template.md 中的模板展开。模板里每个章节都标注了"必选"还是"按 Step 2 判断条件选填",照着填即可,不要自己再发明新的章节结构——三份不同模块的文档如果结构不一致,reviewer 和测试者要重新适应格式,这本身就是一种隐性成本。

如果模块在 Step 2 判断里需要状态转换图,写完图之后要立刻反过来检查:图里每一条转换箭头,触发它的机制是什么,这个机制是否已经在文档别处写清楚了? 状态图本身只表达"状态A会变成状态B",不表达"是什么动作让它变成的"——这一步很容易漏,而且漏的方式不止一种:

  • 用户主动操作触发的转换(比如"扫码取件成功"),需要对应一个接口契约,不能只在图里画一条线就当作设计完成。
  • 外部系统回调触发的转换(比如"支付成功"由支付网关回调驱动),需要写一个接收回调的接口,不能只在异常场景表里写"回调丢失怎么办"而忘了写"回调本身怎么接收"。
  • 系统定时任务/超时触发的转换(比如"超时未支付自动取消"),需要在异常场景表或文字里写清楚检测机制(多久扫描一次、谁来触发),并且同一份文档里所有定时触发的转换,详细程度要彼此一致——如果"待取件超时"写了扫描频率,"待支付超时"却什么都没写,这种不一致比完全没写更容易让测试者误以为"没写的那个就是不需要测的"。

简单说:状态图回答"会发生什么",文档其余部分要回答"是什么让它发生的",这两半合起来才是完整设计,少了任何一半,测试者都没法设计出对应的测试用例。

写接口契约时心里要绷住一根弦:测试者要靠这一段直接写出测试用例,不能再来问你"这个参数必填吗""失败了返回什么"。所以每个接口最低限度要写清楚:

  • 请求方式与路径(如果 PRD/上下文有技术栈线索就用真实路径风格,没有就用语义化占位路径并注明"待开发阶段确认实际路由")
  • 请求参数表:参数名、类型、是否必填、默认值、约束规则(长度/格式/取值范围)
  • 响应结构:成功时的字段、字段类型、字段含义
  • 错误码表:至少覆盖参数校验失败、权限不足、资源不存在、业务规则冲突这几类常见错误,每类给出错误码和错误信息示例
  • 幂等性/并发说明:如果这个接口存在重复提交或并发修改的风险,要写清楚处理策略;如果不存在这个风险也可以一句话说明"无并发冲突风险,因为xxx",避免测试者花时间纠结一个其实不存在的场景

写到任何具体数值(超时时长、重试次数、限流阈值、字符长度上限等)时,先问自己这个数字是从 PRD 原文来的,还是自己为了让文档显得完整而现场编的。 如果是编的——这是写设计文档时最容易不知不觉犯的错误,因为一个写了具体数字的句子读起来就是比一个写"[待确认]"的句子更像"专业文档",但这种专业感是假的,会让测试者以为这是经过确认的业务规则去设计用例——必须显式标注 [待确认],并汇总进文档末尾的待确认事项表,不能让它看起来和 PRD 明确给出的数字一样确定。

但不要因此变得过度保守、把所有没在 PRD 里逐字出现的数字都标成 [待确认]——那样整份文档会布满标注,反而失去重点。区分标准是:这个数字改变的是"业务规则"还是"工程实现细节"。"订单超过多久算用户放弃不付款了"是业务规则,数字错了会让产品行为本身不对,必须标注;"取件码用几位数字""错误信息的具体文案""重试间隔用几秒"这类纯工程实现选择,只要给出合理默认值并保持内部一致即可,不需要标注,这正是 PRD 场景 B 里"能推断的字段直接写清楚"对应的那一类——架构师的工作本身就包含做这类工程默认值决策,不是每一个都要退回去问产品经理。判断标准很简单:能不能在 PRD 原文里指出这个数字的出处,且这个数字一旦改变会不会让"系统该做什么"本身发生变化;两者都满足,就是业务规则,必须标注;否则是实现细节,正常写,不需要标注。


Step 5:汇总全局验收检查清单

文档最后要有一份独立的验收检查清单章节,把前面分散在各模块里的验收规则汇总成可以逐项打钩的列表,分两层:

  • 按模块汇总:每个模块的关键验收项罗列出来,方便 reviewer 按模块过一遍
  • 跨模块的全局项:性能、安全、兼容性等非功能需求的验收项,这些往往不属于任何单一模块,容易被遗漏

这份清单不是重复前文,而是前文的"可执行索引"——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 保持一致的输出位置约定,方便用户在同一个目录里管理一整套产品文档。


特殊场景处理

场景 A:用户没有现成 PRD,只描述了功能需求

可以直接基于描述展开,但要在文档开头注明"本设计文档基于用户口头描述生成,未经过正式 PRD 评审,部分边界条件为推断,标注 [待确认]"。不要因为没有正式 PRD 就降低精度要求——精度要求始终成立,只是来源不同。

场景 B:PRD 信息不足以支撑字段级设计

不要编造看起来精确但其实是瞎猜的字段值(比如凭空编一个"用户等级 1-5"的枚举,而 PRD 根本没提过等级体系)。正确做法:

  1. 先基于 PRD 里明确给出的业务规则,把能推断的字段写清楚
  2. 对于推断不出来、又必须有值才能让接口契约完整的字段,用 [待确认:原因] 标注,并在文档末尾汇总一份"开发前需确认事项清单"
  3. 不要为了让文档看起来完整就跳过标注、直接编一个合理但无依据的值——这种"看起来精确"比"明确说不知道"更危险,会让测试者基于错误前提设计用例

场景 C:PRD 涉及多个完全独立、几乎无交互的模块

如果模块之间确实没有调用/依赖关系(比如一个 PRD 里包含"用户反馈"和"系统公告"两个互不相关的功能),Step 3 的架构图可以简化为并列展示,不用强行画出虚构的依赖箭头。如实反映"无依赖"也是一种有效信息——能让 reviewer 知道这两个模块可以完全独立并行开发和测试。

场景 D:PRD 本身就是单一小功能,只有一个模块

跳过"模块划分"的讨论,Step 3 的架构图改为"该功能与外部系统/已有功能的交互图"。其余步骤照常,字段级精度不因为模块少就降低。

场景 E:用户要求"先出个简版,细节后面再补"

可以先交付架构图 + 各模块的接口契约骨架(请求/响应字段名和类型,暂不展开每个错误码),但要在文档里用 [待补充] 标注哪些部分是简化的,并在交付时明确告知用户"这是简版,XX部分需要进一步细化才能交付测试"——不要让简版看起来像是完整版,否则测试者会基于不完整的契约开始工作。


写作质量自检

写完后过一遍,这些是最容易漏的地方:

  • 每个 Must/Should Have 功能点是否都能在文档里找到对应的接口契约或行为描述?(漏掉一个,开发就会漏做一个)
  • 状态转换图里的每一条转换箭头,触发它的机制是否都能在文档别处找到?(用户操作触发的要有对应接口;外部回调触发的要有接收回调的接口;定时/超时触发的要写清楚检测机制。最容易漏的不是"完全没写",而是"写了一部分"——比如只写了"待取件超时"的扫描机制,却忘了同样需要写"待支付超时"的扫描机制,这种厚此薄彼比完全没写更容易误导测试者)
  • 每个接口的错误码是否覆盖了"用户能想到的失败方式",而不只是"开发顺手写的那几种"?
  • 状态机模块是否把所有状态之间的合法/非法转换都说清楚了?(测试者最容易拿"非法转换"做反例用例)
  • 核心模块的异常场景表是否包含了空值、超限、并发、权限不足这几类通用风险,而不只是业务逻辑本身的分支?
  • 全局验收清单里的每一项,是否都能在前文找到对应的详细规则?(清单不能凌空出现没有依据的验收项)
  • 是否有"看起来精确但其实是编出来的"业务规则数值?(超时时长、限额这类改变系统行为本身的数字,如果 PRD 没给依据,必须改成 [待确认] 标注;但取件码位数、错误文案这类工程实现细节,不必每个都标注,正常给出合理默认值即可)
Repository
digoal/blog
Last updated
First committed

Is this your skill?

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.