Skip to main content

Motif

An agentic loop that turns a folder of interview transcripts into a research synthesis where every insight carries cited, verified evidence, an honest confidence level, and the counter-evidence against it.

Built for design and research teams who synthesise qualitative interviews and need output they can trust and trace. Motif is the first tool from ETOT. Built as an R&D project; the case study tells the story.

What it does

transcripts/  →  intake  →  synthesis  →  critic  →  revise  →  report.md
                                            ↑            │
                                            └────────────┘  until the critic passes or 3 rounds
  • Intake (one call per transcript) maps topics and notable positions with turn references.
  • Synthesis produces 8–14 insights. Each has a claim, cited turns with verbatim receipts, sources, confidence, counter-evidence, and a design opportunity.
  • Critic checks every insight against the transcripts using rules you can edit — unsupported claims, missing dissent, overconfidence, merged findings, themes present in the corpus but absent from the report. Some rules run in code (citations exist, quotes match, confidence thresholds); the rest are judged by the model.
  • Revise fixes what the critic flagged. It may not delete an insight to make an objection go away.
  • Report shows every insight with its evidence expanded, and marks any insight the critic still objected to when the loop stopped. Silence is never treated as agreement.

Sample output: docs/exhibits/best-report-v2/output.md.

Install (about 5 minutes)

You need Python 3.10+ and an Anthropic API key (console.anthropic.com).

pip install etot-motif
export ANTHROPIC_API_KEY=your-key-here      # or put it in a .env file in the working directory

Or from a checkout, if you want to edit the critic rules or run the evals:

git clone https://github.com/sleepycobalt/motif.git
cd motif
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
echo "ANTHROPIC_API_KEY=your-key-here" > .env

Run

Put your transcripts in a folder, one speaker turn per paragraph or line, each starting with the speaker's name and a colon. Label the interviewer Researcher, Interviewer, or Moderator so their turns are never cited as evidence.

Interviewer: Can you tell me about the last time you used the app?
Priya: Sure. I opened it on the train and it logged me out again, which...

Then:

motif ./transcripts --out report.md --question "What frustrates users about onboarding?"

Fifteen transcripts of ~45 minutes each take about 20 minutes and cost about $2.50 in API usage. Every prompt, response, and iteration is saved under runs/ so you can see exactly what the critic objected to and how the synthesis changed.

Try the sample corpus first:

motif data/raw/Dataset-2 --out report.md

Use it from Claude Code or Cursor

Motif is also an MCP server: the same engine, callable from any MCP host.

pip install "etot-motif[mcp]"
claude mcp add motif -e ANTHROPIC_API_KEY=your-key-here -- motif-mcp

Or, with uv and no install step, claude mcp add motif -e ANTHROPIC_API_KEY=your-key-here -- uvx --from "etot-motif[mcp]" motif-mcp. From a checkout: pip install -e ".[mcp]" and point the host at $PWD/.venv/bin/motif-mcp.

Five tools: motif_synthesize, motif_critique (check any synthesis, yours or someone else's, against the transcripts), motif_receipts (verbatim turn text for a citation), motif_board (a run laid out for FigJam, executed by the host through Figma's MCP server), motif_runs_get. Install snippets for Claude Code, Cursor, and Claude Desktop, plus a skill that teaches an agent the verify-before-you-quote workflow: surfaces/mcp/README.md.

Tune it

Everything a team might want to change lives in config/synth.yaml:

  • which model plays which role
  • how many revision rounds
  • what "high confidence" requires (default: 4+ participants and no counter-evidence)
  • the critic's rules, in plain language — add, remove, or reword them

What the evaluation found

Tested on 15 real research interviews (University of Sheffield, CC-BY-NC) against a human-built ground truth of 16 themes and 12 traps, with blind scoring:

Single prompt Motif
Insights whose cited evidence doesn't support them 1.7 of 4 checked 0.7
Insights with overstated confidence 1.3 0.7
Themes found 75% 69%
Time 4 min 22 min
Cost $0.37 $2.28

The loop makes fewer errors and finds slightly less. Its first version found much less (51%) — the critic only checked what was on the page, and the reviser's cheapest fix was deletion. A recall check that compares the report against the intake topic maps recovered most of the gap. Full results: docs/eval1-results.md, docs/eval2-results.md.

Known gaps: the critic still misses some dissent from outlier participants, and when a turn contains two findings the synthesis tends to extract only one.

Repo layout

core/       reusable: loop controller, run logger, LLM client, config loader
synth/      this tool: engine (the shared service), agents, prompts, corpus loader, report renderer, board layout, CLI
surfaces/   mcp/ — the MCP server (Claude Code, Cursor, any MCP host)
tests/      offline tests with a stubbed model; the MCP server is exercised over stdio
config/     synth.yaml — models, thresholds, critic rules (symlink to synth/synth.yaml, which ships in the package)
scripts/    ingest.py (transcripts → citable text), eval_pack.py (blind scoring packs)
data/       sample corpus (CC-BY-NC, see LICENSE) and its processed form
docs/       R&D brief, working log, ground truth, eval results, exhibits, case-study notes
eval/       blind scoring packs and completed sheets

core/ is written to be reused by other loops; Motif is the first tool built on it.

Data attribution

Sample transcripts: Hanchard, M. and San Roman Pineda, I. (2023). Fostering cultures of open qualitative research: Dataset 2 – Interview Transcripts. University of Sheffield. doi:10.15131/shef.data.23567223.v2. CC-BY-NC 4.0. Non-commercial use only.

License

MIT for the code. See LICENSE.

Metadata

Release files for etot-motif 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for etot-motif 0.3.0
File Size Uploaded Provenance
etot_motif-0.3.0.tar.gz 59.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for etot-motif 0.3.0
File Interpreter ABI Platform
etot_motif-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 115.5 kB

Release files / etot_motif-0.3.0.tar.gz

Download URL etot_motif-0.3.0.tar.gz
Size 59.8 kB
Tags Source
SHA-256 checksum
How to use checksums
a245f717d0daa977ed18cb635c90ff48d322658b1058abd69d35c196fb50bde9
BLAKE2b-256 checksum
How to use checksums
e849afc15f998af136feb4008e373ddd0f83e0ac0c8a271e75cbc71462439d53
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.5

Release files / etot_motif-0.3.0-py3-none-any.whl

Download URL etot_motif-0.3.0-py3-none-any.whl
Size 55.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fe4671c8273c15f6fc21b0a2d815b688e56df9b1987d9fe4a8de5c643c85629a
BLAKE2b-256 checksum
How to use checksums
0cf405231d4f911b7ed34d5511230f70d3b851c920271a3e02f12a07daf142b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.5

Security for etot-motif 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page