From nanopm
Prepares hypothesis-driven user interview guides based on Teresa Torres, Rob Fitzpatrick, Bob Moesta, and Cindy Alvarez. Runs live or imports from Granola, extracts signal into FEEDBACK.md.
How this skill is triggered — by the user, by Claude, or both
Slash command
/nanopm:pm-interviewThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<!-- portability-v2 -->
Multi-host portability rules. When invoking
AskUserQuestion:
- The
headerfield MUST be a short noun phrase (≤ 12 characters). Mistral Vibe rejects longer headers withstring_too_long. Pick from:Start,Target,Scope,Audience,Methodology,Feature,Question.- The
optionslist MUST have at least 2 items. Vibe rejects empty/single-option calls. For free-text input, always provide ≥ 2 framing options (e.g.Yes, here's the input/Skip) — never callask_user_questionwithoptions: [].
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || \
source .nanopm/lib/nanopm.sh 2>/dev/null || \
{ echo "ERROR: nanopm not installed. Run: curl -fsSL https://raw.githubusercontent.com/nmrtn/nanopm/main/setup | bash"; exit 1; }
nanopm_preamble
_FEEDBACK_FILE=".nanopm/FEEDBACK.md"
_INTERVIEW_FILE=".nanopm/INTERVIEW.md"
Run /pm-interview when:
The goal is never to pitch. The goal is to collect specific stories from the past that reveal real behavior.
This skill draws from four recognized approaches:
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || source .nanopm/lib/nanopm.sh 2>/dev/null || true
nanopm_context_read pm-interview
nanopm_context_all
If prior interview entries found: "Found {N} past sessions. This session builds on them — prior verdicts will inform the guide."
Read prior context to understand which assumptions have already been tested and what signal exists.
[ -f ".nanopm/DISCOVERY.md" ] && echo "DISCOVERY_EXISTS" || echo "DISCOVERY_MISSING"
_CHALLENGES=".nanopm/CHALLENGES.md"; [ -f "$_CHALLENGES" ] || _CHALLENGES=".nanopm/AUDIT.md" # legacy pre-rename name
[ -f "$_CHALLENGES" ] && echo "CHALLENGES_EXISTS" || echo "CHALLENGES_MISSING"
[ -f ".nanopm/FEEDBACK.md" ] && echo "FEEDBACK_EXISTS" || echo "FEEDBACK_MISSING"
[ -f ".nanopm/PRODUCT.md" ] && echo "PRODUCT_EXISTS" || echo "PRODUCT_MISSING"
If PRODUCT_EXISTS: read .nanopm/PRODUCT.md. Ground the interview guide in what exists — anchor the story-anchor behavior and workaround questions on the product's real workflows and surfaces, so you probe how users actually experience it rather than a hypothetical. This read is advisory — if it's absent, proceed without it. If PRODUCT.md's header shows Completeness: draft, surface a one-line non-blocking warning: "Note: interviewing against a draft product concept."
Ask via AskUserQuestion:
"What are you trying to learn from this interview?
Be specific — name the assumption or behavior you want to understand.
Good examples:
Bad examples (too vague):
If you have DISCOVERY.md or CHALLENGES.md open, I'll suggest the highest-risk assumption as a default."
If DISCOVERY_EXISTS or CHALLENGES_EXISTS: extract the top-risk assumption and suggest it. Let the user confirm or override.
From the focus, extract or infer:
Ask via AskUserQuestion:
"Who is the person you're interviewing?
If you don't have someone yet, I can write a recruitment message."
If no subject yet: write a 3-sentence recruitment message (LinkedIn or Slack) targeting the ideal profile from DISCOVERY.md/CHALLENGES.md context. Include: who you're looking for, what you want to talk about (problem, not your solution), and a clear ask (30-min call).
Interview type detection: Based on the relationship to the problem, classify the session:
Generate a complete, ready-to-use interview guide. The guide is a compass, not a script (Constable) — questions are ordered by criticality, most important hypotheses first.
Set the frame:
"Thanks for making time. I'm trying to understand your experience with [problem area] — I'm not here to pitch anything, just to learn. I'll ask you about specific situations you've been in, not hypothetical scenarios. Mind if I take notes?"
Warm-up:
"Tell me a bit about your role and what [relevant activity] looks like in a typical week."
Pick ONE behavior most likely to reveal the assumption. Anchor to a real past event:
"I'd love to start with a specific situation. Tell me about the last time you [specific behavior]."
Generate 5–7 questions based on the interview type and focus. Apply these rules for every question:
Mom Test rules (Fitzpatrick):
Mandatory questions (always include):
Workaround question: "How are you handling [the problem] right now? Walk me through exactly what you do." → Reveals your real competition. If the answer is "nothing," probe harder — someone with a real problem always has a workaround.
Implication question: "What happens if you don't solve this? What does it cost you — time, money, stress?" → Separates a real problem from a minor irritant. No real cost = weak signal.
Alternative question: "What else have you tried? What did you like or hate about it?" → Reveals the competitive landscape and pricing anchor.
For JTBD Switch sessions (Moesta), follow the 6 stages:
Map the four forces during the session:
Probing techniques (NNG funnel):
For each of the top 3 critical hypotheses, include one targeted question. Order these by criticality — most important first (Constable: if the call cuts short, you've still tested the most critical hypothesis).
Format:
Hypothesis: [belief]
Question: [specific behavior-based question to test it]
Confirmation signal: [what answer would confirm it]
Refutation signal: [what answer would refute it]
"Is there anything about [problem area] you expected me to ask that I didn't?" "Who else do you think I should talk to? Could you introduce me?" "What would be most useful for me to send you as a follow-up?"
Forward action (Alvarez): always end with a specific next step — an intro, a follow-up session, or sharing a prototype later.
| What to avoid | Why |
|---|---|
| "Would you use X?" | Produces false positives — people say yes to be polite |
| Pitching before the core questions | Biases every answer that follows |
| Interpreting aloud while they talk | Shuts down their train of thought |
| Asking compound questions | Interviewee answers only the easiest part |
| Accepting vague answers without probing | "It was frustrating" tells you nothing |
| Asking about hypothetical futures | Behavior prediction is unreliable |
Tell the user:
"Guide ready. Recommended duration: 30–45 min. The questions are ordered by importance — if the call runs short, you've still covered the most critical hypothesis.
When you're done, come back and say 'I just finished the interview' — I'll extract the signal. If you recorded in Granola, I'll pull the transcript automatically."
If the user says they've just finished: proceed to Phase 5.
Check Granola first:
Try mcp__claude_ai_Granola__query_granola_meetings with the interviewee name or topic from Phase 2.
If a matching meeting is found:
mcp__claude_ai_Granola__get_meeting_transcriptIf no Granola transcript: ask via AskUserQuestion:
"Paste your raw notes — don't filter, don't clean up. Exact quotes are the most valuable thing."
From the raw notes or transcript, extract:
Key findings:
Verbatim quotes (mark the strongest one ⭐):
"exact quote" — [context] Pick quotes that reveal emotion, workaround behavior, or a real cost. Paraphrases have no value here.
Four forces map (JTBD):
| Force | Evidence from this session |
|---|---|
| Push (why they wanted to change) | |
| Pull (what attracted them) | |
| Anxiety (what held them back) | |
| Inertia (what they were attached to) |
Jobs identified:
| Functional job | Emotional job | Current workaround | Pain level (1–5) | Frequency |
|---|
Hypothesis verdicts: For each hypothesis tested:
Signal reliability:
Append to .nanopm/FEEDBACK.md (create if missing):
---
## Interview — {date} — {interviewee profile}
**Focus:** {assumption or question tested}
**Session type:** {story-based | JTBD switch | lean discovery | positioning}
**Key findings:**
{bullet list — specific and concrete}
**Best quote** ⭐:
> "{exact verbatim quote}" — {context}
**Other quotes:**
> "{quote}" — {context}
**Four forces:**
| Force | Evidence |
|-------|---------|
| Push | {what frustrated them about the status quo} |
| Pull | {what attracted them toward a solution} |
| Anxiety | {what made them hesitant} |
| Inertia | {what they were reluctant to leave behind} |
**Jobs identified:**
| Functional job | Emotional job | Workaround | Pain | Frequency |
|---|---|---|---|---|
**Hypothesis verdicts:**
- {hypothesis}: {CONFIRMED / REFUTED / INCONCLUSIVE} — {evidence}
**Recommended next:**
{/pm-discovery to reframe | /pm-challenge-me | more interviews (N total so far, {5 - N} more recommended) | /pm-prd if signal is sufficient}
---
Write session summary to .nanopm/INTERVIEW.md (overwrite — latest session only).
source ~/.nanopm/lib/nanopm.sh 2>/dev/null || source .nanopm/lib/nanopm.sh 2>/dev/null || true
nanopm_context_append "{\"skill\":\"pm-interview\",\"outputs\":{\"focus\":\"$(head -20 .nanopm/INTERVIEW.md | grep 'Focus' | cut -d: -f2- | xargs | tr '\"' \"'\" | head -c 100)\",\"verdict\":\"$(grep 'Hypothesis verdicts' .nanopm/INTERVIEW.md | cut -d: -f2- | xargs | head -c 50)\",\"next\":\"pm-challenge-me\"}}"
Tell the user:
STATUS: DONE
npx claudepluginhub nmrtn/nanopm --plugin nanopmGenerates structured customer interview scripts with warmup, JTBD core exploration, and wrap-up sections following Mom Test principles. For user interview prep, guides, and discovery research planning.
Provides frameworks for discovery, validation, usability, and generative user interviews with question scripts, techniques, and analysis for product research.
Design and conduct structured customer interviews to uncover problems, motivations, and decision-making.