| name | claim-check |
| description | Lint a finished marketing draft against what the product actually does, before it is published — catching invented evidence, unsourced numbers, fabricated people, category creep, credential drift, and links pointing at pages the copy contradicts. Use when the user says 'check this draft,' 'is this safe to post,' 'fact-check this copy,' 'review before publishing,' 'did we make that up,' 'can we say this,' 'claim check,' 'pre-publish review,' or has a post, script, caption or landing page ready to go. Also use as the last step of tiktok-script, instagram-post, youtube-shorts and geo-answer-page. Self-contained: it builds the claim ledger from the codebase itself, and reuses `.agents/brand-context.md` or `.agents/product-marketing.md` only if one already exists. |
| metadata | {"version":"1.1.0"} |
Claim Check
The last gate before a draft becomes public. It is a lint, not a critique: it does not judge whether the copy is good, only whether every assertion in it survives contact with the product and with a hostile reader.
Run it on the final text, in the form it will actually be posted — caption, on-screen text, voiceover, alt text, description, pinned comment, bio line, and the destination page all count as published surface.
Step 1 — Build the claim ledger
You need one thing before linting: a list of what is actually true, each row tied to a source a stranger could check. If .agents/brand-context.md or .agents/product-marketing.md already exists, read it and use it. If not, build the ledger now — it takes ten minutes and it is the whole basis of the check.
Do not ask the user what the product does. Read it.
| Read | To establish |
|---|
| The core API route or handler | What one unit of work actually returns — exact fields, caps, limits |
| Any prompt or model config | What the system claims to be, and what persona it adopts |
| Billing / limits / entitlement module | Real plan limits, and whether "unlimited" is enforced or safeguarded |
| i18n dictionaries or copy modules | The user-visible strings that make claims |
Public llms.txt, robots.txt, sitemap, JSON-LD | What machines are told, and whether it matches the code |
| Landing / about / pricing pages | What humans are told, and whether it matches the code |
Write it as a table where every row cites a file and line:
| Claim used in copy | Source | State |
|---|---|---|
| Result is a 0–100 score with at most 3 observations | `lib/analysis.ts:110-120` | verified |
| Free tier is 5 per calendar month (UTC) | `lib/billing.ts:44-55` | verified |
| "Unlimited" on the paid plan | `dictionaries.ts:226` vs `lib/limits.ts:52-63` | **CONTRADICTED** — a spend ladder clamps it |
Three states only: verified, unverifiable (no source found — treat as unusable), contradicted (the code says otherwise — a blocker, not a nuance).
A claim is anything a reader could be wrong about because of you. Numbers, capabilities, comparisons, limits, credentials, who "we" are, how many of you there are, what a user experienced.
Marketing copy drifts from the product in one direction: outward. The pitch is written when the roadmap is the product; the roadmap slips and the pitch does not. That drift stays invisible until someone quotes your own site back at you in public — and the cost is not embarrassment, it is that the channel closes.
Prohibited language
Alongside the ledger, keep a short list of phrases banned outright, each with its reason. Reasons matter — a rule without one gets argued away at 11pm.
| Category | Ban | Because |
|---|
| Manufactured provenance | "we train our model", "we label X every day" | If you call a third-party model, you do neither |
| Unearned precision | any accuracy or efficacy percentage | You have not measured it under conditions you can name |
| Category creep | verbs the product does not perform ("translates", "diagnoses") | The category you claim sets the standard you are judged against |
| Fabricated people | invented users, pets, testimonials, colleagues, support inboxes | The one lie that ends a channel permanently |
| Regulated authority | clinical, legal, or financial verdicts | Needs a named qualified reviewer or it does not ship |
| Bait | "comment below", "tag a friend", "which one is you" | Suppressed on most platforms and it cheapens the account |
Save the ledger to .agents/brand-context.md so the next run does not rebuild it. Record the commit it was verified against — a ledger with no date is a ledger you cannot trust in three weeks.
Step 2 — The eight passes
Work through all eight. Report findings; do not silently rewrite unless the user asked you to fix as well as find.
Pass 1 — Every number
Extract every numeral, quantity, duration, price, count, percentage, and ranking claim. For each, name the source. A source is a file and line, a dated external citation, or a measurement someone actually took and recorded.
Three outcomes: sourced · unsourced · contradicted.
Unsourced is not "probably fine". The characteristic failure is a number that feels like it came from somewhere — "roughly one call in ten", "most users", "about half the time" — where nobody ever measured. Rewrite to what is known, or cut it.
Pass 2 — Invented evidence
Scan for evidence the copy asserts but the world has not produced. This is the highest-frequency failure and it clusters, perversely, in posts about honesty.
Hunt specifically for:
| Pattern | Ask |
|---|
| "it took an outage to notice" | Was there an outage? Is it in the incident record or git history? |
| "the question people ask us most" | Is there an inbox? Are there users? |
| "we've never removed a critical post" | Has the surface existed long enough to have a record? |
| "customers tell us" / "users say" | Which customers, and do they exist yet? |
| Any anecdote with a specific detail | Did it happen, to whom, on what date? |
Pre-launch, the true form of most of these is a commitment ("we don't intend to…") rather than a record ("we never have…"). The rewrite is usually one word.
Pass 3 — Fabricated people
Does the copy invent anyone?
- Users, customers, testimonials — the terminal offence. Never.
- Pets, families, households — "my cat", "our dog" from a brand account that owns no animal.
- Colleagues — "one of us wrote that line" from a solo founder. Manufacturing a team to diffuse blame is still manufacturing a team.
- Support functions — an inbox, a moderation team, an on-call rotation that does not exist.
Then check headcount consistency across the whole campaign, not just this draft. If Instagram says "the team" and Facebook says "I", one of them is lying and a reader who follows both will notice. Pick the true number; enforce it everywhere.
Pass 4 — Category creep
Does the copy claim a verb the product does not perform, or a category whose standards it cannot meet?
The test: what would a reader reasonably expect after reading this, and does the product do that? "Translates" implies a mapping from signal to meaning. "Diagnoses" implies clinical validity. "Detects" implies a measured detection rate. Each imported word imports the standard it is judged against.
Watch for creep by proximity, too — a caption that stays honest sitting next to on-screen text that does not, or an accurate description under a title that overclaims.
Pass 5 — Credential and persona drift
Read every first-person phrase as a stranger in the target community would.
| Written | Reads as |
|---|
| "I do this professionally" | a credential in the field being discussed |
| "I work with animals every day" | veterinary or behavioural training |
| "I have a dog in this fight" | dog ownership, in a dog subreddit |
| "in my experience with hundreds of cases" | a practitioner |
Idiom is not a defence — the reader parses the literal claim. Rewrite to the true and narrower thing: "I build a tool that does X" is nearly always both truer and more interesting.
Pass 6 — Regulated and health-adjacent claims
Flag anything that interprets a symptom, sets a threshold, names a condition, or tells someone what to do about their health, their animal's health, their money, or their legal position.
Each such line needs a named qualified reviewer, recorded, before publishing. "It seems obviously true" is not review. Where no reviewer exists, the copy has two honest options: describe what is observable and stop, or state the boundary and defer.
Check the destination too. A threshold sentence sitting on the linked page is one click from the post and is quotable as yours.
Pass 7 — The destination page
Open the URL the copy points at and read it. Then check it against the product-truth debt list.
The failure mode: an impeccable post linking to a page that contradicts it. The post is judged by the page. If a CONTRADICTED claim is live at the destination, the draft is blocked — not by the copy, by the site — and the fix is a deploy, not an edit.
Also verify the link resolves, carries the right attribution parameters (or deliberately carries none), and is the canonical URL rather than a redirect chain.
Pass 8 — Platform-native compliance
Against the target channel's rules and this pack's channel skill:
- Engagement bait — "comment below", "tag a friend", "which one are you". Suppressed by most ranking systems and it cheapens the account.
- Affiliation disclosure — is commercial interest stated where the platform or the community requires it, in the position it requires?
- AI-generation disclosure — was this drafted or materially shaped by a model, and does the destination require that to be disclosed? Reddit's policy prohibits AI-generated content "that presents itself as human-generated" and asks for a tag; some communities require human authorship outright. This is a separate obligation from affiliation — satisfying one does not satisfy the other — and it applies to text, not only to imagery.
- Rights — is every asset owned, licensed, or consented for this specific surface? Consent for a community showcase is not consent for an ad.
- Generated media — is AI-generated imagery labelled, and is it being presented as illustration rather than as evidence? A generated photograph used as a real example is a fabrication regardless of the caption.
Output
## Claim check — <draft id / file>
**Verdict:** SHIP · SHIP-BLOCKED · REWRITE · HOLD
| # | Pass | Line | Finding | Severity | Fix |
|---|------|------|---------|:--------:|-----|
**Blockers** (must clear before publish)
**Rewrites** (copy changes, no external dependency)
**Notes** (accepted risks, recorded deliberately)
Severity has four levels and they route differently:
- BLOCK — fabrication, unreviewed regulated claim, or contradicted destination. Does not publish.
- REWRITE — unsourced or overclaiming copy that a rewrite fixes without anyone else's involvement.
- CHECK — plausible but unverified; someone must confirm before it ships.
- NOTE — a deliberate, recorded risk.
SHIP-BLOCKED is a distinct and common verdict: the copy is finished and correct, and something outside the copy — a live page, a missing reviewer, an unbuilt account — stops it. Say so precisely, because that is a different person's task.
Failure modes of this check itself
- Passing a draft because it sounds humble. Modest tone is not evidence. Honesty posts fail this check more often than promotional ones.
- Checking the caption only. On-screen text, voiceover, alt text, and the pinned comment are all published copy.
- Accepting a source that does not say what it is cited for. Open it.
- Treating an old verification as current. Product truth has a date. If the ledger was verified against a commit from three weeks ago and the repo has moved, re-verify the rows this draft depends on.
Related skills
- tiktok-script, instagram-post, youtube-shorts, geo-answer-page — run this on their output before it ships.
- copy-editing (upstream) — for whether the copy is good, once it is true.
- product-marketing (upstream) — positioning and ICP, if you want the fuller context document.