Which harness fits
Best for one big review
A read-only reader subagent gets a fresh context per paper, so one long PDF can't crowd out the rest. The main session merges the notes.
Best for a weekly or repeated scan
Save the steps once as a YAML recipe with parameters (topic, folder) and run it the same way each time.
Best for unpublished or private papers
Run it on a local model through Ollama so nothing leaves your machine. See the local LLM rigs.
Step 1: make the sources text
Agents handle plain text most reliably. Convert PDFs first, and keep page numbers so citations can point somewhere checkable:
mkdir -p sources/txt notes out
for f in sources/*.pdf; do
pdftotext -layout "$f" "sources/txt/$(basename "${f%.pdf}").txt" # poppler-utils
donepdftotext marks page breaks with a form-feed character, so an agent can count pages. Scanned PDFs need OCR first.
Step 2: the rules file (shared)
# Literature review rules
- Sources live in `sources/txt/`. Never edit anything in `sources/`.
- Write one notes file per source to `notes/<source>.md`.
- Every claim in notes or the brief needs a citation: (file, page).
- Quote exactly when a number or definition matters. No paraphrased numbers.
- If a source doesn't say it, write "not stated". Never fill gaps from memory.
- The final brief goes to `out/brief.md`: findings, disagreements, open questions.Rig A: Claude Code
---
name: reader
description: Reads ONE source file and writes structured, cited notes. Use once per source.
tools: Read, Grep, Glob, Write
model: inherit
---
You read exactly one file from sources/txt/ and write notes/<same-name>.md with:
1. Question and method (2-3 lines)
2. Key findings, each with (file, page)
3. Exact quotes for every number
4. Limitations the authors state
Write "not stated" for anything missing. Never use outside knowledge.{
"permissions": {
"deny": ["Edit(sources/**)"]
}
}claude "Use the reader subagent on each file in sources/txt/, then write out/brief.md from notes/ following AGENTS.md"A subagent gets only its own system prompt plus basic environment details, not the main conversation, which is what keeps each paper's notes independent. Claude Code checks file paths against Edit(…) and Read(…) rules, so write the deny rule as Edit, not Write.
Rig B: goose recipe (repeatable)
version: "1.0.0"
title: "Literature review"
description: "Cited brief from a folder of text sources"
parameters:
- key: topic
input_type: string
requirement: required
description: "Question the brief should answer"
- key: folder
input_type: string
requirement: optional
default: "sources/txt"
description: "Folder of .txt sources"
instructions: |
Follow AGENTS.md. Read every file in {{ folder }} one at a time and write
notes/<file>.md with (file, page) citations. Then write out/brief.md
answering: {{ topic }}. Write "not stated" instead of guessing.
prompt: "Start the review."goose run --recipe review.yaml --params topic="What changed in agent evals this month?" --max-turns 40goose reads AGENTS.md by default, so the same rules apply.
Failure modes to check for
- Invented citations. Spot-check:
grep -n "exact quote" sources/txt/*.txtshould find every quote in the brief. - The last paper dominates. That's why notes are written per source first and merged second.
- Silent truncation. Very long sources can exceed context. Split them by chapter before the run.
FAQ
What is the best agent harness for research?
For a one-off literature review, Claude Code with a read-only reader subagent per source. For a repeated scan, a goose recipe. For private papers, OpenCode on a local model.
Can an agent harness read PDFs directly?
Some can, but plain text is the most portable across harnesses. Converting with pdftotext also gives you a file to grep when you verify quotes.
How do I stop the agent from changing my sources?
In Claude Code, deny Edit(sources/**) in settings. In OpenCode, set "edit": {"*": "deny", "notes/*": "allow", "out/*": "allow"} under permission.
Get new rigs by email
New job recipes and harness changes, a few times a month. Each one with copy-ready config and dated sources.
Sources
- Claude Code docs: subagents · checked Oct 18, 2026
- Claude Code docs: permissions · checked Oct 18, 2026
- Claude Code docs: settings · checked Oct 18, 2026
- goose docs: recipe reference · checked Oct 18, 2026
- goose docs: CLI commands · checked Oct 18, 2026
- goose docs: .goosehints and AGENTS.md · checked Oct 18, 2026
- OpenCode 1 docs: permissions · checked Oct 18, 2026
Spotted something out of date? Email sternberg@mail.grokbot.com.