Skip to main content
AIDiveForge AIDiveForge
🔗

Fact-and-Source Annotator

Writing & Editing · by AIDiveForge · Apr 20, 2026 · Advanced

Attach evidence and verification status to the factual claims in a draft.

Get a claim ledger and a draft annotated with sources and unresolved claims.

Free · 2 KB · SKILL.md, instructions and example files. Provide the draft and source material; browsing is needed to verify current external claims.

A worked example

A small example to try before using your own data.

Input

{
  "draft": "The product launched in 2024 and has 10,000 customers. It is delightful.",
  "source": "Company announcement: product launched June 2024."
}

Expected result

[
  {
    "claim": "Launched in 2024",
    "status": "supported",
    "evidence": "Company announcement, June 2024"
  },
  {
    "claim": "10,000 customers",
    "status": "unverified",
    "evidence": null
  },
  {
    "claim": "Delightful",
    "status": "opinion",
    "evidence": null
  }
]

What to check: Separate the launch and customer-count claims; do not let one citation appear to support both.

Limits: A cited page is useful only if it supports the specific claim; source availability alone is not verification.

Worked example included. Model-specific performance and vendor compatibility have not been benchmarked.

Installation options and other formats

Install this skill

An agent skill starts with SKILL.md. The ZIP also includes its examples and any helper scripts. Drop the file into your tool of choice — or pick a different format if you use Cursor, Windsurf, Copilot, or something else.

Download SKILL.md
python3 - <<'ADF_SKILL_INSTALL'
import hashlib, io, os, stat, tempfile, urllib.request, zipfile
from pathlib import Path, PurePosixPath
folder = "fact-and-source-annotator"
root = Path(os.environ.get('ADF_SKILL_ROOT', str(Path.home() / '.claude' / 'skills'))).expanduser()
destination = root / folder
if destination.exists() or destination.is_symlink():
    raise SystemExit('An installation already exists. Back it up and merge the ZIP deliberately.')
root.mkdir(parents=True, exist_ok=True)
request = urllib.request.Request("https://aidiveforge.com/skill/fact-and-source-annotator.zip", headers={'User-Agent': 'AIDiveForge-Resource-Installer/1.0 (+https://aidiveforge.com/skills/)'})
with urllib.request.urlopen(request, timeout=30) as response:
    data = response.read(8 * 1024 * 1024 + 1)
if len(data) > 8 * 1024 * 1024 or hashlib.sha256(data).hexdigest() != "810dc1e7f1418dcfc19cd5ab59e365773f2ad617916ae46f487eabb188086776":
    raise SystemExit('The download did not match this reviewed bundle. No files were installed.')
with zipfile.ZipFile(io.BytesIO(data)) as archive, tempfile.TemporaryDirectory(prefix='.adf-skill-', dir=root) as temporary:
    members = archive.infolist()
    if len(members) > 100 or sum(m.file_size for m in members) > 16 * 1024 * 1024:
        raise SystemExit('Unexpected archive size')
    for member in members:
        name = PurePosixPath(member.filename)
        if name.is_absolute() or '..' in name.parts or not name.parts or name.parts[0] != folder or '\\' in member.filename or stat.S_ISLNK(member.external_attr >> 16):
            raise SystemExit('Unsafe archive entry; nothing was installed')
        target = Path(temporary).joinpath(*name.parts)
        if member.is_dir():
            target.mkdir(parents=True, exist_ok=True)
        else:
            target.parent.mkdir(parents=True, exist_ok=True)
            with target.open('xb') as stream:
                stream.write(archive.read(member))
    staged = Path(temporary) / folder
    if not (staged / 'SKILL.md').is_file() or destination.exists() or destination.is_symlink():
        raise SystemExit('The skill could not be installed without replacing existing data')
    os.rename(staged, destination)
print('Installed the complete skill folder:', destination)
ADF_SKILL_INSTALL

Claude Code: ~/.claude/skills/fact-and-source-annotator/SKILL.md. Codex: ~/.codex/skills/fact-and-source-annotator/SKILL.md. Keep the complete ZIP folder when helper scripts are included.

🧠 Why it works

Separate the launch and customer-count claims; do not let one citation appear to support both.

⚙️ How it works

  1. Split compound sentences into separately checkable factual claims.
  1. Prefer primary sources and record source date, supporting passage and scope.
  1. Classify each claim as supported, contradicted, unverified or opinion; do not use invented numeric confidence.
  1. Keep citations adjacent to the claims they support and preserve disagreements between sources.
  1. Return unresolved claims and proposed revisions for the author’s review before publication.

Description

Get a claim ledger and a draft annotated with sources and unresolved claims.

Provide the draft and source material; browsing is needed to verify current external claims.

Limits: A cited page is useful only if it supports the specific claim; source availability alone is not verification.

Recommended Use

Tools and workflow packs this skill pairs well with. Forge picks are auto-generated from category + capability signals; Community picks are added by people who've used the pairing.