Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Specialized skill for synthesizing qualitative user research into actionable insights. Analyzes interview transcripts, extracts patterns and themes, identifies pain points, creates affinity diagrams, and generates persona attributes from research data.
.claude/skills/a5c-ai-user-research-synthesis/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 80% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 46% | 0% |
Synthesize qualitative user research data into actionable product insights with thematic analysis and evidence-based recommendations.
This skill provides comprehensive capabilities for transforming raw user research data into structured insights. It supports interview transcript analysis, survey response synthesis, support ticket mining, and cross-source research aggregation.
Supported formats:
- Interview transcripts (.txt, .md, .docx)
- Survey exports (.csv, .xlsx)
- Support ticket exports (.csv, .json)
- User feedback logs (.json, .csv)markdown## Analysis Framework ### Step 1: Initial Coding For each transcript: 1. Read through completely for context 2. Highlight significant statements 3. Apply initial codes (open coding) 4. Note participant metadata ### Step 2: Pattern Recognition Across transcripts: 1. Group similar codes 2. Identify recurring themes 3. Note frequency of mentions 4. Track contradicting evidence ### Step 3: Insight Generation For each theme: 1. Define the insight clearly 2. List supporting evidence (3+ quotes) 3. Assess confidence level 4. Note actionable implications
json{ "transcript_id": "INT-001", "participant": { "id": "P001", "segment": "power_user", "tenure": "2_years" }, "findings": [ { "code": "onboarding_friction", "theme": "First-time experience", "quote": "I had no idea where to start...", "timestamp": "00:12:34", "sentiment": "negative", "intensity": "high" } ], "summary": { "key_pain_points": [], "unmet_needs": [], "positive_experiences": [], "feature_requests": [] } }
markdown## Affinity Diagram Process ### 1. Capture Observations - One observation per note - Include source attribution - Maintain original language ### 2. Group Bottom-Up - Cluster similar observations - Name each cluster - Create hierarchy of clusters ### 3. Output Format # Theme: [Theme Name] ## Subtheme: [Subtheme Name] - Observation 1 (P001, INT-001) - Observation 2 (P003, INT-003) - Observation 3 (P007, INT-007) ### Evidence Strength - Strong: 5+ supporting observations - Moderate: 3-4 supporting observations - Emerging: 2 supporting observations
markdown## Insight Template ### Insight ID: INS-001 **Statement**: [Clear, actionable insight statement] **Theme**: [Parent theme] **Confidence**: [High/Medium/Low] **Evidence Count**: [Number of supporting data points] ### Supporting Evidence | Source | Quote | Participant | |--------|-------|-------------| | INT-001 | "..." | P001 | | INT-003 | "..." | P003 | | SUR-045 | "..." | R045 | ### Implications - Product: [Product implications] - Design: [Design implications] - Engineering: [Technical considerations] ### Recommendations 1. [Specific recommendation] 2. [Specific recommendation] ### Contradicting Evidence - [Note any contradicting findings]
javascriptconst researchSynthesisTask = defineTask({ name: 'research-synthesis', description: 'Synthesize user research into actionable insights', inputs: { transcriptPaths: { type: 'array', required: true }, researchQuestion: { type: 'string', required: true }, outputFormat: { type: 'string', default: 'markdown' }, minEvidenceThreshold: { type: 'number', default: 3 } }, outputs: { themes: { type: 'array' }, insights: { type: 'array' }, personas: { type: 'array' }, recommendations: { type: 'array' } }, async run(inputs, taskCtx) { return { kind: 'skill', title: 'Synthesize user research findings', skill: { name: 'user-research-synthesis', context: { operation: 'full_synthesis', transcriptPaths: inputs.transcriptPaths, researchQuestion: inputs.researchQuestion, outputFormat: inputs.outputFormat, minEvidenceThreshold: inputs.minEvidenceThreshold } }, io: { inputJsonPath: `tasks/${taskCtx.effectId}/input.json`, outputJsonPath: `tasks/${taskCtx.effectId}/result.json` } }; } });
markdown## JTBD Statement Format When [situation/context], I want to [motivation/goal], So I can [expected outcome]. ### Extraction Process 1. Identify triggering situations in transcripts 2. Extract stated and unstated motivations 3. Map to desired outcomes 4. Categorize: Functional, Emotional, Social jobs
| Severity | Frequency | Impact | Priority | |----------|-----------|--------|----------| | Critical | 80%+ users | Blocks core task | P0 | | High | 50-80% users | Significant friction | P1 | | Medium | 25-50% users | Noticeable issue | P2 | | Low | <25% users | Minor annoyance | P3 |
markdown# Research Synthesis Report ## Executive Summary [2-3 sentence overview] ## Research Methodology - **Method**: [Interviews/Surveys/etc.] - **Participants**: [N participants] - **Duration**: [Date range] - **Research Questions**: [Key questions] ## Key Themes ### Theme 1: [Name] [Description and evidence] ### Theme 2: [Name] [Description and evidence] ## Top Insights 1. **Insight**: [Statement] - Evidence: [Count] - Confidence: [Level] - Recommendation: [Action] ## Persona Implications [How findings affect personas] ## Recommended Actions 1. [Action item] 2. [Action item] ## Appendix - Full coding scheme - Participant demographics - Raw data references
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 30,493 | 29,049 | -5% | 1 | 1 | 0% | 5,079 | 6,309 | +24% | 0 | 0 | — |
case-02 | fail→fail | 18,780 | 45,774 | +144% | 1 | 1 | 0% | 3,315 | 10,212 | +208% | 0 | 0 | — |
case-03 | pass→pass | 9,288 | 4,776 | -49% | 1 | 1 | 0% | 1,602 | 2,824 | +76% | 0 | 0 | — |
case-04 | pass→pass | 8,119 | 5,531 | -32% | 1 | 1 | 0% | 1,376 | 2,944 | +114% | 0 | 0 | — |
case-05 | fail→pass | 10,014 | 4,381 | -56% | 1 | 1 | 0% | 1,679 | 2,757 | +64% | 0 | 0 | — |
case-06 | pass→pass | 7,892 | 4,222 | -47% | 1 | 1 | 0% | 1,300 | 2,754 | +112% | 0 | 0 | — |
case-07 | fail→pass | 6,965 | 2,831 | -59% | 1 | 1 | 0% | 1,302 | 2,474 | +90% | 0 | 0 | — |
case-08 | pass→pass | 8,843 | 9,860 | +12% | 1 | 1 | 0% | 1,338 | 3,480 | +160% | 0 | 0 | — |
case-09 | fail→pass | 13,221 | 11,530 | -13% | 1 | 1 | 0% | 2,411 | 4,331 | +80% | 0 | 0 | — |
case-10 | fail→pass | 10,697 | 4,897 | -54% | 1 | 1 | 0% | 2,150 | 2,843 | +32% | 0 | 0 | — |
case-11 | fail→pass | 15,150 | 11,217 | -26% | 1 | 1 | 0% | 2,426 | 3,531 | +46% | 0 | 0 | — |
case-12 | fail→pass | 11,786 | 8,879 | -25% | 1 | 1 | 0% | 1,721 | 3,398 | +97% | 0 | 0 | — |
case-13 | fail→pass | 14,419 | 15,141 | +5% | 1 | 1 | 0% | 2,392 | 4,330 | +81% | 0 | 0 | — |
case-14 | fail→fail | 14,690 | 15,799 | +8% | 1 | 1 | 0% | 2,189 | 4,629 | +111% | 0 | 0 | — |
case-15 | pass→pass | 9,311 | 1,703 | -82% | 1 | 1 | 0% | 1,289 | 2,193 | +70% | 0 | 0 | — |
case-16 | fail→pass | 13,735 | 7,746 | -44% | 1 | 1 | 0% | 2,229 | 3,406 | +53% | 0 | 0 | — |
case-17 | fail→pass | 16,899 | 13,381 | -21% | 1 | 1 | 0% | 3,387 | 4,847 | +43% | 0 | 0 | — |
case-18 | fail→pass | 12,095 | 6,024 | -50% | 1 | 1 | 0% | 2,106 | 2,899 | +38% | 0 | 0 | — |
case-19 | fail→fail | 18,146 | 22,666 | +25% | 1 | 1 | 0% | 2,720 | 5,511 | +103% | 0 | 0 | — |
case-20 | pass→pass | 18,237 | 20,999 | +15% | 1 | 1 | 0% | 2,995 | 5,719 | +91% | 0 | 0 | — |
case-21 | pass→pass | 17,410 | 17,431 | +0% | 1 | 1 | 0% | 2,844 | 5,507 | +94% | 0 | 0 | — |
case-22 | pass→pass | 14,491 | 16,963 | +17% | 1 | 1 | 0% | 3,179 | 5,574 | +75% | 0 | 0 | — |
case-23 | pass→pass | 13,880 | 17,541 | +26% | 1 | 1 | 0% | 2,192 | 4,377 | +100% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +43 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.