/factcheck
Adversarial citation and claim audit for any document — "do these sources actually say what the text claims?" Takes a markdown file, URL, or pasted draft (including this repo's own pulse/verdict briefs), extracts every checkable claim, then fans out verifier sub-agents
Claude Code
$ npx -y skills add duthaho/skillhub --skill factcheck --agent claude-code
Codex
$ npx skills add duthaho/skillhub --skill factcheck -a codex -y
Cursor
$ npx skills add duthaho/skillhub --skill factcheck -a cursor -y
Gemini CLI
$ npx skills add duthaho/skillhub --skill factcheck -a gemini-cli -y
GitHub Copilot
$ npx skills add duthaho/skillhub --skill factcheck -a github-copilot -y
OpenCode
$ npx skills add duthaho/skillhub --skill factcheck -a opencode -y
Windsurf
$ npx skills add duthaho/skillhub --skill factcheck -a windsurf -y
SKILL.md
factcheck.SKILL.mdname: factcheck
description: >-
Adversarial citation and claim audit for any document — "do these sources
actually say what the text claims?" Takes a markdown file, URL, or pasted
draft (including this repo's own pulse/verdict briefs), extracts every
checkable claim, then fans out verifier sub-agents instructed to refute,
not confirm: does the cited link resolve AND assert the claim as stated,
is the source primary or a laundered secondary write-up, has the claim
gone stale. Emits a graded audit table — VERIFIED / MISATTRIBUTED /
UNSUPPORTED / STALE / UNCHECKABLE — with a quoted passage as evidence for
every grade, saved to out/factcheck/. Advisory: it grades, the human
edits. Use when the user wants to check citations, verify sources, or
audit a report, post, or brief — e.g. "/factcheck <doc>", "verify the
sources in this", "are these citations real?", "is this actually true?".
For researching a fresh topic use pulse; for judging code changes use
done.
factcheck — do the sources say that?
`/factcheck <path | URL>` — audit a document's claims against its sources `/factcheck <path> focus <section/topic>` — audit only part of a long document
Answer one question: **for each claim this document makes, is there a source that actually asserts it?** The documented failure mode of cited writing — human and agent alike — is not missing links; it's links that resolve to pages that *don't say that*. A working URL is the weakest form of evidence there is. This audit replaces "it has citations" with "here is the passage."
Step 0 — Scope the audit
Read the document (WebFetch if a URL; ask for a paste if it's paywalled). Then size the job and say which tier you picked:
- **Small** (≤ ~10 checkable claims): verify inline, no sub-agents — the
fan-out below would cost more than it saves.
- **Standard**: fan out, batching ~5–8 claims per verifier.
- **Focused**: the user named a section or topic → extract only there, note
in the audit header that the rest was not examined.
If the document has **no citations at all**, say so up front — the audit's question shifts from "does the cited source say this" to "does support for this exist anywhere", and UNSUPPORTED becomes the default grade to beat.
Step 1 — Extract the checkable claims
Walk the document and number every **checkable claim**: factual, specific, and in principle verifiable — statistics, quotes, "X said/announced Y", version numbers, benchmark results, historical facts, "studies show".
For each claim record: a short restatement, its **locator** (section heading or line), the **cited source** if any, and whether it's **date-sensitive** (anything with "currently", "latest", a version, or a number that drifts).
Skip pure opinion and analysis — but flag **opinion dressed as fact** ("it is widely known that...") as a finding in its own right, ungraded.
Step 2 — Adversarial verification (fan out)
Spawn verifier sub-agents (`subagent_type: "Explore"`), each with a batch of claims and the same standing instruction: **try to refute each claim, not confirm it** — a verifier hunting for agreement finds it whether it exists or not. Per claim:
1. **Fetch the cited source.** Find the exact passage that supports or contradicts the claim — and **quote it verbatim**. No passage, no verification, regardless of how relevant the page looks. 2. **Trace laundered sources.** If the citation is a secondary write-up (a blog post about a paper, a news story about an announcement), follow it to the source that *owns* the claim — the paper, the changelog, the transcript. Grade against the owner; note the laundering. 3. **Check the date.** For date-sensitive claims, one search pass for newer, superseding evidence — a claim can be faithfully cited and still be wrong today. 4. **Uncited claims:** one honest search for a supporting primary source. Found → grade normally and record the found source. Not found → UNSUPPORTED, with the search noted.
**Grades** (exactly one per claim):
| Grade | Meaning | |---|---| | **VERIFIED** | The source asserts the claim as stated — passage quoted. | | **MISATTRIBUTED** | The source is real but says something materially different — both versions quoted. | | **UNSUPPORTED** | Link dead, source nonexistent, or no source found that asserts it. | | **STALE** | Was true when written; superseded — the newer evidence quoted and dated. | | **UNCHECKABLE** | Paywalled, offline, or genuinely unverifiable — stated, never guessed around. |
**Lossless hand-off:** each verifier writes full findings (quotes, URLs, search trails) to `out/factcheck/.work/<batch>.md` and returns a compact summary; build the audit from the files, not the summaries — a quote flattened by a relay is no longer evidence.
Step 3 — The audit
Render in chat, then save. Findings first, worst first:
# Factcheck: <document title> — <YYYY-MM-DD>
**Document:** <path/URL> · **Claims examined:** N (of M total; scope note if focused)
**Score:** X VERIFIED · X MISATTRIBUTED · X UNSUPPORTED · X STALE · X UNCHECKABLE
## Findings that matter most
1–3 sentences: the riskiest problems (misattributions and unsupported
central claims outrank stale trivia), any laundering pattern, any cluster.
## Claim-by-claim
| # | Claim | Locator | Cited source | Grade | Evidence |
|---|---|---|---|---|---|
(evidence column = the quoted passage or the reason, always)
## Laundered sources
citation → owning source, per case (omit section if none)
## Date-sensitive claims
what to re-check and when (omit if none)
Save to `out/factcheck/<slug>-<YYYY-MM-DD>.md` (`<slug>` from the document title; date via `date +%F` — never guessed). Create the folder if needed; committing the audit is the user's call. Then **offer** — never do unasked — the follow-ups: annotate the original with inline flags, or draft corrected text for the failing claims.
Guardrails
- **A resolving link proves nothing.** Verificatio
Read more
name: factcheck description: >- Adversarial citation and claim audit for any document — "do these sources actually say what the text claims?" Takes a markdown file, URL, or pasted draft (including this repo's own pulse/verdict briefs), extracts every checkable claim, then fans out verifier sub-agents instructed to refute, not confirm: does the cited link resolve AND assert the claim as stated, is the source primary or a laundered secondary write-up, has the claim gone stale. Emits a graded audit table — VERIFIED / MISATTRIBUTED / UNSUPPORTED / STALE / UNCHECKABLE — with a quoted passage as evidence for every grade, saved to out/factcheck/. Advisory: it grades, the human edits. Use when the user wants to check citations, verify sources, or audit a report, post, or brief — e.g. "/factcheck <doc>", "verify the sources in this", "are these citations real?", "is this actually true?". For researching a fresh topic use pulse; for judging code changes use done.
factcheck — do the sources say that?
`/factcheck <path | URL>` — audit a document's claims against its sources `/factcheck <path> focus <section/topic>` — audit only part of a long document
Answer one question: **for each claim this document makes, is there a source that actually asserts it?** The documented failure mode of cited writing — human and agent alike — is not missing links; it's links that resolve to pages that *don't say that*. A working URL is the weakest form of evidence there is. This audit replaces "it has citations" with "here is the passage."
Step 0 — Scope the audit
Read the document (WebFetch if a URL; ask for a paste if it's paywalled). Then size the job and say which tier you picked:
- **Small** (≤ ~10 checkable claims): verify inline, no sub-agents — the
fan-out below would cost more than it saves.
- **Standard**: fan out, batching ~5–8 claims per verifier.
- **Focused**: the user named a section or topic → extract only there, note
in the audit header that the rest was not examined.
If the document has **no citations at all**, say so up front — the audit's question shifts from "does the cited source say this" to "does support for this exist anywhere", and UNSUPPORTED becomes the default grade to beat.
Step 1 — Extract the checkable claims
Walk the document and number every **checkable claim**: factual, specific, and in principle verifiable — statistics, quotes, "X said/announced Y", version numbers, benchmark results, historical facts, "studies show".
For each claim record: a short restatement, its **locator** (section heading or line), the **cited source** if any, and whether it's **date-sensitive** (anything with "currently", "latest", a version, or a number that drifts).
Skip pure opinion and analysis — but flag **opinion dressed as fact** ("it is widely known that...") as a finding in its own right, ungraded.
Step 2 — Adversarial verification (fan out)
Spawn verifier sub-agents (`subagent_type: "Explore"`), each with a batch of claims and the same standing instruction: **try to refute each claim, not confirm it** — a verifier hunting for agreement finds it whether it exists or not. Per claim:
1. **Fetch the cited source.** Find the exact passage that supports or contradicts the claim — and **quote it verbatim**. No passage, no verification, regardless of how relevant the page looks. 2. **Trace laundered sources.** If the citation is a secondary write-up (a blog post about a paper, a news story about an announcement), follow it to the source that *owns* the claim — the paper, the changelog, the transcript. Grade against the owner; note the laundering. 3. **Check the date.** For date-sensitive claims, one search pass for newer, superseding evidence — a claim can be faithfully cited and still be wrong today. 4. **Uncited claims:** one honest search for a supporting primary source. Found → grade normally and record the found source. Not found → UNSUPPORTED, with the search noted.
**Grades** (exactly one per claim):
| Grade | Meaning | |---|---| | **VERIFIED** | The source asserts the claim as stated — passage quoted. | | **MISATTRIBUTED** | The source is real but says something materially different — both versions quoted. | | **UNSUPPORTED** | Link dead, source nonexistent, or no source found that asserts it. | | **STALE** | Was true when written; superseded — the newer evidence quoted and dated. | | **UNCHECKABLE** | Paywalled, offline, or genuinely unverifiable — stated, never guessed around. |
**Lossless hand-off:** each verifier writes full findings (quotes, URLs, search trails) to `out/factcheck/.work/<batch>.md` and returns a compact summary; build the audit from the files, not the summaries — a quote flattened by a relay is no longer evidence.
Step 3 — The audit
Render in chat, then save. Findings first, worst first:
# Factcheck: <document title> — <YYYY-MM-DD> **Document:** <path/URL> · **Claims examined:** N (of M total; scope note if focused) **Score:** X VERIFIED · X MISATTRIBUTED · X UNSUPPORTED · X STALE · X UNCHECKABLE ## Findings that matter most 1–3 sentences: the riskiest problems (misattributions and unsupported central claims outrank stale trivia), any laundering pattern, any cluster. ## Claim-by-claim | # | Claim | Locator | Cited source | Grade | Evidence | |---|---|---|---|---|---| (evidence column = the quoted passage or the reason, always) ## Laundered sources citation → owning source, per case (omit section if none) ## Date-sensitive claims what to re-check and when (omit if none)
Save to `out/factcheck/<slug>-<YYYY-MM-DD>.md` (`<slug>` from the document title; date via `date +%F` — never guessed). Create the folder if needed; committing the audit is the user's call. Then **offer** — never do unasked — the follow-ups: annotate the original with inline flags, or draft corrected text for the failing claims.
Guardrails
- **A resolving link proves nothing.** Verificatio
Give Claude Code a memory and make it cite its sources — skills for research, daily work, and shipping code. They started as prompts I kept retyping, so I wrote each one down once. Keyless: no API keys, no signups.
More skills from other plugins.
i-have-adhd
Shape output for a reader with ADHD: lead with the next action, number multi-step work, restate state across turns, suppress…
distilly
Set up the owner profile so a personal agent knows who it works for (first-run setup, \"get to know me\"), or distill colleague,…
Questions about factcheck.
- Which coding agents can use factcheck?
- factcheck installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

