Fact Check logo

Fact Check

Community
LeeJuOh
fact-check

Verify factual accuracy of a document against the codebase and git history. Use when asked to verify, fact-check, or audit claims in a report or document. Accepts a file path or auto-detects the most recent HTML report.

Overview

PublisherLeeJuOh
Repositoryclaude-code-zero
Skill namefact-check
Stars
53
Forks
4
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by LeeJuOh on GitHub. Read the source before you install it.

Installation

Install the Fact Check AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/LeeJuOh/claude-code-zero/tree/main/plugins/vision-powers/skills/fact-check
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/LeeJuOh/claude-code-zero.git /tmp/claude-code-zero
mkdir -p .claude/skills
cp -r /tmp/claude-code-zero/plugins/vision-powers/skills/fact-check .claude/skills/fact-check
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Fact Check in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Fact Check on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Fact Check is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Fact Check

Verify the factual accuracy of a document against the actual codebase and git history. Extracts verifiable claims, checks each against source, corrects inaccuracies in place, and adds a verification summary.

This is not a re-review. It does not second-guess analysis, opinions, or design judgments. It does not change the document's structure or organization. It is a fact-checker — it verifies that the data presented matches reality, corrects what doesn't, and leaves everything else alone.

Instructions

Format Detection

--format controls which verification-summary block to inject:

FlagValuesDefaultMeaning
--formathtml | mdautoAuto-detected from the input file extension (.html → html block, .md → markdown block). Override when the input is a generic text file or when you want a markdown summary inside an HTML document

Principle: Fact-check edits the source document in place. The format flag only governs the verification summary appended at the end — HTML summary uses KPI cards + <details> blocks, markdown summary uses a table + bullet lists. Auto-detection is almost always correct; override only for edge cases.

Target File Detection

Determine what to verify from $1:

  1. Explicit path: Verify that specific file (.html, .md, or any text document)
    • Resolve relative paths against cwd
  2. No argument: Auto-detect the most recent report of either format:
    ls -t ${CLAUDE_PLUGIN_DATA}/reports/*.html ${CLAUDE_PLUGIN_DATA}/reports/*.md 2>/dev/null | head -1
    If no reports found, inform the user and stop.

Document type detection — from the filename, the same rule report-manager uses:

Document TypeDetectionVerification Focus
diff-visual reportFilename contains -diff-visualVerify against the git ref the review was based on
doc-visual reportFilename contains -doc-visualVerify file references, names, architecture claims
plugin-visual reportFilename contains -reportVerify plugin structure, file paths, feature descriptions
Markdown document.md extensionVerify file references, function/type names, behavior descriptions
OtherFallbackExtract and verify whatever factual claims about code it contains

Artifact-channel detection — after resolving the target, check whether a <target-path>.artifact.json sidecar sits next to it. Its presence means the file is a published Artifact fragment (an .artifact.html living on claude.ai), not a plain local report. This flips two things downstream: the Phase 4 gate runs --content-only (the fragment's design layer is owned by the built-in artifact-design skill, not this file's CSS), and Phase 4.5 republishes the corrected fragment to the same claude.ai URL. A local file with no sidecar takes neither branch — fact-check edits it in place exactly as it always has.

Why this isn't a channel decision: fact-check does not author reports, so there is nothing to route. It follows the target's existing channel: a local file stays local, a published fragment stays published at its link.

Language Detection

Determine the output language for the verification summary:

  1. Explicit argument: --lang <code> (e.g., --lang ko, --lang fr, --lang zh) → use that language. Any language code is valid
  2. User message text: Detect the language of the message (excluding path) and match it
    • Examples: Korean text → Korean, Japanese text → Japanese, "en español" → Spanish, "auf Deutsch" → German
  3. Document language: Match the language of the document being verified
  4. Default: English

Phase 1: Extract Claims

Why: Systematic extraction prevents cherry-picking. Every verifiable claim must be identified before verification begins.

Read the target file. Extract every verifiable factual claim into 5 categories:

  1. Quantitative: Line counts, file counts, function counts, module counts, test counts, any numeric metrics
  2. Naming: Function names, type names, module names, file paths referenced in the document
  3. Behavioral: Descriptions of what code does, how things work, before/after comparisons
  4. Structural: Architecture claims, dependency relationships, import chains, module boundaries
  5. Temporal: Git history claims, commit attributions, timeline entries

Skip subjective analysis: opinions, design judgments, readability assessments, severity ratings, recommendations. These aren't verifiable facts.

Phase 2: Verify Against Source

Why: Each claim category requires a different verification method. Using the wrong method (e.g., Grep for quantitative claims) produces false confirmations.

For each extracted claim, go to the actual source:

Naming claims — Glob + Read:

  • Verify every file path exists
  • Verify every function name, type name, and module name exists at the claimed location
  • Check for typos, renames, or stale references

Quantitative claims — Bash git commands:

  • Re-run git diff --stat, git log, git diff --name-status and compare output against the document's numbers
  • Verify line counts with wc -l
  • Verify file counts with Glob

Behavioral claims — Read source files:

  • Read every file referenced and check function signatures, type definitions
  • For diff-reviews: read both the ref version (git show <ref>:file) and working tree version to verify before/after claims
  • Check that described behaviors match actual code logic

Structural claims — Grep + Read:

  • Verify import/dependency relationships
  • Check that architecture descriptions match actual module boundaries
  • Verify that claimed connections between modules exist

Temporal claims — Git commands:

  • Re-run git log commands to verify activity narrative
  • Verify commit hashes, authors, dates, and messages
  • Check that timeline entries match actual git history

Classify each claim:

  • Confirmed: Claim matches the code/output exactly
  • Corrected: Claim was inaccurate — note what was wrong and what the correct value is
  • Unverifiable: Claim can't be checked (e.g., references a file that doesn't exist, or requires runtime testing)

Phase 3: Correct In Place

Why: Surgical corrections preserve the document's structure and style. Over-editing risks breaking HTML layout or changing the author's voice.

Use the Edit tool for surgical corrections:

Do correct:

  • Incorrect numbers (line counts, file counts, commit counts)
  • Wrong function names, type names, file paths
  • Inaccurate behavior descriptions
  • Swapped before/after comparisons
  • Wrong git hashes, dates, or attributions
  • Factual errors in Mermaid diagram node labels or edge descriptions

Do NOT change:

  • HTML layout, CSS, or animations
  • Document structure or section organization
  • Mermaid diagram styling or layout (only fix factual labels/edges)
  • Subjective analysis, opinions, or design judgments
  • Writing style or tone

If a section contains a factual error, fix only the factual part. If a section is fundamentally wrong (not just a detail error), rewrite that section's content while preserving the surrounding HTML/markdown structure.

Phase 4: Add Verification Summary

Why: Transparency — readers can see what was checked, what changed, and what couldn't be verified.

Insert a verification summary into the document. Choose block type based on resolved --format (explicit flag wins, otherwise auto-detect from file extension: .html → HTML block, .md → Markdown block, other text → Markdown block).

For HTML files — insert a verification section matching the page's existing design:

html
<section id="verification-summary">
  <h2>Verification Summary</h2>
  <div>
    <div>
      <strong>{total}</strong>
      <span>Claims Checked</span>
    </div>
    <div>
      <strong>{confirmed}</strong>
      <span>Confirmed</span>
    </div>
    <div>
      <strong>{corrected}</strong>
      <span>Corrected</span>
    </div>
    <div>
      <strong>{unverifiable}</strong>
      <span>Unverifiable</span>
    </div>
  </div>
  <details>
    <summary>Corrections Made</summary>
    <ul>
      <li>{description of each correction with file:line reference}</li>
    </ul>
  </details>
  <details>
    <summary>Unverifiable Claims</summary>
    <ul>
      <li>{claim that could not be verified and why}</li>
    </ul>
  </details>
</section>

Place the verification section as the last content section, before </main> or the closing layout wrapper.

Re-check the gate (HTML output only). After injecting the HTML verification section, re-run the artifact-gate on the final output to confirm the inserted summary didn't break the artifact:

node ${CLAUDE_PLUGIN_ROOT}/scripts/artifact-gate.js <report-path> [--content-only]

Pass --content-only when the target is a published Artifact fragment (the sidecar found during Target File Detection, or a filename ending in .artifact.html). The design-layer checks (density, palette, font fallback, Mermaid classDef) belong to the built-in artifact-design skill that owns the fragment, not to this file — running the full gate would false-flag it. A plain local HTML report gets the full gate (no flag), same as before.

If the gate flags violations, fix them inline (max 2 retries), consistent with how the other skills handle gate output. Only do this for HTML output — the artifact-gate is HTML-only. If the summary was appended as Markdown (.md file or markdown block), skip the re-check entirely; there is nothing for the gate to validate.

For Markdown files — append at the end:

markdown
## Verification Summary

| Metric | Count |
|--------|-------|
| Claims Checked | {total} |
| Confirmed | {confirmed} |
| Corrected | {corrected} |
| Unverifiable | {unverifiable} |

### Corrections Made
- {description of each correction}

### Unverifiable Claims
- {claim and reason}

Phase 4.5: Republish (published Artifact fragments only)

Why: a correction that only touches the local .artifact.html file leaves the live claude.ai page stale — readers still see the unverified numbers. Re-publishing to the same URL keeps the shared link honest without minting a new one.

Do this only when Target File Detection found a sidecar (or the filename ends in .artifact.html). Local files and markdown skip this entirely — there is nothing published to update, so fact-check stops after Phase 4. Mirror the report-manager republish contract (its refine step 7):

  1. Read the sidecar <target-path>.artifact.json for url and title.
  2. Call the Artifact tool with file_path=<target-path>, url=<sidecar url>, and a one-sentence description. Passing url is what stacks the correction onto the same claude.ai link instead of creating a new one — a fresh session has no other handle on an existing artifact. You do not load artifact-design here: the fragment's design is already baked in, and content-only republish needs neither the load nor the grant.
  3. Rewrite the sidecar so published_at reflects this fact-check:
    bash
    node ${CLAUDE_PLUGIN_ROOT}/scripts/write-artifact-sidecar.js --report <target-path> --url <url> --title <title>
  4. Report the claude.ai URL in the Phase 5 summary instead of the local file:// path.

Edge cases (same as report-manager step 7):

  • Filename ends in .artifact.html but no sidecar: an earlier publish fell back to local-only. Publish fresh (omit url) and write the sidecar for the first time.
  • Sidecar present but the republish call errors (the link died upstream): publish fresh (omit url), overwrite the old sidecar, and tell the user in one line: "New shared link published — any previously shared link now points to a stale version." Don't guess why the old link died.

Gotchas

  • Over-correcting opinions as facts: "This architecture is well-designed" is a subjective judgment, not a factual claim. Only correct things that can be verified against source — names, numbers, behaviors, paths. When in doubt, skip it.
  • Modifying HTML structure: The Edit tool is for surgical text corrections only. Do not reorganize sections, move content between sections, or change HTML wrapper elements. If a section is fundamentally wrong, rewrite the text content inside the existing <section> tags.
  • Stale git refs in diff-visual reports: A diff-visual report captures a snapshot. If new commits landed since the report was generated, the fact-checker sees different data than the report author did. Verify against the same ref the report was based on (look for commit hashes in the report), not HEAD.
  • Counting claims too aggressively: Not every number in a report is a "claim" worth verifying. Focus on claims that matter — metrics in KPI cards, file counts in summaries, function names in architecture descriptions. Ignore incidental numbers in prose.
  • Mermaid diagram labels: Mermaid node labels that contain function or file names are factual claims. If a diagram says validateAuth() but the actual function is verifyAuth(), that's a correction. But don't change diagram layout or styling.

Phase 5: Report

Output a summary to the user:

Fact-check complete: {file path — or the claude.ai URL when a published fragment was republished}

  {total} claims checked
  {confirmed} confirmed
  {corrected} corrected
  {unverifiable} unverifiable

{If corrections were made, list the top 3-5 most significant corrections}
{If nothing needed correction, note that verification confirms accuracy}

Frequently asked questions

What does the Fact Check AI skill do?

Verify factual accuracy of a document against the codebase and git history. Use when asked to verify, fact-check, or audit claims in a report or document. Accepts a file path or auto-detects the most recent HTML report.

Why use Fact Check on TypingMind?

Because you install it once and use it with any model. Fact Check is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Fact Check in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/LeeJuOh/claude-code-zero/tree/main/plugins/vision-powers/skills/fact-check. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Fact Check?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Fact Check?

As many as you like. As long as a model supports skills, you can use Fact Check with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Fact Check AI skill free?

Yes. It is published on GitHub by LeeJuOh under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇