Agent skills that make coding agents profile data before charting it A set of 15 skills, 9 commands and 4 reviewer subagents was released to make AI coding agents run data work through a fixed eight-stage pipeline — PROFILE, CLEAN, MODEL, QUERY, VISUALIZE, ASSEMBLE, NARRATE, DISCLOSE — with a /redact command spanning all stages. The skills keep the original file read-only, log every cleaning rule with the row count it touched, persist curated data as Parquet under data/curated/, and query it with DuckDB, while four non-editing reviewers separate verified from asserted findings and audit percentages against their arithmetic. The release cites a test page built from a 200-order sales export in which a shipped check traced all 85 figures back to the curated table, with the category, channel, payment and province breakdowns each summing to $7,316.65. 15 skills, 9 commands and 4 reviewer subagents that make an AI coding agent profile a file before it cleans it, clean it before it charts it, build the dashboard by BI rules rather than by its own guess, and say what it did not cover instead of inventing it. Data work runs in one direction. Each stage assumes the one before it happened. PROFILE → CLEAN → MODEL → QUERY → VISUALIZE → ASSEMBLE → NARRATE → DISCLOSE /profile /clean /model /query /chart /dashboard /insight /disclose /redact runs across all of them Run a command to enter a stage by name, or just describe the task and let the router pick. A page an agent built with these skills from a 200-order sales export that holds no names or contact details. The shipped check traced all 85 figures on it back to the curated table. Every figure says which of the 200 orders it covers, and the category, channel, payment and province breakdowns each add up to the $7,316.65 at the top. A working data architecture in your project, not an answer in a chat. The pipeline - Three layers and a trail. The file that arrived is never written to. Cleaning happens in its own layer, every rule logged with the number of rows it touched. What survives is persisted as Parquet under data/curated/ , and everything downstream reads from there. - SQL over Parquet at local speed. DuckDB queries the curated table directly — no server, no load step, and a plan you can read. Grouping, ranking, joins and window functions stop being loops. - Row work at spreadsheet scale. A worksheet stops at 1,048,576 rows; Polars handles that range in memory on an ordinary laptop, with a schema that is declared rather than guessed from whichever rows it saw first. If your project already has a dataframe library, the skills tell the agent to use that one rather than add a second. - Workbooks that survive the round trip. Formulas, number formats, named ranges, merged regions and validation rules are named before anything is written back — because a library returns the last value the spreadsheet computed, not the formula that computed it. The output - One page, not a pile of files. A single self-contained HTML file, with linked filters that move every panel at once — no bundler, no build step, nothing to compile. Five files each carrying their own copy of the drawing library is five charts, not a dashboard. - Charts chosen by a rule with an author. Cleveland and McGill measured how accurately people read visual encodings: position, then length, then angle, then area, and colour last. The skill applies that order instead of a preference, which is why nine slices in a pie get refused. - A dashboard that starts from your question. Before any layout, the agent writes down the one question the page answers and what the reader must be able to do with it. Panels are ranked against that question, and anything answering no part of it is a candidate for removal. The guardrails - Four reviewers that cannot edit what they review. One separates what was verified from what was asserted . One audits a finding against its arithmetic — the base of every percentage, whether an average is weighted, whether a comparison reverses once the groups are pooled. One classifies every field before anything leaves the project. One names the craft decisions a page never made, and says plainly that it did not render the page. They run when the result leaves your machine or somebody will act on it, and stay out of the way when it is a first look. - Numbers you can trace. Every figure on the page has a query behind it and a population it covers. A number typed by hand fails the check. - A written record of what was skipped — rows, sheets, files, in counts rather than adjectives. - Nothing personal leaves the project without somebody deciding it should. | Stage | Skill | Use it when | |---|---|---| | Route | using-lakehouse-skills https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/using-lakehouse-skills | It is not obvious which skill applies, or the request jumps straight to a chart | | Shape | structured-vs-unstructured-routing https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/structured-vs-unstructured-routing | You are not sure the source is even a table | | | document-extraction-integrity https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/document-extraction-integrity | The numbers are in a PDF, a scan or a photo | | Values | etl-before-dashboard https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/etl-before-dashboard | Anything is about to be charted, cleaned, joined, or has arrived a second time | | | spreadsheet-integrity https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/spreadsheet-integrity | Results are being written back into a workbook | | | honest-data-limits-disclosure https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/honest-data-limits-disclosure | The file is huge, the batch partly failed, or coverage is not total | | Storage | parquet-to-open-table-format https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/parquet-to-open-table-format | Rows need correcting, two jobs write to one folder, or a column has to survive being added | | | duckdb-for-local-analytics https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/duckdb-for-local-analytics | You are grouping, ranking or joining a persisted table | | Output | chart-type-and-library-selection https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/chart-type-and-library-selection | Pie or bar, and which library the destination needs | | | dashboard-color-and-visual-hierarchy https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/dashboard-color-and-visual-hierarchy | Choosing colours, or checking they read on both backgrounds | | | dashboard-layout-by-widget-mix https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/dashboard-layout-by-widget-mix | A page has more panels than fit, or is a grid of equal tiles | | | dashboard-visual-craft https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/dashboard-visual-craft | The page is styled and nothing on it ranks: one size, one gap, centred numbers, an empty first state | | | insight-narrative-integrity https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/insight-narrative-integrity | Writing takeaways, a ranking, a growth figure or a cause | | Safety | data-privacy-before-llm https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/data-privacy-before-llm | Rows are about to be pasted into a prompt or sent to a service | | | safe-live-database-access https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/skills/safe-live-database-access | Connecting to a database other people use | One command per stage, in the order the stages run. Each one names the skills it invokes and the artefact it leaves behind, so the next stage starts from a file rather than from memory. | Stage | Command | What it does | |---|---|---| | PROFILE | /profile | Profile a dataset before anything is cleaned, charted or claimed about it. | | CLEAN | /clean | Clean a profiled dataset, recording every rule and the number of rows it touched. | | MODEL | /model | Decide what one row means and persist the modelled table to columnar storage. | | QUERY | /query | Answer a question with SQL over the table that was already persisted. | | VISUALIZE | /chart | Choose the chart form the data shape allows, then the library the destination needs. | | ASSEMBLE | /dashboard | Lay out a page by what its panels are and how many of them there are. | | NARRATE | /insight | Write findings that survive their own arithmetic before they become sentences. | | DISCLOSE | /disclose | State what the run did not cover, in numbers, before the result is used. | | REDACT, across all of them | /redact | Decide what may leave the project before any rows are sent anywhere. | They reach Claude Code, as the plugin's commands, and Gemini CLI, generated into .gemini/commands/ .toml from the same sources. Every other tool gets the same steps by describing the task: the router names the stage, and the stage names its skills. Four reviewer personas. They read and report; none of them can edit the work it reviews. | Persona | What it does | |---|---| | data-work-reviewer https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/agents/data-work-reviewer.md | Separates what was verified from what was asserted , and says which claims have evidence behind them | | claim-auditor https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/agents/claim-auditor.md | Audits a written finding against its arithmetic: the base of every percentage, whether an average is weighted, whether a comparison reverses once groups are pooled | | outbound-data-gate https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/agents/outbound-data-gate.md | Classifies every field that would leave the project and decides what may go, in what form | | design-reviewer https://github.com/LuynoxRD/lakehouse-agent-skills/blob/main/agents/design-reviewer.md | Names the craft decisions a page never made, each with the value from the file, and says plainly that it did not render the page | They run when the result leaves the project or somebody will act on it. For a first look that stays on your machine, they stay out of the way. Two session hooks come with them. One refuses to end a turn while a profiled dataset has no disclosure written, a published page has not been checked, or a page was written without the skills that own how it reads. Installing it for someone? If you are an AI agent and the person you work for asked you to install this pack, run the line for the tool you are running in, with their approval: | Running in | Install | |---|---| | Claude Code | claude plugin marketplace add LuynoxRD/lakehouse-agent-skills , then claude plugin install lakehouse-agent-skills@lakehouse-skills | | Codex | codex plugin marketplace add LuynoxRD/lakehouse-agent-skills , then codex plugin add lakehouse-agent-skills@lakehouse-skills | | Any other coding agent | npx skills add LuynoxRD/lakehouse-agent-skills --skill ' ' --agent