fact-check-prose — verify claims, reasoning, and computed values in prose
Prose review usually stops at style. This skill goes further: it checks whether the prose is actually true and its logic actually holds — per the standing rule in d-morrison/ai-config’s shared/writing/fact-check-prose.md, which is the canonical statement of this policy (edit that file, not this skill’s procedure, if the policy itself changes).
When this fires
- “fact-check this”, “check the math”, “verify this reasoning”, “check this proof”, “is this accurate”, “does this claim check out”
- As part of any PR/MR review where the diff touches narrative prose — docs, READMEs, lecture notes, textbook chapters, commit/PR descriptions making a substantive claim. Run it alongside (not instead of) style review (
use-preferred-style,find-ai-tells) and terminology review (challenge-ambiguous-terminology, folded intoard/ardi).
Procedure
1. Identify the target and extract checkable units
A PR/MR diff (gh pr diff <N> / glab mr diff <N>), a file, or pasted text. Read the changed prose and pull out three kinds of units to check:
- Factual claims — statements that cite a value, a behavior, a result, an external fact (“X was introduced in version Y”, “the estimator is unbiased under Z”).
- Undefended claims — a factual claim with no internal reasoning and no citation backing it, even if it turns out to be accurate. Flag it separately from an accuracy check (below) — a claim can pass accuracy and still fail this one.
- Reasoning chains — an argument the document makes, not just its individual facts. This includes formal mathematical reasoning (derivations, proofs, algebraic manipulations — check every step follows from the last, check dimensional/unit consistency, check edge cases) and informal reasoning (X therefore Y, a causal claim, a design justification).
- Computed/rendered values — a number, table entry, or figure the prose describes as the output of code, a model fit, or a render.
2. Check factual claims
For each factual claim, check it against domain knowledge first. Where it’s checkable against an external source — a package’s own docs, a spec, a paper, a dataset’s documentation — fetch that source (WebFetch/ WebSearch) and confirm or refute the claim against it, not against a secondhand summary. Don’t wave a plausible-sounding claim through unchecked — see challenge-ambiguous-terminology for the sibling rule on ambiguous phrasing specifically.
Separately from accuracy, check that the claim is defended: does the surrounding text give reasoning for it, or does it carry a citation? A claim can be accurate and still undefended — flag both kinds of gap, not just outright inaccuracy.
3. Verify document-internal reasoning
Walk each reasoning chain step by step:
- Formal math — re-derive or spot-check each step; confirm dimensions and units are consistent at every operation; check boundary/edge cases the claim implies; confirm a cited theorem’s hypotheses actually hold in this application (e.g. don’t apply a result that requires independence to correlated data without noting it).
- Informal arguments — does the stated reasoning actually support the conclusion drawn, or is there a gap (an unstated assumption doing the real work, a non sequitur, an overgeneralization from one example)?
4. Cross-check computed values and figures against the rendered output
Don’t trust the source prose’s own description of a computed value — verify it against what was actually produced:
- Check whether the project has a PR-preview deploy. Look for a sticky preview-link comment on the PR, or check the project’s
CLAUDE.md/.github/workflows/for a preview workflow (e.g.preview.yml+preview-deploy.ymlbuilt onrossjrw/pr-preview-action, common in this lab’s Quarto repos — those deploy to agh-pagesbranch underpr-preview/pr-<N>/<path>). - If a live preview exists, fetch the rendered page (
WebFetch) and read the actual value/figure off it. - If no preview covers the changed page yet, fall back to the project’s render command (e.g.
quarto render <chapter.qmd> --to htmlin an R/ Quarto repo) and check the local render instead of skipping the check. - Compare what’s rendered against what the prose claims. A mismatch is a finding even if the prose “sounds” right — the rendered output is ground truth, not the sentence describing it.
5. Report
For every unit checked:
| Claim/step | Verdict | Basis (source checked) |
|------------|---------|-------------------------|
| "the estimator is unbiased" | Inaccurate | Biased under this design per [source/derivation]; see step 3 below |
| Derivation step 4 → 5 | Confirmed | Re-derived; algebra holds, dimensions consistent |
| "Table 2, row 3 = 4.7" | Inaccurate | Rendered preview (pr-preview/pr-N/chapter.html) shows 4.9 |
| "adoption has grown steadily" | Undefended | No citation or reasoning given; claim itself checks out but needs a source or an explicit basis |
Then, separately, list additional citations/references worth adding — proactively, anywhere a pointer to a source would help a reader, not only where a claim is currently flagged as uncited.
6. Offer to apply corrections
On request, fix the flagged inaccuracies and reasoning gaps in place with Edit, preserving the author’s intent and voice — same posture as find-ai-tells’s apply step. Don’t silently rewrite without being asked; report first.
Relationship to other skills
challenge-ambiguous-terminology— catches phrasing whose meaning is unresolved; this skill catches claims and reasoning that are resolved but wrong. Run both during review.use-preferred-style/find-ai-tells— style and AI-tell scans; this skill is the accuracy/reasoning counterpart, not a replacement.ard/ardi— when a reviewer (human or bot) flags a factual or reasoning error,ardhandles the response disposition; this skill is how you (as reviewer) find that class of error in the first place.prose-fact-checkeragent — the read-only, parallelizable version of step 2–4 above, for fanning claim-checking out across aWorkflowwhen a document has many independent claims to verify at once.check-info-quality(ciq) — this skill verdicts a claim Accurate / Inaccurate / Undefended;ciq’s check C catches a claim that’s accurate by this skill’s own standard yet still misleads (missing context, cherry-picking, a citation that only weakly supports it).ciqalso covers two failure modes this skill doesn’t: stale claims (check A) and irrelevant content (check B). Run both.
Anti-patterns
- Don’t accept a claim because it sounds authoritative — check it.
- Don’t skip a derivation step because “it’s probably fine” — re-derive it or flag it as unverified, not silently pass it.
- Don’t trust the prose’s own description of a computed value when a rendered artifact (preview or local render) is available to check it against directly.
- Don’t limit citation suggestions to claims already flagged as uncited — suggest them anywhere they’d help a reader, per the fragment’s policy.