University of Oxford · Stanford University · National University of Singapore · University of Washington · University of Cambridge
Evidence-grounded paper review and verification agent. It compares a paper's claims against its code, math, experiments, prior work, references, and visual layout — then renders every finding into a single interactive report.
Each stage is a Claude Code skill (SKILL.md) backed by a small set of Python tools in tools/. All artifacts for a paper live under a single papers/<paper_dir>/ directory.
Workflow
prepare-paper → metadata/
│
│ Phase 1 (parallel)
├── read-claim ──→ reports/check_claim.json
├── read-txt ──→ reports/check_txt.json
├── read-vis ──→ reports/check_vis.json
├── read-bib ──→ reports/check_bib.json
│
│ Phase 2 (parallel, after read-claim)
├── read-code ──→ reports/check_code.json
├── read-theory ──→ reports/check_theory.json
├── read-prior ──→ reports/check_prior.json
├── read-exp ──→ reports/check_exp.json
│
│ Phase 3 (manual, requires user approval)
└── run-exp ──→ updates reports/check_exp.json
│
│ Report (after Phase 2, or after Phase 3)
└── vis-preview ──→ display/paperdoctor.html
Skills
| Skill | Input | Output | What it does |
|---|---|---|---|
| prepare-paper | PDF + codebase | metadata/ |
Parse PDF to markdown, render page images, index code |
| read-claim | paper text | reports/check_claim.json |
Extract all verifiable claims (explicit, implicit, cross-reference) |
| read-txt | paper text | reports/check_txt.json |
Check writing quality — grammar, typos, phrasing, terminology |
| read-code | check_claim.json + code | reports/check_code.json |
Verify code claims against the codebase |
| read-theory | check_claim.json + paper text | reports/check_theory.json |
Verify theoretical claims — math, proofs, formal arguments |
| read-prior | check_claim.json + web | reports/check_prior.json |
Verify related_work claims — baselines, novelty, cited facts |
| read-bib | references.json + web | reports/check_bib.json |
Verify each cited reference exists |
| read-exp | check_claim.json + README | reports/check_exp.json |
Review experiment design + prioritize a reproduction plan |
| read-vis | page images | reports/check_vis.json |
Check layout, figures, tables, spacing |
| run-exp | check_exp.json + check_code.json | updates reports/check_exp.json |
Create env, run experiments, compare against paper numbers |
| vis-preview | all check_*.json + PDF | display/paperdoctor.html |
Three-panel HTML report: PDF pages · code viewer · findings |
Execution Order
Phase 1 (parallel): read-claim, read-txt, read-vis, read-bib
Phase 2 (parallel): read-code, read-theory, read-prior, read-exp (need check_claim.json)
Phase 3 (manual): run-exp (needs check_exp.json + check_code.json + user approval)
Report: vis-preview (after Phase 2 or Phase 3)
Quick Start
/prepare-paper papers/my_paper
# Phase 1 (parallel)
/read-claim papers/my_paper # ─┐
/read-txt papers/my_paper # ├─ parallel
/read-vis papers/my_paper # │
/read-bib papers/my_paper # ─┘
# Phase 2 (parallel, after read-claim)
/read-code papers/my_paper # ─┐
/read-theory papers/my_paper # ├─ parallel
/read-prior papers/my_paper # │
/read-exp papers/my_paper # ─┘
# Phase 3 (requires user approval)
/run-exp papers/my_paper
# Report (after Phase 2, or after Phase 3)
/vis-preview papers/my_paper
Tools
The skills call these helpers under tools/; you can also run them directly.
| Tool | Usage |
|---|---|
api_mathpix.py |
Parse a PDF to markdown + images via Mathpix (preferred): python tools/api_mathpix.py papers/xxx/paper.pdf |
api_mineru.py |
MinerU fallback parser: python tools/api_mineru.py -p paper.pdf -o papers/xxx/metadata |
organize_paper.py |
Build metadata/paper/full.md, references.json, and sections/: python tools/organize_paper.py --paper-file paper.pdf |
pdf_render.py |
Render PDF pages to PNGs: python tools/pdf_render.py paper.pdf |
code_analyzer.py |
Index a codebase (tree-sitter AST): python tools/code_analyzer.py <repo> --output papers/xxx/metadata/code/index.json |
pdf_search.py |
Locate quotes in a PDF: python tools/pdf_search.py paper.pdf quotes.json |
merge_reports.py |
Merge all check_*.json into review.json: python tools/merge_reports.py papers/xxx |
build_review.py |
Generate the vis-preview report: python tools/build_review.py papers/xxx |
Repo Structure
paperdoctor/
├── skills/ # Skill definitions (one SKILL.md each)
│ ├── prepare-paper/
│ ├── read-claim/
│ ├── read-txt/
│ ├── read-code/
│ ├── read-theory/
│ ├── read-prior/
│ ├── read-bib/
│ ├── read-exp/
│ ├── read-vis/
│ ├── run-exp/
│ └── vis-preview/
├── tools/ # Python utilities called by the skills
├── papers/ # Per-paper inputs and outputs (metadata/, reports/, display/)
├── assets/
└── requirements.txt
Per-paper layout produced by the pipeline:
papers/<paper_dir>/
├── <paper>.pdf
├── metadata/ # parsed markdown, page images, code index
├── reports/ # check_*.json from each read-* skill
└── display/ # paperdoctor.html report
Install
pip install -r requirements.txt
API Keys
PDF parsing relies on third-party services. Bring your own credentials and set them as environment variables — no keys are bundled with this repo.
# Mathpix (preferred parser) — sign up at https://mathpix.com
export MATHPIX_APP_ID="your-app-id"
export MATHPIX_APP_KEY="your-app-key"
# MinerU (fallback parser) — get a token at https://mineru.net
export MINERU_API_TOKEN="your-token"
api_mathpix.py also accepts --app-id / --app-key flags as an alternative to the environment variables.
No comments yet
Be the first to share your take.