🔴 The post that fact-checks itself
You get: content that verified its own claims before going live. Pairs with: the section on star drift, the citation machine, and a strong coffee.
This is the hardest recipe. It combines all four verbs in a pipeline:
- Extract — pull the draft post as structured data
- Generate — identify every verifiable claim
- Extract (parallel) — fetch live data for each claim
- Research — fill gaps where no specific URL exists
- Generate — produce FAQ JSON-LD for SEO
- Assemble — write the verification report
The script
#!/usr/bin/env bash
set -euo pipefail
POST_URL="${1:?Usage: $0 <post-url>}"
REPORT="fact-check-$(date +%Y%m%d).md"
echo "# Fact-check report: $POST_URL" > "$REPORT"
echo "_Generated $(date)_" >> "$REPORT"
echo "" >> "$REPORT"
# Step 1: Extract claims from the post
echo "## Claims found" >> "$REPORT"
CLAIMS=$(tabstack generate json "$POST_URL"
--instructions "Extract every verifiable claim — statistics, dates, quotes, version numbers. For each, note the claim text and whether there's a source URL mentioned."
--schema '{"type":"object","properties":{"claims":{"type":"array","items":{
"type":"object","properties":{
"text":{"type":"string"},
"source_url":{"type":"string"},
"verifiable":{"type":"boolean"}}}}}}')
echo "$CLAIMS" | jq -r '.claims[] | "- (.text)"' >> "$REPORT"
echo "" >> "$REPORT"
# Step 2: Verify claims that have source URLs
echo "## Verification" >> "$REPORT"
echo "$CLAIMS" | jq -r '.claims[] | select(.source_url != "" and .verifiable == true) | .source_url'
| while read -r url; do
result=$(tabstack extract json "$url"
--schema '{"type":"object","properties":{"relevant_stat":{"type":"string"}}}' 2>/dev/null || echo '{"relevant_stat":"fetch failed"}')
echo "- $url → $(echo "$result" | jq -r .relevant_stat)" >> "$REPORT"
done
# Step 3: Research for claims without sources
UNSOURCED=$(echo "$CLAIMS" | jq -r '.claims[] | select(.source_url == "" and .verifiable == true) | .text' | head -3)
if [ -n "$UNSOURCED" ]; then
echo "" >> "$REPORT"
echo "## Unsourced claims (researched)" >> "$REPORT"
echo "$UNSOURCED" | while read -r claim; do
tabstack research "Verify: $claim"
| jq -r 'select(.event=="complete") | "### (.data.metadata.query)\n(.data.report)\n"' >> "$REPORT"
done
fi
echo "✓ Report written to $REPORT" Run it
chmod +x fact-check.sh
./fact-check.sh https://zero8.dev/blog/state-of-agentic-harnesses-june-2026 What the report looks like
# Fact-check report: https://zero8.dev/blog/...
_Generated 2026-06-13_
## Claims found
- Claude Code reached 83,000 GitHub stars at launch
- The repo has since grown to 131,792 stars (+59%)
- Three of the ten tools covered were renamed after publication
## Verification
- https://github.com/anthropics/claude-code → 131,792 stars (confirmed)
- https://github.com/openai/codex → 90,457 stars (claimed: 67,700 — drift +34%)
## Unsourced claims (researched)
### Verify: LLM agent frameworks grew 40% in Q1 2026
[research report with citations...] Credits budget
This pipeline makes:
- 1
generatecall for claim extraction (~30 credits) - N
extractcalls for sourced claims (~10 credits each) - Up to 3
researchcalls for unsourced claims (~250 credits each)
Run tabstack usage before running this on a post with many claims.
Adapt it
The script is a template. Adapt the schemas to your content type, the research step to your budget, and the output format to your publishing workflow. The core insight — that you can automate the fact-checking step that usually gets skipped — is the recipe.