Codes a single interview transcript into a structured, lens-specific format where every analytic conclusion is grounded in a verified verbatim quote. It runs multiple independent analysis passes to flag reliability issues and supports cross-interview synthesis by triangulating patterns across multiple sources.
Say it in your own words; the assistant finds this recipe by itself. Examples:
Use this skill when you have a raw interview transcript (text, docx, srt, or vtt) and need to extract structured insights, code it against a specific research lens (like JTBD, usability, or exit interview), or verify that conclusions are supported by exact quotes. It is also the correct choice when you need to synthesize patterns across multiple coded transcripts to generate insight cards, ensuring that findings are triangulated and reliable.
Turns one interview transcript into a structured mapping where every conclusion is grounded in a verbatim quote (checked by a script, not by eye), analysis is checked across multiple runs (disagreement is flagged, never silently resolved), and cross-interview patterns require triangulation across independent sources before being called an insight.
research-ops/skills/product-research operates one level up: it picks the research method
(generative vs evaluative), sizes the sample, and synthesizes already-coded observations into an
insight repository — it never touches a transcript. This skill is the transcript-level layer:
it reads the raw interview, produces the per-lens coding with quote-level grounding, and hands
verified, triangulated evidence to product-research's synthesis step (or works standalone). See
../product-research/SKILL.md.
python3 scripts/route.py --goal <goal> --respondent <who> picks the lens
(which of 16 templates) and output, and returns the applicable pipeline steps.python3 scripts/number_lines.py transcript.(txt|docx|srt|vtt) numbers
lines for traceability (from subtitles it also writes timecodes and speakers to a sidecar, and
flags lines that read as instructions to the model — a transcript is untrusted input);
python3 scripts/verify_quotes.py --transcript t_nl.txt --claims claims.json
checks every quote is actually in the source (verbatim ≠ support — see references/reliability.md).python3 scripts/consensus.py run1.json run2.json run3.json
flags cells where independent runs disagree — and flags the opposite failure too: total agreement
(council_degenerate) usually means the runs were not independent, and agreement across weakly
grounded runs (unanimous_but_ungrounded) may be identical bias rather than correctness.
python3 scripts/score_insights.py nuggets.json --k 3 only promotes a cross-interview pattern to
insight once ≥k distinct interviews carry a verified quote.python3 scripts/route.py --goal discovery --respondent customer --n 3
python3 scripts/verify_quotes.py --sample --output json
python3 scripts/consensus.py --sample
| Lens | For whom | Lens | For whom |
|---|---|---|---|
org-mapping-vmdi |
employee | winloss |
customer, outcome known |
jtbd |
customer (the job) | candidate |
hiring |
custdev |
customer (discovery) | intercept |
in-the-moment, post-touchpoint |
expert |
expert/stakeholder | conflict-mediation |
party to a conflict |
visitor-experience |
visitor | ethnographic |
in-situ observation |
brand-positioning |
anyone (brand focus) | change-readiness |
ahead of a transformation |
exit |
departing employee | focus-group |
group (not 1-on-1) |
usability |
task in an interface | team-retro |
team post-project |
Full routing matrix (goal × respondent → lens) and defaults: references/intake.md.
Exercise status: only candidate has been through a human comparison
(assets/evals/fixtures/candidate/review-example.md). The other fifteen have never left the synthetic
fixtures — not "broken", but unverified: treat the first real-interview run of such a lens as a pilot
and check it against references/rubric.md.
S0 intake → S1 transcript QA (proofread, log fixes) → S2 lens coding + quote verify + entailment
check → S3 reliability council (N isolated re-runs, flag disagreement) → S4 final mapping output.
For ≥2 interviews: S5 nugget extraction → S6 clustering → S6.5 triangulated scoring → S7 insight
cards → S8 longitudinal/panel tracking of the same person over waves. Full detail:
references/pipeline.md and references/synthesis.md.
All 15 are stdlib-only Python with --help, --sample, and --output {human,json}:
route, number_lines, batch_prepare, extract_claims, verify_quotes, check_support,
coverage_gaps, calibrate_threshold, consensus, make_adjudication, extract_nuggets,
score_insights, build_provenance, render_board, compare_to_gold. Index with stage mapping:
references/pipeline.md.
references/reliability.md).verify_quotes.py does not replace
check_support.py.references/validation.md, scripts/calibrate_threshold.py).references/validation.md).candidate/exit/conflict-mediation feed
decisions about those people. Clear the consent and de-identification gate in references/ethics.md
before the text goes anywhere — and de-identify before number_lines.py, or quotes stop matching.NO QUOTE — never
paraphrase and present it as verbatim.check_support.py --judge2-prompt).coverage_gaps.py finds uncovered stretches mechanically.../product-research/SKILL.md — method selection, sample sizing, and insight-repository
synthesis one level above this skill.references/intake.md, references/pipeline.md, references/reliability.md,
references/rubric.md, references/synthesis.md, references/validation.md — full detail
per stage, each with named methodological sources.references/ethics.md — consent, de-identification, and the lenses that need extra care.route.py also returns a cost estimate: S3 feeds the transcript anew on every run, so the price grows
as interviews × runs. --council-runs is the lever — 6 interviews cost 26 transcript feeds at 3 runs
and 14 at 1.
LICENSESKILL.mdassets/evals/evals.jsonassets/evals/fixtures/brand-positioning/claims.jsonassets/evals/fixtures/brand-positioning/gold.mdassets/evals/fixtures/brand-positioning/transcript.txtassets/evals/fixtures/candidate/claims.jsonassets/evals/fixtures/candidate/gold.mdassets/evals/fixtures/candidate/review-example.mdassets/evals/fixtures/candidate/transcript.txtassets/evals/fixtures/change-readiness/claims.jsonassets/evals/fixtures/change-readiness/gold.mdassets/evals/fixtures/change-readiness/transcript.txtassets/evals/fixtures/conflict-mediation/claims.jsonassets/evals/fixtures/conflict-mediation/gold.mdassets/evals/fixtures/conflict-mediation/transcript.txtassets/evals/fixtures/custdev/claims.jsonassets/evals/fixtures/custdev/gold.mdassets/evals/fixtures/custdev/transcript.txtassets/evals/fixtures/ethnographic/claims.jsonassets/evals/fixtures/ethnographic/gold.mdassets/evals/fixtures/ethnographic/transcript.txtassets/evals/fixtures/exit/claims.jsonassets/evals/fixtures/exit/gold.mdassets/evals/fixtures/exit/transcript.txtassets/evals/fixtures/expert/claims.jsonassets/evals/fixtures/expert/gold.mdassets/evals/fixtures/expert/transcript.txtassets/evals/fixtures/focus-group/claims.jsonassets/evals/fixtures/focus-group/gold.mdassets/evals/fixtures/focus-group/transcript.txtassets/evals/fixtures/intercept/claims.jsonassets/evals/fixtures/intercept/gold.mdassets/evals/fixtures/intercept/transcript.txtassets/evals/fixtures/jtbd/claims.jsonassets/evals/fixtures/jtbd/gold.mdassets/evals/fixtures/jtbd/transcript.txtassets/evals/fixtures/mappings/nuggets.jsonassets/evals/fixtures/org-mapping-vmdi/claims.jsonassets/evals/fixtures/org-mapping-vmdi/gold.mdassets/evals/fixtures/org-mapping-vmdi/transcript.txtassets/evals/fixtures/team-retro/claims.jsonassets/evals/fixtures/team-retro/gold.mdassets/evals/fixtures/team-retro/transcript.txtassets/evals/fixtures/usability/claims.jsonassets/evals/fixtures/usability/gold.mdassets/evals/fixtures/usability/transcript.txtassets/evals/fixtures/visitor-experience/claims.jsonassets/evals/fixtures/visitor-experience/gold.mdassets/evals/fixtures/visitor-experience/transcript.txtassets/evals/fixtures/winloss/claims.jsonassets/evals/fixtures/winloss/gold.mdassets/evals/fixtures/winloss/transcript.txtassets/evals/gold/gold.jsonassets/evals/gold/transcript.txtassets/example-outputs/decision-memo.mdassets/example-outputs/insight-cards.mdassets/example-outputs/journey-map.mdassets/example-outputs/opportunity-prioritization.mdassets/example-outputs/personas.mdreferences/ethics.mdreferences/intake.mdreferences/pipeline.mdreferences/reliability.mdreferences/rubric.mdreferences/synthesis.mdreferences/validation.mdscripts/batch_prepare.pyscripts/build_provenance.pyscripts/calibrate_threshold.pyscripts/check_support.pyscripts/compare_to_gold.pyscripts/consensus.pyscripts/coverage_gaps.pyscripts/extract_claims.pyscripts/extract_nuggets.pyscripts/make_adjudication.pyscripts/number_lines.pyscripts/render_board.pyscripts/route.pyscripts/score_insights.pyscripts/verify_quotes.pytemplates/brand-positioning.mdtemplates/candidate.mdtemplates/change-readiness.mdtemplates/conflict-mediation.mdtemplates/custdev.mdtemplates/ethnographic.mdtemplates/exit.mdtemplates/expert.mdtemplates/focus-group.mdtemplates/intercept.mdtemplates/jtbd.mdtemplates/org-mapping-vmdi.mdtemplates/team-retro.mdtemplates/usability.mdtemplates/visitor-experience.mdtemplates/winloss.mdVendored from alirezarezvani/claude-skills, commit 27cfcd0fb0a4, path research-ops/skills/interview-mapper, licence MIT. The upstream licence file ships inside the skill.