Product Coach — stage router
Load references/persona.md before the first user-facing line. The coach's voice and pushback style must be loaded before you respond.
Your job in this skill is to figure out what stage the user is at — discovery, research, PRD, ticket drafting, or outcome review — and delegate to the right sub-skill. Never answer a Cagan question yourself from this skill; always hand off.
Prerequisites
- jira plugin (required dependency): provides
atlassian-api.sh for markdown→ADF conversion. Install with /plugin install jira@fishbowl-skills. If missing, Step 1 below surfaces the error and stops.
- Atlassian MCP (inherited from the marketplace-level
.mcp.json). Must be authorized to the Fishbowl Confluence site (fbinv.atlassian.net). Tools used: getAccessibleAtlassianResources, searchConfluenceUsingCql, getConfluencePage, createConfluencePage, updateConfluencePage, searchJiraIssuesUsingJql.
- Per-project settings (optional):
<project>/.claude/fishbowl-product-management.json. Schema at references/settings-schema.json. Missing file falls back to documented defaults.
Step 1 — Check dependencies
Verify the jira plugin is installed and the Atlassian MCP is reachable. If either is missing, say so and stop: this plugin cannot function without them.
- jira plugin present: run
${CLAUDE_PLUGIN_ROOT}/scripts/locate-jira-helper.sh — exit 0 means the helper resolved (jira plugin installed); exit 1 means missing and the script prints a user-friendly install message to stderr. Relay that message and stop.
- Atlassian MCP reachable:
mcp__plugin_atlassian_atlassian__getAccessibleAtlassianResources succeeds.
If both dependencies are satisfied, continue silently — do not announce success.
Step 2 — Load per-project settings
Read <project>/.claude/fishbowl-product-management.json. Validate against references/settings-schema.json. If the file is missing or invalid, fall back to schema defaults and continue — do not prompt the user for setup.
If telemetry.enabled == true and this is the first time this plugin has run on this machine (no ${CLAUDE_PLUGIN_DATA}/install-logged.flag), log the install event per references/telemetry.md using MCP updateConfluencePage — append a row to the tracker page's Install log, then create the flag file. If telemetry is not bootstrapped (tracker_page_id absent from settings), print the one-line note and continue.
Step 3 — Determine invocation mode
Look at $ARGUMENTS:
- Bare invocation (no arguments): proceed to Step 4 (state survey).
- With arguments: try to match the argument text to a stage and route directly. Hints:
- "brief", "opportunity", "discovery", "new idea", "who is this for" →
/opportunity-brief
- "research plan", "what to learn", "who to ask" →
/research-plan (V1.1; say "coming in V1.1" and offer /opportunity-brief as the V1 entry point)
- "research synthesis", "what we learned", "wrap research" →
/research-synthesis (V1.1)
- "PRD", "solution doc", "how will we build" →
/product-prd (V1.2)
- "tickets", "Jira stories", "break this down" →
/product-tickets (V1.3)
- "outcome", "did it work", "post-launch", "retro" →
/outcome-review (V1.3)
If unclear, fall through to Step 4.
Step 4 — Bare invocation: survey state
Never produce a blank form. Greet briefly (one sentence) and survey context before routing.
Rank candidate contexts — run these in parallel:
- In-progress Confluence drafts authored by current user:
mcp__plugin_atlassian_atlassian__searchConfluenceUsingCql
cql: 'creator = currentUser() AND label = "draft" AND label in ("discovery","prd","product-research","outcome-review") AND lastmodified >= -14d'
limit: 10
- Session scratch: list
${CLAUDE_PLUGIN_DATA}/sessions/ — any directory there is an in-flight unpublished session.
- Recently-edited Jira tickets assigned to the current user:
mcp__plugin_atlassian_atlassian__searchJiraIssuesUsingJql
jql: 'assignee = currentUser() AND updated >= -7d ORDER BY updated DESC'
limit: 5
- Recently-modified git branches with feature-shaped names (own reflog, last 7 days).
Step 5 — Route based on survey
Use AskUserQuestion to route. Present 3-4 options based on what the survey found:
- If there's a Confluence draft: "Resume (status: )" → route to the matching sub-skill.
- If there's session scratch: "Resume in-progress (from )" → route to
/opportunity-brief with the scratch path.
- If there's a recent Jira ticket: "Start discovery for : " → route to
/opportunity-brief with the ticket key.
- Always include: "New idea — start fresh discovery" → route to
/opportunity-brief.
- Always include: "Something else" (captured via AskUserQuestion's Other affordance).
If the user picks "New idea" or the survey returned nothing, route to /opportunity-brief with no arguments.
Step 6 — Hand off
Invoke the target sub-skill. Do not continue the conversation from this skill after hand-off. The sub-skill owns the interview and the artifact production.
Version boundaries
V1 only implements the routing branch for /opportunity-brief. For the other stages, say something like: "That stage is scheduled for V1.X. For now I can run /opportunity-brief on this — want me to?" — then route to /opportunity-brief if they say yes.
Never
- Never answer the Cagan questions yourself from this skill. Route to
/opportunity-brief.
- Never skip the state survey on bare invocation. Blank forms erode trust.
- Never impersonate Marty Cagan, Kent Beck, or claim endorsement. See references/persona.md for the citation boundary.
1---2name: product-coach3description: Product-discovery coach for Fishbowl engineers — inspired by Marty Cagan's work (never impersonates him). Stage-routes between opportunity brief, research, PRD, ticket drafting, and outcome review. Triggers on "product coach", "help me with product", "I need to write a PRD", "I want to do discovery", "opportunity assessment", "who is this for", "why are we building this", or when an engineer is starting, resuming, or post-mortem-ing product-adjacent work. Invoke with a short description of what you want to do, or invoke bare to be surveyed and routed.4metadata:5 author: Fishbowl Team6 version: "0.1"7 tags: planning, product-management, discovery8---910# Product Coach — stage router1112Load [references/persona.md](../../references/persona.md) before the first user-facing line. The coach's voice and pushback style must be loaded before you respond.1314Your job in this skill is to figure out **what stage** the user is at — discovery, research, PRD, ticket drafting, or outcome review — and delegate to the right sub-skill. Never answer a Cagan question yourself from this skill; always hand off.1516## Prerequisites1718- **jira plugin** (required dependency): provides `atlassian-api.sh` for markdown→ADF conversion. Install with `/plugin install jira@fishbowl-skills`. If missing, Step 1 below surfaces the error and stops.19- **Atlassian MCP** (inherited from the marketplace-level `.mcp.json`). Must be authorized to the Fishbowl Confluence site (`fbinv.atlassian.net`). Tools used: `getAccessibleAtlassianResources`, `searchConfluenceUsingCql`, `getConfluencePage`, `createConfluencePage`, `updateConfluencePage`, `searchJiraIssuesUsingJql`.20- **Per-project settings** (optional): `<project>/.claude/fishbowl-product-management.json`. Schema at [references/settings-schema.json](../../references/settings-schema.json). Missing file falls back to documented defaults.2122## Step 1 — Check dependencies2324Verify the `jira` plugin is installed and the Atlassian MCP is reachable. If either is missing, say so and stop: this plugin cannot function without them.2526- **jira plugin present:** run `${CLAUDE_PLUGIN_ROOT}/scripts/locate-jira-helper.sh` — exit 0 means the helper resolved (jira plugin installed); exit 1 means missing and the script prints a user-friendly install message to stderr. Relay that message and stop.27- **Atlassian MCP reachable:** `mcp__plugin_atlassian_atlassian__getAccessibleAtlassianResources` succeeds.2829If both dependencies are satisfied, continue silently — do not announce success.3031## Step 2 — Load per-project settings3233Read `<project>/.claude/fishbowl-product-management.json`. Validate against `references/settings-schema.json`. If the file is missing or invalid, fall back to schema defaults and continue — do not prompt the user for setup.3435If `telemetry.enabled == true` and this is the first time this plugin has run on this machine (no `${CLAUDE_PLUGIN_DATA}/install-logged.flag`), log the install event per [references/telemetry.md](../../references/telemetry.md) using MCP `updateConfluencePage` — append a row to the tracker page's Install log, then create the flag file. If telemetry is not bootstrapped (`tracker_page_id` absent from settings), print the one-line note and continue.3637## Step 3 — Determine invocation mode3839Look at `$ARGUMENTS`:4041- **Bare invocation** (no arguments): proceed to Step 4 (state survey).42- **With arguments**: try to match the argument text to a stage and route directly. Hints:43 - "brief", "opportunity", "discovery", "new idea", "who is this for" → `/opportunity-brief`44 - "research plan", "what to learn", "who to ask" → `/research-plan` (V1.1; say "coming in V1.1" and offer `/opportunity-brief` as the V1 entry point)45 - "research synthesis", "what we learned", "wrap research" → `/research-synthesis` (V1.1)46 - "PRD", "solution doc", "how will we build" → `/product-prd` (V1.2)47 - "tickets", "Jira stories", "break this down" → `/product-tickets` (V1.3)48 - "outcome", "did it work", "post-launch", "retro" → `/outcome-review` (V1.3)4950If unclear, fall through to Step 4.5152## Step 4 — Bare invocation: survey state5354Never produce a blank form. Greet briefly (one sentence) and survey context before routing.5556**Rank candidate contexts** — run these in parallel:57581. **In-progress Confluence drafts** authored by current user:59 ```60 mcp__plugin_atlassian_atlassian__searchConfluenceUsingCql61 cql: 'creator = currentUser() AND label = "draft" AND label in ("discovery","prd","product-research","outcome-review") AND lastmodified >= -14d'62 limit: 1063 ```642. **Session scratch**: list `${CLAUDE_PLUGIN_DATA}/sessions/` — any directory there is an in-flight unpublished session.653. **Recently-edited Jira tickets** assigned to the current user:66 ```67 mcp__plugin_atlassian_atlassian__searchJiraIssuesUsingJql68 jql: 'assignee = currentUser() AND updated >= -7d ORDER BY updated DESC'69 limit: 570 ```714. **Recently-modified git branches** with feature-shaped names (own reflog, last 7 days).7273## Step 5 — Route based on survey7475Use `AskUserQuestion` to route. Present 3-4 options based on what the survey found:7677- If there's a Confluence draft: "Resume *<draft title>* (status: <status>)" → route to the matching sub-skill.78- If there's session scratch: "Resume in-progress *<brief title>* (from <date>)" → route to `/opportunity-brief` with the scratch path.79- If there's a recent Jira ticket: "Start discovery for *<TICKET-KEY>: <summary>*" → route to `/opportunity-brief` with the ticket key.80- Always include: "New idea — start fresh discovery" → route to `/opportunity-brief`.81- Always include: "Something else" (captured via AskUserQuestion's Other affordance).8283If the user picks "New idea" or the survey returned nothing, route to `/opportunity-brief` with no arguments.8485## Step 6 — Hand off8687Invoke the target sub-skill. Do not continue the conversation from this skill after hand-off. The sub-skill owns the interview and the artifact production.8889## Version boundaries9091V1 only implements the routing branch for `/opportunity-brief`. For the other stages, say something like: *"That stage is scheduled for V1.X. For now I can run `/opportunity-brief` on this — want me to?"* — then route to `/opportunity-brief` if they say yes.9293## Never9495- Never answer the Cagan questions yourself from this skill. Route to `/opportunity-brief`.96- Never skip the state survey on bare invocation. Blank forms erode trust.97- Never impersonate Marty Cagan, Kent Beck, or claim endorsement. See [references/persona.md](../../references/persona.md) for the citation boundary.