Skip to content
Back to skills

Interview Analysis

ASecurity

This skill should be used when the user asks to "/interview-analysis", "analyze my interview", "debrief my interview", "what did I miss in the interview", "review my interview transcript", or pastes a transcript / notes from a just-finished interview. Reads the transcript (pasted, from --from-file, or auto-pulled from Granola when userdata/integrations.md shows granola wired), pulls context from userdata/companies/<Co>/{meta,research-brief,interview-prep-*}.md and userdata/profile.md, and wri...

  • 7 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added June 4, 2026
ai-agentsrustgoapi

Works with

  • api
  • mcp

Security analysis

A100/100

Scanned June 4, 2026

npx -y skills add archugunov/pm-job-search --skill interview-analysis --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Interview Analysis?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Interview Analysis
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/archugunov-interview-analysis/badge)](https://www.skillsdirectory.com/skills/archugunov-interview-analysis)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: interview-analysis
description: This skill should be used when the user asks to "/interview-analysis", "analyze my interview", "debrief my interview", "what did I miss in the interview", "review my interview transcript", or pastes a transcript / notes from a just-finished interview. Reads the transcript (pasted, from --from-file, or auto-pulled from Granola when userdata/integrations.md shows granola wired), pulls context from userdata/companies/<Co>/{meta,research-brief,interview-prep-*}.md and userdata/profile.md, and writes userdata/companies/<Co>/interview-debrief-<YYYY-MM-DD>-<stage>.md with: what landed, what didn't, interviewer signals, deltas vs the prep doc, and recommended updates (story angles, profile.md What-NOT items, monitoring flag).

---

# /interview-analysis — post-interview debrief from a transcript

Single-pass analysis. Take a transcript (or notes), produce a debrief that's useful for: (a) the next round at the same company, (b) updates to the user's universal artefacts (stories, anti-patterns), (c) status decisions on `meta.md`.

**Voice:** the transcript-source prompt, stage prompt, and the written debrief itself follow `${CLAUDE_PLUGIN_ROOT}/TONE.md`. Apply the low-effort-first principle — accept notes if no transcript is available, infer Company / stage from filename if possible, only ask when the answer can't be derived.

## Inputs

- Transcript source — resolve in this priority order. The FIRST source that produces content wins:
  1. **Pasted content** in the same message as the invocation.
  2. **`--from-file <path>`** — read from the given path (can be inside or outside the workspace).
  3. **Auto-Granola fetch** — if `userdata/integrations.md` shows `granola` status `wired` AND neither of the above produced content, automatically attempt the Granola fetch (see "Granola fetch" below). No flag needed.
  4. **Prompt the user** — `Paste the transcript, or give me a file path.` Only fires when 1-3 all came up empty.
  - If the user has only notes (not a verbatim transcript), accept them — flag in the debrief that analysis is from notes, not transcript.
- `<Company>` — required. Take as positional arg (`/interview-analysis Plaid`), infer from `--from-file` parent folder if path is inside `userdata/companies/<Co>/`, or ask if neither.
- `<stage>` — required for the filename and for shaping. Pass via `--stage` or ask: `Which round was this — recruiter / hiring-manager / panel / cpo-round / final-loop / take-home / other?` Free-text accepted; will be slugged.
- `userdata/integrations.md` if it exists — parse the `## granola` section for wired-status. Skip silently if absent.
- `userdata/companies/<Co>/meta.md` and `research-brief.md` — for company context.
- The most recent `userdata/companies/<Co>/interview-prep-*.md` if it exists — for the "vs the prep" delta analysis. Match on `--stage` if multiple; otherwise pick the most recent same-stage prep, or the most recent prep regardless.
- `userdata/profile.md` — `## Positioning`, `## Tone of Voice`, `## What NOT to Frame As`.
- All `userdata/stories/*.md` — to spot which stories were used (match by title hints in the transcript) and judge whether the angles landed.

## Granola fetch (when granola wired)

When auto-Granola fires (or when the user explicitly says "pull from Granola"):

1. Query Granola for meetings matching `<Company>`. Primary path: call `mcp__granola__list_meetings` (or equivalent under the saved tool prefix) and title-scan the response for case-insensitive substring matches against `<Company>` (plus any common aliases from `userdata/companies/<Co>/meta.md`). If the list returns >10 meetings AND >3 candidate matches survive the title scan, refine via `mcp__granola__query_granola_meetings` to narrow. Reason for list-first: the query tool has been observed returning false negatives even when matching meetings exist; the list endpoint is more reliable as the source of truth.
2. Handle the result count:
   - **One match:** print `Found: <Meeting title> on <Date> — use this transcript?` Wait for y/n. If wrong, ask the user to describe the meeting and re-query.
   - **Multiple matches:** present a numbered list `1. <Title> — <Date> — <Duration>` and ask `Which interview — pick a number, or comma-separate to bundle rounds.` Bundling multiple selections concatenates them in chronological order with `--- next meeting ---` separators between transcripts.
   - **No matches:** print `Couldn't find any Granola meeting matching '<Company>'. Paste the transcript or give me a file path instead.` Fall through to source #4.
3. For the selected meeting(s), call `get_meeting_transcript` with the meeting ID. Extract the transcript text. Pass that downstream as if it had been pasted.
4. If the Granola call returns an auth or quota error: print one line `Granola fetch failed (<error type>). Paste the transcript or give me a file path instead.` and fall through to source #4. Do not retry silently.

Auto-Granola is opportunistic. If the user has explicitly pasted a transcript or passed `--from-file`, that wins — Granola is never queried in those runs.

## Parse the transcript

Extract these structured pieces. If something can't be identified, mark `unknown` rather than guessing.

1. **Interviewer(s)** — names and roles if stated; otherwise generic ("CPO", "hiring manager").
2. **Questions asked** — list, with the user's answer-summary alongside.
3. **Stories the user told** — match each user-told story against the universal bank's titles + themes. Surface mismatches: "user told a story not in the bank — candidate for new entry."
4. **Direct signals from the interviewer** — verbatim quotes that indicate enthusiasm, hesitation, scope-concerns, or culture cues.
5. **Topics the interviewer kept returning to** — these are the real evaluation axes for this round.
6. **Items the interviewer mentioned about next steps** — process, timeline, who's next, when to expect a decision.
7. **Compensation signals** — if comp was discussed, capture the band as stated.

## Debrief structure

Write `userdata/companies/<Co>/interview-debrief-<YYYY-MM-DD>-<stage-slug>.md`:

```markdown
# Interview debrief — <Company> / <Position>
**Date:** <date>  **Stage:** <stage>  **Source:** transcript | notes  **Tier (pre):** <P0|P1|P2>

## What landed
- <Specific bullets, each anchored to a quote or moment from the transcript.>
- (e.g. "The pricing-experiment story drew an explicit 'this is exactly the
  shape we need' from the CPO at 24:15 — clear signal it lands here.")

## What didn't land
- <Bullets, also anchored. Be specific — vague self-criticism isn't useful.>
- (e.g. "When asked about activation, the answer drifted into pricing again
  rather than the activation funnel story — visible interviewer cool-off.")

## Interviewer signals
- **Enthusiasm:** <list quoted signals.>
- **Concerns / hesitations:** <list, with interpretation in parentheses.>
- **Scope cues:** <what the interviewer kept asking about — that's their
  actual decision criterion.>
- **Culture cues:** <e.g. how they described the team, what they praised
  in past hires.>

## Vs the prep doc
<If a same-day or recent prep doc exists, compare:>
- **Stories planned vs told:** which prep-doc stories made it in, which
  didn't, and any stories told that weren't in the prep.
- **Questions asked vs prepped:** how many of the planned "Questions to
  ask THEM" were actually used.
- **Anchors deployed:** which prep-doc anchors (why-us, salary, etc.)
  came through and which got buried.
<If no prep doc: omit this section entirely.>

## Role shape verdict
**🟢 building-with-team / 🟡 mixed / 🔴 defending-positions**

<One-line verdict, then 2-4 bullets quoting the transcript signals that
drove it. Read the round for what kind of work the role actually is — the
JD often says "build the product strategy" but the interviewer's stories
reveal whether the last person spent their time shipping or putting out
political fires.>

Signal categories to scan for:
- **🟢 Building** — interviewer describes recent shipping cadence, names
  the engineering / design leads they collaborate with, talks about
  what's NEXT for the surface, asks about your favourite product debates.
- **🟡 Mixed** — interviewer describes the role as "stabilising" or
  "getting the team to a steady state", references at least one named
  internal conflict, asks about cross-functional alignment.
- **🔴 Defending** — interviewer talks about "rebuilding trust", names
  specific stakeholders who "need to be brought along", describes the
  role as primarily senior-stakeholder management, the role exists
  because the last person left under tension.

If signals are insufficient to call (e.g. recruiter screen, < 20 minutes
of substantive content), render: `Insufficient signal — defer verdict to
next round.` Do NOT guess.

## Process / next steps
- <Bullets capturing what the interviewer said about timeline, next
  rounds, decision process, who's involved.>

## Recommended updates
- **Stories to add or sharpen** — list. If a told story isn't in the bank,
  recommend `/story-builder --new "<title>"`. If a told story landed weakly,
  recommend a new angle.
- **Profile updates** — if the interview surfaced a misfit (e.g.
  "interviewer pushed on people-management depth and you don't have it"),
  recommend a `## What NOT to Frame As` addition.
- **Meta updates** — recommend status / monitoring changes. E.g. "Move
  status to interviewing-paused if they signalled a 2-week pause," or
  "Flip monitoring: true if you exit at any reason short of mutual no."
- **Next-round prep** — if this isn't the final round, list 3-5 prep items
  the user should focus on for the next round (lifted from interviewer
  signals + concerns).
```

If a section's evidence list is empty, render the section with `<None — see notes.>` rather than omitting (the structure helps with cross-debrief comparison).

## Tone of voice for the debrief

Use the user's `## Tone of Voice` from profile.md. Default if unset: direct, short sentences, no euphemism. The debrief is for the user's own use — softening hurts more than helps.

## Status hints (do NOT mutate meta.md)

The debrief surfaces recommendations under "Meta updates" but never edits `meta.md` itself. The user runs the change (`/today` will surface the suggestion or the user edits directly). Reasoning: status transitions are decisions, not derivations — the user's call.

If the interview signal is unambiguous (e.g. "we don't think this is a fit, thank you for your time"), make the recommendation explicit:
> **Strongly recommend** updating `meta.md`: status: rejected, date_rejected: <date>, rejection_stage: <stage>, rejection_note: "<verbatim or summary from interviewer>".

For ambiguous signals, recommend a wait period: `Hold for 5 business days before flipping to not_interested; recruiter may circle back.`

## Output to chat

After writing the debrief file, print to chat (compact):

> Debrief filed: userdata/companies/<Co>/interview-debrief-<date>-<stage>.md
> - <N> stories landed, <M> didn't
> - <K> recommended updates (see "Recommended updates" section)
> - Next step (from interviewer): <one-line summary, or "unclear">

If the debrief recommends a meta.md status change, repeat it in the chat output (don't bury it in the file):

> Recommended next: update meta.md status to <X>. /today will surface this but you make the call.

## What /interview-analysis never does

- Never edits `meta.md` directly. Recommendations only.
- Never edits the universal story bank (no story body changes, no angle additions). It recommends; `/story-builder` executes.
- Never edits the prep doc the interview used. The prep was a forecast; the debrief is what happened.
- Never invents transcript content. If a section can't be evidenced from the input, the bullet is `<None evidenced — needs user fill-in.>`.
- Never deletes prior debriefs at the same company / stage. If the same stage gets a re-interview (rare), the new debrief has the suffix `-v2` (or `-v3`, etc.).
- Never writes to `userdata/integrations.md`. Granola is read-only from this skill's perspective.
- Never persists the raw Granola response anywhere. The transcript text gets used to produce the debrief; the saved file is the debrief, not the API response. (The transcript stays in Granola — that's its source of truth.)
- Never retries failed Granola calls silently. One attempt, fall through to manual paste on failure.

## Smoke test against the Maya example

There's no transcript and no `integrations.md` in Maya's example install — this skill is exercised by the user pasting real content. A synthetic test would mock a transcript for Plaid's CPO round and verify the output structure. Defer until a real interview happens.

To exercise the auto-Granola code path, run the skill in a workspace where `userdata/integrations.md` has granola wired (run `/pm-job-search:integrations` first), invoke `/interview-analysis <Company>` with NO pasted transcript and no `--from-file`, and verify the Granola query / disambiguation / fetch flow runs before any "paste the transcript" prompt would appear.

## End-of-run nudge

After writing the output to chat, compose one context-aware next-step line per `${CLAUDE_PLUGIN_ROOT}/references/recommended-flow.md`. Skip the nudge entirely if no useful next step is obvious.

Typical next steps for this skill:
- If the debrief surfaces a story not yet in the bank: suggest `/pm-job-search:story-builder --new "<title>"` to capture it.
- After any round debrief: suggest `/pm-job-search:today` to update the pipeline state and surface the meta.md status recommendation.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.