Workshop themes you can defend.
Hand it interviews, tickets, survey answers, whiteboard photos or a FigJam board. It asks what decision the research is for, writes themes where every quote is word for word and tagged to its source, then loops until a script and a second reader can't knock them down. Built for Claude Code, and the basis for the synthesize harness in Workshopr.io.
/synthesize research/notes/
What it does, step by step
You type one command. Everything after it either reads your sources, asks you, or checks the synthesis.
Looks before it asks
It counts your sources by type, notes who participants are when the notes say so, and flags anything that isn't research.
Grills you
One question at a time, each with its recommended answer: the decision, the research question, the audience, the groups to compare, your hunches.
Synthesizes
A fresh agent codes every source with equal care, clusters 3–7 themes, and cuts any theme that could have been written without the data.
Counts instead of guessing
Every theme lists its sources as "4 of 4 participants", with a confidence rating, counter-evidence and a table by group.
Checks every quote
A script fails any quote that isn't word for word in its source, or a [...] that stitches two interviews together.
Gets a second opinion
Another fresh agent re-reads the sources and tries to prove each theme wrong: recounts, re-rates, and hunts for missed contradictions.
Loops
The synthesizer fixes only what was flagged. Then both checks run again, three passes at most.
Tests your hunches
Each hunch comes back supported, contradicted or open, with sources. A hunch is never counted as evidence.
Reports
The answer to your question leads. Then the themes, what the checks caught, and what the data can't tell you.
What a theme looks like
Every theme separates what people said from what it means, shows the count behind it, and quotes the sources exactly.
## Theme 2 — Nobody can tell how far through setup they are Observed: All four participants and one ticket say setup gives no sense of how many steps remain. Insight: The friction is uncertainty about the end, not the length of setup. Support: P01, P02, P03, P04, T03 — 4 of 4 participants, plus 1 ticket Confidence: High — every participant, both segments, no counter-evidence > "It wasn't long exactly. It was more that I couldn't tell where the end was." — P03, 05:13 > "Not the length. A few people said they didn't know when it would end." — P04, 08:16
What one source says on its own goes under Outliers. What the data can't answer goes under Gaps, with a suggested next study.
Why it holds up
Language models are fluent synthesizers and unreliable ones. They smooth quotes, over-report rare themes, lose the middle of long input, and drift toward what the question seems to want.
Quotes are checked by a script
Models that correct themselves without outside feedback get worse. The loop runs on a deterministic quote gate with 12 test cases, and on the sources themselves.
Counts, not adjectives
LLMs over-code rare themes, and their errors can track who was interviewed. Every theme carries its source list and an n of N, and a table by group shows any skew.
A second reader
Model judges favour their own work. The verifier never sees the synthesizer's reasoning, only its report and the sources, and has to uphold each theme.
Try it on the example study in the repo: four interviews and three tickets with planted traps, among them a split between solo users and admins, a hunch the data contradicts, and quotes that invite paraphrase.
Install
You need Claude Code and Python 3.
git clone https://github.com/bbulman/workshop_synthesizer.git cd workshop_synthesizer ./install.sh
Open a new Claude Code session and run /synthesize on a folder of notes. Start with the example study, which lists what a good run should find.
What it's built on
Each design choice answers a finding from research on qualitative analysis, by people and by machines.
- Braun and Clarke on thematic analysisObservation kept apart from interpretation; hunches tested, not counted.
- Ashwin et al. 2023LLM coding can be biased by who was interviewed, so counts and groups are shown.
- Lost in the MiddleModels skim the middle of long input, so every source is coded and checked for coverage.
- Mapping LLM qualitative analysisGeneric "echo chamber" themes: cut any theme the data didn't earn.
- Huang et al. 2023Self-correction needs outside feedback, so the loop runs on a gate.
- Self-RefineMost gains come early: three passes at most.
- Zheng et al. 2023Judges favour their own output, so a fresh reader verifies.
- Building effective agentsThe evaluator-optimizer loop, with ground truth at every step.
- Matt Pocock's grilling skillOne question at a time, each with a recommended answer.
- Claude Code subagentsAgents can't ask you questions, so the grill runs in your session.