Last issue nailed citation checking to the end of a research checklist. This one goes a layer down: before you can verify a citation, every sentence needs a position it can point back to — and the official API already has fields that do exactly that.
Last issue ended on a hard line: citation checking is not fact checking. A link returning 200 does not mean the sentence came from that page. This issue picks up there. Grounding does not ask "does the model know this". It asks "which document, which character offset, does this sentence come from". There are three tiers of answer: put it in the prompt (cheapest, least reliable), install a skill (portable, still relies on the model's diligence), or use official API fields (the model never gets a chance to invent anything). Below, real items in each tier, and at the end a set of criteria for choosing between them.
Reduce hallucinations gives three basic strategies, each with a prompt you can lift whole: (1) let it say "I don't know" — the page's own words: This simple technique can drastically reduce false information; (2) extract verbatim quotes before analyzing (for documents over 20k tokens especially); (3) after drafting, find a supporting quote for every claim and delete the ones that have none — the sharp part of that example is its last line: remove that claim from the press release and mark where it was removed with empty [] brackets. Four advanced ones follow: chain-of-thought verification, best-of-N verification, iterative refinement, external knowledge restriction. Free, zero dependencies, and the first thing to read this issue.
# Official: makes you look back once it has answered
/plugin marketplace add anthropics/skills
# discernment-nudge lives under skills/, one of 19 official skill dirs
# First usable move: have it pull the quotes first, then you pick
# "Extract exact quotes from this document relevant to X. If you can't find
# relevant quotes, say 'No relevant quotes found.' Then answer using only
# those quotes, referencing them by number."
discernment-nudge (official): it does not verify — it makes you verify. After answering, it appends A few things worth a second look: plus 2–3 short questions, each tied to a specific element of the reply and phrased so you could ask them back verbatim. Two hard constraints are worth copying: offer the nudge at most once per conversation, and an explicit skip list — creative writing, casual chat, simple lookups, purely educational questions, and whenever the user has already asked you to verify, cite, or flag uncertainty. When not to install it: you want answers, not follow-up questions, or you already have automated verification in the pipeline — then it is just text you will not read.
truth-first (Agensi marketplace) covers the other half: no claiming "done" without having actually run it. It demands real reads of file contents, configuration and system state before a conclusion. Full disclosure: agensi.io was blocked by this machine's egress policy for this issue, so the page could not be opened — which means no install-count figure and no copied install command here, only its position on the map. If you want the same job with source you can read, see the two GitHub implementations in the next section.
discernment-nudge among them)Set "citations": {"enabled": true} on each document and the reply's text blocks come back carrying citation objects. The official doc's comparison against prompt-based approaches is this issue's core line: citations are guaranteed to contain valid pointers to the provided documents. Three engineering details:
char_location (0-indexed character offsets); PDFs have text extracted then chunked and yield page_location (1-indexed pages); custom content is not chunked further and yields content_block_location.cited_text does not count toward output tokens, and does not count toward input tokens when passed back. So "make it output verbatim quotes" is actually cheaper as an API field than as a prompt.title and context are passed to the model but are not citable content; citations must be enabled on all or none of the documents in a request.web_search: {"type":"web_search_20250305","name":"web_search","max_uses":5}. Citations are forced on — the doc's words: Citations are always enabled for web search. Each web_search_result_location carries url, title and cited_text (up to 150 characters), and those fields likewise cost no tokens. Use allowed_domains to pin searching to official domains. When not to use it: stable knowledge. It bills at $10 per 1,000 searches, plus every retrieved page counting as input tokens.
web_fetch: no additional charge, but citations are off by default — you set "citations": {"enabled": true} yourself. It also has the prettiest mechanism in this issue: it can only fetch URLs that already appeared earlier in the conversation — in user messages, in client-side tool results, or in prior search/fetch results. A URL that exists only in the model's own output cannot be fetched; the tool returns url_not_in_prior_context. A link it invented is physically unreachable. (The design intent is exfiltration defense; the docs carry a Warning against enabling it where the model handles untrusted input alongside sensitive data — see Skill 12 on this site.) Cap long pages with max_content_tokens: a 100 kB doc runs about 25,000 tokens, a 500 kB PDF about 125,000.
cited_text rather than letting the model emit it is precisely that the model-emitted version is still, fundamentally, generated.daymade/claude-code-skills · fact-checker (MIT): takes a finished document and pulls out factual claims to check — context window sizes, pricing, version numbers, release dates, benchmark scores. It hardcodes a source hierarchy: product official pages > API documentation > official blog announcements > GitHub releases, and says explicitly to be careful with third-party aggregators. Whatever it cannot check gets marked ❓ Unverifiable with a recommendation to soften the wording, and no correction lands without your explicit approval. When not to install it: subjective claims, paywalled sources, genuinely disputed facts — it declares all three out of scope itself.
geigermatic/claude-craft · verify-claim (MIT, one of 6 skills in the repo): aimed at what it calls the single most expensive failure mode of AI-assisted coding: confident wrongness. The method turns assertions into runnable evidence: state the claim as one specific, falsifiable sentence, match it to a mechanism (file read, grep, curl), run it, then report exactly one of three verdicts — Verified / Refuted / Inconclusive — with file:line, and do not summarize prematurely (three grep hits means report all three). When not to install it: it draws the line itself — things obvious from a file you just read, and trivial claims with low blast radius, do not deserve the ceremony.
michaelwjohnson/claude-skills · check-claims: a set of three — occams-razor, check-claims, writing-review — installed individually after claude plugin marketplace add michaelwjohnson/claude-skills. Its ordering argument is the interesting part: run the razor before the fact check, because "cutting changes which claims are still load-bearing, and because a cut leaves orphans that are themselves often false." Honest cost: per the GitHub repo page, 2026-09, it has 0 stars, 0 forks and 11 commits on main — its value is that the ordering argument copies straight into your own process, not that it has been validated. Same for frmoretto/source-of-truth-creator (CC BY 4.0), whose list of overconfidence traps (unmarked estimates, self-assessment bias, absence-as-proof, illustrative-as-data, staleness) is worth reading as a checklist — but per its repo page, 2026-09, it has 3 stars and 2 commits. Read it; don't depend on it.
web_search (forced citations) or web_fetch (opt in) for the web. Skills are powerless in this cell.fact-checker; its source hierarchy was written for this cell. Stack last issue's verify_citations.py on top to sweep the link layer.verify-claim or truth-first. Both want tool output as evidence, not phrasing.discernment-nudge. Its only output is three things worth re-checking; it treats the human, not the model.source-of-truth-creator's failure modes at 6 where the repo itself lists 8; another rendered the official web-artifacts-builder as artifacts-builder. Use aggregators to discover candidates; take every name, number and count back to the GitHub directory or the official page.web_search is $10 per 1,000 searches plus input tokens for everything that lands in context; web_fetch has no tool fee, but one 500 kB PDF is roughly 125,000 input tokens. Citations itself only slightly raises input tokens (system prompt additions and chunking) and saves on the output side.fact-checker's ❓ and verify-claim's Inconclusive are both honest, but a draft full of hedges is also an unusable draft. Turn this on only for claims someone will act on.web_fetch's url_not_in_prior_context turns that into an error code — you can also just make it a rule of your own.verify_citations.py guarantees the DOI exists, web_fetch guarantees the link was really retrieved — none of them can judge whether the correctly cited passage actually supports the conclusion you wrote. That step is still a human one.Do these three first: (1) read Reduce hallucinations and copy the "say I don't know" and "delete unsupported claims, leave empty []" prompts into your template. (2) /plugin marketplace add anthropics/skills, enable only discernment-nudge at first, and let it name three things per conversation that deserve a second look. (3) If you have documents to ask about, add "citations": {"enabled": true} to every document in your API calls — it is the only tier here that yields a pointer guaranteed to be valid.
Add as needed: web_search (you need current information and accept $10/1,000) · web_fetch + citations.enabled (you already have URLs and need passage-level citations, in a trusted environment) · daymade/claude-code-skills's fact-checker (drafts heavy on numbers and versions) · geigermatic/claude-craft's verify-claim (to block "I ran it") · truth-first (same job, Agensi marketplace, read its SKILL.md yourself before installing) · 199-biotechnologies/claude-deep-research-skill's verify_citations.py (sweep the link layer before filing).
Explicitly don't: treat "please cite your sources" in a prompt as grounding · treat michaelwjohnson/claude-skills (0 stars) or source-of-truth-creator (3 stars) as a validated dependency rather than reading material · copy names and numbers from secondary aggregators · assume that passing grounding and citation checks means the conclusions were checked.
citations.enabled set on a document, the API parses citations into structured objects carrying locations. The doc's own claim: the pointers are guaranteed valid.web_fetch's error code for a URL that never appeared earlier in the conversation. A link the model invented therefore cannot be retrieved.verify-claim's term: a claim you intend to act on, where being wrong costs real work. Only these deserve the full verification procedure.citations.enabled; three location types and their index bases; cited_text costs no tokens; images and scanned PDFs are not citable; all-or-none per request (2026-09)web_search_result_location fields; allowed_domains / blocked_domains; $10 per 1,000 searches (2026-09)url_not_in_prior_context; citations off by default; max_content_tokens; the exfiltration Warning; no additional tool charge (2026-09)file:line and "do not summarize prematurely"; explicitly skipped for low-stakes cases (MIT, 6 skills in the repo)occams-razor / check-claims / writing-review and the "razor before claim check" ordering argument (per the repo page, 2026-09: 0 stars, 11 commits, MIT)verify_citations.py and the citation registryweb_fetch Warning