A Power BI report under change control
A checklist for running a Power BI report like a control: .pbip source files, required review, two CI gates, a scripted publish, and an audit trail.
A .pbix file is one binary, so Git can only say "the file changed." Saved as a Power BI Project (.pbip), the same report becomes text: PBIR files for pages and visuals, TMDL files for tables, measures and relationships. Once it is text, a report can carry the controls any regulated change carries. Before I built software, I spent years in broker-dealer supervision, where the job is making sure a change that matters was reviewed, evidenced and traceable. This is that checklist, pointed at a report: twenty control points in five stages.
Synthetic data. Seeded generator, no real company.
Review (4)
- Save as
.pbipfrom day one; treat.pbixas a build output. - Every model change goes through a pull request, and the TMDL diff shows the exact measure or relationship that changed.
- Branch protection on
mainrequires one approval for any change to a published model. git blamenames who last touched a measure, and a bad edit reverts in one command.
CI (6)
- The workflow triggers on every pull request.
- It runs on a Windows runner, because the Power BI tooling is Windows-first.
- It installs the free Tabular Editor 2 command-line runner.
- A Best Practice Analyzer rule file flags missing format strings, unused columns, implicit measures, naming drift and wrong cardinality.
- Any non-zero exit fails the build and blocks the merge.
- A value assertion checks that
Gross Margin %still reads 42.6 percent for January 2026 on the seeded data.
Publish (3)
- A merge to
mainpublishes through a service principal, not a person clicking Publish. - The same parameterized project promotes through dev, test and prod workspaces, with the data source swapped by a parameter.
- Confirm the current publish API against Microsoft's docs before wiring it. On Fabric, prefer its native Git integration and deployment pipelines.
Audit trail (3)
- Who changed a number, when and why: the commit message, the PR discussion and the linked issue.
- The required approval, kept as evidence rather than a memory.
- Traceability from a requirement to the change to the release that shipped it.
Data safety (4)
- Commit a seeded generator instead of data, so anyone can regenerate identical CSVs.
- A validation script exits non-zero on broken referential integrity, gaps in the date table, duplicate keys or a failed tie-out.
- Ignore the analysis cache (
cache.abf),.pbi/localSettings.json, credentials and.envfiles. - Read
git statusand the staged diff before every commit. No ignore rule catches a customer name in a screenshot.
The 42.6 percent in the CI gate is the January margin reconciled across Databricks, SQL and DAX in one margin bridge, three tools.