spreadsheet-qa
Answers business questions about the user's own spreadsheet or data export (CSV, TSV, XLSX from a CRM, Shopify, Stripe, QuickBooks, ad platforms, HR or…
Skill by OneWave-AI
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/onewave-ai-spreadsheet-qa
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: spreadsheets, backend, testing, data
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/spreadsheet-qa
What's inside
- Skill name
spreadsheet-qa- Description
- Answers business questions about the user's own spreadsheet or data export (CSV, TSV, XLSX from a CRM, Shopify, Stripe, QuickBooks, ad platforms, HR or payroll systems) correctly and auditably. Profiles every file first (grain, duplicate keys, embedded Grand Total rows, text-stored numbers, mixed currencies, UTC timestamps, Excel serial dates, hidden rows), states the metric definition used, computes every number in SQL or pandas instead of mental math, checks joins for fan-out, reconciles to a known total, and returns the query, filters, row counts, and rows behind the answer. Use this whenever the user says "analyze this spreadsheet", "how many...", "what's the total in this export", "which customers...", "pivot this", "revenue by month", "top 10", "what's our churn/MRR/AOV", or asks any question about their data, CSV, or Excel file, even a quick one. Also use when they ask to change values in a data file.
- License
- MIT
- Instructions
- 100 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (18)
- SKILL.md
- metric-definitions.md · references/
- traps.md · references/
- ask.py · scripts/
- diff_edit.py · scripts/
- profile.py · scripts/
- build_fixtures.py · tests/
- customers.csv · tests/fixtures/
- fx_rates.csv · tests/fixtures/
- orders.csv · tests/fixtures/
- pipeline.xlsx · tests/fixtures/
- refunds.csv · tests/fixtures/
- q1_net_revenue.json · tests/questions/
- q2_august_ny.json · tests/questions/
- q3_naive_fanout.json · tests/questions/
- q3_segment_revenue.json · tests/questions/
- q4_top_customers.json · tests/questions/
- run_tests.py · tests/
SKILL.md (first lines)
# Spreadsheet QA
Business exports lie quietly. A "Grand Total" row doubles every SUM. A customer listed twice multiplies their orders through a join. EUR and USD sit in one amount column. A UTC timestamp at 02:30 on Aug 1 is a July order in New York. None of these raise an error, so an answer computed by eye or by one quick query looks right and is wrong. This skill makes every number reproducible: profile, define, compute in code, reconcile, show the evidence.
Scope: questions about the data in the file. To combine or dedupe several files into one first, use `csv-excel-merger`. To check whether a financial model's formulas are sound, use `spreadsheet-model-auditor`.
## Workflow
### 1. Profile before answering anything
```bash
python3 scripts/profile.py path/to/*.csv path/to/book.xlsx --out sqa_out
```
Read `sqa_out/profile.md`. It reports, per file and sheet: header row, row count, candidate keys, duplicate keys, each column's type and parse rate, null %, distinct count, min/max, top values, currency and timezone hints, date ranges, embedded total/footer rows, hidden rows/columns, autofilters, merged cells, and a join-risk section predicting fan-out between files. It also drafts `data_dictionary.md` with open questions.
Why first: the traps above are visible only in the profile. Once a query has run, nobody rereads the raw rows. Do this even for "just give me the total": the total is the question most exposed to embedded total rows.
State the grain in one line per table ("one row = one order; key order_id") before writing a query. If no key is unique, say what one row is before counting anything.
### 2. Pin the metric definition, then proceed
Look up the metric in `references/metric-definitions.md`. If different definitions give materially different answers, list the one to three that matter, pick a stated default, and continue. Do not stall waiting for an answer. Example:
> Using net revenue = paid orders minus refunds against them, in USD at the rates in fx_rates.csv, by UTC date. By refund date instead: 8,710. Gross: 9,020. Say if you want one of those.
Ask before computing only when the choice is unknowable and decisive: which of two amount columns is the real one, which currency to report in when no rates exist, or what "active" means when the file has no activity dates.
Never invent a definition silently. "Active customer", "revenue", "churn", and "conversion" each have several; the answer must name the one used.
### 3. Compute in code only
Write a question spec (JSON steps) and run it:
```bash
python3 scripts/ask.py spec.json --out sqa_out/q1
```
Each step is one SQL view built on the previous ones, with a `kind`: `clean` (cast text, drop total rows), `filter`, `join`, `dedupe`, `derive`, `aggregate` (last step is the answer). ask.py counts rows before and after every step, fails the run when a join grows rows (fan-out) and warns when one drops rows, runs `assert_zero` checks (e.g. "amounts that failed to parse"), and writes `answer.md`, `query.sql`, `steps.json`, and `rows_used.csv`. Worked specs covering all of this: `tests/questions/*.json`. Copy the closest one.
Rules:
- Every source column loads as text. Cast explicitly with `to_num()` (handles "$1,200.00", "(35.00)", "12%") and `excel_date()`, and assert that nothing failed to parse. Auto-typing is how "$1,200" becomes NULL without anyone noticing.
- Exclude embedded total, subtotal, and footer rows in the first clean step and let the row count show it.
- Dedupe lookup tables (customers, products) before joining, or aggregate the many side first (refunds per order). Use LEFT JOIN and count unmatched rows instead of letting an inner join drop them.
- Convert currencies through an explicit rate table and assert every row found a rate. If there are no rates, report per currency.
- Convert timestamps to the reporting timezone before bucketing by day, week, or month: `CAST(ts AS TIMESTAMPTZ) AT TIME ZONE 'America/New_York'`.
- Recompute rates (CTR, margin %, conversion) from summed parts. Never average row-level rates.
- No mental math, including "quick" sums in prose. If a number appears in the answer, it came from a query output. Differences, percentages, and "X more than last month" too: add them as a step.
- DuckDB is the engine (`pip install duckdb`). Without it, ask.py falls back to SQLite, which lacks timezone functions; or use pandas and print the same row counts yourself.
For a one-off exploratory look, `ask.py --table orders=orders.csv --sql "SELECT ..."` works, but the final answer comes from a spec with the full step accounting.
### 4. Reconcile
Before reporting, tie the number to something independent. Add a `reconcile` entry to the spec:
- the export's own total row (your parsed sum must equal it)
- a total the user quoted, or one from the source system's dashboard
- the ungrouped total (grouped rows must sum to it; this is what catches fan-out)
- a second route to the same number (net = gross - refunds computed separately)
If it does not reconcile, the answer is not ready. Find the gap (usually filters, a hidden row, a timezone edge, or a status value) and say what explains it. Filtered views are a common cause: ask which filters the user's reference number used. `references/traps.md` lists the usual culprits.
### 5. Answer with an evidence block
Lead with the number and the definition in one or two sentences, then the evidence:
```
Net revenue, Q3 2026: $8,260.00 (USD, paid orders minus refunds against them, UTC dates)
Evidence
- Source: orders.csv (17 rows), refunds.csv (3), fx_rates.csv (3)
- Filters: dropped 1 Grand Total row (17 -> 16); status = paid, created Jul 1-Sep 30 UTC (16 -> 13)
- Joins: FX rates (13 -> 13, all matched); refunds pre-summed per order (13 -> 13)
- Reconciled: parsed amounts = the export's own Grand Total (9,700); net = gross 9,020 - refunds 760
- Other definitions: by refund date 8,710; gross 9,020
- Caveats: one fixed FX rate per currency, not transaction-date rates
- Query and rows: sqa_out/q1/query.sql, sqa_out/q1/rows_used.csv
```
Show sample rows when the user asks "which" (which customers, which orders): list the rows themselves, not only a count. Keep the evidence block even when the user wants a quick answer. It is five lines and it is what lets them trust or challenge the number.
## Editing data safely
When asked to change values in a file (fix a price, update a status, correct an invoice line):
1. Copy the original first. Never edit the only copy.
2. Change only the targeted cells, addressed by a unique key and column name, never by row position or by rewriting the whole file from memory. Re-emitting a full table from context is how an edit to one invoice line also changes the bank account number on another.
3. Diff before and after for every other column:
```bash
python3 scripts/diff_edit.py original.csv edited.csv --key invoice_id --allow amount --rows INV-7
```
It lists every changed cell and exits 1 if anything outside the allowed columns and rows changed, or if rows or columns appeared or disappeared. Show the user the diff. For .xlsx, edit with openpyxl on the specific cells so formulas and formatting survive, then run the same diff on the sheet.
## Testing
`python3 tests/run_tests.py` rebuilds the fixtures (orders with a Grand Total row, text amounts, three currencies and UTC timestamps; customers with a duplicated key; refunds; an xlsx with a title row, serial dates, a hidden row, and a Total row), checks that the profile catches every trap, answers four questions against hand-computed values, confirms the naive join is caught, and checks the edit diff.From OneWave-AI/claude-skills, MIT.
More from OneWave-AI/claude-skills
- 0.625score
scout-pro
OneWave-AI
Enhanced skill navigator that maps conversation history, recommends multi-skill chains, identifies patterns from past usage, and learns from session outcomes.
SkillAFreshness: A★ 373Claude Code +9 - 0.623score
gillby-water
OneWave-AI
Plan Florida boating, fishing, paddling, surf and beach outings using Gillby's sourced marine forecasts, tides, coastal places and vessel-aware tools.
SkillAFreshness: A★ 373Claude Code +9 - 0.620score
scout
OneWave-AI
Analyzes current conversation context to recommend the best skills and subagents for the task at hand.
SkillAFreshness: A★ 373Claude Code +9 - 0.592score
landing-page-copywriter
OneWave-AI
Writes conversion-focused landing page copy - headlines, subheads, value propositions, feature and benefit blocks, social proof, FAQs, and CTA button text -…
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
design-export-repair
OneWave-AI
Fixes broken decks/PDFs exported from Claude's "Design" feature (or similar AI deck generators) — cut-off or clipped text, wrong/substituted fonts, and…
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
devils-advocate
OneWave-AI
Argues the strongest honest case against a decision, plan, belief, hire, pricing move, strategy, or piece of work the user is leaning toward.
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
csv-excel-merger
OneWave-AI
Merges, appends, joins, and deduplicates multiple CSV, TSV, and Excel files (including multi-sheet workbooks) with pandas - mapping mismatched column names to…
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
code-review-pro
OneWave-AI
Performs a deep code review of files, modules, a diff, or a branch - finding security vulnerabilities (mapped to OWASP Top 10:2025), correctness bugs…
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
crm-data-cleanup
OneWave-AI
Cleans up CRM data from HubSpot, Salesforce, Pipedrive, Zoho, Close, Attio, or any CRM CSV export.
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
bi-measure-builder
OneWave-AI
Writes, explains, debugs, and optimizes BI calculations - Power BI / Fabric DAX measures and calculated columns, Tableau calculated fields…
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
bookkeeping-close
OneWave-AI
Runs small and midsize business bookkeeping operations - categorizes bank and card transactions to a chart of accounts, reconciles a bank or card statement…
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
database-schema-designer
OneWave-AI
Designs relational and document database schemas from requirements or an existing app - tables and collections, keys, relationships, constraints, indexes…
SkillBFreshness: B★ 373Claude Code +9
Signals
- Stars
- 373
- Forks
- 60
- Open issues
- 1
- Last commit (this folder)
- Sep 23, 2026 (1 month ago)
- Last release
- Jun 8, 2026 (4 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/OneWave-AI/claude-skills
- Website
- www.onewave-ai.com
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from OneWave-AI
- 0.625score
scout-pro
OneWave-AI
Enhanced skill navigator that maps conversation history, recommends multi-skill chains, identifies patterns from past usage, and learns from session outcomes.
SkillAFreshness: A★ 373Claude Code +9 - 0.623score
gillby-water
OneWave-AI
Plan Florida boating, fishing, paddling, surf and beach outings using Gillby's sourced marine forecasts, tides, coastal places and vessel-aware tools.
SkillAFreshness: A★ 373Claude Code +9 - 0.620score
scout
OneWave-AI
Analyzes current conversation context to recommend the best skills and subagents for the task at hand.
SkillAFreshness: A★ 373Claude Code +9 - 0.592score
csv-excel-merger
OneWave-AI
Merges, appends, joins, and deduplicates multiple CSV, TSV, and Excel files (including multi-sheet workbooks) with pandas - mapping mismatched column names to…
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
code-review-pro
OneWave-AI
Performs a deep code review of files, modules, a diff, or a branch - finding security vulnerabilities (mapped to OWASP Top 10:2025), correctness bugs…
SkillBFreshness: B★ 373Claude Code +9 - 0.592score
bi-measure-builder
OneWave-AI
Writes, explains, debugs, and optimizes BI calculations - Power BI / Fabric DAX measures and calculated columns, Tableau calculated fields…
SkillBFreshness: B★ 373Claude Code +9
Cite this page
spreadsheet-qa skill. Agent Mart. https://agentmart.dev/skills/onewave-ai-spreadsheet-qa (last updated 2026-10-24)