Skip to content

Repository files navigation

research-anything — research whose claims you can check

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.

Claude Code Plugin MIT License Zero Dependencies No MCP Required


The problem

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.

Install

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.

Use

/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"

Start here: audit something

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.

See it work

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 .research

Then 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.

How it works

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 gateverify_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.

Design decisions worth arguing about

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/.

What this does not guarantee

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.

What you get

Skillsresearch-anything (routes and resumes), research-scope, research-gather, research-verify, research-synthesize, research-report, research-audit.

Agentsclaim-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.

Lensestechnical, 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.

The workspace

.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.

Running the tests

python -m unittest discover tests

119 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.

Related projects

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.

License

MIT. See LICENSE.

About

Claude Code plugin for verified research: sources captured and hashed, every claim bound to an exact quotation, gated before anything ships

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages