Help us improve
Share bugs, ideas, or general feedback.
From academic-research
Verifies that a citation in a manuscript is honestly supported by its source, using a staged abstract-then-fulltext rule and classification scheme. Sub-skill for fact-check and critic-loop.
npx claudepluginhub mronkko/claude-academic-research --plugin academic-researchHow this skill is triggered — by the user, by Claude, or both
Slash command
/academic-research:verifying-citationsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A citation is verified when an externally consulted source (Zotero PDF fulltext or abstract — never training memory) directly supports the claim the manuscript attributes to it. Verification is staged: read the abstract first; escalate to full text only when the abstract is silent, ambiguous, or insufficient for the kind of claim being made.
Verifies citations and claims in manuscripts by auditing sources through Zotero and MCP. Activates on 'fact-check', 'verify citations', 'audit sources'.
Verifies every citation in LaTeX manuscripts by fetching arXiv papers and sources to detect ghost papers, wrong metadata, inverted claims, and dead links. Suggests bib fixes and prose rewrites.
Provides reference guidance for citation verification in academic writing, including verification principles and common error patterns. Helps prevent fake citations and ensure citation accuracy.
Share bugs, ideas, or general feedback.
A citation is verified when an externally consulted source (Zotero PDF fulltext or abstract — never training memory) directly supports the claim the manuscript attributes to it. Verification is staged: read the abstract first; escalate to full text only when the abstract is silent, ambiguous, or insufficient for the kind of claim being made.
This skill is the single source of truth for citation-verification doctrine. fact-check (one-shot audits) and the evidence critic in critic-loop (iterative revision) both load it so that when the rules change, two skills don't drift.
Insertion vs verification. The complementary skill grounded-citations governs inserting a citation during drafting — same externalised-consultation rule, but it escalates on recency / context staling (a faded context-window memory needs re-fetching). This skill governs auditing an existing citation, and it escalates on claim type — quoted passages, specific β coefficients, and method details always require fulltext regardless of what the abstract says. Same demand for grounding; different decision axis.
Unit of dispatch: one subagent per unique citation, not per mention. A paper cited five times in a manuscript becomes one subagent (with five mentions in its prompt), not five subagents. This (a) fetches the source once and (b) lets the subagent catch cross-mention inconsistency — e.g. the manuscript citing the same paper for X in Methods and ¬X in Discussion — which per-mention dispatch can't see. See Multiple mentions of one source below.
| Classification | When to assign |
|---|---|
| VERIFIED | The source directly supports the claim — sign, direction, finding, and magnitude all match. |
| MINOR | The claim overreaches the source: oversimplified finding, missing caveat the source considers important, paraphrase that mildly overstates. |
| MAJOR | The paper doesn't exist under that key; wrong paper for the key; direction reversal; fabricated quote; specific finding not supported by the source. Blocks publication. |
| UNVERIFIABLE | Verification requires the full text and no PDF is attached to the Zotero item. The issue is access, not accuracy — recommend running enrich_pdfs.py to populate the library, or replacing the citation. Callers may map UNVERIFIABLE to MAJOR for their own report when the workflow can't ship an unresolved citation (e.g. inside critic-loop). |
The caller may pass the citation in one of two forms:
@bbtkey form (rendered manuscripts, where citations have been
resolved already) → mcp__zotero__zotero_search_by_citation_key to
resolve the BBT key to a Zotero item key.mcp__zotero__zotero_search_items
with the surname(s) and year (and a second co-author surname if
present in the prose to disambiguate). If multiple candidates match,
pick the one whose title/venue is consistent with the surrounding
context.If nothing resolves — neither the BBT key nor any Author-Year search finds a matching item — the citation is MAJOR (paper not in library) for every mention of it, with the recommendation: "add the paper to Zotero, or replace the citation with one that supports the claim."
mcp__zotero__zotero_get_item_metadata on the resolved item key.
| Abstract says... | Action |
|---|---|
| Directly states the claim, with matching direction / sign / finding | VERIFIED — done. |
| Directly contradicts the claim (direction reversal, contrary finding) | MAJOR — done. |
| Is silent on the specific claim, or consistent but inconclusive | Escalate to Stage C. |
mcp__zotero__zotero_get_item_fulltext — works when the PDF is attached. Verify against the body:
If zotero_get_item_fulltext returns no content (no PDF attached, OCR empty), classify UNVERIFIABLE with a message naming what's missing — e.g. "no PDF attached for @key; run enrich_pdfs.py then re-run, or replace the citation."
Do not fall back to OpenAlex / Semantic Scholar / publisher MCPs inside this skill. The plugin already has scripts/pipelines/enrich_pdfs.py for populating Zotero from publisher sources (ScienceDirect, Wiley TDM, browser fallbacks). Broadening the fulltext source pool is that script's job, not the auditor's.
Skip Stage B and go straight to Stage C — the abstract cannot conclusively support these claim types regardless of how it reads:
The caller dispatches one subagent per unique citation with all of the manuscript's mentions of that citation in the prompt. The subagent should:
A subagent returns one block per mention plus, optionally, one cross-mention block:
@citekey (or the Author-Year surface form when no @key exists yet)
Mention 1 — location: "<section / quoted excerpt>"
Classification: VERIFIED | MINOR | MAJOR | UNVERIFIABLE
Stage: abstract | fulltext | unverifiable
Evidence: <one line — direct quote or paraphrase of the relevant source content>
Recommendation: <one line — what the author should do, if anything>
Mention 2 — location: "..."
Classification: ...
...
Cross-mention (only if applicable):
Finding: <one line — describe the internal inconsistency>
Severity: MAJOR | MINOR
Recommendation: <one line>
When a citation has only one mention, the cross-mention block is omitted and there is exactly one mention block.
This is the contract between this skill and its callers. Callers
reshape these blocks into their own report formats — fact-check's
console table or report file, critic-loop's ISSUES: numbered list.
grounded-citations enforces the same rule at insertion time; this skill enforces it at audit time.)enrich_pdfs.py's responsibility. UNVERIFIABLE is the correct outcome here.