Claude-skill-registry batch-report-generator
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.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/batch-report-generator" ~/.claude/skills/majiayu000-claude-skill-registry-batch-report-generator && rm -rf "$T"
skills/data/batch-report-generator/SKILL.mdBatch 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 & PolicyHealth & MedicalAI & DeepfakesImmigration & BorderInternational AffairsEconomic ClaimsConspiracy & HoaxesPlatform & TechMedia & Journalism
Verdicts
| Verdict | When to Use |
|---|---|
| Claim is demonstrably untrue |
| Contains truth but distorts context |
| Partially true, partially false |
| Needs additional context to evaluate |
What This Skill Does
- Parses your structured JSON input
- Validates all source URLs exist (via WebFetch)
- Generates HTML from
docs/report-template-2025.html - Creates Chart.js visualization based on data
- Adds entry to
js/reports-data.js - REQUIRES MANUAL RUN:
(see warning below)node tools/sync-chart-configs.js - Runs
to verify./validate-report.sh - Commits to feature branch
WARNING: CHART SYNC IS NOT AUTOMATIC
After generating reports, you MUST manually run:
node tools/sync-chart-configs.jsWithout 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:
- Place figure IMMEDIATELY AFTER
or BEFORE paragraphs<h2> - Ensure 2-3 paragraphs of text FOLLOW the figure
- 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:
- The report HTMLlocalreports/{slug}.html- Entry in
with chart configjs/reports-data.js - 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:
- ✅ Create HTML reports in
localreports/ - ✅ Add entries to
js/reports-data.js - ✅ Run:
node tools/generate-sitemaps.js - ✅ Run:
← MANDATORYnode tools/sync-chart-configs.js - ✅ Run:
on each report./validate-report.sh - ✅ Commit and push
Example Workflow
- You: Ask Gemini to research 5 topics (20 min)
- You: Paste Gemini's JSON output here
- Claude: Generates 5 HTML reports (~5 min)
- Claude: Commits to feature branch
- You: Review on Vercel preview
References
- REPORTS.md - Full report guidelines
- VISUAL_STANDARDS.md - Colors & charts
- report-template-2025.html - HTML template
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