Get updates
Recipe

Agent harness for research: literature review

Job: turn a folder of papers into a cited brief you can trust. The trick isn't the model. It's isolating each source, forcing citations, and making the sources folder read-only.

Checked against official docs on Oct 18, 20267 sourcesNo affiliate links

Which harness fits

Claude Code

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.

goose

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.

OpenCode

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:

Convert PDFs, one text file per page range
mkdir -p sources/txt notes out
for f in sources/*.pdf; do
  pdftotext -layout "$f" "sources/txt/$(basename "${f%.pdf}").txt"   # poppler-utils
done

pdftotext 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)

AGENTS.md
# 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

.claude/agents/reader.md
---
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.
.claude/settings.json: sources can never be edited
{
  "permissions": {
    "deny": ["Edit(sources/**)"]
  }
}
Run it
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)

review.yaml
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."
Run it weekly
goose run --recipe review.yaml --params topic="What changed in agent evals this month?" --max-turns 40

goose 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/*.txt should 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.

Sources

  1. Claude Code docs: subagents · checked Oct 18, 2026
  2. Claude Code docs: permissions · checked Oct 18, 2026
  3. Claude Code docs: settings · checked Oct 18, 2026
  4. goose docs: recipe reference · checked Oct 18, 2026
  5. goose docs: CLI commands · checked Oct 18, 2026
  6. goose docs: .goosehints and AGENTS.md · checked Oct 18, 2026
  7. OpenCode 1 docs: permissions · checked Oct 18, 2026

Spotted something out of date? Email sternberg@mail.grokbot.com.

Related