Skip to content

/pm

Generate a PM through guided PM-focused interview with automatic question classification. Use when the user says 'ooo pm', 'prd', 'product requirements', or wants to create a PRD/PM document.

From plugin
ouroboros
5.8k22 skills21 agents3 hooks1 MCP
Install
$ npx -y skills add Q00/ouroboros --skill pm --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/pm

Context preview

The summary Claude sees to decide when to auto-load this skill.

Generate a PM through guided PM-focused interview with automatic question classification. Use when the user says 'ooo pm', 'prd', 'product requirements', or wants to create a PRD/PM document.

SKILL.md

pm.SKILL.md
name: pm
description: "Generate a PM through guided PM-focused interview with automatic question classification. Use when the user says 'ooo pm', 'prd', 'product requirements', or wants to create a PRD/PM document."

/ouroboros:pm

PM-focused Socratic interview that produces a Product Requirements Document.

Instructions

Step 0: Version Check (runs before the PM interview)

Before starting the PM interview, check if a newer version is available:

# Fetch latest release tag from GitHub (timeout 3s to avoid blocking)
curl -s --max-time 3 https://api.github.com/repos/Q00/ouroboros/releases/latest | grep -o '"tag_name": "[^"]*"' | head -1

Compare the result with the current version in the active runtime's local plugin metadata (for Claude installs this is `.claude-plugin/plugin.json`).

  • If a newer version exists, ask the user through the active runtime's `ask_user` capability:
  {
    "questions": [{
      "question": "Ouroboros <latest> is available (current: <local>). Update before starting?",
      "header": "Update",
      "options": [
        {"label": "Update now", "description": "Update plugin to latest version (restart required to apply)"},
        {"label": "Skip, start PM interview", "description": "Continue with current version"}
      ],
      "multiSelect": false
    }]
  }
  • If "Update now":
  • On Claude-plugin installs only:

1. Run `claude plugin marketplace update ouroboros` via the active runtime's `run_shell` capability (refresh marketplace index). If this fails, tell the user "⚠️ Marketplace refresh failed, continuing…" and proceed. 2. Run `claude plugin update ouroboros@ouroboros` via the active runtime's `run_shell` capability (update plugin/skills). If this fails, inform the user and stop — do NOT proceed to the package-manager step.

  • On non-Claude runtimes, skip Claude plugin commands and proceed directly to the package-manager step for `ouroboros-ai`; do not require Claude-only commands or tools.

3. Detect the user's Python package manager and upgrade the MCP server:

  • Check which tool installed `ouroboros-ai` by running these in order:
  • `uv tool list 2>/dev/null | grep "^ouroboros-ai "` → if found, use `uv tool upgrade ouroboros-ai`
  • `pipx list 2>/dev/null | grep "^ ouroboros-ai "` → if found, use `pipx upgrade ouroboros-ai`
  • Otherwise, print: "Also upgrade the MCP server: `pip install --upgrade ouroboros-ai`" (do NOT run pip automatically)

4. Tell the user: "Updated! Restart your session to apply, then run `ooo pm` again."

  • If "Skip": proceed immediately.
  • If versions match, the check fails (network error, timeout, rate limit 403/429), or parsing fails/returns empty: **silently skip** and proceed.

Step 1: Load MCP Tool

tool discovery query: "+ouroboros pm_interview"

**CRITICAL — deferred-schema guard (prevents "Invalid tool parameters"):** This is a multi-turn loop and each turn runs in a fresh tool context. A deferred tool's schema loaded on one turn is NOT guaranteed to still be loaded on the next. Calling `ouroboros_pm_interview` while its schema is unloaded in the **current** turn makes the runtime reject it with **"Invalid tool parameters"** every message. Therefore **re-run `tool discovery query: "+ouroboros pm_interview"` immediately before EVERY `ouroboros_pm_interview` call** below (idempotent — a no-op if already loaded). If the load ever returns no matching tool (and the tool is not already callable — an empty load for an already-exposed tool is an expected no-op, not absence), follow the not-found diagnosis below instead of retrying the failing call.

If not found → fail closed without inspecting or mutating `~/.claude/mcp.json`. Standalone Claude SDK setup requires MCP 1.x and cannot activate the Ouroboros MCP 2 server with its configured backend. Explain:

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.

Stop.

Step 2: Start Interview

Tool: ouroboros_pm_interview
Arguments:
  initial_context: <user's topic or idea>
  cwd: <current working directory>

**This response carries the first question, so Step 3 applies to it** — including the fan-out in 3-A2. The first question is the one most likely to be answered from memory, so it is the last one to skip evidence on.

Step 3: Loop

Apply this to **every** MCP response that carries a question, including the one Step 2 returned and any question a resume plans anew.

**Batched turns (RFC #2222).** A response may carry one to three questions at once: `meta.question_batch` lists them and `meta.question_advisories` carries one advisory envelope per question, each with its own `question_advisory_subagents` and `question_advisory_fanout_id`. Treat every question of the turn exactly as a single question is treated below, with these batch mechanics:

  • **Dispatch all envelopes' payloads in one wave** — one subagent per payload

across all questions, in a single parallel batch. Never leave a question's lanes undispatched: every question shown keeps its evidence.

  • **Submit results per envelope** — each question's lanes correlate by its own

envelope's `question_advisory_fanout_id` and `question_advisory_result_correlation_key`; one `ouroboros_submit_fanout_results` call per envelope.

  • **Relay the turn's answers together** in one call:

`answers: [{question, answer}, ...]`, one entry per question the turn asked, each naming its own exact question text. One call records the turn, so collect every answer first — and never auto-answer, auto-defer, or decide-later one on the user's behalf to complete the set. The server

Read more
Ships withouroboros

Agent OS: the agent gets smarter on its own. We just hold the line: Interview-gated, staged evaluation, budgeted evolution loop. MCP server, 14 runtimes: Claude Code, Codex CLI, Gemini CLI, OpenCode, Copilot, Kiro and more.

Get the whole plugin, auto-invoked

Other skills on ouroboros.