> Use when the user wants an iterative, self-checking exploratory analysis of a dataset — surfacing findings that are each verified by re-running the computation, not asserted. Proposes one specific hypothesis at a time, writes and runs analysis code to test it, and records the finding only if the numbers support it at a meaningful effect size; loops until no new verified finding appears or the budget is hit. The result is a findings report where every claim is backed by a reproducible number. Not for diagnosing a single known anomaly or pipeline failure, and not for verifying an external claim against sources (that is a claim-verification task) — this is open-ended discovery over a bound dataset.
npx skills add https://github.com/gaasher/Agent-Loop-Skills --skill data-analysis
A hypothesis → verify reflection loop over a dataset. The artifact is a findings report; the
feedback signal is verification — a finding only counts if re-running the computation confirms it
at a meaningful effect size. The discipline this enforces: no insight without a number behind it.
A plausible claim the data does not support is discarded, not softened; every line in the report can
be reproduced from the dataset.
Use this for open-ended, self-checking exploration of a bound dataset where each finding must survive
an independent re-computation. Default to broad exploration across the columns; if the user gives a
focus question, let it steer the hypotheses. Not for diagnosing one known anomaly or for checking an
external claim against the literature.
Resolve bindings interactively. If loop.run.yaml exists in the working dir, load it, confirm the
values in one line, and skip to the loop. Otherwise: on Claude Code (the AskUserQuestion tool is
available) infer a likely value for each binding and present it as the recommended option; on other
hosts ask each as a quoted plain-text prompt. Then write loop.run.yaml (format:
examples/run.example.yaml) and confirm the values before creating any other files.
| binding | meaning | default | how to infer |
|---|---|---|---|
| <dataset> | data file to analyze (CSV/TSV/Parquet/…); read-only ground truth | — | scan the working dir for a data file |
| <question> | optional analysis focus; omit to explore broadly | — | ask the user; else leave unbound |
| <report> | output findings file | <sandbox_root>/findings.md | — |
| <analysis_cmd> | interpreter that runs analysis snippets in the user's env | python3 | pyproject.toml/.venv/uv in the working dir |
| <sandbox_root> | where snippets + ledger live | ./sandbox | — |
| <budget> | max iterations | 8 | — |
| <patience> | stop after N consecutive iters with no new verified finding | 2 | — |
Analysis snippets run in the user's environment via <analysis_cmd>, so they may use whatever the
user has installed. Keep helper code stdlib-first (csv, statistics): if a snippet needs
pandas/numpy, probe with try/except ImportError and degrade to a stdlib path, or offer a
consented uv pip install "pandas==<ver>" — never assume the package is installed.
Copy this checklist and tick items off:
<dataset> (shape, types, ranges, missingness); record nothing as a finding.<question>; not already settled).<sandbox_root>/iter<N>/analysis.py, run with <analysis_cmd>, redirect to out.txt.<report> (verified); else log refuted, do not add it.<patience>) or <budget>.Iteration 0 — profile. Write and run a snippet that reports the shape of <dataset>: columns,
inferred types, row count, and a quick summary (ranges, category counts, missingness). This grounds
the hypotheses; record nothing as a finding yet.
Then, until stop (dry or budget):
higher value than consumer", "mobile has a higher return rate than other channels", "order value
rises with signup tenure". Let <question> steer it; do not repeat a hypothesis already settled.
<sandbox_root>/iter<N>/analysis.py that loads <dataset> and computes therelevant statistic plus an effect size (a group-mean difference, a rate gap, a correlation —
not just a yes/no). Run it with <analysis_cmd>, redirecting output to
<sandbox_root>/iter<N>/out.txt (never flood your context).
recount, or a sanity cross-check) and confirm the two agree. Then judge honestly: does the result
support the hypothesis at a meaningful effect size, or is it negligible / within noise? Decide
"meaningful" against a bar you state up front and apply consistently — a minimum effect size scaled
to the group sizes and noise (e.g. roughly |Cohen's d| ≳ 0.2, risk ratio ≳ 1.5, or |r| ≳ 0.1,
tightened when groups are small) — so the keep/refute threshold does not drift between iterations.
<report>: the claim, the exact numbers, the effect size,and the method (so it is reproducible). Mark it verified.
refuted in the ledger and do not add it tothe report. A null result is a real outcome, not a failure to hide.
<sandbox_root>/ledger.tsv, tab-separated, never commas in the text. Header:
iter hypothesis effect status
status ∈ {profile, verified, refuted}. Example:
iter hypothesis effect status
0 dataset profile - profile
1 enterprise orders average higher value than consumer 185 vs 109 (+70%) verified
2 returns differ by region North 0.16 vs South 0.14 (negligible) refuted
3 mobile has a higher return rate than web/store 0.30 vs 0.10 verified
Report the best outcome: the <report> path, the count of verified findings, and the hypotheses
refuted (so the user sees what was checked and ruled out, not just what survived).
<report> carries the figures and themethod that produced it; if you cannot compute it, you cannot claim it.
does not reproduce, or whose effect is within noise, does not enter the report.
say "associated with", and note confounders when the data cannot separate them.
<dataset> — never modify it, because it is the ground truth every finding is checkedagainst. The sandbox is self-contained (no ../ escapes).
<patience> consecutive iterations add no new verified finding.<budget> iterations reached.Comprehensive spreadsheet creation, editing, and analysis with support for formulas, formatting, data analysis, and visualization. When Claude needs to work with spreadsheets (.xlsx, .xlsm, .csv, .tsv, etc) for: (1) Creating new spreadsheets with formulas and formatting, (2) Reading or analyzing data, (3) Modify existing spreadsheets while preserving formulas, (4) Data analysis and visualization in spreadsheets, or (5) Recalculating formulas
Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.
Picks random winners from lists, spreadsheets, or Google Sheets for giveaways, raffles, and contests. Ensures fair, unbiased selection with transparency.
Query openFDA API for drugs, devices, adverse events, recalls, regulatory submissions (510k, PMA), substance identification (UNII), for FDA regulatory data analysis and safety research.
MATLAB and GNU Octave numerical computing for matrix operations, data analysis, visualization, and scientific computing. Use when writing MATLAB/Octave scripts for linear algebra, signal processing, image processing, differential equations, optimization, statistics, or creating scientific visualizations. Also use when the user needs help with MATLAB syntax, functions, or wants to convert between MATLAB and Python code. Scripts can be executed with MATLAB or the open-source GNU Octave interpreter.
UMAP dimensionality reduction. Fast nonlinear manifold learning for 2D/3D visualization, clustering preprocessing (HDBSCAN), supervised/parametric UMAP, for high-dimensional data.
Creating interactive data visualisations using d3.js. This skill should be used when creating custom charts, graphs, network diagrams, geographic visualisations, or any complex SVG-based data visualisation that requires fine-grained control over visual elements, transitions, or interactions. Use this for bespoke visualisations beyond standard charting libraries, whether in React, Vue, Svelte, vanilla JavaScript, or any other environment.
Access AlphaFold 200M+ AI-predicted protein structures. Retrieve structures by UniProt ID, download PDB/mmCIF files, analyze confidence metrics (pLDDT, PAE), for drug discovery and structural biology.
Take gaasher/data-analysis from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip, uv.
Without those the skill loads but fails at the first command.