The Power BI Environment Agent connects to a tenant with a read-only service principal, walks every workspace through the admin APIs, and turns the metadata into two things: a queryable inventory and a prioritised findings report. It says what is wrong, why it matters, and what to fix first. It changes nothing.
A few workspaces become a few hundred. Semantic models get cloned instead of reused. Someone shares a report with the whole organisation because it was the quickest way to unblock a colleague, and the capacity starts throttling on Monday mornings. Nobody made a bad decision on purpose. The environment simply became too large to hold in one person's head, and the admin portal shows you settings, not consequences.
Workspaces, semantic models, reports, dataflows, gateways, capacities and their owners live in different screens and different APIs. Answering "what do we actually have" becomes a project rather than a question.
Auto date/time still on, calculated columns doing work the source should do, no RLS on models shared broadly, production content in personal workspaces, gateway clusters with a single member. Each is well documented, and each is invisible until it breaks.
A manual audit is a consultant, a spreadsheet and three days of clicking. Six weeks later the findings are stale, and there is no cheap way to check whether the remediation actually happened.
The rule engine runs before the model, not underneath it, so the same tenant always produces the same findings. The language layer clusters related findings, writes the explanation in the client's own vocabulary, and drafts the remediation order. Every finding carries the object it came from, the rule it failed, a severity, and the owner it should route to.
The metadata scanning APIs walk every workspace including personal ones, capturing datasets with their tables, columns, measures, expressions, data sources and lineage, plus reports, dataflows, apps, gateways and capacities.
Activity events give who opened what and how often, what was exported, and what has not been touched in ninety days. Refresh history and capacity endpoints give failure patterns, refresh windows colliding with peak load, and throttling signals.
Where a read-only XMLA endpoint is available on Fabric or Premium capacity, the agent reads the model itself for storage sizes, cardinality and relationship design. Pro-only workspaces get the shallower metadata view.
Model design rules in the spirit of the Tabular Editor Best Practice Analyzer, plus tenant governance rules: broad sharing, missing RLS, orphaned artefacts, workspaces with a single admin, no dev/test/prod separation or deployment pipeline.
Findings come out with severity, affected objects, a plain-language explanation of the impact, a concrete remediation step and a suggested owner. Exported as markdown or PDF, and as a CSV backlog that drops straight into a work tracker.
Because the scan is repeatable, the next run shows what moved: which findings closed, which reopened, and what appeared since last time. A recurring health check instead of an annual audit.
A Microsoft Entra ID service principal with Tenant.Read.All, enabled through the read-only admin API tenant setting and scoped to a dedicated security group, with the secret or certificate in Key Vault. No write scopes are requested, so the agent runs against production without a change window. Raw payloads and the parsed inventory land as Delta tables in a Fabric Lakehouse, delivered as a semantic model and report plus a generated document.
The fastest way to evaluate this is a scoped read-only scan of one real environment, with the findings report walked through together so you can judge whether the priorities match your own instinct. Get in touch to arrange it, or to discuss running it as the discovery phase of a Power BI governance engagement.