Install any skill in seconds. Free to start, no credit card required.
Get Started Free →data-goblin/semantic-model
This skill should be used whenever the user mentions a "semantic model", "data model", or "dataset", or asks to "build", "model", "design", "optimize", "review", or "audit" one, or to "add a measure", "add a relationship", "create a role" / "set up RLS", "add a calculation group", "set up incremental refresh", "fix a star schema", "reduce model size", "prepare a model for Copilot / AI", or "check model quality". Covers the full lifecycle (design, build, refresh, review) and drives every operatio
Passed 20 of 23 test cases with the skill, and 9 of 23 without it.
and 13 more in the full report
13 fixed10 passed either way3 still failing0 broke
Tokens, turns and time describe resource use, not a dollar price.
This benchmark measured an earlier version of the skill.
A newer attempt on gemini-3.8-flash on 10/20/2026 did not produce a publishable comparison (not comparable). The snapshot above is the previously measured run.
One of 12 test cases the skill fixed. Same model, same prompt, with and without the skill.
When executing multiple consecutive CLI commands against a tabular model file, we do not want to pass '--model <path>' on every single command invocation. What environment variable can be set to establish the active model session across command calls?
| Checked | Without skill | With skill |
|---|---|---|
| specifies setting the TE_SESSION environment variable to avoid passing --model on every command | Missed | Passed |
The instructions your model reads when the skill loads.
Guidance for designing, building, refreshing, and reviewing Power BI / Analysis Services tabular models from the terminal. It consolidates model review with modeling best practices, and routes every change to the narrowest capable tool. Depth lives in references/; this file is the operating loop and the routing.
pbir-cli skill (reports plugin)dax skilltmdl skill (this skill routes to it for the file-edit fallback)te command surface itself: the te-cli skill (tabular-editor plugin) is the command reference; this skill is the modeling judgment layered on topReach for the narrowest capable tool, in order. Most edits never leave step 1.
te CLI first. One verb per operation, staged in memory until --save, with a save-time DAX + referential-integrity gate. Covers add/set/rm/mv for measures, columns, relationships (Sales[K]->Dim[K] shorthand on te add), roles + RLS filters, calculation groups / items, DAX formatting (te set <path> --format Expression, or te script --inline "Model.AllMeasures.FormatDax();" for the whole model), te bpa, te vertipaq, te query. Each Bash call is a fresh shell, so pass --model <path> (or -s/-d for remote) on every command, or set TE_SESSION. Properties are -p Name=Value; read the real object's settable surface first with te get <obj> --properties. Every mutation is a dry run until --save. The te-cli skill is the full command reference.te cannot reach a property. Some properties are absent from te set -p (for example alternateOf, securityFilteringBehavior, crossFilteringBehavior, KPI sub-objects, linguistic-schema content, calendar objects). Drive these through a te script C# pass (in-process TOM), or the connect-pbid skill (PowerShell + TOM/ADOMD against a live local Desktop instance, and the only route to traces: EVALUATEANDLOG, aggregation-hit events, storage DMVs). The Power BI Modeling MCP server is also available if you prefer an MCP. The local Desktop proxy cannot reach Direct Lake; use a remote XMLA endpoint there.fab + direct TMDL last, with the tmdl skill. Service- and file-shape operations with no model-edit verb: assigning Entra principals to roles (workspace-side, not in .tmdl), report-to-model binding, Copilot-folder features (AI instructions, AI data schema, verified answers), Lakehouse / Delta reshaping behind Direct Lake, and bulk structural surgery that is cleaner as one TMDL diff than N te calls. For read-only Fabric retrieval of AI instructions / schema, use scripts/get_semantic_model_ai_metadata.py. Author the TMDL with the tmdl skill, then run te validate.Ordering gate: add relationships before any measure that uses RELATED() or a cross-table CALCULATE(), or the save gate fails with DAX0002 (no relationship in context).
Write column references as 'Table'[Column]: the table name is always present and always in single quotes. Write measure references as [Measure], never prefixed with a table. This applies everywhere DAX or model metadata names an object: measure, calculated column and calculation item expressions, RLS filters, format string expressions, DAX queries (te query, pbir model -q), and descriptions or annotations that mention an object.
Why: a measure belongs to the model rather than to its home table, so moving it between tables must not change any expression that uses it; a bare [Measure] also tells the reader at a glance that it is a measure and not a column. An unqualified column is ambiguous as soon as two tables share a column name, and quoting every table name keeps one consistent form whether or not the name needs quotes.
Model dimensionally: a star of fact plus conformed dimensions beats snowflakes and fact-to-fact joins. Decide storage mode and refresh strategy before building; both are near one-way doors once published. See references/dimensional-modeling.md, references/storage-modes.md, references/composite-models.md, and references/direct-lake.md.
test cases passed, vs 9 / 23 without
Published skills whose descriptions closely match this one, with their headline benchmark lift.
More skills from the same source and nearby in the registry, with their headline benchmark lift.