bullshit-detector
Fact-check and hype-audit content. Extracts the discrete claims from a video, article, tweet, or PDF, verifies each against…
Count how many independent origins are behind news coverage of a claim, instead of counting URLs. Queries GDELT for matching articles, collapses reprints and wire copy into single origins, and flags publication bursts that indicate syndication. Use when a claim appears to be
$ npx -y skills add SerhiiKorniienko/bullshit-detector --skill coverage-check --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/coverage-checkContext preview
The summary Claude sees to decide when to auto-load this skill.
Count how many independent origins are behind news coverage of a claim, instead of counting URLs. Queries GDELT for matching articles, collapses reprints and wire copy into single origins, and flags publication bursts that indicate syndication. Use when a claim appears to be
name: coverage-check description: Count how many independent origins are behind news coverage of a claim, instead of counting URLs. Queries GDELT for matching articles, collapses reprints and wire copy into single origins, and flags publication bursts that indicate syndication. Use when a claim appears to be confirmed by many outlets and you need to know whether that's many sources or one source many times.
Ten URLs are not ten sources. This turns "lots of outlets reported it" into a number you can defend.
During claim verification, when a claim looks *corroborated by volume* — a pile of search results all saying the same thing. That pattern has two very different causes:
Search results look identical in both cases. This tells them apart.
uv run scripts/coverage.py "<query>" [--timespan 3m] [--max 250] [--sort dateasc] [--timeout 120] [--json]
**It is slow. This is normal.** GDELT takes ~15s for a trivial one-day query and considerably longer for a 3-month window at 250 records. The script prints progress to stderr and how long the call took, so you can tell "working" from "hung" — if you see the querying line, wait. Narrowing `--timespan` is the speed lever; raise `--timeout` before assuming it's broken.
The query accepts GDELT operators: `"exact phrase"`, `(a OR b)`, `-exclude`, `domain:example.com`, `sourcelang:english`. Quote the distinctive phrasing of the claim — a verbatim phrase is what catches reprints.
# Is this "40 outlets confirmed it" or one wire story? uv run scripts/coverage.py '"quantum breakthrough" AND university' # Narrow to the week the claim surfaced uv run scripts/coverage.py '"record quarterly revenue" domain:reuters.com' --timespan 7d
The first line is the verdict the detector needs. The rest supports it.
estimate. Outlets ≫ clusters means syndication.
whole cluster as one source.
distributor (Reuters, AP, PR Newswire…). The strongest mechanical one-origin signal available at headline level; bodies would catch more, but GDELT returns none.
trailing slash. Collapsed before anything else is counted, so every number below it is already deduplicated.
over weeks is more likely independent.
Feed the result into the report's evidence column as an origin count: *"6 results, 1 origin (all reprints of the company's press release)"* is worth more than six links.
this returns nothing, and **nothing does not mean unreported**. The script says so in its output; don't let the agent quietly read empty as disconfirming.
token overlap for the same facts in a different order. Grouping is transitive — three outlets on one wire story stay together even when the two extremes score below the bar individually. Verbatim reprints, rewritten wire copy and reordered headlines all collapse correctly.
What it still won't catch: two newsrooms that independently reached the same finding and described it in genuinely different words. Those show as separate clusters, which is the safe direction to be wrong in — it *under*-reports syndication rather than inventing it.
Thresholds were tuned against real GDELT output, not guessed. If you see false merges, raise `TITLE_MATCH`/`TOKEN_MATCH` in the script; if wire copy slips through as distinct, lower them.
*widely reported*, not *true*. Verdicts still need the source hierarchy in the detector's [RUBRIC.md](../../analysis/bullshit-detector/RUBRIC.md).
lower bound, and the honest fix is a narrower `--timespan`, not a bigger number.
requests to one every 5 seconds"* well below that rate whenever its public API is busy — independent of IP, User-Agent, and query size. Measured behaviour: identical calls succeed and fail minutes apart. The script retries with growing backoff and then **exits 3**.
**Exit 3 means "unmeasured", not "no coverage".** Never let a failed check weaken or strengthen a verdict, and never record it as though the search came back empty. If the tool can't measure, the report says the origin count is unknown and falls back to the eyeball tells in [RUBRIC.md](../../analysis/bullshit-detector/RUBRIC.md). Retry in a few minutes, or skip it.
| Exit | Meaning | |---|---| | 0 | measurement succeeded (including a legitimate zero-result window) | | 1 | bad input or unreachable host | | 3 | GDELT throttled — no measurement, claim is unmeasured |
It counts and groups coverage. It does not fetch article text — that's [fetch-content](../fetch-content/SKILL.md) — and it does not judge anything. Analysis skills read its output; they never call it to decide a verdict on their own.
Read a real report → — 60 claims from a 2.7M-view "the AI bubble is popping" video, 44 of them individually searched, every verdict linked. Agent skills that fact-check the internet.
Fact-check and hype-audit content. Extracts the discrete claims from a video, article, tweet, or PDF, verifies each against…
Explain content or any concept inside it at the depth the user needs — ELI5, practitioner level, or expert deep-dive — with a…
Produce a structured summary of a video, article, tweet thread, or PDF — TLDR, key points with timestamps/locations, notable…
Fetch and normalize any content source into clean text with metadata — YouTube video transcripts, TikTok captions, web articles,…
Render a finished BS report as a self-contained HTML page — score hero, filterable claims, readable on a phone, prints to a clean…
Turn a BS report (or any analysis result) into ready-to-paste posts for X/Twitter, LinkedIn, Facebook, Reddit, Hacker News, or a…