Don't believe the hype.Test the hyp.
The evidence layer for AI research agents. Your agents write their hypotheses, runs, results and claims into a record that checks every claim as it's written — numbers bound to results, no "always" without the counts, no "ruled out" without a powered search — and works out on every read what's really been shown.
Connect your agent
One line of MCP, or the Agent Skill. Claims get checked, an agent can't review its own work, and every refusal
says exactly what to fix. Machine-readable: /llms.txt · /SKILL.md.
claude mcp add hypgraph -- hypgraph --db study.hypgraph --as claude mcp hypgraph skill --installThe agent guide
Wire it into your stack
One dependency-free Python package. You set who reviews, which runner's records count, and what work costs — for one agent or a whole team of them. Plus the JSON API, the Atlas and verifiable bundles for CI.
pip install hypgraph
Graph("research.hypgraph", policy=Policy(reviewers={"critic"}))
The engineering guide
Watch an eval report get refused.
An agent evaluates a fine-tune against its baseline on 2,000 held-out items: 1,624 against 1,568 correct. It writes "always beats", then "5 points better" (it's 2.8), then "prompt format makes no difference" from a test too small to see a 3.6-point effect. Each refusal does the arithmetic and names the fix. Then it binds its numbers — and the record runs the significance test itself before letting "significantly" in.
- every number in a claim must match a result field
- "always", "never", "proves" need k of n with k = 0 or n
- "no difference" / "rules out" needs a search shown to find a planted effect
0 leaks in 50 tests still allows 58,155 across a million users.
Zero failures in n trials doesn't mean zero — it means "probably below 3/n". HypGraph refuses a "never" its count can't carry, says what the count does support, and puts the number of failures you haven't ruled out into the claim's standing, where every claim and decision built on it can see it.
$ hypgraph add claim statement="The model never leaks training data." exposure=1000000 … refused: 'never' rests on 0 of 50: that only rules out it happening more than 5.8% of the time (95% upper bound). Honest version: 'no occurrences in 50 trials (95% upper bound 5.8%)'. To support a rate below 1 in 1,000 you need about 2,995 trials without one. Across the 1,000,000 users this claim applies to, that leaves up to 58,155 not ruled out. [ABSOLUTE_UNDERPOWERED] $ hypgraph bound 0 50 --exposure 1000000 --unit users 'never' here means: at most 5.8% — 1 in 20 — at 95% confidence to bound it below 1 in 1,000: about 2,995 trials with none across 1,000,000 users: up to 58,155 not ruled out (95%)
How does cholera spread? Broad Street, 1854.
Two hypotheses — bad air or dirty water. Snow's map. The grand experiment: neighbours on the same streets, different water companies, 315 against 37 deaths per 10,000 houses. A skeptical curate who set out to prove Snow wrong and replicated him instead. A decision pinned to a claim that later changed, so the record flags it to revisit. Click anything. The hash chain is re-verified in your browser as it loads.
A teaching reconstruction; figures from J. Snow, On the Mode of Communication of Cholera,
2nd ed., 1855. Download the bundle ·
open full screen · build it yourself: hypgraph demo
Every rule is a mistake that was really made.
HypGraph came out of a team of AI agents doing long investigations, and the errors they made despite instructions not to. Each one became a rule the record enforces when it's written, not advice it hopes is followed.
Standing is derived
No field says "confirmed". Review, risk, support and evidence strength are computed from the record on every read.
Nothing is rewritten
Append-only, SHA-256 hash-chained. Corrections are new
versions; withdrawals stay on record. verify() catches any edit.
Reviews pin versions
Revise a checked claim and its check goes stale. A decision based on the old version is flagged to revisit.
Claims carry numbers
Every number bound to a result field. A number with no source is refused — the most common way summaries go wrong.
Independence is counted
Three results from one run are one line of evidence, not three. Lines that share data or a source merge.
Exclusions need power
"Rules out" only after a search was shown to find a planted answer. Otherwise it's inconclusive.
Nobody reviews their own
Only named reviewers' verdicts count, never on their own work. Everyone else's are kept as comments.
Instruments speak for themselves
Only the lab runner files a lab-recorded run. A run you describe is labelled as your report.
Anywhere an agent's conclusions have to hold up.
Agents that can't fool themselves
Long investigations where agents plan experiments, run them and draw conclusions — with the premise chains, the reviews and the "what's actually established" kept honest by the record, not by the prompt.
Eval reports with their numbers attached
Every accuracy, delta and win rate bound to the run that produced it; "beats the baseline" only with the counts; "no effect" only after a planted effect was found.
Roles the record enforces
Critic agents as reviewers, the job runner as the only instrument, every agent its own author. Nobody grades their own work; a revised claim goes back for review by itself.
A record others can verify
One bundle a reviewer, a regulator or the next team can check with SHA-256 — every claim's standing, every run's hashes, every verdict pinned to the version it judged.
Check any record in your browser.
A bundle carries every event as the exact string that was hashed. Verifying it is SHA-256 over strings — no trust in us, our code or the sender. Drop one in and it opens in the Atlas.
pip install hypgraph # no dependencies pip install "hypgraph[mcp]" # + the MCP server
hypgraph export -o study.bundle.json hypgraph verify study.bundle.json