generate-report
Skill11 starsChanged 3 months agoApache-2.0View on GitHub
Generate a styled HTML report from experiment results following the house design system. Usage: /generate-report --results <path> --out <folder> [additional instructions]
- Installs packages
10 other projects use a version of this.
Adopted by
Most recently taken up by
- Cellular-Semantics/claude-skillstheir own version, first seen Oct 13, 2026
- MohamedEssam0-0/claude-skillstheir own version, first seen Oct 11, 2026
- 45ck/open-genome-agenttheir own version, first seen Apr 8, 2026
- maxwell2732/my-submission-formatting-agenttheir own version, first seen Mar 15, 2026
- aiagentwithdhruv/skillstheir own version, first seen Mar 2, 2026
- jackhendon/ecom-feedback-intelligencetheir own version, first seen Feb 28, 2026
Used with
Projects with it also use add-webhook, casualize-names and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
nickjwellsSkilladd-webhook
Add new Modal webhooks for event-driven execution. Use when user asks to create a webhook, add an endpoint, or set up event triggers.
Also in 3 projects that use this
nickjwellsSkillcasualize-names
Convert formal names to casual versions for cold email personalization - first names, company names, and city names. Use when user asks to casualize names, make names friendly, or prepare lead data for emails.
Also in 3 projects that use this
- +10 more from nickjwells
Other versions10 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 10
- maxwell2732/my-submission-formatting-agent★ 106same name
- nickjwells/skills-workspace★ 28same name
- aiagentwithdhruv/skills★ 16same name
- 45ck/open-genome-agent★ 4same name
- jackhendon/ecom-feedback-intelligence★ 1same name
- Cellular-Semantics/claude-skills★ 0same name
- gu-dsan6725/ai-assisted-coding★ 0same name
- jorgegoco/claude_skills★ 0same name
- MohamedEssam0-0/claude-skills★ 0same name
- phuongdo/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository6 other files it gives its agents.
- aws-syncSkill
- ensure-english-consistencySkill
- expand-writingSkill
- fix-precommitSkill
- inspect-dataSkill
- review-paperSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. 0 are common, 4 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 10 edited versions we read keep these.
4
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 16
Stop and ask the user if:
- Very specific: line 30
Draft the report: Read template.html from this skill's directory and use it as the scaffold.
- Very specific: line 50
All Python execution for this skill — data loading, plot generation, anything — runs via uv with inline script metadata.
- Very specific: line 71
When plots are needed, write a one-off script in the output folder — <out>/make_plots.py — with the uv header from the Environment section, …
- Distinctive: line 73
Start with the uv inline metadata block from the Environment section.
- Very specific: line 75
Import the plot helpers from this skill's scripts/ directory:
- Very specific: line 89
All take a pandas DataFrame and return a matplotlib.figure.Figure.
- Very specific: line 96
All helpers re-export PALETTE (dict of named colors) and CATEGORICAL (the ordered series color list) so ad-hoc code can match the style by …
- Very specific: line 122
Run the plot script once after writing it (uv run <out>/make_plots.py), confirm the SVGs exist, then reference them from index.html with …
- Very specific: line 179
Never modify the --results source.
- Very specific: line 180
Never write outside the --out folder.
- Very specific: line 182
Do not invent numbers, model names, or claims not present in the results.
- Distinctive: line 183
Do not add JavaScript. The report is static HTML + CSS.
- Distinctive: line 184
Do not commit anything.
“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Generate a styled, self-contained HTML report (index.html) summarizing a set of experiment results. The skill inspects the results, drafts a report using the house design system (see template.html in this skill's directory), writes it to the requested folder, and then iterates on the draft in response to user refinement instructions.
Parse the argument
The argument string must contain:
--results <path>(required) — a file or folder containing the experiment output. May be a single file (JSONL / JSON / Parquet / HDF5 / CSV / TSV / log), a directory, or a HuggingFace dataset id.--out <folder>(required) — destination folder. The report is written as<folder>/index.html. Images and other supporting files referenced by the report live in this same folder (relative paths only).- Everything remaining is free-form additional instructions (may be empty) — e.g. "group by model", "highlight the GPT-4o row", "add a latency section".
Stop and ask the user if:
--resultsis missing, or the path does not exist (unless it looks like a HuggingFace dataset id).--outis missing.<folder>/index.htmlalready exists — confirm before overwriting.
Steps
- Resolve inputs. Parse the flags. If the
--outfolder does not exist, create it. If<folder>/index.htmlalready exists, ask before overwriting (preserve other files in the folder — onlyindex.htmland files the skill explicitly generates may be written). - Inspect the results. Use
/inspect-data(theinspect-dataskill) on the--resultstarget to understand the structure. If--resultsis a directory, inspect the most informative file(s) in it (typical candidates:results.jsonl,metrics.json,summary.csv,eval.parquet) — if several look relevant, inspect each. Summarize the fields, row counts, and any categorical dimensions (model, dataset, split, seed, condition) internally so the report can group by them. - Identify or generate image assets. If the
--resultsfolder already contains plots (.svg,.pdf,.png,.jpg), note their relative paths and copy or symlink them into<folder>/so that<img src="foo.svg">works. If the results are raw numbers with no plots, or the existing plots do not fit the story, generate new plots following the "Plot generation" section below. Prefer vector output (.svg) for anything the skill generates. Do not embed base64 — prefer sibling files. - Draft the report. Read
template.htmlfrom this skill's directory and use it as the scaffold. Keep every CSS variable, font link, cache-control meta, and class name from the template — the design system is non-negotiable. Populate the template with:- A gradient header (
<div class="header">) with the report title and a meta subtitle (date, dataset name, model, or other top-level identifier). - A TL;DR / key findings card near the top with a
<div class="summary">banner stating the main takeaways in 2–4 bullet points. - One
<div class="card">per major section, each with an<h2><span class="num">N</span> Title</h2>numbered heading. - Data tables (with
class="best"on the best cell per comparison), code blocks for commands / config snippets, and image tags for plots. - A
.warningbanner for caveats (small sample sizes, known failures, incomplete runs). .mtagpill badges for model / category labels where useful.
- A gradient header (
- Write the report to
<folder>/index.html. Use relative paths (./plot1.svg, not absolute) for every asset. Do not inline external CSS or JS beyond whattemplate.htmlalready specifies. - Report back to the user. Print a short summary:
- Path to
index.html. - Section list (by number and title).
- Any gaps you left (e.g., "no per-seed variance in the data — omitted the variance section") or banners added (
.warningabout small N). - A one-line invitation to request refinements.
- Path to
- Iterate on refinements. When the user sends follow-up instructions ("add a latency table", "drop Section 3", "re-color the best column"), edit
<folder>/index.htmlin place. Preserve the design system: do not change CSS variables, fonts, class names, or the overall card structure unless explicitly asked. Re-run step 6's summary after each edit so the user knows what changed.
Environment
All Python execution for this skill — data loading, plot generation, anything — runs via uv with inline script metadata. No system Python, no activated venv, no pip install. The standard dependency set is:
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "matplotlib",
# "seaborn",
# "pandas",
# ]
# ///(json is stdlib — do not list it.) Add further deps (e.g. pyarrow for Parquet, numpy) only when the data actually requires them.
Invoke every script with uv run <path-to-script>. Never python, never python3.
Plot generation
Plots are SVG (vector), saved as sibling files next to index.html, and embedded via <img src="foo.svg">. SVG scales cleanly at any zoom, renders crisply on HiDPI displays, and is usually smaller than a 160-dpi PNG for plot content. Raster output is only used when the user explicitly asks for it.
When plots are needed, write a one-off script in the output folder — <out>/make_plots.py — with the uv header from the Environment section, generate SVGs, then run it via uv run <out>/make_plots.py. The script must:
- Start with the uv inline metadata block from the Environment section.
- Load data from the
--resultspath (JSON, JSONL, CSV, Parquet as appropriate). Import the plot helpers from this skill's
scripts/directory:import sys sys.path.insert(0, '<absolute path to generate-report/scripts>') from plots import bar, line, scatter, heatmap, save_svg, PALETTE, CATEGORICALImporting
plotsrunsapply_style()automatically — the rest of the script gets teal/rose/green house palette, Palatino serif type, no top/right spines, and light grid with no further setup.- Build each figure with a helper (or matplotlib directly when a helper doesn't fit), then save with
save_svg(fig, '<out>/<name>.svg'). The<name>.svgfilename must match the<img src="...">reference inindex.html.
Helpers available in scripts/plots.py
All take a pandas DataFrame and return a matplotlib.figure.Figure. Pass title=, xlabel=, ylabel= where useful; omit to leave unset.
bar(df, x=, y=, hue=None, err=None, orientation='v', ...)— bar / grouped bar with optional error bars.orientation='h'for horizontal.line(df, x=, y=, hue=None, err=None, markers=False, ...)— line plot;errshades a symmetric confidence band.scatter(df, x=, y=, hue=None, size=None, ...)— scatter with optional color and size mapping.heatmap(matrix, row_labels=None, col_labels=None, annot=True, ...)— accepts a 2D array or DataFrame. Default cmap is a teal→white→rose diverging map matching the house palette; passcmap=to override.
All helpers re-export PALETTE (dict of named colors) and CATEGORICAL (the ordered series color list) so ad-hoc code can match the style by hand.
Minimal make_plots.py example
# /// script
# requires-python = ">=3.10"
# dependencies = ['matplotlib', 'seaborn', 'pandas']
# ///
import sys
import pandas as pd
sys.path.insert(0, '<absolute path to generate-report/scripts>')
from plots import bar, save_svg
df = pd.read_json('../results/accuracy.jsonl', lines=True)
fig = bar(df, x='model', y='accuracy', hue='dataset',
title='Accuracy by model and dataset',
ylabel='accuracy')
save_svg(fig, 'accuracy.svg')Font note
Plots use Palatino (serif), not the body font. Matplotlib tries Palatino, Palatino Linotype, Book Antiqua, and URW Palladio L in order; if none are installed on the host it falls back to the platform default serif. On Debian/Ubuntu, URW Palladio L ships with texlive-fonts-recommended. A missing Palatino is not a blocker — the fallback still looks reasonable and SVG text is rendered as outline paths, so the figure looks identical in every browser regardless of what fonts the viewer has.
Run the plot script once after writing it (uv run <out>/make_plots.py), confirm the SVGs exist, then reference them from index.html with relative paths (<img src="accuracy.svg">). Keep make_plots.py in the output folder so the user can re-run or tweak it themselves.
For refinement iterations that change plots (new columns, different grouping, color swaps), edit <out>/make_plots.py and re-run with uv run. Do not hand-edit generated SVGs.
Design system (baked into template.html)
These values are the spec — do not change them without explicit user instruction.
Color palette
primary/teal #225573
accent/rose #b6274e
green #547b5b
olive #6d8436
amber #d4880f
light-teal #4a7a94
gray/neutral #7d99b1CSS variables (must appear in :root)
--bg: #f5fbf7;
--card: #ffffff;
--text: #225573;
--text-light: #4a7a94;
--accent: #b6274e;
--green: #547b5b;
--green-light: #6d8436;
--border: #d5e3ec;
--border-light:#e8f0f5;
--tag-bg: #eef5f0;
--shadow: 0 1px 3px rgba(34,85,115,.08), 0 4px 14px rgba(34,85,115,.05);
--shadow-lg: 0 2px 6px rgba(34,85,115,.10), 0 8px 24px rgba(34,85,115,.08);
--radius: 10px;
--max-w: 1440px;Required <head> elements
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">- Cache-Control / Pragma / Expires no-cache headers (all three)
- Google Fonts link for Source Sans Pro weights 400/600/700
Structural conventions
<div class="page">wraps all content; max width 1440px.<div class="header">— gradient banner (teal → green) with<h1>and<div class="meta">.<div class="card">— one per section. Each has an<h2><span class="num">N</span> …</h2>numbered heading.<div class="summary">— teal-green gradient, left-bordered in--green, for TL;DRs and key findings.<div class="warning">— amber-bordered (#d4880f), for caveats.- Tables:
border-collapse: separate, rounded corners viaoverflow: hiddenon the outer<table>. Usetd.best(rose, bold) for winner cells. - Code: dark (
#1e2d3abg,#c8dce6text) for<pre>; light tag-bg (--tag-bg) with green text for inline<code>. - Links: green default, rose on hover with underline.
- Images: bordered, rounded (8px), soft shadow, 1em top/bottom margin.
.mtagpills: colored rounded rectangles for model/category tags.
Rules while running
- Never modify the
--resultssource. - Never write outside the
--outfolder. The folder may containindex.html, generated.svgplots,make_plots.py, and copied/symlinked assets — nothing else. - Generated plots must be
.svgunless the user explicitly asks for a raster format. - Do not invent numbers, model names, or claims not present in the results. If a field is missing, flag the gap in a
.warningbanner or leave the section out and note it in the summary. - Do not add JavaScript. The report is static HTML + CSS. (Exception: only if the user explicitly asks for interactivity.)
- Do not commit anything.
- Preserve the design system across refinement iterations. New sections use the same card / heading / banner pattern as the existing ones.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

