workshop_synthesizer

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.

Get it on GitHub /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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. Checks every quote

    A script fails any quote that isn't word for word in its source, or a [...] that stitches two interviews together.

  6. 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.

  7. Loops

    The synthesizer fixes only what was flagged. Then both checks run again, three passes at most.

  8. Tests your hunches

    Each hunch comes back supported, contradicted or open, with sources. A hunch is never counted as evidence.

  9. 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.