kai-report-creator
August 12, 2026 · View on GitHub
You have data, decisions, and deadlines — but decision makers don't have time to read everything. AI can generate reports, but they often look instantly AI-made: template headings, primary color flooding every element, 3-column KPI grids regardless of count. kai-report-creator gives you polished, async-friendly reports in one command: drop a document or URL, pick a theme, and get a single HTML file that survives first-contact reading. Downstream AI agents can also parse it — the output embeds a 3-layer machine-readable structure.
See the guide as a report → — this document was generated by kai-report-creator itself.
A skill for Claude Code and OpenClaw that turns plain text or structured outlines into polished HTML reports.
English | 简体中文
Live Demo
Click any screenshot to open the live demo:
![]() corporate-blue Warm Premium · Business |
![]() minimal Research · Academic |
![]() dark-tech Engineering · Ops |
![]() dark-board Dashboards · Architecture |
![]() data-story Annual Reports · Growth |
![]() newspaper Editorial · Industry Analysis |
![]() regular-lumen Periodic Reports · Weekly/Daily/Monthly |
![]() forest-editorial Paper-Green · Editorial |
![]() radar-board dark-board preset · Intelligence Dashboard |
Preview the theme gallery: /report --themes → opens report-themes-preview.html
Design Philosophy: Skills as Domain Harness Engineering
This section explains the principles behind report-creator — both as a user tool and as a Claude Code skill. These principles are reusable for anyone building skills.
1. Progressive Disclosure
A skill file loads entirely into the AI's context on every invocation. Size directly affects focus.
report-creator solves this with rules in the skill, assets in files:
--plan → only IR rules + component syntax; no CSS, no HTML shell
--generate → one theme CSS + one shared CSS; other theme files stay on disk
--themes → pre-built preview HTML; skill doesn't parse internals
Result: --plan never touches CSS. Single-theme generation only loads the selected theme.
This is progressive disclosure applied to AI context: reveal information at the moment it's needed, not before.
2. Capability Growth Must Reduce Context Load
When adding a new capability, the first question is not "what else can we stuff into context?" It is "can we reduce prompt/context burden on the generation path?"
report-creator should prefer three moves:
- Thin routing in
SKILL.md. Keep the skill file as a router plus contract boundary. Load only the files needed for the selected path. Do not drag long planning conversations directly into the render phase. - Structured compression over raw prose. Prefer
.report.md,BRIEF.json-style briefs, explicit contracts, and routing metadata over more prompt paragraphs. If information matters repeatedly, give it a field, a schema, or a deterministic transform. - Move quality checks off the hot path. If a new quality mechanism increases generation-time cognitive load, it belongs in guard validation, post-render review, or evals instead of the prompt chain.
This is not minimalism for its own sake. It is reliability work. Prompt bloat makes routing fuzzy, hides the real contract, and causes the model to drop constraints exactly when rendering needs precision.
3. Silicon-Carbon Collaboration Design
report-creator is designed for human-AI collaboration at both input and output ends.
Input: IR as Human-AI Contract
The .report.md Intermediate Representation is the contract between human intent and AI rendering:
--- ← Frontmatter: document identity
title: Q3 Sales Report What is this? Who made it? How should it look?
theme: corporate-blue Declares intent, not content.
---
## Section Heading ← Prose: human narrative
Plain Markdown text... Written naturally. AI renders to semantic HTML.
:::kpi ← Component blocks: structured data
- Revenue: \$2.45M ↑12% Machine-parseable. AI renders deterministically.
:::
Humans write naturally without knowing HTML. AI renders each layer with different rules — prose gets Markdown, components get templates. IR is inspectable and version-controllable.
Output: Three-Layer AI-Readable Structure
Every generated HTML embeds machine-readable structure:
Layer 1 — <script id="report-summary"> Document-level: title, abstract, all KPIs
Layer 2 — data-section data-summary Section-level: heading + one-sentence summary
Layer 3 — data-component data-raw Component-level: raw KPI/chart/table data
An AI agent reads Layer 1 for a 3-second overview, drills to Layer 2 for section-level understanding, reaches Layer 3 only for specific data.
Progressive disclosure for both species: IR reveals structure to humans; HTML reveals data to machines. The same principle applied twice — once for carbon-based readers, once for silicon-based ones.
4. Visual Rhythm as Cognitive Pacing
Reports that work follow a rhythm: prose sets context, components deliver data, prose interprets it.
The skill enforces this: never 3+ consecutive prose-only sections. Every 4–5 sections must include a visual anchor chosen for the content type — callout, timeline, diagram, KPI grid, or chart. Dense prose fatigues; data without context loses. Alternation creates flow.
This is why IR's component syntax (:::tag ... :::) is visually obvious: authors scan IR files and see data-heavy sections immediately.
5. Reports Are Asynchronous Decision Support
Slides have a presenter. Reports don't. A report must survive first contact with a busy reader who skims the opening, scans headings, glances at data, and decides in under a minute whether to continue.
This constraint drives product design:
--reviewis one-pass automatic refinement, not interactive editing--generateruns the same checklist as a silent final pass- Checklist split into L0 visual quality and L1 content quality
- Only rules AI can judge and repair reliably are included
Rule of thumb: A generated report should reduce reader effort. If a stakeholder can understand the point, evidence, and next action from a fast skim, the report works.
6. Design Quality Baseline: Against AI Slop
The enemy: instantly recognizable AI output — uniform borders, primary color flooding everything, 3-column KPI grids regardless of count, template-sounding headings.
references/design-quality.md encodes four disciplines:
90/8/2 Color Law. 90% neutral surface, 8% structural accent, 2% bullet-point hits. When --primary floods headings, KPIs, charts, callouts, TOC, and badges — it becomes noise.
10:1 Typography Tension. Largest element ≥10× smallest. Report titles should feel like anchors (2.8–4rem), not labels. Pages without hierarchy look like spreadsheet exports.
KPI Grid Rules. Default isn't always 3 columns. 4 KPIs → 2×2. Hero metric → 2fr 1fr 1fr. 7+ KPIs need dividers. Rigid 3-column grids signal AI wasn't paying attention.
Content-Tone Color Calibration. Different emotional registers deserve different palettes:
| Tone | primary_color | Feel |
|---|---|---|
| Contemplative / Research | #7C6853 warm brown | Grounded, editorial |
| Technical / Engineering | #3D5A80 navy | Precise, authoritative |
| Business / Data | #0F7B6C deep teal | Confident, forward |
| Narrative / Annual | #B45309 amber | Warm, momentum |
Pre-output check: "If you told someone 'an AI wrote this', would they believe it? If yes — find the most generic-looking part and redesign it."
7. Contract Enforcement Before Render
v1.20.0's guard validation pipeline introduces a new principle: intercept invalid IR before rendering, not repair after.
IR → Guard (validate + downgrade) → Renderer → HTML
↑
Block invalid input
Three sub-principles:
| Principle | Implementation | Meaning |
|---|---|---|
| Zero-Drift Resolution | Guard and renderer share the same resolve_report_class logic | Validation and rendering never diverge |
| Graceful Degradation | Invalid components auto-downgrade (kpi→callout, chart→table, timeline→list) | Don't fail outright; fall back to safe substitute |
| Traceability | <meta name="ir-hash"> embeds IR hash in HTML | Output is traceable to source IR |
Why it matters:
- Earlier
--reviewwas post-hoc repair; guard is pre-hoc interception - Prevents invalid IR from entering the render pipeline and producing unpredictable output
- Zero-drift ensures guard's judgment and renderer's behavior stay aligned
v1.23.0 extends this boundary to final HTML with scripts/html_quality_gate.py: rendered files must keep the standard shell controls, the declared theme's CSS fingerprint, typography/layout markers, and only real quantitative KPI values. This catches failures where IR is legal but the HTML hand-rolls a theme, drops summary/export controls, or smuggles placeholder/status text into KPI cards.
8. Eval as Quality Boundary, Not Quality Score
v1.15.0's eval workflow embodies this principle: evals define boundaries, not scores.
compression → ir_contract → async_readability → render_integrity
↓ ↓ ↓ ↓
Source→IR IR Spec Reading UX HTML Integrity
| Layer | What it checks | Where to fix |
|---|---|---|
| compression | report_class, audience, decision_goal declared | SKILL.md |
| ir_contract | timeline is real time, kpi is short value, chart schema legal | rendering-rules.md + contract_checks.py |
| async_readability | BLUF, heading stack, takeaway after data | review-checklist.md |
| render_integrity | shell IDs, report-summary JSON, no ::: leak, theme fidelity | html-shell-template.md + html_quality_gate.py |
Failure Map rule: Every real production failure → one new eval case. Not post-hoc discussion about "feels wrong", but direct pointer to the layer that needs fixing.
Rubric design: Output structured JSON (verdict + scores + findings), not fuzzy scores. Downstream agents can parse and auto-repair.
9. Contract Checks as Programmable Guardrails
contract_checks.py makes IR spec executable:
# Timeline must be real dates
DATE_PATTERNS = [YYYY-MM-DD, YYYY-MM, Q1-4 YYYY, Day N, Week N]
# KPI value must be a short real quantitative value; placeholders/status-only words fail
def is_short_kpi_value(value): ...
# Placeholder pattern recognition
PLACEHOLDER_RE = r"\[(INSERT VALUE|数据待填写)\]"
Design principles:
- Spec declared in SKILL.md, validated in contract_checks.py
- Guard calls contract_checks, zero drift
- Every component has
auto_downgrade_target: safe fallback path when invalid
Final HTML has a separate gate:
python scripts/html_quality_gate.py report.html
Install
Claude Code
Tell Claude: "Install https://github.com/kaisersong/kai-report-creator"
Or manually:
git clone https://github.com/kaisersong/kai-report-creator ~/.claude/skills/kai-report-creator
Restart Claude Code. Use as /report.
OpenClaw
# Via ClawHub (recommended)
clawhub install kai-report-creator
# Or manually
git clone https://github.com/kaisersong/kai-report-creator ~/.openclaw/skills/kai-report-creator
Release Downloads
The current release is v1.28.1. Download source bundles from GitHub Releases:
- https://github.com/kaisersong/kai-report-creator/releases/tag/v1.28.1
- https://github.com/kaisersong/kai-report-creator/archive/refs/tags/v1.28.1.zip
Usage
Commands
| Command | Description |
|---|---|
/report --from file.md | Generate from an existing document |
/report --from URL | Generate from a web page |
/report --plan "topic" | Create a .report.md outline first |
/report --generate file.report.md | Render an outline to HTML |
/report --review file.html | Refine an existing report |
/report --themes | Preview the bundled theme gallery |
/report --bundle --from file.md | Offline HTML with inlined CDN assets |
/report --theme <name> --from file.md | Use a built-in or custom theme |
/report [content] | One-step: generate from description |
Typical Workflows
One-step generation:
/report --from meeting-notes.md
/report --from https://example.com/data-page --output market-analysis.html
Two-stage workflow (complex content):
/report --plan "Q3 Sales Summary" --from q3-data.csv
# edit q3-sales-summary.report.md if needed
/report --generate q3-sales-summary.report.md
Review and refine:
/report --review market-analysis.html
Review Mode
Run --review to improve existing reports with 13 checkpoints:
/report --review market-analysis.html
Behavior:
- Load
references/review-checklist.md - Apply hard rules automatically
- Apply AI-advised rules when confidence is high
- Save refined HTML back to file
If you want a structured change summary after review, use references/review-report-template.md.
One-pass automatic refinement — not interactive approval.
--generate also runs this checklist as a silent final review before writing HTML.
This review flow is the built-in 13-checkpoint review system.
13 Checkpoints:
- KPI value length
- Badge coverage
- Summary card poster hierarchy
- Timeline content validity
- Export menu completeness
- BLUF opening (Bottom Line Up Front)
- Heading stack logic
- Anti-template section headings
- Prose-wall cleanup
- Takeaway-after-data
- Insight-over-data
- Scan-anchor coverage
- Conditional reader guidance
Eval Workflow
This repo now includes a small, repo-contained eval harness focused on async reading quality, not slide-style presenter flow.
Run it with:
python scripts/run-report-evals.py --root . --packet-dir .tmp/eval-packets
What it does:
- Runs deterministic checks for
compression,ir_contract,render_integrity, andjsonld - Emits rubric-ready JSON packets for
async_readabilityinstead of hiding quality behind vibes - Uses repo-contained cases from
evals/report-cases.csv
Key files:
evals/report-cases.csv— living case setevals/rubric.schema.json— structured grader output contractevals/failure-map.md— where to fix each layer when a case failsevals/cases/*— source + IR artifacts for each case
Captured-Run Skill Evals
scripts/run-report-evals.py checks repo-contained source/IR/HTML artifacts. It is a deterministic regression gate, not a full agent-run skill eval.
For OpenAI-style skill evals, run the captured-run harness against checked-in fixtures or recorded traces:
python scripts/run-skill-evals.py --runner fixture --format json --json-out .tmp/skill-evals/results.json
The harness reads evals/report-skill-prompts.csv, replays deterministic
fixture metrics by default, and scores each case across four categories:
- Outcome: report task completion and valid artifacts.
- Process: skill flow, reference loading, guard validation, and HTML quality gate evidence from normalized runner metrics.
- Style: template/theme/content conventions plus structured rubric grading for positive captured-run cases.
- Efficiency: shell command count, repeated failures, token budgets, and wall-clock budget.
Release verification also uses fixture mode by default, so it does not require Codex, Claude, Qoder, network access, model auth, or any live agent environment:
python scripts/verify-release.py --include-skill-evals
Positive fixture cases use checked-in tests/fixtures/skill-evals/*-style-rubric.json.
If a positive case has no rubric, the harness marks it eval_complete: false
and fails the case instead of hiding the coverage gap behind a green score.
Saved baselines live under evals/baselines/. Compare a fresh run against the
checked-in baseline before changing skill behavior:
python scripts/run-skill-evals.py --runner fixture \
--artifact-dir .tmp/check-skill-evals-fixture-artifacts \
--format json \
--json-out .tmp/check-skill-evals-fixture.json
python scripts/compare-skill-eval-baseline.py \
--old evals/baselines/2026-05-17-skill-evals-fixture.json \
--new .tmp/check-skill-evals-fixture.json \
--format text
evals/baselines/2026-05-17-baseline-summary.md records the saved scores:
the deterministic fixture baseline passes 6/6 with incomplete: 0,
average_score: 100.0, and Style 25.0, while the hardened Codex live
baseline is archival evidence of one manual runner sample. It is not part of
default release verification. The comparator checks pass/fail state,
eval_complete, total score, and each category score.
Manual live sampling is still possible, but it must be explicit because it depends on the local runner environment:
python scripts/run-skill-evals.py --runner codex --run-live --format json --json-out .tmp/skill-evals/codex-live.json
For complex reports, keep these IR frontmatter fields so evals can measure compression quality directly: report_class, audience, decision_goal, must_include, must_avoid.
Maintainers can run the full release verification chain from one entry point:
python scripts/verify-release.py --root .
For a single generated report, run the final HTML gate directly:
python scripts/html_quality_gate.py report.html
Features
Core
- Zero dependencies — single
.htmlfile, works offline with--bundle - 9 built-in themes — corporate-blue, minimal, dark-tech, dark-board, data-story, newspaper, regular-lumen, fangsong, forest-editorial
- 9 component types — KPIs, charts (ECharts), tables, timelines, diagrams, code blocks, callouts, images, lists
- Report Review System — 13-checkpoint automatic refinement
- AI-readable output — 3-layer machine-readable structure for downstream agents
- Animated render mode —
animations: scrollytelling(dark GSAP scroll narrative) oranimations: iridescence(light WebGL-shader hero, zero CDN); single-file animated web page with keyboard paging and fullscreen play mode, validated by the animated profile ofhtml_quality_gate.py - Full-screen cover —
forest-editorialalways renders one; any other theme opts in withcover: hero. Eyebrow, display headline with one[[accent phrase]], lead, provenance chips and a three-card conclusion strip, validated by the cover assertions inhtml_quality_gate.py
Interaction
- Summary card overlay —
⊞ Summarybutton opens a poster-style title card with abstract, KPIs, and section summaries - Built-in export — Print/PDF, PNG (Desktop), PNG (Mobile) via ↓ Export button
- Mobile responsive — adapts to any screen size
- Bilingual — full zh/en support with auto-detection
Output
- Custom themes —
themes/<name>/theme.css+--theme <name> - Custom templates —
template: ./my-brand-template.htmlwith placeholders - Theme overrides —
theme_overrides.primary_colorin frontmatter - Offline bundles —
--bundleinlines all CDN assets
Themes
| Theme | Vibe | Best For |
|---|---|---|
| corporate-blue | Warm premium | Business reports, executive summaries |
| minimal | Clean, academic | Research papers, analysis |
| dark-tech | Engineering feel | Ops reports, technical docs |
| dark-board | Dashboard style | Architecture, metrics dashboards |
| data-story | Narrative-driven | Annual reports, growth stories |
| newspaper | Editorial | Industry analysis, newsletters |
| regular-lumen | Poster-style, warm-toned | Periodic work reports (日报/周报/月报 · 本周期复盘 + 下周期规划) · Kami-style reading experience |
| fangsong | Traditional Chinese, warm brown | Formal reports with FangSong typography (标题衬线仿宋 + 正文非衬线仿宋) |
| forest-editorial | Paper-green, editorial | Light reports that still want one dark anchor block (深林绿锚区 + 金色 eyebrow + 大圆角) · explicit --theme only |
Presets, not themes: radar-board in the demo grid above is dark-board plus one override — theme_overrides.primary_color: "#5ee1b4". A frozen-fixture comparison showed the accent colour is the only real difference, so it stays a preset instead of a tenth theme. See themes/README.md for what theme_overrides can and cannot reach.
corporate-blue
Warm business theme with subtle gradients. Default for executive-facing reports. Uses restrained primary color on key elements only — KPI values, section links, and one accent block per report.
Why it works: Primary color appears on ≤3 element types, creating clear visual hierarchy without the "AI flooded everything with blue" look.
Creating Custom Themes
- Create
themes/your-theme/directory - Write
theme.csswith CSS custom properties:
:root {
--primary: #B45309;
--bg: #FAFAF9;
--text: #1C1917;
--font-heading: "Merriweather", serif;
}
- Run:
/report --theme your-theme --from file.md
Example theme bundled: themes/warm-editorial/
Report Format (IR)
For complex reports, use --plan to generate a .report.md intermediate file.
Frontmatter:
---
title: Q3 Sales Report
theme: corporate-blue
author: Sales Team
date: 2024-10-08
lang: en
toc: true
abstract: "Q3 revenue grew 12% YoY with record new customer acquisition."
---
Component blocks:
:::kpi
items:
- label: Revenue
value: \$2.45M
delta: ↑12%
- label: New Clients
value: 183
delta: ↑8%
:::
:::chart type=line title="Monthly Revenue"
labels: [Jul, Aug, Sep]
datasets:
- label: Actual
data: [780000, 820000, 850000]
:::
:::timeline
- 2024-10-15: Q4 targets released
- 2024-10-31: Product launch
:::
:::callout type=tip
Key insight goes here.
:::
Badges remain optional HTML chips for scanability; they are not standalone IR tags. Timelines are strict chronological components and should use explicit time tokens such as 2024-10-15 or Q4 2024.
For AI Agents
Other agents can call report-creator programmatically:
# From document
/report --from ./analysis.md --output summary.html
# From URL
/report --from https://example.com/report-page --theme data-story
# Two-step with review
/report --plan "Market Analysis" --from ./raw-data.md
/report --generate market-analysis.report.md
/report --review report.html
Extracting structured data:
from bs4 import BeautifulSoup
import json
soup = BeautifulSoup(open("report.html"), "html.parser")
summary = json.loads(soup.find("script", {"id": "report-summary"}).string)
print(summary["title"], summary["kpis"])
Export
Every report has a built-in ↓ Export button (bottom-right):
| Option | How it works |
|---|---|
| Print / PDF | Opens browser print dialog → Save as PDF |
| PNG (Desktop) | Full page at 2× resolution |
| PNG (Mobile) | Report body at 1170px wide (≈3× iPhone) |
Tip: Uncheck "Headers and footers" in print dialog for clean PDFs.
Use Case: Daily Work Report → Telegram
Generate a report of today's work in dark-board style, export as IM image, send via Telegram.
OpenClaw will:
- Summarize tasks, decisions, next steps
- Render to
dark-boardHTML with KPIs and timeline - Screenshot as 800px JPEG (animations auto-disabled for headless capture)
- Send directly to your Telegram channel
Examples
| File | Description |
|---|---|
| examples/en/business-report.html | Q3 Sales Report (EN) |
| examples/en/business-report-reviewed-demo.html | Reviewed demo with stronger BLUF (EN) |
| examples/zh/business-report.html | Q3 销售业绩报告(中文) |
| examples/zh/tesla-q2-2026.report.md | Tesla Q2 2026 IR source (animated mode) |
| examples/zh/tesla-q2-2026.html | Tesla Q2 2026 — iridescence animated demo (WebGL hero, zero CDN) |
| examples/zh/tesla-q2-2026-scrollytelling.html | Tesla Q2 2026 — scrollytelling animated demo (dark, GSAP) |
| examples/review-reports/ | Structured review report examples |
Requirements
No dependencies. Works in any modern browser.
For offline bundles with --bundle: internet connection needed once to inline CDN assets.
Compatibility
| Platform | Version | Install path |
|---|---|---|
| Claude Code | any | ~/.claude/skills/kai-report-creator/ |
| OpenClaw | ≥ 0.9 | ~/.openclaw/skills/kai-report-creator/ |
Version History
v1.28.1 — forest-editorial timeline padding: this theme is the only one that boxes .timeline-content (surface fill, border, 17px radius, soft shadow), but shared.css gives that element colour and line-height only, so the theme was styling a capsule with no interior padding — text sat flush against the wall and the corner curve clipped it. Adds padding: .75rem 1.1rem, the horizontal value chosen to clear the 17px radius, matching the theme's other card surfaces. Adds a regression test asserting that a boxed timeline capsule's horizontal padding is never smaller than its corner radius — the class of bug a marker check cannot see, since every declaration involved was present and correct.
v1.28.0 — Full-screen report cover: a theme-agnostic #report-cover renders as a sibling before .report-wrapper, so it is full-bleed with no 100vw arithmetic and no scrollbar jitter; forest-editorial always renders one and has no off switch, every other theme opts in with cover: hero. The IR marks the accent phrase with [[…]] in title and carries the rest in a :::cover fence (eyebrow, chips ≤ 4, cards 0 or 3 with at most one accent, watermark); the renderer normalises over-supply and the gate verifies the rendered result. The cover holds the document's only <h1> and only #card-mode-btn, with abstract becoming the lead and author/date the meta line — the in-wrapper title block is suppressed, so forest-editorial's anchor block now only styles custom template: shells and the frozen skin fixture. Colours are two palettes, not nine: a shared neutral-dark default plus the forest-editorial gradient. Mobile PNG and IM long-image capture move from .report-wrapper to .main-with-toc, without which long images would have silently shipped with no cover. Adds cover assertions to the gate (sibling order, single <h1>, card and chip bounds, aria-hidden watermark, unconsumed [[ markers, conflict with the animated track), tests/test_cover_contract.py and tests/test_cover_render.py with contrast measured in a browser across all nine themes, and regenerates both forest-editorial preview decks — the first shipped decks to pass the gate with a cover.
v1.27.0 — Theme routing for retrospectives, summaries and proposals: forest-editorial stops being explicit-selection only and gains a routing row for 复盘/回顾, the summary compounds (工作总结, 项目总结, 阶段总结, 年终总结, 总结报告), 方案/提案/建议书, plus retrospective/post-mortem/proposal and the style words 米绿/纸感/林绿/森林; data-story narrows to the data-shaped narrative it was meant to be (年度/故事/增长) with the retrospective keywords moved out; the editorial keyword moves from minimal to forest-editorial, which resolves a straight contradiction — theme-routing.md said the word selects forest-editorial while context_isolation.py routed it to minimal. The row sits below the sharper signals on purpose, so 7 月月报复盘 stays regular-lumen, 季度业绩总结报告 stays corporate-blue, and 支付网关技术方案 stays dark-tech. Summary keywords are compounds rather than a bare 总结: keyword matching runs over the whole IR, so a bare 总结 would be claimed by every report that merely has a 总结 section. Adds tests/test_theme_routing.py with 18 assertions — the keyword table had no test coverage at all, and its row order is the contract.
v1.26.1 — forest-editorial anchor-block fix: the theme's deep forest-green header block was scoped to .report-wrapper > h1:first-of-type, but the standard shell wraps h1 in .title-row to seat the summary-card button, so every generated forest-editorial report rendered a plain title with no anchor and no gold eyebrow — only the older hand-built preview decks still looked right; the anchor now matches both structures and the summary-card button switches to a light outline when it sits on the dark anchor. Both forest-editorial preview decks get the shell they were missing: the ⊞ Summary card overlay, a real export-print$ \text{binding} \text{with} \text{prepared} \text{print} \text{mode} \text{so} \text{the} \text{paper}-\text{green} \text{background} \text{survives} \text{PDF} \text{export}, \text{screenshots} \text{re}-\text{shot} \text{at} 1280 \times 800, \text{and} $data-version / JSON-LD rendererVersion brought into agreement. Adds tests/test_forest_editorial_anchor.py, four computed-style regression tests — the gate's fingerprint markers only prove declarations are present, not that they still match the shipped DOM.
v1.26.0 — Theme preview and doc-sync release: ship the templates/{en,zh}/forest-editorial.html and templates/{en,zh}/radar-board.html preview decks with 1280×800 screenshots and add both to the README demo grid; document radar-board in the Themes section as a dark-board preset (theme_overrides.primary_color: "#5ee1b4") rather than a tenth built-in theme, matching the frozen-fixture finding in themes/README.md; fix the SKILL_HEAD.md drift left by v1.25.0, where the zh skill description and highlight list still claimed 8 themes and never mentioned animated render mode; give the zh radar-board deck the same data-template / data-version / data-theme markers its en sibling already carried.
v1.25.0 — Animated render mode and forest-editorial theme: migrate the scrollytelling and iridescence recipes from lingee-gen-ppt into references/animated-shell/ with animations: scrollytelling|iridescence routing; rebuild the quality gate's animated profile so it verifies real elements instead of substrings (HTMLParser-based mode detection and chrome IDs, an exact (src, integrity) allow-list for pinned CDNs, per-KPI summary checks, data-theme == data-animation, colour-agnostic WebGL fallback); strip comments before the standard-track id checks too; add forest-editorial as the 9th built-in theme with its fingerprint; add a frozen theme-skinning fixture (tests/fixtures/skin_fixture.py) so themes can be compared without AI rendering drift; add 20 playwright behaviour tests for animated paging and play mode; document that the gate catches generator omissions, not hand-crafted parsing ambiguity, and never judges whether a number is truthful.
v1.24.0 — JSON-LD structured metadata release: every rendered HTML now embeds <script type="application/ld+json"> with schema.org Report metadata (name, inLanguage, creator, theme, metadataVersion, irHash); add references/output-metadata.md field contract; add quality gate JSON-LD validation (position, escaping, required fields, hash parity, propertyID allow-list); add jsonld eval dimension; update canonical templates with JSON-LD; 34 new JSON-LD unit tests; normalize IR hash computation for cross-repo parity.
v1.23.3 — No-agent eval gate release: make release verification use fixture skill evals by default, document that skill evals do not require Codex/Claude/Qoder/model auth/network access, and reject non-fixture runners unless a recorded trace or explicit live flag is provided.
v1.23.2 — Complete fixture rubric release: add checked-in positive-case style rubrics, require eval_complete for green captured-run results, compare completeness regressions, and refresh the deterministic fixture baseline to 6/6 passing at 100.0 average with Style 25.0.
v1.23.1 — Captured-run skill eval release: add OpenAI-style skill eval prompts, fixture and Codex trace runners, normalized timeout handling, baseline comparison, saved fixture/live baselines, release-verification integration, and README guidance for comparing future skill changes against the saved scores.
v1.23.0 — Final HTML quality gate release: add scripts/html_quality_gate.py to validate rendered shell IDs, theme CSS fidelity, regular-lumen/fangsong typography and layout markers, and KPI values; require every KPI card to use a real quantitative value; remove forced placeholder KPIs from periodic reports; fix dark-board status KPI examples; and add regression coverage for the failure modes.
v1.22.0 — Reference split and validator profile release: split oversized shell and rendering contracts into route-specific child references, add a reference index and validator-facing usage boundary artifacts, add a generated-cache cleanup gate to release verification, and document golden eval cases for external validators.
v1.21.2 — Packaging cleanup: remove the tracked docs/ directory from GitHub and ClawHub packages, ignore the local docs symlink, and keep project documentation in /Users/song/projects/mydocs/report-creator.
v1.21.1 — Skill prompt budget release: compress SKILL.md into a thin routing contract under 320 lines, move shell metadata and duplicate-date details into references, add a size-budget regression test, and include that test in the fast verification path.
v1.21.0 — Late-context isolation and release hardening: require --generate to extract exactly one IR block from context, add context isolation helpers plus late-context eval runner, expand release verification and fast-test coverage, normalize footer/watermark shell metadata, and tighten bilingual doc-sync guardrails.
v1.20.1 — Design philosophy expansion: added §6 (Contract Enforcement Before Render), §7 (Eval as Quality Boundary), §8 (Contract Checks as Programmable Guardrails) documenting the guard pipeline and eval workflow principles.
v1.20.0 — Guard validation pipeline: Python guard (scripts/guard_validate.py) runs before HTML rendering with zero-drift report_class resolution, auto-downgrade invalid blocks (kpi→callout, chart→table, timeline→list, diagram→callout), IR hash embedding in <meta name="ir-hash"> for traceability, and guard integration tests.
v1.18.0 — Theme routing fixed for work reports: priority-ordered keyword matching now correctly routes weekly/daily/monthly reports to regular-lumen (first priority) and generic work progress reports to corporate-blue (fallback), instead of misrouting to dark-tech/dark-board due to overlapping keywords like "项目/进展/状态".
v1.17.1 — Resolve ClawHub version conflict (merge ClawHub v1.16.1 updates).
v1.17.0 — Merge ClawHub v1.16.1 updates + add watermark feature.
v1.16.0 — Minimal Kami borrowing, fully landed: add hard anti-patterns.md and diagram-decision-rules.md, introduce silent spec-loading-matrix.md plus optional archetype routing hints, add maintainer-side scripts/verify-release.py, and raise the Windows release suite to 134 passing tests.
v1.15.0 — IR contract hardening and eval foundation: split failures into invalid_syntax / invalid_semantics / contract_conflict, formalize kpi / chart / timeline / diagram schemas, demote badge to optional enhancement, add repo-contained eval cases plus run-report-evals.py, fix install paths to kai-report-creator, and bring the Windows release suite to 125 passing tests.
v1.14.2 — Export menu completeness enforced in the standard generate flow: require print/desktop/mobile/IM export entries plus JS bindings during pre-write shell validation and silent final review; add shell contract coverage so reports no longer regress to partial export menus.
v1.14.1 — Print/PDF export fix: preserve report background and force animated KPI/data blocks visible during print export; add print export regression coverage.
v1.14.0 — ECharts standard: unified all charts on ECharts (was Chart.js), added bar/line/radar/pie ECharts templates, grid bottom rule for rotated labels, line data integrity rule, 14 new chart rendering contract tests.
v1.13.0 — L2 HTML shell structure validation: 10 mandatory elements check in SKILL.md pre-write, design-quality.md §8, 30 new HTML shell contract tests (BUG-001 fix).
v1.9.0 — Report Review System: --review with 13 checkpoints; silent final review in --generate; L0/L1 quality layering.
v1.8.3 — KPI overflow fix: .kpi-suffix for long units; rendering rules updated.
v1.8.2 — Restrained color system: shared badges default to neutral; data-report-mode="comparison" for entity colors.
v1.8.1 — Export background fix: resolve --bg before fallback.
v1.8.0 — Custom themes: --theme <name> loads themes/<name>/.
v1.6.0 — Sankey chart: :::chart type=sankey for flow diagrams.
v1.5.0 — Design Quality Baseline: 90/8/2 color law, KPI grid rules, content-tone calibration.
v1.4.0 — Summary card overlay with poster entry card behavior and KPI/section summaries.
v1.3.0 — Zero-dependency animations: staggered KPI bounce, timeline slide-in.
v1.0.0 — Initial release with 6 themes and 9 component types.








