batch-report-generator

chrisklop's avatarfrom chrisklop

Generate GenuVerity fact-check reports from structured input (Gemini research output). Use /batch-report to process research into HTML reports. Optimized for token efficiency - expects pre-researched sources.

0stars🔀0forks📁View on GitHub🕐Updated Jan 5, 2026

When & Why to Use This Skill

The Batch Report Generator is a high-efficiency Claude skill designed to transform structured research data into professional, SEO-optimized HTML fact-check reports. It streamlines the transition from raw research to published content by automating HTML generation, source validation, and interactive data visualization using Chart.js. Optimized for token efficiency, it allows users to process multiple claims simultaneously, ensuring a consistent and rigorous standard for media verification and journalistic integrity.

Use Cases

  • Automated Journalism: Rapidly converting bulk research data from AI models like Gemini into standardized, web-ready fact-check reports.
  • Misinformation Combat: Generating high-volume verification reports with clear verdicts (False, Misleading, etc.) to address trending claims in real-time.
  • Data-Driven Reporting: Creating interactive charts and visual evidence automatically from structured JSON data to enhance reader engagement and transparency.
  • Content Pipeline Optimization: Streamlining the workflow for media platforms by automating source validation, sitemap updates, and technical SEO tasks for new reports.
namebatch-report-generator
descriptionGenerate GenuVerity fact-check reports from structured input (Gemini research output). Use /batch-report to process research into HTML reports. Optimized for token efficiency - expects pre-researched sources.
allowed-toolsRead, Write, Edit, Bash, Glob, Grep, WebFetch

Batch Report Generator

Generate fact-check reports from pre-researched input (e.g., Gemini Deep Research output).

Quick Start

/batch-report

Then paste your structured input (see format below).

Structured Input Format

Paste this JSON format with your Gemini research:

{
  "reports": [
    {
      "slug": "claim-name-2025",
      "title": "The Full Claim Title",
      "verdict": "FALSE",
      "claim": "One sentence: what was claimed",
      "claimant": "Who made the claim",
      "date": "Jan 2025",
      "category": "Health & Medical",
      "sources": [
        {
          "title": "Primary Source Name",
          "url": "https://example.com/article",
          "quote": "Key quote that supports/refutes the claim..."
        }
      ],
      "context": "2-3 sentences explaining why this verdict was reached. From Gemini research."
    }
  ]
}

Gemini Prompt Template

Copy this to Gemini for Deep Research:

Research these fact-check topics. For EACH topic, provide:

1. VERDICT: FALSE / MISLEADING / MIXED / CONTEXT NEEDED
2. CLAIM: One sentence summary of what was claimed
3. CLAIMANT: Who made the claim (person/organization)
4. DATE: When the claim was made
5. SOURCES: 10-15 primary sources (NO Wikipedia), each with:
   - Title
   - URL
   - Key quote (verbatim)
6. CONTEXT: 3 sentences explaining the verdict

TOPICS:
1. [Topic 1]
2. [Topic 2]
3. [Topic 3]
...

Format your response as JSON matching this structure:
{
  "reports": [
    {
      "slug": "topic-name-2025",
      "title": "Full Title",
      "verdict": "FALSE",
      "claim": "...",
      "claimant": "...",
      "date": "...",
      "category": "...",
      "sources": [{"title": "...", "url": "...", "quote": "..."}],
      "context": "..."
    }
  ]
}

Categories

Use one of these category values:

  • U.S. Politics & Policy
  • Health & Medical
  • AI & Deepfakes
  • Immigration & Border
  • International Affairs
  • Economic Claims
  • Conspiracy & Hoaxes
  • Platform & Tech
  • Media & Journalism

Verdicts

Verdict When to Use
FALSE Claim is demonstrably untrue
MISLEADING Contains truth but distorts context
MIXED Partially true, partially false
CONTEXT Needs additional context to evaluate

What This Skill Does

  1. Parses your structured JSON input
  2. Validates all source URLs exist (via WebFetch)
  3. Generates HTML from docs/report-template-2025.html
  4. Creates Chart.js visualization based on data
  5. Adds entry to js/reports-data.js
  6. REQUIRES MANUAL RUN: node tools/sync-chart-configs.js (see warning below)
  7. Runs ./validate-report.sh to verify
  8. Commits to feature branch

WARNING: CHART SYNC IS NOT AUTOMATIC

After generating reports, you MUST manually run:

node tools/sync-chart-configs.js

Without this, carousel thumbnails will show wrong/placeholder data. This step extracts chart data from HTML and updates reports-data.js.

CRITICAL: Chart Height Constraint

ALWAYS wrap canvas in height-constrained div. NEVER use height attribute on canvas:

<!-- ❌ WRONG - Chart expands to 20,000+ pixels -->
<canvas id="myChart" height="220"></canvas>

<!-- ✅ CORRECT - Height constrained by wrapper -->
<div style="height: 280px; position: relative;">
    <canvas id="myChart"></canvas>
</div>

CRITICAL: Float-Figure Placement (Text Wrap)

ALWAYS place float-figures BEFORE the text that should wrap around them:

<!-- ✅ CORRECT - Text wraps beside chart -->
<section>
    <h2>Section Title</h2>
    <figure class="float-figure">...chart...</figure>
    <p>This paragraph wraps beside the chart.</p>
    <p>More text continues wrapping.</p>
</section>

<!-- ❌ WRONG - Chart at end, no text to wrap -->
<section>
    <h2>Section Title</h2>
    <p>This text appears ABOVE the chart.</p>
    <figure class="float-figure">...chart...</figure>
</section>  <!-- Nothing after figure! -->

Key rules:

  1. Place figure IMMEDIATELY AFTER <h2> or BEFORE paragraphs
  2. Ensure 2-3 paragraphs of text FOLLOW the figure
  3. NEVER place a figure as the last element in a section

Token Optimization

This skill is designed for minimal token usage:

  • Expects pre-researched sources (no web search needed)
  • Uses template-based generation (no creative writing)
  • Batch processes multiple reports
  • Caches verified URLs

Output

For each report:

  • localreports/{slug}.html - The report HTML
  • Entry in js/reports-data.js with chart config
  • Updated sitemaps via node tools/generate-sitemaps.js
  • Synced chart thumbnails via node tools/sync-chart-configs.js

CRITICAL: Chart Thumbnail Sync (MANDATORY)

After creating ANY new reports, ALWAYS run:

node tools/sync-chart-configs.js

This syncs the chart configs in js/reports-data.js to match the actual charts in each HTML report. Without this step, carousel cards show wrong/blank chart previews.

Post-generation checklist:

  1. ✅ Create HTML reports in localreports/
  2. ✅ Add entries to js/reports-data.js
  3. ✅ Run: node tools/generate-sitemaps.js
  4. ✅ Run: node tools/sync-chart-configs.jsMANDATORY
  5. ✅ Run: ./validate-report.sh on each report
  6. ✅ Commit and push

Example Workflow

  1. You: Ask Gemini to research 5 topics (20 min)
  2. You: Paste Gemini's JSON output here
  3. Claude: Generates 5 HTML reports (~5 min)
  4. Claude: Commits to feature branch
  5. You: Review on Vercel preview

References

REMINDER: Option B Automation

After testing this workflow, build full automation:

  • Agent SDK batch processor script
  • Playwright MCP for source verification
  • Research cache system
  • Queue-based processing