Verify claims in social content before posting: trace each stat, quote, date, and product claim to its primary source, check date, population, and context, keep a claim ledger, and hold, fix, or cut posts that fail. Use when drafting or reviewing a post, thread, caption, or graphic that contains a number, quote, comparison, causal claim, endorsement, or photo of an event.
./install.sh content-claim-verificationname: content_claim_verification description: "Verify claims in social content before posting: trace each stat, quote, date, and product claim to its primary source, check date, population, and context, keep a claim ledger, and hold, fix, or cut posts that fail. Use when drafting or reviewing a post, thread, caption, or graphic that contains a number, quote, comparison, causal claim, endorsement, or photo of an event."
Stop a social post from carrying a claim its source does not carry. Most bad posts are not invented from nothing. A real number loses its population, a quote gains a famous name, an old photo gets a new date, a study that says "associated with" becomes a post that says "proves". This skill catches that drift before posting, with a ledger a second person can recheck.
This is a pre-post gate for social content. For a document or paper audit use a citation audit skill. For reading news someone else published use a media literacy skill. Here the draft is yours and the decision is post, fix, hold, or cut.
Read the full draft as it will appear: post text, thread replies, graphic text, image caption, alt text, link title, and pinned comment. Claims hide in graphics and alt text as often as in the main post.
A claim needs a ledger row if it has any of these:
Run the extractor to catch what your eye missed, then add quotes and product claims by hand:
python3 bin/claim_ledger.py extract draft.txt
Copy assets/claim-ledger.csv and start one row per claim: claim_id, post_id, claim_text copied word for word, claim_type. Leave verdict blank until step 4. Opinion stated as opinion needs no row. Opinion with a fact inside it does, see worked example 6 in references/worked-examples.md.
For each row, find the primary source, not the source you first saw. Rules by type are in references/source-hierarchy.md. Short version:
Use lateral reading, the move professional fact-checkers use in Stanford History Education Group research: leave the page you found, search the claim and the source separately, scan a full results page before clicking, and check what independent sources say about both. Use the SIFT order from Mike Caulfield as the rhythm: Stop, Investigate the source, Find better coverage, Trace claims, quotes, and media to the original context.
Search moves that work:
A search snippet, a screenshot, another social post, and a summary written from the source are leads. None of them is a primary source. If you cannot open the primary source, the claim cannot pass in step 4.
Record in the ledger: primary_source_title, primary_source_url, source_date, event_date if different, and locator (page, section, table, paragraph, or timestamp). No locator, no pass.
Read the primary passage and enough around it to catch a reversed condition. Compare draft to source on five points, from references/source-hierarchy.md:
Add a context_note for anything a reader would get wrong without it: preliminary data, a cherry picked window, a voluntary sample, a result that held in one subgroup only, a quote cut mid sentence where the next sentence changes the meaning.
For quotes, add three checks: the words match word for word at the locator, the attribution matches the earliest traceable source you can find, and the speaker was alive and active when the earliest use appeared. Popularizer is not originator. Origin uncertain is an honest attribution. A famous name with no solid citation is a hold.
For endorsements, add the disclosure check. Under the FTC Endorsement Guides, 16 CFR Part 255 revised in 2023, an endorsement must be honest and not misleading and cannot make a claim the marketer could not legally make, and a material connection readers would not expect must be disclosed clearly and conspicuously, meaning difficult to miss and easily understandable. In a social post that means the disclosure sits at the start, in the post itself, not on a profile page and not buried at the end of a tag block.
Assign one verdict per ledger row:
Validate the ledger before deciding:
python3 bin/claim_ledger.py ledger claim-ledger.csv
The validator rejects a PASS or FIXED row with no source URL, no source date, or no locator, and rejects verdicts outside the set above.
Post decision rule: one HOLD, CUT, or UNVERIFIABLE row stops the post as written. Either fix the draft to the FIXED wording, remove the cut claim everywhere it appears, or hold the whole post. Never post the clean claims and quietly keep the failed one in the graphic.
Recheck the final draft, not the draft you started with. Edits after verification are the top way a fixed claim drifts back. Diff the final text against fix_text for every FIXED row, confirm the disclosure is still at the start, and confirm cut claims are gone from the graphic and alt text.
Keep the ledger with the post record: post_id, date posted, and final text. If a source is later corrected or retracted, or a reader shows an error, follow the corrections standard in references/source-hierarchy.md: post a visible correction tied to the original, update the ledger verdict, and search the ledger for other posts that used the same source.
For each draft checked, deliver:
If the draft has no checkable claims, say so in one line and name what you checked: text, graphic, caption, and alt text. Do not invent a ledger for an opinion post.
publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
No ratings yet — be the first to rate it.