🔴 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:

  1. Extract — pull the draft post as structured data
  2. Generate — identify every verifiable claim
  3. Extract (parallel) — fetch live data for each claim
  4. Research — fill gaps where no specific URL exists
  5. Generate — produce FAQ JSON-LD for SEO
  6. 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 generate call for claim extraction (~30 credits)
  • N extract calls for sourced claims (~10 credits each)
  • Up to 3 research calls 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.