luynoxrd/lakehouse-agent-skills
Data-engineering skills and subagents for AI coding agents: profile before you clean, clean before you chart, persist to columnar storage, query it with SQL, then build the dashboard by BI rules rather than by the model's guess, and disclose exactly what was and was not processed rather than invent it.
Picks the chart form that an already prepared result and its shape call for, then the rendering library the destination calls for, rather than the one that was easiest to reach. Use when it is not obvious which kind of plot a result needs, when choosing between a bar, line, scatter, area or pie, when a value has to be plotted over time, when a relationship between measures calls for a scatter rather than bars, when a result has more categories or a longer tail than the chosen form can carry, when a series has gaps or points that are not in order, or when deciding what to render a plot with for a report, a slide or a web page.
Chooses the palette a variable's own type requires and keeps every mark and label readable, by never letting colour carry meaning on its own and by holding text to a measured contrast ratio on both grounds. Use when assigning colours to categories or to an ordered scale, when a status column is shown as a green or red fill and nothing else marks the state, when a design leans on colour alone to carry its message, when a page has so many accents that nothing stands out, or when checking that a palette survives a light and a dark background.
Places what is on a page according to how many panels there are and what kind each one is, giving a table or a heatmap the area it needs and a single figure the little it needs. Use when arranging more panels than fit on one screen, when a page is a uniform grid of equally sized tiles, when deciding what belongs above the fold, or when a page has grown by accretion and nothing was ever removed.
Makes type, spacing, alignment and non-data ink carry the ranking of the information instead of decorating it, holding a page to one type scale of at most three sizes, named spacing steps that double, one alignment edge and a default state that answers. Use when a page is styled and nothing on it reads as more important than anything else, when the headline figure and its caption render at the same size, when every panel is separated by a border and a shadow and a fill at once, when the numbers in a column are centred so their digits do not line up, when a stylesheet carries a different gap value in every rule, or when the page opens on an empty state instead of on an answer.
Decides what may leave the project before any rows reach a model or a hosted service, by finding the fields that identify a person, sending a profile or a masked form instead of the values, and recording what was sent. Use before pasting rows, a sample or a file into a prompt, before calling a hosted API with data in it, or when a dataset holds names, emails, phone numbers, addresses, free-text notes or account identifiers.
Gets data out of a document before anything treats it as a dataset, deciding first whether the file carries a text layer or has to be recognised, then checking the extracted values against the page they came from. Use when a source is a PDF, a word-processor file, a scan or a photograph of a receipt or a form, when a table has to be pulled off a page, when extracted text arrives with its columns interleaved, or when a number was read by recognition rather than typed.
Answers an analytical question with SQL over the Parquet or delimited tables that were already persisted, instead of another pass of row-by-row code over the source. Use when a question asks for revenue, counts or averages per group, a ranking of segments or channels, or one period compared with the period before it, when an analysis is being written as iteration over rows, when a file is larger than the memory available to load it, or when the same source is re-read and re-cleaned for every new question.
Enforces the profile, clean, model and persist order before anything is charted, so a visualization never renders raw ingest. Use when a request asks to chart, plot, dashboard or summarize a CSV, spreadsheet, export or extract, when a bar chart or a monthly total is being built straight from a source file, when values arrive as text, with mixed date formats, comma decimals or lost leading zeros, when the same source arrives a second time as a refreshed or corrected file, when two tables have to be related and the key that joins them has not been established, or when existing code is about to be re-run to rebuild or regenerate a page, a report or a dashboard that somebody will read.
Declares what a data run did not cover before and after the work, including memory ceilings, sampled rows, unread sheets, skipped files and hard format limits. Use when a file may be too large to read whole, when only part of a batch or a workbook was processed, when a row cap or a sample was applied, or when reporting results that came from less data than the request implied.
Checks that a finding survives its own arithmetic before it becomes a sentence, using weighted averages instead of averages of averages, catching comparisons that reverse when groups are pooled, keeping unlabelled buckets out of rankings, and requiring a stated base behind every percentage. Use when writing takeaways or a summary, when naming the top or best performing segment, channel or period, when reporting growth or a decline as a percentage, or when saying that something drove or caused a change.
Decides when a directory of Parquet files has stopped being enough to hold a dataset, by naming what that layer cannot do, from correcting a row to surviving two writers, keeping a column somebody added, or giving a reader the same answer twice. Use when files are being rewritten to fix rows, when more than one process writes the same dataset, when a column was added and the older files do not have it, or when a reader needs the data as it stood at a point in time.
Treats a live database as a system other people depend on rather than a file that was handed over, so it stays read-only unless a write was asked for, the cost of a query is known before it runs, credentials are never copied into code or output, and every write is confirmed as its own decision. Use when connecting to a shared or production database, when a query will run against a system that is serving other users, when a task needs credentials to reach data, or when a request asks to insert, update or delete rows.
Protects a workbook's structure when a spreadsheet is read or written, by never rewriting the source and by naming exactly what a round trip through a library drops. Use when a task edits, saves or converts an xlsx file, when a workbook carries formulas, named ranges, merged cells, number formats or validation rules, or when a result has to be written back into a spreadsheet someone else maintains.
Decides what shape a source actually has before any analysis is chosen, separating a clean table from records whose fields differ from one another and from free text that has no columns at all. Use when a source is JSON with nested or uneven records, when a column holds sentences instead of values, when a task asks for themes or topics in written text, or when it is not yet clear whether the data is a table.
Routes a data request to the skill that owns it and states the order the stages have to run in. Use when starting work on a dataset and it is not obvious which skill applies, when a request jumps straight to a chart or a conclusion, when work spans more than one stage of the data lifecycle, or when a request names an action rather than a stage and what the work will write has to decide which stages are in play.