Analytics Strategy
rampstackco/claude-skills
Design measurement frameworks including event taxonomy, KPI hierarchy, dashboard architecture, attribution models, and analytics implementation strategy.
A skill your agent uses when a recurring report must ship itself on a cadence — weekly digest, monthly exec pack, board pack — via a fetch→narrate→render→deliver pipeline with a schedule and a…
$ npx skills add ericrisco/rsc-harness --skill reporting -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness reporting --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/reporting .claude/skills/reporting && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "reporting" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/reporting into .claude/skills/reporting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reporting", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ericrisco/rsc-harness/tree/main/skills/reportingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ericrisco/rsc-harness --skill reporting -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness reporting --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/reporting .agents/skills/reporting && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "reporting" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/reporting into .agents/skills/reporting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reporting", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill reporting -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness reporting --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/reporting .cursor/skills/reporting && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "reporting" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/reporting into .cursor/skills/reporting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reporting", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ericrisco/rsc-harness.git --path skills/reporting--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ericrisco/rsc-harness --skill reporting -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness reporting --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/reporting .gemini/skills/reporting && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "reporting" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/reporting into .gemini/skills/reporting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reporting", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ericrisco/rsc-harness reportingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ericrisco/rsc-harness --skill reporting -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/reporting .github/skills/reporting && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "reporting" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/reporting into .github/skills/reporting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reporting", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill reporting -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness reporting --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/reporting .opencode/skills/reporting && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "reporting" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/reporting into .opencode/skills/reporting/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reporting", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
reportingA skill your agent uses when a recurring report must ship itself on a cadence — weekly digest, monthly exec pack, board pack — via a fetch→narrate→render→deliver pipeline with a schedule and a…
Reporting is an agent skill from ericrisco/rsc-harness. Use when a recurring report must ship itself on a cadence — weekly digest, monthly exec pack, board pack — via a fetch→narrate→render→deliver pipeline with a schedule and a freshness gate. NOT a live view people slice (that is dashboard), NOT picking which KPIs to track (that is kpi-framework), NOT a one-off investigation (that is analytics).
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/pipeline.md`).
It sits in Business, Finance & HR, covering OKRs and executive reporting and Newsletters. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
Read from SKILL.md and the folder at commit 92fde8f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Reporting loads about 2.7k tokens when it runs, and up to ~4.8k if it reads all its reference files. Until then it costs about 90 tokens; SKILL.md has 1,252 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from ericrisco/rsc-harness at commit 92fde8f, republished under its MIT licence (© ericrisco). 1,252 words, ~2,688 tokens.
.claude/skills/reporting/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.A report is a push artifact: a fixed snapshot that lands in someone's inbox or shared drive on a
cadence, the same shape every period, with no human assembling it. That is the whole job. If a human
opens a live view to slice numbers themselves, that is pull — a
dashboard, not a report. Hold that line; almost every failed "reporting"
project is a dashboard wearing a report's name, or a report nobody can trust because the numbers went
stale and no one noticed.
Your deliverable is a runnable pipeline, not advice: a template, a generation script, a schedule, and a delivery step, with a freshness gate so it fails loud instead of shipping yesterday's numbers.
Before any code, pin six fields. An undefined audience is a report no one reads; an undefined source is a number no one can defend.
| Field | What it fixes | Example |
|---|---|---|
| Audience | Who reads it → sets depth and tone | "5-person leadership team" |
| Cadence | When it ships → sets the scheduler | "every Monday 08:00 Europe/Madrid" |
| Sections | The fixed skeleton, same every period | Exec summary · revenue · pipeline · risks |
| Metric source | Where numbers come from + who owns them | metrics.csv from the data team |
| Channel | The artifact + transport | PDF over email |
| Owner | Who gets paged when it breaks | a named person, not "the team" |
Rule: you consume an agreed metric set — you do not adjudicate which KPIs matter. If the ask is
"which metrics should we even track?", that is kpi-framework, not this
skill. The contract names the source and its owner so a wrong number has an address.
Audiences want a citable snapshot for the period more often than a live feed — that is why push wins for exec summaries, weekly reviews, and finance close packs.
| Signal in the ask | Route |
|---|---|
| "Same summary, every week/month/quarter" | reporting (here) |
| "Consistent snapshot the board can cite in a meeting" | reporting (here) |
| "It must arrive even if no one logs in" | reporting (here) |
| "A screen people open to filter/drill live" | dashboard |
| "Self-serve, slice by region/date on demand" | dashboard |
When both are wanted, build the report and let it link to the dashboard as a "go deeper" footer.
| Format | Wins when | Notes |
|---|---|---|
| Email-body HTML | Short digest, ≤1 screen, read on a phone | Inline the key numbers; no attachment to open |
| Exec / client / board, fixed layout that must look identical for everyone | The default for anything formal; pinned render stack below | |
| Spreadsheet | Analysts who will re-filter and pivot the data themselves | Hand off the data, not a picture → spreadsheet-ops |
| Notion / living doc | Internal team, the doc evolves and gets commented | Page over file → notion-connector |
A board pack is a PDF; an analyst hand-off is a spreadsheet. Picking PDF for analysts who wanted to pivot is the most common format miss.
Keep the four layers separate so each is testable and the template never knows where data came from.
Pinned stack (Python, the most-documented 2025 PDF path — verified on PyPI 2026-06-02):
pandas (data) → Jinja2 (HTML template) → WeasyPrint 68.1 (HTML+CSS → PDF), Matplotlib
for embedded charts. Pin WeasyPrint — major versions change CSS support, so an unpinned bump can
silently reflow a board pack. Re-check PyPI before you freeze, then freeze what you resolve.
# render.py — minimal fetch → narrate → render. Delivery + charts live in references/pipeline.md.
import pandas as pd
from jinja2 import Environment, FileSystemLoader
from weasyprint import HTML # WeasyPrint==68.1
def build_report(metrics_csv: str, params: dict) -> bytes:
df = pd.read_csv(metrics_csv) # fetch
df = df[df["region"] == params["region"]] # per-recipient scope, NOT a new template
cur, prev = df["revenue"].iloc[-1], df["revenue"].iloc[-2]
ctx = {
"title": f'{params["region"]} weekly revenue',
"period": params["period"],
"summary": narrate(cur, prev), # narrate (see below)
"rows": df.tail(8).to_dict("records"),
}
env = Environment(loader=FileSystemLoader("templates"))
html = env.get_template("report.html.j2").render(**ctx) # render
return HTML(string=html).write_pdf()Rule: one template, per-recipient params — regional managers each get their region from the same
report.html.j2, scoped by params, never a forked template per recipient. A template-per-recipient
codebase rots the first time the layout changes. The full worked template, the Matplotlib base64 chart
embed, the per-recipient loop, the GitHub Actions workflow, and the freshness gate are in
references/pipeline.md.
Executives read the executive summary and stop. Lead every report with: the report's purpose in one line, 3 key takeaways, and what changed versus last period. Then per section, one period-over-period delta sentence and one "so what". An annotated chart callout is retained; a bare chart is not.
def narrate(cur: float, prev: float) -> str:
delta = (cur - prev) / prev * 100
arrow = "up" if delta >= 0 else "down"
flag = " — investigate" if abs(delta) >= 20 else "" # anomaly callout
return (f"Revenue {arrow} {abs(delta):.1f}% vs last week "
f"(€{cur:,.0f} from €{prev:,.0f}){flag}.")Bad → Good, the difference that decides whether the report is useful:
Revenue | 248,300 | 201,400. The reader must do the math and guess if it matters.The numbers are the evidence; the sentence is the report.
Reports die two ways: stale data ships silently, and a silent break means no one notices for weeks. Treat the schedule as managed infrastructure.
Where to run it:
| Situation | Scheduler |
|---|---|
| You already run a server / cron host | cron (0 8 * * 1 = Mondays 08:00) |
| No server, want zero infra | GitHub Actions on: schedule: - cron: — the recommended cloud option |
| Multi-app event wiring beyond a timer | route the plumbing to automation-flows |
This skill owns the report-shaped concern (contract, narrative, artifact) and uses a scheduler — it
does not teach scheduling in general. The actual transport (SMTP/Gmail send) belongs to
email-connector; for a Drive/Workspace destination see
google-workspace. The GH Actions schedule: YAML is in
references/pipeline.md.
Reliability checklist — every recurring report:
data-cleaning; this gate only refuses to ship
known-stale numbers.| Anti-pattern | Why it bites | Do instead |
|---|---|---|
| Email a live dashboard link, call it "the report" | Recipient must log in and slice; most won't, the snapshot is lost | Ship the fixed artifact; link the dashboard as a footer |
| No freshness gate | Stale numbers ship silently; trust dies on the first wrong figure | Assert source newer than last period; refuse to send if stale |
| One mega-report for every audience | Execs drown in analyst detail; analysts can't refilter a PDF | Contract per audience; one template, per-recipient params |
| Raw metric dump, no narrative | Reader does the math, misses what changed, stops opening it | Exec summary + 3 takeaways + a "so what" per section |
| Schedule with no failure alert | A broken job is invisible for weeks; the report just stops | Fail loud to the named owner on any error |
| A template forked per recipient | Layout change must be made N times; they drift | Single template scoped by params |
| Redefining KPIs inside the report | The report quietly becomes the metric authority, numbers diverge | Consume an agreed set; defer definition to kpi-framework |
| Unpinned WeasyPrint / render lib | A minor bump reflows the board pack with no warning | Pin (WeasyPrint 68.1) and re-check PyPI before changing |
| Hand-assembling the digest weekly | It breaks the week the owner is on leave | Automate the pipeline end to end; a human only reads it |
Run scripts/verify.sh (read-only; pass a path to a generated pipeline directory, or run in it). It
confirms a Jinja2 template renders against a sample context without error, the generation script
produces a non-empty PDF/HTML artifact, a schedule definition exists (a crontab line or a
.github/workflows/*.yml with a schedule: block), and a delivery step is wired. It soft-warns if no
freshness/failure gate is detected, and exits 0 on an empty/clean target — nothing to check is not a
failure.
© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (scripts, references) in skills/reporting of ericrisco/rsc-harness.
Open the folder on GitHubat commit 92fde8f
Reporting next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Reporting this skillericrisco/rsc-harness | 156 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Analytics Strategyrampstackco/claude-skills | 935 | 1 repos | ~2.4k | Automated safety check: Pass | MIT | |
| Pine BacktesterTradersPost/pinescript-agents | 167 | 1 repos | ~3.9k | Automated safety check: Pass | None | |
| Onboarding Plannerbpinheiroms/dotfiles | 108 | — | ~5.4k | Automated safety check: Pass | None | |
| Replit Decksanqiufong/slides-from-anything | 132 | 1 repos | ~2.9k | Automated safety check: Pass | Apache-2.0 | |
| Building Streamlit Dashboardsiusztinpaul/designing-real-world-ai-agents-workshop | 512 | — | ~1.1k | Automated safety check: Pass | Apache-2.0 |
rampstackco/claude-skills
Design measurement frameworks including event taxonomy, KPI hierarchy, dashboard architecture, attribution models, and analytics implementation strategy.
TradersPost/pinescript-agents
Implements comprehensive backtesting and performance metrics.
bpinheiroms/dotfiles
Plan high-conversion mobile app onboarding flows from scratch.
sanqiufong/slides-from-anything
Single-file horizontal-swipe HTML deck in the style of Replit Slides's landing-page template gallery.
iusztinpaul/designing-real-world-ai-agents-workshop
Building dashboards in Streamlit. An agent skill from iusztinpaul/designing-real-world-ai-agents-workshop.
ibuilder/massing
Drive a Massing BIM/AEC project from an AI agent over MCP — read a project's status, records, CDE, KPI and model-quality checks; run standards-compliance, schedule-risk, embodied-carbon, permit-…
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
Categories
A skill your agent uses when a recurring report must ship itself on a cadence — weekly digest, monthly exec pack, board pack — via a fetch→narrate→render→deliver pipeline with a schedule and a…. Reporting is an agent skill from ericrisco/rsc-harness. Use when a recurring report must ship itself on a cadence — weekly digest, monthly exec pack, board pack — via a fetch→narrate→render→deliver pipeline with a schedule and a freshness gate.
Reporting fits situations like: A recurring report must ship itself on a cadence — weekly digest; monthly exec pack; board pack — via a fetch→narrate→render→deliver pipeline with a schedule and a freshness gate.
Run `npx skills add ericrisco/rsc-harness --skill reporting -a claude-code`. Or copy the skill folder (skills/reporting in ericrisco/rsc-harness) into .claude/skills/reporting in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill reporting -a codex`. Or copy the skill folder (skills/reporting in ericrisco/rsc-harness) into .agents/skills/reporting in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill reporting -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/reporting, .gemini/skills/reporting, .github/skills/reporting and .opencode/skills/reporting in your project.
Going by SKILL.md and its folder, Reporting needs a shell for the scripts in its folder. Our summary lists: Python 3; A Bash shell.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Reporting is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Reporting: Analytics Strategy (rampstackco/claude-skills, 935 stars), Pine Backtester (TradersPost/pinescript-agents, 167 stars), Onboarding Planner (bpinheiroms/dotfiles, 108 stars) and Replit Deck (sanqiufong/slides-from-anything, 132 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 156 GitHub stars. The repository holds 229 skills in this directory. The repository was last updated on October 6, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.