关于 pm
面向产品规划的 PM 访谈技能,通过结构化提问生成产品需求文档,并可在提问旁呈现证据。
主要功能
- 01苏格拉底式 PM 访谈
- 02生成 PRD
- 03每题配套证据审查
- 04答案确认与修订
- 05可用时复制到剪贴板
适用场景
- 01梳理产品需求
- 02记录决策与待定事项
MCP 相关
使用 Ouroboros PM 访谈 MCP 工具管理访谈状态并写入 PRD。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ q00/ ouroboros --skill pm安装后在 Claude Code 中输入/pm确认已加载。
详细介绍
/ouroboros:pm
面向 PM 的苏格拉底式访谈,用于生成产品需求文档(PRD)。
所需技能能力
ask_user:通过当前运行时的ask_user能力向用户提问。call_mcp:ouroboros_pm_interview保存访谈状态并编写 PRD。orchestrate_subagents:执行每个问题附带的证据通道。refine_answer:提交结构化答案前先确认(Refine 门控)。run_shell:完成后将 PRD 复制到剪贴板(如可用)。
说明
更新会在后台检查;如果你的上下文中包含 Ouroboros 更新通知,请在第一个问题之后提及一次 ooo update。
步骤 1:加载 MCP 工具(延迟加载架构防护)
Ouroboros 工具可能会延迟加载,而且某一轮加载的架构可能在下一轮卸载。每次调用 ouroboros_* 前,都要立即通过当前运行时的工具发现能力加载相应工具:"+ouroboros pm_interview" 对应 ouroboros_pm_interview。如果工具已可调用,工具发现操作不会执行任何操作,预期会返回空结果。只有在工具确实不存在时才使用后备方案。
后备方案:安全失败。不要检查或编辑 ~/.claude/mcp.json,也不要添加直接调用 Python 的后备方案。告知用户这一点,然后停止:
The PM interview MCP tool is unavailable in this runtime.
Configure a supported CLI-backed host with:
ouroboros setup --runtime <codex|opencode|kiro|copilot|hermes>
Then restart that host and retry ooo pm. Claude SDK profiles ([claude] and
[claude-sdk]) stay on MCP 1.x; the separate [mcp] server uses [claude-cli]. Do
not combine both MCP majors or add a direct Python fallback.
步骤 2:开始访谈
Tool: ouroboros_pm_interview
Arguments:
initial_context: <user's topic or idea>
cwd: <current working directory>
响应中包含第一个问题,因此步骤 3 也适用于该问题,包括证据通道。
步骤 3:循环
对每条包含问题的响应执行以下操作。
批量轮次。 一条响应可能包含 1 到 3 个问题:meta.question_batch 会列出这些问题,meta.question_advisories 则为每个问题提供一个提示封装(包含各自的 question_advisory_subagents、question_advisory_fanout_id 和 question_advisory_result_correlation_key)。按以下要求处理每个问题,此外还要:
- 在同一轮中派发每个封装中的所有有效负载;不得让任何已展示的问题失去其证据通道。
- 按封装提交结果:每个封装各调用一次
ouroboros_submit_fanout_results。 - 在一次
ask_user提示中询问本轮的所有问题;每个问题都使用其对应meta.question_batch条目中的选项。 - 在一次调用中转达本轮内容,使用
answers: [{question, answer}, ...],每个问题占一项,并使用其准确文本。先收集所有答案;不得代替用户自动回答、自动延后处理或决定稍后再处理任何问题,以凑齐整组答案。遗漏的内容会被放弃;如果调用中缺少本轮的答案,就会规划新一轮,导致用户再次被询问。 - 跳过标记按问题分别处理,放在对应问题自己的条目中。
A. 提醒(来自 meta):
meta.deferred_this_round→ 输出[DEV → deferred] "question"meta.decide_later_this_round→ 输出[DEV → decide-later] "question"meta.pending_reframe→ 输出ℹ️ 已从技术问题重新表述。
A2. 证据通道:在向用户提问前必须完成。
你不能自行查看代码库。此技能没有通过代码作答的路径:无法追溯至证据通道的证据,均不属于记录中的证据。所需内容都在这里和工具响应中。
如果存在 meta.question_advisory_subagents,则处理其中的每个有效负载:先展示问题,再原样传递每个有效负载的 prompt,包括精简的占位提示(子 Agent 会通过 ouroboros_fetch_artifact 获取自身上下文)。遵循 meta.question_advisory_host_action:spawn_subagents 表示已声明并行支持;dispatch_subagents_if_supported 表示在支持时进行原生并行派发,否则按顺序处理;process_payloads_sequentially 要求按顺序处理。有效负载是工作约定,宿主操作则决定执行策略。
这些通道是 code_context 和 data_context,两者都是必需的。提出问题后,在分隔线下方,用用户使用的语言说明当前有多少个视角正在运行,使用用户的说法,而不是通道 ID,并以“依据”结尾,绝不能以“选项”结尾(此工具不会提供答案选项):
---
While you answer this question, two perspectives are reviewing in parallel
(code context / data measurement). When they return I will put what they found
next to the question as grounds.
通道仍在运行时,不要进入步骤 B。空结果、未遵守约定或无法启动的通道,都视为已返回。用户可随时作答;等待的是你的正式提示词。
提交。 调用 ouroboros_submit_fanout_results,并提供 meta.question_advisory_fanout_id、明确的 session_id,以及通过 meta.question_advisory_result_correlation_key(context.lane_id)关联的结果。提交你持有的所有通道:没有发现内容的通道也要提交其输出;无法启动的通道,或子级回复内容恰好为 UNDISPATCHED 的通道,提交 { "key": <lane id>, "undispatched": true }(字面值 true,不含 content)。绝不要编造未运行通道的输出。
读取回复。 如果有 contract_id,根据你持有的输出进行综合。若没有,则读取 missing_required_keys 和 contract_violations,并在重新提交时补上所有通道。如果仍然没有,则带着现有内容(或空内容)进入步骤 B,并用一行说明调查结果未返回。无论哪种情况,都要省略 contract_violations 中列出的通道,也要省略你提交为 undispatched 的通道:未运行的通道是空缺,不是结果清晰。证据块本应包含该通道内容时,写明该通道未运行。
证据块(synthesis_contract.output_shape = "evidence_beside_question")。将其紧贴在问题上方打印,然后原样提问:
Evidence (examined: billing-api, storefront)
What the system does today
· [billing-api] access continues to the end of the paid period
· [storefront] access is revoked immediately
! These two repositories implement this differently.
Measured: active subscriptions by plan, last 90 days
· standard 12,480 / premium 3,120
这些标签是格式占位符,不是要照抄的文本。规则:
- 每条代码声明都必须取自通道的
plain_statement(已使用问题的语言),不得取自policy_claim,也不得改述。界面上不得显示文件路径、类名或标志值;引用保留在已发布的扇出结果中。 - 每条声明都必须保留其所属仓库。绝不要合并来自两个仓库的声明,也不要将意见分歧表述为带有例外情况的单一政策;应像上文那样标明分歧。
- 始终打印已检查的范围。每个
examined条目都是通道读取过的仓库;如果某条目的policy_claims为空,表示该仓库已读取但没有发现内容(应明确说明);没有条目的仓库表示从未打开,不得标示为检查无问题。 - 按报告内容保留测量值(
metric、分组、数字);不得重新缩放、合并或四舍五入。 - 空操作通道最多显示一行。
not_a_policy_question/not_a_measurement:不打印任何内容。no_repository_in_roster/roster_repository_not_readable/store_described_but_not_callable:由你自行处理(未注册、路径无法打开或存储库未响应);绝不要将这些情况转述为“你的系统没有此类政策/数据”。 - 丢弃用户已经回答过的问题的相关发现;不要用这些发现重新提出已确定的决策。
- 不在名册内的证据(为本次 PM 会话选定的棕地仓库之外的证据)会在提交时被拒绝。不要转述;改为提议注册该仓库。
- 不提供答案选项、建议、排名或“因此”式结论。PRD 会询问系统应该怎么做;证据块只说明系统实际怎么做。
A3. 发现是证据,不是答案。 已发布的扇出结果是某项发现的完整记录。不要发送 [from-code] 答案,不要让用户在单独一轮中确认某项发现,不要在任何答案载荷中放入发现,也绝不要因为某个通道给出了明确答案就跳过提问。用户会在看到证据的情况下,用自己的话作答。
B. 询问用户(等 A2 的各条线返回后)。打印 MCP 内容文本及证据块。告诉用户无需编造推测性答案:对于未知、取决于利益相关方、范围过广或最好稍后再决定的问题,应通过假设、稍后决定或暂缓机制处理,而不是列为已确认需求。通过 ask_user 提问,将问题文本作为 meta.question,并提供 2-3 个建议答案;适当时包括 Not sure yet: record as an assumption or decide-later item。当 meta.skip_eligible == true 时,根据该问题自身的 classification 添加一个跳过选项:
decide_later→Decide later(作为开放事项记录在 PRD 中)deferred→Defer to dev(将技术决策推迟到开发阶段)
C. 转达答案。 Decide later → answer="[decide_later]";Defer to dev → answer="[deferred]";其他任何答案都必须先经过 Refine gate。对于批量轮次,先精炼每个答案,再在一次 answers 调用中发送所有答案,并附上每个问题的原文;该调用会返回下一轮。
Refine gate(pm)。 与访谈技能不同,即使用户只选择了一个选项,也始终要对答案进行结构化:这是 MCP 唯一拥有的上下文,也是 PRD 记录为已决定的内容。使用用户自己的措辞标注各部分 (user-stated),你自己的解读部分不加标记。没有内容的部分应省略,不要用看似合理的内容填充。不要添加代码库上下文部分或各条线的调查结果(A3)。
[from-user][refined]
Decision: <what they decided, in their words>
Reasoning:
- <your reading of why, drawn from what they said in this session>
Constraints (user-stated):
- <constraints they stated>
Out of scope (user-stated):
- <what they put out of scope>
然后通过 ask_user 确认:“发送前,我将你的答案结构化如下:。是否有任何遗漏或表述不准确之处?”选项:Send as-is、Fix the reasoning(未标记的部分是你撰写的)、Add to Constraints、Let me rewrite it。仅在确认后追加 [refined]。
Tool: ouroboros_pm_interview
Arguments:
session_id: <meta.session_id>
last_question: <meta.question>
answer: <the refined answer, or "[decide_later]" / "[deferred]">
last_question 必须始终与 answer 一同提供:服务器会将每个答案与对应问题配对,并拒绝不带 last_question 的 answer。每个答案都必须是用户自己的措辞。
D. 检查是否完成。 是否完成仅由 meta.is_complete 决定,绝不能根据响应文本判断。如果 meta.is_complete == true:
meta.generation_failed == true→ 重试生成:Tool: ouroboros_pm_interview Arguments: session_id: <session_id> action: "generate" cwd: <current working directory>- 否则,PRD 已生成:转到步骤 4(
meta.pm_path、meta.seed_path)。
否则重复步骤 3。
步骤 4:复制到剪贴板
如果 run_shell 可用,将 meta.pm_path 的内容复制到剪贴板(例如,在 macOS 上使用 pbcopy < <meta.pm_path>)。
步骤 5:显示结果和下一步
PM document saved: <meta.pm_path>
(copied to clipboard)
PM seed handoff artifact: <meta.pm_seed_path or meta.seed_path>
This is not the runnable Seed yet.
Next step:
ooo interview <meta.pm_seed_path or meta.seed_path>
ooo seed
如果没有复制任何内容,则省略 (copied to clipboard)。
RFC #1392 状态提示页脚
最终响应以且仅以一行 ◆ <current state> → next: <recommended action> 结尾。如果 ouroboros_session_status 可用,则根据实时会话状态确定状态;否则,根据此技能的实际结果确定。绝不要使用线性的 Step N of M 页脚;如果下一步需要实际选择,则列出 2-3 个选项。