/prd — 把模糊点子变成可落地的 PRD
一个给 Claude Code 用的 skill。通过对话,把一个模糊的产品想法一步步变成可以直接拿去 coding 的需求文档——不止对齐产品方向,还包含技术落点和给执行者的约束。
适合没有产品背景、准备用 vibecoding 把点子做出来的人。
它解决什么问题
AI 写需求文档有三个通病:
幻觉迎合 —— 你说什么它都说好,从不挑战你
细节模糊 —— 看着专业,但没有状态、没有字段、没有异常、没有文案
返工成本高 —— 等你发现不对已经在 coding 阶段,改一处全盘重来
解法是不让 AI 一上来就写完整 PRD,而是拆成两步:先出精简版对齐方向,冻结范围之后再出落地版补细节。
工作流
阶段一:概念版(约 10 分钟)
从用户 / 商业 / 技术三个视角连续提问,诊断这个想法是不是伪需求、范围是不是过大、技术上现不现实。这一阶段会主动挑战你,而不是一味迎合。
聊透后输出一份约 300 字的概念版,核心是圈定 MVP——明确哪些本期做、哪些本期明确不做,然后逐条确认并冻结,才进入阶段二。
阶段二:落地版(约 30 分钟)
五节结构:
#xEUWeTAopZNL text { white-space: pre; }#xEUWeTAopZNL .fb0 { stroke: var(--N900-FG, 0.15); }#xEUWeTAopZNL .fb0 {stroke: rgba(31,35,41, 0.15)}#xEUWeTAopZNL .fx0 { stroke-miterlimit: 10; }#xEUWeTAopZNL .fx0 {stroke-miterlimit: 10}#xEUWeTAopZNL .fa1 { fill: rgb(187, 191, 196); }#xEUWeTAopZNL .fa1 {fill: rgb(187, 191, 196)}#xEUWeTAopZNL .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#xEUWeTAopZNL .fx1 {font-style: normal}#xEUWeTAopZNL .fx2 { text-anchor: middle; }#xEUWeTAopZNL .fx2 {text-anchor: middle}#xEUWeTAopZNL .fx3 { dominant-baseline: central; }#xEUWeTAopZNL .fx3 {dominant-baseline: central}#xEUWeTAopZNL .fx4 { stroke: none; }#xEUWeTAopZNL .fx4 {stroke: none}#xEUWeTAopZNL .fc0 { fill: var(--text-caption); }#xEUWeTAopZNL .fc0 {fill: #646a73}#xEUWeTAopZNL .fa2 { fill: var(--text-link-disabled); }#xEUWeTAopZNL .fa2 {fill: rgb(187, 191, 196)}#xEUWeTAopZNL .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#xEUWeTAopZNL .fx5 {font-style: normal}#xEUWeTAopZNL .fx6 { text-anchor: start; }#xEUWeTAopZNL .fx6 {text-anchor: start}#xEUWeTAopZNL .fx7 { dominant-baseline: alphabetic; }#xEUWeTAopZNL .fx7 {dominant-baseline: alphabetic}#xEUWeTAopZNL .fc1 { fill: rgb(0, 0, 0); }#xEUWeTAopZNL .fc1 {fill: rgb(0, 0, 0)}#xEUWeTAopZNL .fb1 { fill: var(--N900-FG, 0.15); }#xEUWeTAopZNL .fb1 {fill: rgba(31,35,41, 0.15)}#xEUWeTAopZNL .fb2 { fill: rgb(209, 217, 224); }#xEUWeTAopZNL .fb2 {fill: rgb(209, 217, 224)}#xEUWeTAopZNL .fa3 { fill: var(--bg-body); }#xEUWeTAopZNL .fa3 {fill: #fff}AB123456节一、概述二、功能列表三、功能详细说明四、技术方案与数据模型五、交付契约内容背景、目标、范围、技术约束、文案人设、视觉方向本期功能 + P0/P1/P2 优先级每个功能逐项覆盖五个盲区技术栈建议表 + 全局数据实体表 + 关键接口与读写时机验收证据 + 禁止路径 + 取舍优先级 + 未知处置
AI 最容易跳过的五个盲区(逐功能必填):用户流程(正常 + 异常)、状态机、字段规范、文案规范、异常状态处理。
我在原方法上加的三层
这三层没有一层是装上它的第一天能想到的,全是用出来的。
第一层:技术落点。 原方法能产出很漂亮的产品级 PRD,但丢给模型 coding,同一份文档跑两次会出来两套完全不同的数据结构——因为数据存哪儿、建几张表、字段叫什么、用什么栈,文档里一个字没提。补了第四节,文档才真正能作为开发输入。
第二层:堵摩擦。 用了一个多月后的体检:修掉模板外层代码围栏被内层提前闭合的 bug;把开放式提问改成选择题 + 默认值(每视角 23 轮封顶);功能多时改成每批 23 个分批交付,防细节质量衰减;补上视觉方向约束——不写风格关键词和主色调,coding 模型每次都会给你一套自己的审美,这是返工重灾区。
第三层:交付契约。 前四节描述要做什么,第五节约束不许怎么做。需求写得再清楚,也挡不住执行者走捷径——尤其当 AI 从"你盯着它写"变成"它自己跑几个小时"之后。
其中最实用的是禁止路径清单:
•
不许用 mock 或 hardcode 返回值让流程"看起来通了"
•
不许删改或跳过测试用例来让测试通过;跑不过就改实现,不改测试
•
不许交付 UI 骨架加占位数据就报告完成
•
不许绕过技术约束偷偷引入新依赖
•
不许改动本期范围之外的文件和功能
•
不许把"本期明确不做"的功能顺手做了
定义目标时,排除比设定更重要。肯尼迪登月宣言的关键不在"把人送上月球",而在"并安全带回地球"——多出的这句话,删掉了"单程票"这个最省钱的解法。
安装
把仓库内容放进 Claude Code 的 skills 目录:
代码块
Bash
git clone https://github.com/liuzhaowei1/Digital--PRD-SKILL.git
mkdir -p ~/.claude/skills/prd
cp -r Digital--PRD-SKILL/SKILL.md Digital--PRD-SKILL/references ~/.claude/skills/prd/
目录结构:
代码块
Plain Text
~/.claude/skills/prd/
├── SKILL.md
└── references/
└── prd-template.md
用法
代码块
Plain Text
/prd
或者直接说「我有个点子想做出来」「帮我写个产品需求」「帮我把这份需求改得能落地」。
支持三种模式,开场会先确认是哪种:
#dPaZUwGrZJVW text { white-space: pre; }#dPaZUwGrZJVW .fb0 { stroke: var(--N900-FG, 0.15); }#dPaZUwGrZJVW .fb0 {stroke: rgba(31,35,41, 0.15)}#dPaZUwGrZJVW .fx0 { stroke-miterlimit: 10; }#dPaZUwGrZJVW .fx0 {stroke-miterlimit: 10}#dPaZUwGrZJVW .fa1 { fill: rgb(187, 191, 196); }#dPaZUwGrZJVW .fa1 {fill: rgb(187, 191, 196)}#dPaZUwGrZJVW .fx1 { font: 400 12px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#dPaZUwGrZJVW .fx1 {font-style: normal}#dPaZUwGrZJVW .fx2 { text-anchor: middle; }#dPaZUwGrZJVW .fx2 {text-anchor: middle}#dPaZUwGrZJVW .fx3 { dominant-baseline: central; }#dPaZUwGrZJVW .fx3 {dominant-baseline: central}#dPaZUwGrZJVW .fx4 { stroke: none; }#dPaZUwGrZJVW .fx4 {stroke: none}#dPaZUwGrZJVW .fc0 { fill: var(--text-caption); }#dPaZUwGrZJVW .fc0 {fill: #646a73}#dPaZUwGrZJVW .fa2 { fill: var(--text-link-disabled); }#dPaZUwGrZJVW .fa2 {fill: rgb(187, 191, 196)}#dPaZUwGrZJVW .fx5 { font: 400 13px MonospacedNumber, LarkHackSafariFont, LarkEmojiFont, LarkChineseQuote, -apple-system, BlinkMacSystemFont, "Helvetica Neue", Tahoma, "PingFang SC", "Microsoft Yahei", Arial, "Hiragino Sans GB", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }#dPaZUwGrZJVW .fx5 {font-style: normal}#dPaZUwGrZJVW .fx6 { text-anchor: start; }#dPaZUwGrZJVW .fx6 {text-anchor: start}#dPaZUwGrZJVW .fx7 { dominant-baseline: alphabetic; }#dPaZUwGrZJVW .fx7 {dominant-baseline: alphabetic}#dPaZUwGrZJVW .fc1 { fill: rgb(0, 0, 0); }#dPaZUwGrZJVW .fc1 {fill: rgb(0, 0, 0)}#dPaZUwGrZJVW .fb1 { fill: var(--N900-FG, 0.15); }#dPaZUwGrZJVW .fb1 {fill: rgba(31,35,41, 0.15)}#dPaZUwGrZJVW .fb2 { fill: rgb(209, 217, 224); }#dPaZUwGrZJVW .fb2 {fill: rgb(209, 217, 224)}#dPaZUwGrZJVW .fa3 { fill: var(--bg-body); }#dPaZUwGrZJVW .fa3 {fill: #fff}AB1234模式从零生成优化已有新增需求场景我有个点子想做帮我把这份需求改得能落地给这个产品加个 X 功能
一个使用建议
第五节交付契约要写多细,取决于你打算怎么用这份 PRD:
•
拿了就开目标模式 / /goal 让它自己跑几小时 → 五个小节必须填满,这是唯一的防跑偏手段
•
自己边看边改、随时能纠偏 → 留一条禁止路径清单就够了