| name | report-visualization-design |
| description | Design a Power BI report/visualization in the Kurt-Buhler / Bas-Dohmen mold — a checklist-driven method: decide the question first, structure the page with the 3-30-300 information-seeking hierarchy, choose the visual by question-type, design headline KPIs with actual/target/gap + pre-attentive color, lay everything on an 8-pt grid, and tune density / color tokens / accessibility. Emits a layout that maps cleanly onto PBIR (visualType enum + pbir-layout-engine geometry). Used by `power-bi-engineer` (primary). |
Report Visualization Design Skill
Purpose: Give power-bi-engineer a concrete, reproducible method for designing a Power BI report that communicates — not just renders. The method distills the published design canon of Kurt Buhler (Data Goblins / SQLBI — the 3-30-300 rule, the "anatomy of an effective KPI visual", pre-attentive color) and the design-first school associated with Bas Dohmen (How to Power BI — decide-first, prototype-then-build, less-is-more). Every step is a checklist item, not an aesthetic opinion, so a design from this skill is directly realizable as PBIR (it names real visualTypes and emits grid-aligned geometry).
Sourcing & honesty. The load-bearing techniques are cited inline with retrieval date 2026-06-08. Where a technique is the broader Power BI design canon rather than a specific named source — or where attribution to a specific person can't be confirmed from a primary source — it is marked [unverified attribution]. The value is the reproducible technique, not the name-drop. Re-verify the volatile bits (visualType strings, schema rules) at use via the PBIR reference below.
When to Use
- Designing a new report/page from a blank canvas — you have a data model and a business question, and need a layout that lands.
- A report "makeover" — an existing report is cluttered, slow to read, or "Power BI slop" (every-field-on-the-page) and needs restructuring.
- Reviewing someone else's report for communication quality — design is a review dimension, the same way performance and DAX-correctness are.
- Before authoring PBIR — run this skill to decide what goes where, then hand the result to
pbir-layout-engine to lint the geometry and pbir-enhanced-reference.md to author the JSON.
How this maps onto our PBIR canon (do not duplicate — point at these)
This skill is the design layer. The realization layer already exists in the marketplace; this skill produces inputs for it, it does not re-implement it:
| Layer | Owned by | This skill's relationship |
|---|
Which visualType strings are real + their query roles | knowledge/pbir-enhanced-reference.md § 1 (the visualType enum) | This skill's chart-selection step picks only from that enum (kpi, cardVisual, clusteredBarChart, lineChart, pivotTable, …). Never invent a visual name. |
| Page geometry — no-overlap / within-canvas / equal-gap / column-alignment + PBIR schema checks | pbir-layout-engine (lint.py) | This skill emits x/y/w/h on an 8-pt grid; run lint.py on the page to prove the grid holds. The helper below produces lint-clean coordinates. |
| Authoring the visual/page/report JSON (filterConfig, objects vs visualContainerObjects, literal suffixes) | knowledge/pbir-enhanced-reference.md | After this skill decides the design, author the JSON there. |
| Why a deployed report renders blank | knowledge/pbir-enhanced-report-loading.md | Debug runbook — out of scope here. |
The handoff: design here → realize in PBIR there. A design that names a non-enum visual or off-grid geometry is a defect this skill is meant to prevent.
The method — six steps, each a checklist
Step 1 — Decide the question first (decide-first, not data-first)
The single biggest design failure is building around what's in the model instead of what must be decided. Bas Dohmen's framing: "Reports fail for one reason: they're built around what's available in the data, not around what needs to be decided" (datatraining.io/powerbidesigntransformation, retrieved 2026-06-08).
Step 2 — Structure the page with the 3-30-300 hierarchy (Buhler)
Kurt Buhler's 3-30-300 rule paraphrases Shneiderman's visual information-seeking mantra ("overview first, zoom and filter, then details-on-demand") into report-design tiers (sqlbi.com — Introducing the 3-30-300 rule, retrieved 2026-06-08):
| Tier | User gets… in | Content | Placement (Western reading flow) |
|---|
| 3 seconds | an overview of the most important questions/areas | headline KPIs + 1 trend; simple visuals (kpi, cardVisual, lineChart) | top-left, moving right |
| 30 seconds | the ability to filter & zoom to periods/categories | performance-by-dimension bars + slicers; conditional formatting on under-performers | middle-left / center |
| 300 seconds | details-on-demand to inform an action | curated matrix / supplemental table; drillthrough; dynamic links | bottom-right |
Step 3 — Choose the visual by the question-type, not by taste
Match the chart to the analytical question. These seven shapes cover ~95% of business reporting (tabulareditor.com — Data visualization best practices, retrieved 2026-06-08). Pick the visualType from the PBIR enum § 1:
| The question is about… | Use | PBIR visualType |
|---|
| A single headline number + status | KPI card | kpi, cardVisual, card, multiRowCard |
| Comparing categories | bar / column | clusteredBarChart, clusteredColumnChart |
| Trend over time | line / area | lineChart, areaChart |
| Composition (2-3 parts max) | donut (sparingly) | donutChart, pieChart |
| Change between two points | waterfall | waterfallChart |
| Relationship between two metrics | scatter (X & Y must be measures) | scatterChart |
| Detailed/precise values | table / matrix | tableEx, pivotTable |
| Geographic comparison | map | (per enum — verify at use) |
Step 4 — Design the headline KPI (Buhler's "anatomy of an effective KPI visual")
A KPI card earns its place only if it answers "is this good or bad, and is it getting better or worse?" without the reader doing arithmetic (data-goblins.com — KPIs and cards in Power BI, retrieved 2026-06-08). It must carry three layers:
Step 5 — Lay it on an 8-point grid (Dohmen-school precision + our linter)
Disciplined spacing is what separates a "makeover" from a mess. The widely-used Power BI design default is a 1664×936 canvas on an 8-point grid, key metrics in the top-left zone [unverified attribution] (canon summarized at lukasreese.com — dashboard design best practices, retrieved 2026-06-08 — page returned HTTP 403 on direct fetch this session, so the numeric tokens are [unverified — secondary summary]; treat 1664×936 as a sensible default, not gospel).
Step 6 — Tune density, color tokens & accessibility (less-is-more)
The "less is more" / data-ink discipline: think about what you can remove to make the chart simpler, not what you can add to make it nicer (tabulareditor.com, retrieved 2026-06-08).
Optional helper — grid.py (8-pt layout solver → PBIR-ready geometry)
grid.py is a stdlib-only, fail-safe coordinate solver. Given a canvas, a margin, a gap, and a chosen 3-30-300 template, it emits each region's x/y/width/height snapped to the 8-pt grid — coordinates that pass pbir-layout-engine's within-canvas / no-overlap / equal-gap / column-alignment checks, ready to drop into a PBIR page.json's position blocks.
python3 plugins/power-platform/skills/report-visualization-design/grid.py --template 3-30-300 --format json
python3 .../grid.py --template kpi-strip --kpis 4 --canvas 1664x936 --format json
Templates: 3-30-300 (overview top-left / filter band / detail bottom-right), kpi-strip (N equal KPI cards across the top), golden-overview (single hero visual + supporting column). It only does arithmetic (no network, no file writes); an invalid request prints a diagnostic to stderr and exits non-zero. Verify the output against the linter before authoring JSON.
Output Contract
When this skill drives a design deliverable, the report ends with the cross-plugin Structured Output JSON block per ../../../ravenclaude-core/skills/structured-output/SKILL.md, plus the Power Platform ## Output Contract lines (Status / Files changed / Gates passed / Open questions / Licensing impact / Grounding checks performed) from the plugin constitution § 6. For a design, Gates passed should cite the pbir-layout-engine lint result on the emitted geometry.