drpwchen/openevidence-tools/oe-verify
Claude Code and agent skill by drpwchen/openevidence-tools
- community
Checking that the SKILL.md file is still in the repository.
Verify OpenEvidence clinical responses by cross-checking each citation against primary sources and detecting evidence omissions. Two-layer verification: Layer 1 (Haiku agents) checks per-citation accuracy; Layer 2 (Sonnet agent) checks evidence completeness. Use when: user says "/oe-verify", "verify OE", or auto-triggered after ask_openevidence in a note-writing workflow.
Install
npx vskill@latest install drpwchen/openevidence-tools/oe-verifySKILL.md
/oe-verify — OpenEvidence Citation Verification
Derived from audit-oe-skill,MIT © 2026 Hsieh-Ting Lin. TheoriginROT-1 decode, the corpus→risk tiers, thetransitive-citation framing and trace-back stage, the parallel-per-citation +single-cross-citation agent architecture, and the CRITICAL/WARNING/NOTE severityladder all originate there. See NOTICE for the full licence text.
Why This Skill Exists
OpenEvidence uses RAG (vector search + LLM synthesis) to answer clinical questions. Its structural weaknesses cannot be fixed by improving the prompt:
- Transitive citation — OE retrieves a chunk of a review's full text in which the review
quotes another trial's number, then credits that number to the review. The claim is real; the attribution is wrong. The origin corpus field (Step 0) tells us exactly when to suspect this, which is why provenance drives the whole Layer 1 flow.
- Secondary source confusion — embedding search treats review-article claims the same as primary findings
- Impact-score ranking bias — older high-IF positive results rank above newer negative ones
- Selective presentation — synthesis picks supporting evidence, not a balanced view.
Layer 2 (external anchor: what did OE omit) and Layer 3 (do OE's own citations contradict each other?) exist for this.
This skill independently verifies OE output before you absorb it.
Transport
OE calls run through the openevidence MCP server (see the server README in this repo), which executes them as page-context fetch() inside a logged-in openevidence.com tab of a dedicated browser it drives over the DevTools Protocol. If OE tools fail with Not authenticated, run python mcp/server.py --login and log in again in the window it opens; for anything else, python tests/smoke_cdp.py checks the transport without touching OE.
Input Modes
| Mode | Trigger | Behavior | |
|---|---|---|---|
| Question | /oe-verify {question} | Call ask_openevidence(question, preserve_citations=True), then verify | |
| In-context | /oe-verify (no args) | Verify the most recent OE response in this conversation | |
| Auto-trigger | From a note-writing workflow | Receives OE response + question, runs verification silently |
Pipeline
Step 0: Obtain & Parse OE Response
If calling OE directly: use ask_openevidence(question, preserve_citations=True).
Parse the response:
- If
## Citation DataJSON block exists →json.loads()to get citation array - Each citation object has:
index,title,doi,pmid,date,journal,authors,publication_types,impact_score,recency_days,is_guideline,origin,origin_risk,url - The body text uses
[N]inline markers matchingcitation.index
`origin` / `origin_risk` — which corpus the claim was retrieved from:
OE is a RAG system, and origin names the corpus the cited chunk came from. The MCP server decodes it (OE ships it ROT-1 obfuscated) and tiers it:
origin_risk | Corpora | What it means for verification | |
|---|---|---|---|
HIGH | *_fulltext_scraped_* (lancet, nejm, aan, …) | Text scraped from a review's full text. The sentence OE quotes is frequently the review citing someone else's trial — so OE attributes another study's number to this paper. This is the main OE failure mode. | |
MEDIUM | wiley_cdsr_fulltext (Cochrane), wiley_research_fulltext, guidelines_fulltext_*, media_annotated_gemini | Publisher full text or AI-annotated figures. Real full-text chunks, but still not necessarily the paper's own finding. | |
LOW | pubmed_abstracts_* | Abstract-level. Little room for mis-attribution. | |
UNKNOWN | (no span metadata) | Provenance unavailable — treat as MEDIUM, never as LOW. |
⚠️ One paper can hold several indices. OE assigns an index per retrieved chunk, so the same PMID legitimately appears under multiple [N] (observed: 10 indices over 7 papers). Two consequences:
- Dedupe by PMID/DOI before spawning agents — verify each paper once, then apply its
verdict to every index it owns. Spawning one agent per index burns tokens re-verifying the same paper.
- Never assume
[N]ordering equals the bibliography order.
Build claim-span map:
- Split body text into sentences (split on
.but preservee.g.,vs.,et al., numbered decimals) - For each sentence containing
[N], record:{index: N, claim: "sentence text", context: "preceding sentence for context"} - Group by citation index, then merge groups that share a paper → each merged group is one Haiku agent's input
- If a sentence has multiple
[N][M], it maps to both citations - Mark a claim
quantitative: trueif it contains a number that carries an evidential load —
effect size, HR/OR/RR, CI, %, p-value, n. HIGH/MEDIUM origin + quantitative claim is the transitive-citation danger zone (Layer 1 Step 5 below).
Step 0.5: Deterministic Existence Gate (main agent, BEFORE spawning Haiku)
A citation-shaped object is not a source — OE returns well-formatted metadata whose DOI can be fabricated or resolve to a different paper. Existence checking is mechanical; do it deterministically and cheaply BEFORE spending any agent tokens on semantic comparison:
- For each selected citation with a DOI: WebFetch
https://api.crossref.org/works/{doi}
(no key needed; batch all fetches in parallel).
- 404 / no
message→ verdict FABRICATED immediately. Do NOT spawn a Haiku agent
for it — the semantic layer is meaningless for a nonexistent source.
- Resolves → compare returned
titlevs OE'scitation.title(token-overlap, not
exact-match). Low overlap → keep the citation in the Haiku batch but prepend to that agent's prompt: "⚠️ DOI resolves to a different title than OE reports — verify identity via PMID/title search before trusting any content."
- No DOI but has PMID → skip the gate here; the Haiku agent's PubMed lookup doubles as
the existence check.
- Neither DOI nor PMID → note "existence unverified" and let the Haiku agent attempt
title search; failure there → UNVERIFIABLE as usual.
Failure-mode rule: if CrossRef itself is unreachable, do not treat the gate as passed — proceed to Layer 1 but mark those rows "existence gate skipped (CrossRef down)" in the report. A verification-tool outage must degrade to explicit uncertainty, never to a silent pass.
Step 1: Layer 1 — Citation Verification (Parallel Haiku Agents)
Citation cap: Max 10 papers (after PMID/DOI dedupe). If more exist, prioritize by:
origin_riskHIGH first — that is where mis-attribution actually lives- Citations backing key therapeutic claims (not background/epidemiology)
- Most recent citations (lower
recency_days) - Citations with DOI or PMID (verifiable)
For each paper, spawn Agent(model: "haiku") with this prompt template:
Spawn all agents in a single message (parallel execution).
Step 2: Layer 2 — Evidence Completeness Check (Sonnet Agent)
Spawn 1x Agent(model: "sonnet") in the same message as Layer 1 agents (runs in parallel).
Prompt template:
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/oe-verify/SKILL.md
Popularity
- Repository stars
- 8
- Repository forks
- 2
- 7-day trend score
- 11
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/drpwchen/openevidence-tools/oe-verify)