Every sentence in the report is bound to a source that was captured to disk, at a quote you can look up. A gate refuses the report when that binding is missing.
An agent doing research produces a document with 40 citations. Thirty-eight are fine. Two are not, and they are not the two you would guess:
- The link resolves, the page is real, the page does not say what the sentence says. It says something adjacent, about one configuration, in 2023.
- A figure got rounded, converted, then restated as a different metric with a similar name.
Neither is catchable by reading. Both survive review, because reviewing a citation means opening it, and nobody opens forty. So the document ships, the number enters a slide, and eighteen months later somebody tries to reproduce it.
Every research tool in this space tells the model to be rigorous. This one makes the rigor mechanical: the sources are on disk, the quotes are checked against them, and the check is a script with an exit code.
claude plugin marketplace add asadani/research-anything
claude plugin install research-anything@research-anything
Nothing else. No API keys, no MCP server, no pip install — the scripts are Python standard library only, and if Python is missing entirely the hooks degrade to a silent pass-through instead of breaking your session.
/research-anything:research which vector database for a 10M-vector workload on existing Postgres
/research-anything:audit vendor-whitepaper.md
/research-anything:verify
/research-anything:resume
Or just say what you want — the skills trigger on their own:
"research X properly" · "audit this report" · "do these sources actually say this" · "find sources on X" · "what does this all mean" · "write it up"
The fastest way to see whether this is worth your time is to point it at a document you already have doubts about.
/research-anything:audit some-report.md
It reads the document, extracts the checkable claims, captures every source the document cites, and tells you which claims the sources actually support. It needs no setup and no prior workspace, and it works on anything — your draft, a vendor whitepaper, an analyst note, something an LLM wrote.
examples/vector-db/ is a complete workspace, committed with real hashes. The
gate passes on it as checked in:
cd examples/vector-db
python ../../plugin/scripts/verify_claims.py --workspace .researchThen break it: change a digit, edit a snapshot, or delete the sentence that says sources disagree. Each is a different rule firing, and the example's README walks through all five.
Two ledgers and a gate.
.research/sources.jsonl — every source, with the bytes captured to
snapshots/ and a sha256. A URL is not evidence; it changes, it 404s, and a model
that never opened it can still write a fluent sentence about it. The snapshot is
what a quote gets checked against.
.research/claims.jsonl — every assertion the report will make, bound to a
source at a locator: a quote, a page, a table, a timestamp. There is no none
locator kind. A claim that cannot say where it came from has nowhere to hide.
The gate — verify_claims.py reads the report and the ledgers and applies
eight hard rules and three warnings. Hard failures mean the report does not ship:
| Rule | The report fails when |
|---|---|
| G1 | A [^c-017] marker resolves to no claim |
| G2 | A claim has no binding, or an empty locator |
| G3 | A binding names a source that does not exist |
| G4 | A quote does not occur in the snapshot |
| G5 | A snapshot is missing, or its hash changed |
| G6 | A contested claim is presented as settled |
| G7 | A non-quote locator has no auditor evidence |
| G8 | The report cites a claim marked failed |
G4 is generous about rendering and strict about wording: curly quotes, ligatures, soft hyphens, and reflowed line breaks all match. A changed digit does not.
G5 is the one people underestimate. If a page changed after you read it, every quote against it is unverified — not stale, unverified — and the gate says so.
verified is pass or fail. There is no uncertain.
A middle value becomes the drain everything difficult flows into, and within a day
"could not confirm" and "confirmed" are one hedge apart. Gray zone is fail. Real
uncertainty about the world goes in confidence and in the prose, where a reader
will see it.
Escaping the quote check costs more than doing it.
quote locators are checked mechanically and free. page, table, section, and
timestamp cannot be, so they require a fresh-context auditor pass and a written
evidence line. The asymmetry is the point.
Warnings never block. W1–W3 are heuristics. A heuristic that blocked would train you to disable the gate, and then the eight rules that are not heuristics stop running too.
Every skill file is under 150 lines.
Rigor systems accumulate rules and almost never subtract them, and the end state is
a skill file nobody can hold in their head, with behaviour spread across dozens of
flags. The limit is arbitrary, which is exactly why it is enforceable. Detail goes
to references/.
The hard rules verify claim → source. They say nothing about report →
claim: whether the sentence carrying [^c-017] faithfully restates claim
c-017.
That cannot be a hard rule. Paraphrase is legitimate, and deciding in general
whether a sentence restates a claim is not a job for a regex. W3 covers the
checkable slice — figures — and the rest is held by judgement: the report skill
writes from claim statements, the claim-auditor agent judges whether a passage
supports a statement at all, and a Stop hook checks the final message against the
ledger.
So: a passing gate means every claim is anchored to a real passage in a real
source. It does not mean every sentence is a faithful restatement. That
distinction is in docs/LEDGER-SPEC.md section 5.2.1, and it is stated plainly
because a verification tool that oversells its own coverage is worse than none.
Skills — research-anything (routes and resumes), research-scope,
research-gather, research-verify, research-synthesize, research-report,
research-audit.
Agents — claim-auditor judges whether a passage supports a statement, from a
fresh context that never sees the report's narrative, so it cannot be led.
source-hunter sweeps a sub-question in isolation and returns ledger rows rather
than page text. contradiction-scout searches for what would break the conclusion,
as its own dispatch, because counter-evidence gathered as an afterthought is
counter-evidence not gathered.
Lenses — technical, market, academic, due-diligence, general. Each
defines what T1 means for that domain, the recency window, and the traps. A vendor
benchmark is weak evidence in a technical comparison and strong evidence about what
the vendor claims; a preprint is a leading indicator in ML and a red flag in
medicine. One suite, thin domain config — not four products.
Hooks — a malformed ledger row is caught the moment it is written; the gate runs the moment a report is. Both fail open.
.research/
├── state.yaml phase, question, lens -- the resume point
├── brief.md the question, its boundaries, what would settle it
├── lens.yaml what T1 means here
├── sources.jsonl every source, hashed
├── snapshots/ the bytes each quote is checked against
├── claims.jsonl every assertion, bound
├── synthesis.md agreement, conflict, gaps
├── report.md the deliverable
└── verification-report.md the gate's verdict
Plain JSONL and markdown. Diffable in git, readable without this plugin, and portable between machines. Because none of it lives in the conversation, research survives a compaction, a new session, or a different laptop.
python -m unittest discover tests119 tests, standard library only. The one that matters is TestDoctoredReport: a
structurally valid workspace with one quote altered by a single digit and one
binding pointing at a source that does not exist. If the gate misses that, nothing
else here is worth anything.
Other tools for agent-driven research, each solving a different part of the problem:
| Project | What it is for |
|---|---|
| gpt-researcher | Autonomous research agent that plans, searches, and writes a cited report |
| STORM | Generates long, Wikipedia-style articles with citations, from Stanford OVAL |
| open_deep_research | LangChain's open implementation of the deep-research pattern |
| deep-research | A deliberately small deep-research loop, easy to read end to end |
| phd-skills | Claude Code guardrails for ML experiments, paper reproduction, and LaTeX |
Those are aimed at producing research quickly and at scale. This one is aimed at a narrower thing: making the result checkable afterwards. If you want a survey of forty products across twelve fields, one of the above will get you there faster. If you need to hand someone a document and have them able to verify it line by line, that is what this is for.
docs/COMPARISON.md goes into more detail on when another tool fits better.
MIT. See LICENSE.