<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shai Karmani</title>
    <description>The latest articles on DEV Community by Shai Karmani (@shai_karmani_2521c2f8e837).</description>
    <link>https://dev.to/shai_karmani_2521c2f8e837</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3940157%2Fa5733802-de8e-4874-8d18-ea8a44589688.jpeg</url>
      <title>DEV Community: Shai Karmani</title>
      <link>https://dev.to/shai_karmani_2521c2f8e837</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shai_karmani_2521c2f8e837"/>
    <language>en</language>
    <item>
      <title>AI Can Build Power BI Reports Now. Here’s the Playbook I’d Use First.</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Mon, 08 Jun 2026 23:33:57 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/ai-can-build-power-bi-reports-now-heres-the-playbook-id-use-first-2i7h</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/ai-can-build-power-bi-reports-now-heres-the-playbook-id-use-first-2i7h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-06-08-power-bi-agent-skills-playbook.html" rel="noopener noreferrer"&gt;Data Ninja AI Lab&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq1diq3ph75gbnb09khu7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq1diq3ph75gbnb09khu7.png" alt="Power BI agent skills workflow" width="799" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft just opened a very interesting door for Power BI teams.&lt;/p&gt;

&lt;p&gt;AI-powered Power BI reporting with agent skills is now in preview, and this is one of the most practical AI announcements in the Power BI space right now.&lt;/p&gt;

&lt;p&gt;The reason is simple: this is not only chat over a report. This is AI helping with the actual report-building workflow.&lt;/p&gt;

&lt;p&gt;Design pages. Generate PBIR files. Work inside a PBIP project. Reload Power BI Desktop. Capture screenshots. Improve the report based on what was actually rendered. Publish to Fabric when the report is ready.&lt;/p&gt;

&lt;p&gt;That is a very different thing from asking Copilot to summarize a visual.&lt;/p&gt;

&lt;p&gt;This is closer to giving an AI agent a real Power BI workbench.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Microsoft released
&lt;/h2&gt;

&lt;p&gt;Microsoft announced &lt;strong&gt;AI-powered Power BI reporting: From design to deployment with agent skills&lt;/strong&gt; as part of the Power BI authoring plugin in &lt;a href="https://github.com/microsoft/skills-for-fabric" rel="noopener noreferrer"&gt;Skills for Fabric&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The core idea: install a first-party Power BI authoring plugin, then use compatible AI tools, currently optimized for GitHub Copilot CLI, to build and modify Power BI reports through natural language.&lt;/p&gt;

&lt;p&gt;The plugin can help an agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create report pages from a prompt&lt;/li&gt;
&lt;li&gt;write schema-correct PBIR files&lt;/li&gt;
&lt;li&gt;work with PBIP projects&lt;/li&gt;
&lt;li&gt;reload an open Power BI Desktop report&lt;/li&gt;
&lt;li&gt;capture screenshots from the rendered report&lt;/li&gt;
&lt;li&gt;improve the report based on the screenshot output&lt;/li&gt;
&lt;li&gt;coordinate with semantic model authoring and Modeling MCP&lt;/li&gt;
&lt;li&gt;publish or manage reports in Fabric through companion skills&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part is the important shift.&lt;/p&gt;

&lt;p&gt;A lot of AI reporting demos stop at “generate a report.” This one is being designed around the artifacts Power BI developers already care about: PBIR, PBIP, semantic models, Desktop rendering, and Fabric publishing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdmaif90kv6tc6p0ergn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdmaif90kv6tc6p0ergn.png" alt="Microsoft Skills for Fabric repository screenshot" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository behind this is public: &lt;a href="https://github.com/microsoft/skills-for-fabric" rel="noopener noreferrer"&gt;microsoft/skills-for-fabric&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;At the time I checked it, the repo was created on &lt;strong&gt;February 17, 2026&lt;/strong&gt;, had &lt;strong&gt;425 stars&lt;/strong&gt;, &lt;strong&gt;94 forks&lt;/strong&gt;, and was still active, with a latest main-branch commit on &lt;strong&gt;June 7, 2026&lt;/strong&gt;. The Power BI Authoring plugin manifest in the repo is at version &lt;strong&gt;0.3.3&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This matters because it shows the direction clearly: Microsoft is not treating these as a throwaway demo prompt pack. This is a first-party skills catalog that can be installed, versioned, inspected, improved, and contributed to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power BI Authoring plugin
&lt;/h2&gt;

&lt;p&gt;The Power BI Authoring plugin lives under:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/microsoft/skills-for-fabric/tree/main/plugins/powerbi-authoring" rel="noopener noreferrer"&gt;plugins/powerbi-authoring&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The plugin currently includes these skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;check-updates&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;semantic-model-authoring&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;powerbi-report-planning&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;powerbi-report-design&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;powerbi-report-authoring&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;powerbi-report-management&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ttgjlan1g0yu2p6cazt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ttgjlan1g0yu2p6cazt.png" alt="Power BI authoring skills folder screenshot" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That split is smart.&lt;/p&gt;

&lt;p&gt;Report building is not one task. It is a chain of decisions and artifacts.&lt;/p&gt;

&lt;p&gt;You plan the report. You design the experience. You create or connect the semantic model. You author the PBIR files. You reload and inspect the report. You manage the Fabric item.&lt;/p&gt;

&lt;p&gt;The plugin structure reflects that workflow instead of pretending one mega-prompt can do everything well.&lt;/p&gt;

&lt;p&gt;The plugin also declares a local MCP server for Power BI Modeling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"powerbi-modeling-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"@microsoft/powerbi-modeling-mcp@latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"--start"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2eulrfsvivl27fbqeu48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2eulrfsvivl27fbqeu48.png" alt="Power BI plugin manifest screenshot" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is where the ecosystem starts to become powerful.&lt;/p&gt;

&lt;p&gt;Skills provide the operating instructions. MCP gives the agent live tool access. PBIP and PBIR give the work a file-based shape. Git gives the work history. Power BI Desktop gives the rendered output. Fabric gives the deployment target.&lt;/p&gt;

&lt;p&gt;Put together, this becomes a real authoring loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to install it
&lt;/h2&gt;

&lt;p&gt;The install flow from Microsoft is short.&lt;/p&gt;

&lt;p&gt;First, register the Skills for Fabric marketplace in GitHub Copilot CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add microsoft/skills-for-fabric
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install the Power BI Authoring plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;powerbi-authoring@fabric-collection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want the broader Fabric bundle, Microsoft also documents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin &lt;span class="nb"&gt;install &lt;/span&gt;fabric-skills@fabric-collection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a focused Power BI report pilot, I would start with &lt;code&gt;powerbi-authoring@fabric-collection&lt;/code&gt; first. Keep the test narrow, prove the loop, then expand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this can actually do
&lt;/h2&gt;

&lt;p&gt;Microsoft showed three practical examples in the announcement.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create a report from scratch
&lt;/h3&gt;

&lt;p&gt;You can ask the agent to create report pages with KPIs, slicers, tables, branding, and page structure.&lt;/p&gt;

&lt;p&gt;For example, Microsoft’s demo prompt asks for an Opportunities page with revenue KPIs, slicers, and a table, then a Collabs page with offer status KPIs and filters.&lt;/p&gt;

&lt;p&gt;The agent uses the &lt;code&gt;powerbi-report-authoring&lt;/code&gt; skill to create Power BI report definitions in PBIR format.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmstrk27u7f7xf2qrqho1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmstrk27u7f7xf2qrqho1.png" alt="Power BI report created from scratch with agent skills" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a strong use case for the first draft of a report.&lt;/p&gt;

&lt;p&gt;Not the final report. The first structured draft.&lt;/p&gt;

&lt;p&gt;That alone can save a lot of time. Page scaffolding, KPI placement, slicer setup, table layout, and basic branding are not usually the highest-value part of BI work. They are necessary, but repetitive.&lt;/p&gt;

&lt;p&gt;If an agent can get the first 60 percent into a usable PBIR structure, the developer can spend more time on business logic, model quality, visual clarity, and stakeholder feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Modify an existing report from a prompt or reference image
&lt;/h3&gt;

&lt;p&gt;The announcement also shows the agent updating an existing report based on a reference image and logo.&lt;/p&gt;

&lt;p&gt;That means the workflow is not limited to greenfield reports.&lt;/p&gt;

&lt;p&gt;You can point the agent at an existing PBIP project, describe the visual change, provide a reference image, and let it apply the style to the report pages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnudbfra467kuybnar4to.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnudbfra467kuybnar4to.png" alt="Power BI report modified from reference image and logo" width="799" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where I see a lot of practical value.&lt;/p&gt;

&lt;p&gt;Every BI team has reports that are useful but visually inconsistent. Different fonts. Random colors. Misaligned objects. Slicers in five different places. KPI cards that grew organically over time.&lt;/p&gt;

&lt;p&gt;A good AI report assistant can help normalize those reports faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Modernize a messy report
&lt;/h3&gt;

&lt;p&gt;Microsoft’s third example is the one that will probably resonate with the most Power BI teams: modernize a report with better design.&lt;/p&gt;

&lt;p&gt;The prompt asks the agent to create a cleaner landing page, improve navigation, apply a consistent theme, reduce clutter, and make insights easier to scan.&lt;/p&gt;

&lt;p&gt;Behind the scenes, Microsoft says the agent uses the &lt;code&gt;powerbi-report-design&lt;/code&gt; skill to create a structured design brief, then passes that to the authoring skill for implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ff024jlu02o0fknlwg1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ff024jlu02o0fknlwg1.png" alt="Power BI report modernization with report design skill" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is exactly the kind of work where agent skills make sense.&lt;/p&gt;

&lt;p&gt;The work has patterns. The output is visible. The files are structured. The result can be reloaded and checked. The agent can iterate.&lt;/p&gt;

&lt;p&gt;That is a much better fit than asking an AI model to “make a dashboard better” with no real access to the report definition or rendered page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that makes this different: screenshots in the loop
&lt;/h2&gt;

&lt;p&gt;The feature I like most is the Desktop bridge.&lt;/p&gt;

&lt;p&gt;Microsoft describes a loop where the agent can reload the report in an already-open Power BI Desktop instance, capture screenshots of the latest report pages, inspect the rendered output, and make another pass.&lt;/p&gt;

&lt;p&gt;That changes the quality of the workflow.&lt;/p&gt;

&lt;p&gt;Without screenshots, an agent is editing JSON and hoping the report looks right.&lt;/p&gt;

&lt;p&gt;With screenshots, the agent can see the actual page.&lt;/p&gt;

&lt;p&gt;That matters for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;overlapping visuals&lt;/li&gt;
&lt;li&gt;bad alignment&lt;/li&gt;
&lt;li&gt;poor spacing&lt;/li&gt;
&lt;li&gt;unreadable labels&lt;/li&gt;
&lt;li&gt;broken image placement&lt;/li&gt;
&lt;li&gt;inconsistent card sizes&lt;/li&gt;
&lt;li&gt;visual clutter&lt;/li&gt;
&lt;li&gt;theme mismatch&lt;/li&gt;
&lt;li&gt;navigation layout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the same reason designers do not approve a report by reading JSON. They look at the rendered page.&lt;/p&gt;

&lt;p&gt;Giving the agent access to that rendered page is a big practical step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0a5av5v510j7fqbfcckt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0a5av5v510j7fqbfcckt.png" alt="Power BI end-to-end agentic workflow from Microsoft announcement" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Top use cases that can save real time
&lt;/h2&gt;

&lt;p&gt;Here are the use cases I would prioritize first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fboyzt0zjalwldmcw1rc1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fboyzt0zjalwldmcw1rc1.png" alt="Top use cases for Power BI agent skills" width="799" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. First draft report generation
&lt;/h3&gt;

&lt;p&gt;Give the agent a clear brief:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;audience&lt;/li&gt;
&lt;li&gt;pages&lt;/li&gt;
&lt;li&gt;KPIs&lt;/li&gt;
&lt;li&gt;slicers&lt;/li&gt;
&lt;li&gt;tables&lt;/li&gt;
&lt;li&gt;navigation&lt;/li&gt;
&lt;li&gt;required branding&lt;/li&gt;
&lt;li&gt;source semantic model&lt;/li&gt;
&lt;li&gt;examples of questions the report must answer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then let it generate the first PBIR structure.&lt;/p&gt;

&lt;p&gt;This is useful when the report shape is known but the build work is repetitive.&lt;/p&gt;

&lt;p&gt;Example prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a Power BI report for an executive sales pipeline review.

Use the Sales semantic model.

Page 1: Executive Overview
- KPI cards: Revenue Won, Revenue in Pipeline, Win Rate, Open Opportunities
- Trend: Revenue Won by Month
- Bar chart: Pipeline by Region
- Slicers: Region, Sales Owner, Close Month

Page 2: Opportunity Detail
- Table: Opportunity, Account, Owner, Stage, Risk, Expected Close Date, Revenue
- Add slicers for Stage and Risk
- Use a clean executive layout with strong navigation between pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The point is not to make the prompt poetic. The point is to make it operational.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Report modernization backlog
&lt;/h3&gt;

&lt;p&gt;Most organizations have a long tail of reports that people still use but nobody wants to redesign manually.&lt;/p&gt;

&lt;p&gt;This is a perfect pilot category.&lt;/p&gt;

&lt;p&gt;Pick five reports that are useful but ugly. Save them as PBIP. Ask the agent to improve one report at a time.&lt;/p&gt;

&lt;p&gt;Good prompts here are direct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Modernize this report for a monthly operations review.

Keep the same business meaning, but improve page structure, spacing, alignment, navigation, and visual hierarchy.

Create a cleaner landing page with the most important KPIs at the top.
Use a consistent theme across all pages.
Reduce clutter and make the page easier to scan in under 30 seconds.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the &lt;code&gt;powerbi-report-design&lt;/code&gt; skill should shine.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Brand and theme standardization
&lt;/h3&gt;

&lt;p&gt;If a company has many reports across teams, style drift becomes real.&lt;/p&gt;

&lt;p&gt;The agent can help apply a reference design, logo, color palette, or layout style more consistently.&lt;/p&gt;

&lt;p&gt;This is not only about making reports pretty. Consistent design reduces cognitive load. Users know where to look. Filters behave more predictably. Navigation feels familiar.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Semantic model plus report creation
&lt;/h3&gt;

&lt;p&gt;The Power BI report authoring skill can work with the Modeling MCP server and the semantic model authoring skill.&lt;/p&gt;

&lt;p&gt;That means the bigger workflow can become:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;inspect or create the semantic model&lt;/li&gt;
&lt;li&gt;define measures and relationships&lt;/li&gt;
&lt;li&gt;create report pages over that model&lt;/li&gt;
&lt;li&gt;reload in Desktop&lt;/li&gt;
&lt;li&gt;capture screenshots&lt;/li&gt;
&lt;li&gt;refine the report&lt;/li&gt;
&lt;li&gt;publish when ready&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is where the long-term value is.&lt;/p&gt;

&lt;p&gt;A report without a good semantic model is just a nice-looking surface over weak logic. Pairing report authoring with semantic model authoring is the right direction.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Screenshot-driven report QA
&lt;/h3&gt;

&lt;p&gt;The screenshot loop can save a lot of back-and-forth.&lt;/p&gt;

&lt;p&gt;A normal report iteration might look like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;change PBIR files&lt;/li&gt;
&lt;li&gt;open or reload Power BI Desktop&lt;/li&gt;
&lt;li&gt;check the page visually&lt;/li&gt;
&lt;li&gt;fix spacing or formatting&lt;/li&gt;
&lt;li&gt;repeat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the agent can reload, screenshot, inspect, and adjust, it can take over a chunk of that mechanical loop.&lt;/p&gt;

&lt;p&gt;That does not remove the BI developer. It gives the developer a faster loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Fabric publishing preparation
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;powerbi-report-management&lt;/code&gt; skill is aimed at managing Power BI report workspace items in Microsoft Fabric through the Fabric REST API.&lt;/p&gt;

&lt;p&gt;That includes creating, updating, downloading, and managing report definitions.&lt;/p&gt;

&lt;p&gt;For teams already using PBIP, Git, deployment pipelines, and Fabric workspaces, this could become part of a more automated report release workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  My first pilot: a practical playbook
&lt;/h2&gt;

&lt;p&gt;If I were testing this inside a real Power BI team, I would not start with the biggest executive dashboard in the company.&lt;/p&gt;

&lt;p&gt;I would start with one report that is valuable, visible, and safe to iterate on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1169nezgw6c52faik6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1169nezgw6c52faik6l.png" alt="Implementation playbook for Power BI agent skills" width="799" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: choose the right report
&lt;/h3&gt;

&lt;p&gt;Pick a report with these traits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;already has a working semantic model&lt;/li&gt;
&lt;li&gt;has 2 to 4 pages&lt;/li&gt;
&lt;li&gt;needs layout or usability improvement&lt;/li&gt;
&lt;li&gt;has clear business questions&lt;/li&gt;
&lt;li&gt;does not require complex custom visuals for the first test&lt;/li&gt;
&lt;li&gt;can be saved as PBIP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good pilot examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sales pipeline report&lt;/li&gt;
&lt;li&gt;inventory risk report&lt;/li&gt;
&lt;li&gt;operations review report&lt;/li&gt;
&lt;li&gt;finance month-end variance report&lt;/li&gt;
&lt;li&gt;support tickets and SLA report&lt;/li&gt;
&lt;li&gt;project portfolio status report&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid the monster report with 19 pages, 47 bookmarks, custom visuals, hidden pages, and years of business politics. That can come later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: save the report as PBIP
&lt;/h3&gt;

&lt;p&gt;The agent skills work with file-based Power BI report definitions. PBIP and PBIR are the important pieces here.&lt;/p&gt;

&lt;p&gt;That means the report should live in a project folder where the report definition can be edited, inspected, and committed.&lt;/p&gt;

&lt;p&gt;A simple structure might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sales-pipeline-report/
  Sales Pipeline.pbip
  Sales Pipeline.Report/
  Sales Pipeline.SemanticModel/
  briefs/
    report-brief.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a Git branch for the experiment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; ai-report-skills-sales-pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every change the agent makes has a place to live.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: write a real report brief
&lt;/h3&gt;

&lt;p&gt;The quality of the output will depend heavily on the quality of the brief.&lt;/p&gt;

&lt;p&gt;I would create a short &lt;code&gt;report-brief.md&lt;/code&gt; file before asking the agent to touch anything.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Sales Pipeline Report Brief&lt;/span&gt;

Audience: VP Sales, Sales Directors, Revenue Operations

Business goal:
Show pipeline health, revenue at risk, and opportunities that need attention this month.

Pages:
&lt;span class="p"&gt;1.&lt;/span&gt; Executive Overview
&lt;span class="p"&gt;2.&lt;/span&gt; Pipeline Detail
&lt;span class="p"&gt;3.&lt;/span&gt; Risk Review

Required KPIs:
&lt;span class="p"&gt;-&lt;/span&gt; Revenue Won
&lt;span class="p"&gt;-&lt;/span&gt; Revenue in Pipeline
&lt;span class="p"&gt;-&lt;/span&gt; Win Rate
&lt;span class="p"&gt;-&lt;/span&gt; Open Opportunities
&lt;span class="p"&gt;-&lt;/span&gt; At-Risk Revenue

Required slicers:
&lt;span class="p"&gt;-&lt;/span&gt; Region
&lt;span class="p"&gt;-&lt;/span&gt; Sales Owner
&lt;span class="p"&gt;-&lt;/span&gt; Close Month
&lt;span class="p"&gt;-&lt;/span&gt; Stage

Design direction:
Clean executive report. Strong KPI row. Simple navigation. Low clutter.
Use brand colors from theme.json.

Success criteria:
A VP should understand the pipeline status in 30 seconds.
A Sales Director should find at-risk opportunities without opening another report.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That kind of brief gives the agent something useful to work with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: ask the agent to plan first
&lt;/h3&gt;

&lt;p&gt;I would not start with “build the report.”&lt;/p&gt;

&lt;p&gt;I would start with planning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the Power BI report planning skill.
Read briefs/report-brief.md.
Inspect the semantic model metadata.
Propose the report page plan, required visuals, navigation structure, and any missing fields or measures.
Do not edit files yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This uses the planning skill for what it is good at: turning a request into a report specification.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: use design before authoring
&lt;/h3&gt;

&lt;p&gt;Then I would ask for a design brief:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the Power BI report design skill.
Create a design brief for this report.
Prioritize executive scanning, clean page hierarchy, consistent navigation, readable KPI cards, and low visual clutter.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is important because “create a report” and “create a good report experience” are not the same request.&lt;/p&gt;

&lt;p&gt;The design skill gives the authoring skill a better target.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: let the authoring skill create or modify PBIR
&lt;/h3&gt;

&lt;p&gt;Once the plan and design are clear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the Power BI report authoring skill.
Implement the approved report plan in PBIR.
Create the pages, visuals, slicers, navigation, and theme updates described in the design brief.
Validate the report definition after the first implementation pass.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the agent writes or updates the report files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: reload Desktop and capture screenshots
&lt;/h3&gt;

&lt;p&gt;Now the loop becomes visual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reload the report in Power BI Desktop.
Capture screenshots of each page.
Inspect the screenshots for layout, spacing, readability, navigation, and visual hierarchy.
Make one improvement pass based on the rendered output.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the part I would test hardest.&lt;/p&gt;

&lt;p&gt;If the screenshot loop works well, this becomes much more than a prompt-to-JSON tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: publish only after the artifact is clean
&lt;/h3&gt;

&lt;p&gt;When the report is in good shape, the management skill can help create or update report items in Fabric.&lt;/p&gt;

&lt;p&gt;That publishing step should come after the PBIR files, semantic model binding, screenshots, and report behavior are ready.&lt;/p&gt;

&lt;p&gt;A clean local loop first. Fabric publish second.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would measure in the pilot
&lt;/h2&gt;

&lt;p&gt;I would measure this like an engineering workflow, not like a novelty demo.&lt;/p&gt;

&lt;p&gt;For one report, track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;time to first useful draft&lt;/li&gt;
&lt;li&gt;number of manual layout fixes needed&lt;/li&gt;
&lt;li&gt;number of agent screenshot iterations&lt;/li&gt;
&lt;li&gt;PBIR validation issues&lt;/li&gt;
&lt;li&gt;semantic model issues discovered&lt;/li&gt;
&lt;li&gt;how much of the report structure was reusable&lt;/li&gt;
&lt;li&gt;whether the final output was easier to maintain than a manual build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best result is not “AI built everything.”&lt;/p&gt;

&lt;p&gt;The best result is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The team got to a useful, file-based, maintainable Power BI report faster, with more of the repetitive work handled by the agent.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a practical win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I think this goes next
&lt;/h2&gt;

&lt;p&gt;This is still preview, but the direction is obvious.&lt;/p&gt;

&lt;p&gt;Power BI development is moving toward a more code-aware, agent-aware workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PBIP makes reports file-based.&lt;/li&gt;
&lt;li&gt;PBIR makes report definitions more editable.&lt;/li&gt;
&lt;li&gt;TMDL makes semantic models more inspectable.&lt;/li&gt;
&lt;li&gt;MCP gives agents access to real tools.&lt;/li&gt;
&lt;li&gt;Skills give agents the right operating instructions.&lt;/li&gt;
&lt;li&gt;Desktop screenshots give agents feedback from rendered output.&lt;/li&gt;
&lt;li&gt;Fabric APIs give the workflow a deployment path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination is much more interesting than isolated AI features.&lt;/p&gt;

&lt;p&gt;It means a future Power BI workflow could look like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A business owner writes a report brief.&lt;/li&gt;
&lt;li&gt;An agent proposes the page plan.&lt;/li&gt;
&lt;li&gt;The agent creates the semantic model and report draft.&lt;/li&gt;
&lt;li&gt;Desktop screenshots drive the first visual refinement pass.&lt;/li&gt;
&lt;li&gt;The BI developer improves the model, measures, layout, and usability.&lt;/li&gt;
&lt;li&gt;The report is published to Fabric.&lt;/li&gt;
&lt;li&gt;The report definition remains in source control for future changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is a strong direction for teams that already want better engineering discipline around Power BI.&lt;/p&gt;

&lt;h2&gt;
  
  
  My take
&lt;/h2&gt;

&lt;p&gt;I am very excited about this direction.&lt;/p&gt;

&lt;p&gt;Power BI teams spend too much time on repetitive report setup, redesign cleanup, visual alignment, theme drift, and the boring mechanics around first drafts.&lt;/p&gt;

&lt;p&gt;Agent skills are a good fit for that work because the work is structured, file-based, visible, and iterative.&lt;/p&gt;

&lt;p&gt;The big idea is not “AI replaces Power BI developers.”&lt;/p&gt;

&lt;p&gt;The big idea is better:&lt;/p&gt;

&lt;p&gt;AI agents can now participate in the same report-building loop that Power BI developers already use: model, files, Desktop, screenshots, Git, and Fabric.&lt;/p&gt;

&lt;p&gt;That is where this becomes useful.&lt;/p&gt;

&lt;p&gt;Start with one PBIP report. Install the Power BI Authoring plugin. Give the agent a real report brief. Let it plan, design, author, reload, screenshot, and improve.&lt;/p&gt;

&lt;p&gt;If the loop works, you have something much more valuable than a demo.&lt;/p&gt;

&lt;p&gt;You have the beginning of an AI-assisted Power BI development workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Power-BI-Updates-Blog/AI-Powered-Power-BI-reporting-From-design-to-deployment-with/ba-p/5190703" rel="noopener noreferrer"&gt;Microsoft Power BI Updates Blog: AI-Powered Power BI reporting: From design to deployment with agent skills (Preview)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Fabric-Skills-for-GitHub-Copilot-Claude-and-CLI-built-by/ba-p/5190188" rel="noopener noreferrer"&gt;Microsoft Fabric Updates Blog: Fabric Skills for GitHub Copilot, Claude, and CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/skills-for-fabric" rel="noopener noreferrer"&gt;GitHub: microsoft/skills-for-fabric&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/skills-for-fabric/tree/main/plugins/powerbi-authoring" rel="noopener noreferrer"&gt;GitHub: Power BI Authoring plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/skills-for-fabric/blob/main/plugins/powerbi-authoring/skills/powerbi-report-authoring/SKILL.md" rel="noopener noreferrer"&gt;GitHub: Power BI report authoring skill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/skills-for-fabric/blob/main/plugins/powerbi-authoring/skills/powerbi-report-design/SKILL.md" rel="noopener noreferrer"&gt;GitHub: Power BI report design skill&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/power-bi/developer/mcp/" rel="noopener noreferrer"&gt;Power BI Modeling MCP documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>microsoftfabric</category>
      <category>ai</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Fabric IQ Is GA. This Is the Context Layer I’ve Been Waiting For.</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Thu, 04 Jun 2026 23:03:52 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/fabric-iq-is-ga-this-is-the-context-layer-ive-been-waiting-for-3c0c</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/fabric-iq-is-ga-this-is-the-context-layer-ive-been-waiting-for-3c0c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-06-04-fabric-iq-ga-context-layer.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-06-04-fabric-iq-ga-context-layer.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63aqyh4cuwg3qxf98g6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63aqyh4cuwg3qxf98g6b.png" alt="Fabric IQ context layer" width="800" height="1262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fabric IQ becoming generally available is one of the Fabric milestones I was waiting for.&lt;/p&gt;

&lt;p&gt;Not because the industry needed another AI announcement.&lt;/p&gt;

&lt;p&gt;Because production AI agents have been missing something very basic: a shared, governed understanding of the business.&lt;/p&gt;

&lt;p&gt;Most AI agent demos can answer a question if the prompt is clean, the data source is obvious, and the scope is small. That is useful for a demo. It is not enough for an enterprise workflow where the same customer, shipment, asset, incident, product, or KPI can mean different things across systems.&lt;/p&gt;

&lt;p&gt;Microsoft is positioning Fabric IQ as the shared context layer for people, applications, and AI agents. The GA announcement includes Fabric IQ as the production context layer, with Graph and Operations Agents generally available and Ontology continuing in preview.&lt;/p&gt;

&lt;p&gt;That nuance matters. The whole direction is production-facing, but not every individual piece has the same maturity label yet.&lt;/p&gt;

&lt;p&gt;My take: this is the moment where Fabric starts looking less like a reporting platform with AI features and more like an operating layer for business context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is strategically important
&lt;/h2&gt;

&lt;p&gt;AI agents do not fail only because the model is weak.&lt;/p&gt;

&lt;p&gt;They fail because the business context is scattered.&lt;/p&gt;

&lt;p&gt;One team defines active customer one way. Finance defines revenue another way. Operations tracks incidents in a different system. A report hides business logic in measures. A warehouse stores clean tables but not the real meaning behind the process. Then an agent is expected to reason across all of it.&lt;/p&gt;

&lt;p&gt;That is where things get risky.&lt;/p&gt;

&lt;p&gt;A production agent needs to know more than where the data lives. It needs to know what the business entities are, how they relate, which metrics are trusted, what rules apply, and which source owns the truth.&lt;/p&gt;

&lt;p&gt;Fabric IQ is Microsoft’s answer to that problem.&lt;/p&gt;

&lt;p&gt;The strategic shift is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Stop asking every agent, report, app, and workflow to rediscover business meaning from scratch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Define the context once. Govern it. Reuse it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Fabric IQ actually does
&lt;/h2&gt;

&lt;p&gt;Fabric IQ sits on top of the Fabric data foundation and gives business meaning to data that would otherwise live as tables, streams, events, reports, and models.&lt;/p&gt;

&lt;p&gt;Microsoft describes three connected layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Unified data in OneLake
&lt;/h3&gt;

&lt;p&gt;OneLake gives Fabric IQ the common data foundation. Analytical data, operational data, shortcuts, lakehouses, warehouses, semantic models, and other Fabric items can participate in the same platform story.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Business intelligence through semantic models
&lt;/h3&gt;

&lt;p&gt;Power BI semantic models already hold a lot of trusted business logic: measures, hierarchies, dimensions, relationships, and KPI definitions.&lt;/p&gt;

&lt;p&gt;Fabric IQ does not throw that away. It uses semantic models as part of the context layer. You can generate or align ontology from semantic models so the business language used in reports can also ground agents and applications.&lt;/p&gt;

&lt;p&gt;Many companies already spent years building trusted semantic models. The smart move is to reuse that logic, not rebuild it in prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Operational intelligence through ontology and graph
&lt;/h3&gt;

&lt;p&gt;This is the part that gets interesting.&lt;/p&gt;

&lt;p&gt;Ontology defines business entities, properties, relationships, rules, and actions. Think Customer, Shipment, Store, Sensor, Order, Contract, Incident, and Asset.&lt;/p&gt;

&lt;p&gt;Graph makes connected data explicit and queryable. Instead of asking an agent to guess how things relate through joins and table names, relationships can become first-class business context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6081evatq6g3bj216pk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz6081evatq6g3bj216pk.png" alt="Fabric IQ context stack" width="800" height="1598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I like most: agents can stop guessing relationships
&lt;/h2&gt;

&lt;p&gt;Graph in Fabric is now generally available. Relationship-first modeling is no longer just a nice preview idea sitting outside the core platform conversation.&lt;/p&gt;

&lt;p&gt;For AI agents, relationships are not decoration.&lt;/p&gt;

&lt;p&gt;They are the difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Show sales by customer”&lt;/li&gt;
&lt;li&gt;“Which customers are affected by a supplier delay through the products they bought and the shipments currently in transit?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first question is normal BI.&lt;/p&gt;

&lt;p&gt;The second question needs relationships, paths, dependencies, and business meaning. It needs to understand how entities connect across domains.&lt;/p&gt;

&lt;p&gt;Traditional joins can answer some of this, but they usually hide the relationship logic in technical implementation. Graph and ontology make those relationships explicit enough for humans to review and for agents to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  A mini tutorial: how I would start small
&lt;/h2&gt;

&lt;p&gt;I would not start a Fabric IQ pilot by modeling the whole company.&lt;/p&gt;

&lt;p&gt;That is how architecture diagrams become shelfware.&lt;/p&gt;

&lt;p&gt;I would start with one narrow process where the relationships matter.&lt;/p&gt;

&lt;p&gt;Example: retail inventory risk.&lt;/p&gt;

&lt;p&gt;The business question could be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which stores are at risk because a high-revenue product has low inventory, recent demand is increasing, and the supplier is already delayed?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a good Fabric IQ candidate because it crosses entities and systems: Store, Product, Inventory, SaleEvent, Supplier, Shipment, and DelayReason.&lt;/p&gt;

&lt;p&gt;Here is the smallest practical path I would use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: start from a trusted semantic model or OneLake data
&lt;/h3&gt;

&lt;p&gt;If a Power BI semantic model already has clean relationships and trusted measures, use it as the starting point and generate an ontology from it. If not, create the ontology directly from OneLake sources.&lt;/p&gt;

&lt;p&gt;Do not bring every table. Pick the few entities needed for the first business question.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: rename technical objects into business language
&lt;/h3&gt;

&lt;p&gt;This is not cosmetic.&lt;/p&gt;

&lt;p&gt;An agent should not reason over &lt;code&gt;dimproducts&lt;/code&gt;, &lt;code&gt;factsales&lt;/code&gt;, and &lt;code&gt;store_id&lt;/code&gt; as the primary business language.&lt;/p&gt;

&lt;p&gt;Rename entity types into business terms such as Product, Store, SaleEvent, Supplier, and Shipment. Choose stable keys. Bind properties from source data. Define relationships like Store sells Product, Supplier ships Product, Shipment supplies Store.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: bind data and verify relationships
&lt;/h3&gt;

&lt;p&gt;Data binding connects the ontology definitions to real OneLake data.&lt;/p&gt;

&lt;p&gt;Before connecting an agent, I would check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are entity keys correct?&lt;/li&gt;
&lt;li&gt;Are the important properties bound?&lt;/li&gt;
&lt;li&gt;Are relationship directions understandable?&lt;/li&gt;
&lt;li&gt;Are source systems documented?&lt;/li&gt;
&lt;li&gt;Is there an owner for each business concept?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: connect a Fabric Data Agent
&lt;/h3&gt;

&lt;p&gt;Create a Fabric Data Agent and add the ontology as a source.&lt;/p&gt;

&lt;p&gt;Then test questions that force relationship reasoning, not just lookup behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which stores have low inventory for products with rising revenue in the last 14 days?

Which delayed shipments affect high-revenue products?

Which suppliers are connected to the most at-risk stores this week?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to prove that the agent is using governed business context instead of guessing from table names.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw25gpy1iyiplu592hxq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw25gpy1iyiplu592hxq2.png" alt="Fabric IQ mini tutorial path" width="800" height="1268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The governance question teams should ask first
&lt;/h2&gt;

&lt;p&gt;Fabric IQ will be powerful for teams that treat it like infrastructure.&lt;/p&gt;

&lt;p&gt;It will become confusing for teams that treat it like another AI feature.&lt;/p&gt;

&lt;p&gt;Before I would let an ontology-backed agent near production, I would want clear answers to these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which business concepts are in scope?&lt;/li&gt;
&lt;li&gt;Who owns each entity definition?&lt;/li&gt;
&lt;li&gt;Which semantic model or source system is trusted?&lt;/li&gt;
&lt;li&gt;Which relationships are reviewed by the domain owner?&lt;/li&gt;
&lt;li&gt;Which agents can use this context?&lt;/li&gt;
&lt;li&gt;What actions are allowed?&lt;/li&gt;
&lt;li&gt;How do we test whether the agent used the right definition?&lt;/li&gt;
&lt;li&gt;What changes when the ontology changes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the same lesson as semantic models, but with higher stakes.&lt;/p&gt;

&lt;p&gt;A bad measure can create a bad report. A bad ontology can create a bad agent decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  My takeaway
&lt;/h2&gt;

&lt;p&gt;Fabric IQ going GA is not just another Fabric announcement.&lt;/p&gt;

&lt;p&gt;It is a signal that Microsoft is building the missing layer between data platforms and production AI agents: business context that can be modeled, governed, queried, reused, and connected to action.&lt;/p&gt;

&lt;p&gt;That is why I was waiting for this milestone.&lt;/p&gt;

&lt;p&gt;Semantic models gave BI teams a trusted language for reporting.&lt;/p&gt;

&lt;p&gt;Fabric IQ pushes that idea further: a trusted context layer for agents, planning, graph reasoning, and applications.&lt;/p&gt;

&lt;p&gt;The opportunity is huge, but the implementation discipline matters.&lt;/p&gt;

&lt;p&gt;Start with one business process, one ontology, one trusted semantic model or OneLake source, one narrow agent scenario, and one owner who can say whether the answer makes sense.&lt;/p&gt;

&lt;p&gt;That is how Fabric IQ becomes useful infrastructure instead of another impressive demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/iq/overview" rel="noopener noreferrer"&gt;Microsoft Learn: What is Fabric IQ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/iq/ontology/overview" rel="noopener noreferrer"&gt;Microsoft Learn: What is Ontology in Fabric IQ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/iq/ontology/tutorial-4-create-data-agent" rel="noopener noreferrer"&gt;Microsoft Learn: Consume Ontology from Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/graph/overview" rel="noopener noreferrer"&gt;Microsoft Learn: What is Graph in Microsoft Fabric?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Fabric-IQ-The-shared-context-layer-for-AI-agents-and-real-time/ba-p/5191678" rel="noopener noreferrer"&gt;Microsoft Fabric Updates Blog: Fabric IQ as the shared context layer for AI agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Fabric-IQ-The-semantic-layer-powering-trusted-AI-agents-at/ba-p/5190739" rel="noopener noreferrer"&gt;Microsoft Fabric Updates Blog: Fabric IQ, the semantic layer powering trusted AI agents at enterprise scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Graph-in-Fabric-Generally-Available/ba-p/5190748" rel="noopener noreferrer"&gt;Microsoft Fabric Updates Blog: Graph in Fabric Generally Available&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>aiagents</category>
      <category>powerbi</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Fabric Business Events Just Became an Architecture Pattern</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Mon, 01 Jun 2026 23:28:15 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/fabric-business-events-just-became-an-architecture-pattern-3gbd</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/fabric-business-events-just-became-an-architecture-pattern-3gbd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-06-01-fabric-business-events-architecture-guide.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-06-01-fabric-business-events-architecture-guide.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A Business Event is a meaningful business signal that says something important happened and that another process, person, dashboard, model, or workflow may need to react.&lt;/p&gt;

&lt;p&gt;That sounds simple, but the distinction matters.&lt;/p&gt;

&lt;p&gt;A raw technical event might say a row changed, a sensor value moved, or a query returned a result. A Business Event should describe a business moment: a shipment was delayed, a high-value order is ready, a payment failed, or a demand forecast moved outside tolerance.&lt;/p&gt;

&lt;p&gt;That is why the latest Fabric Business Events update is more than another alerting feature.&lt;/p&gt;

&lt;p&gt;It moves Business Events closer to a real architecture pattern for turning operational signals into governed, reusable events that analytics, automation, AI, and business workflows can all consume.&lt;/p&gt;

&lt;p&gt;The update matters because it expands the pattern in four directions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eventstream can publish Business Events from operational streams.&lt;/li&gt;
&lt;li&gt;Activator can publish Business Events when a condition is detected.&lt;/li&gt;
&lt;li&gt;Eventhouse and Real-Time Dashboards can analyze Business Events as persistent, queryable history.&lt;/li&gt;
&lt;li&gt;Business Events now have clearer capacity consumption behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The short version: this is no longer just alerting. It is event modeling for business operations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u81q11mljkmfp0lsifc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u81q11mljkmfp0lsifc.png" alt="Fabric Business Events architecture flow" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually new
&lt;/h2&gt;

&lt;p&gt;The June 2026 update makes Business Events more practical across publishers, consumers, history, and cost ownership.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Eventstream can publish Business Events
&lt;/h3&gt;

&lt;p&gt;Eventstream can act as the signal-processing layer.&lt;/p&gt;

&lt;p&gt;Instead of sending raw telemetry, CDC rows, or low-level operational messages to every downstream process, teams can filter, enrich, correlate, and publish a named business event.&lt;/p&gt;

&lt;p&gt;That matters because downstream consumers should not need to know every detail of the source system.&lt;/p&gt;

&lt;p&gt;A raw event might say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;order_status_changed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A business event should say something closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HighValueOrderReadyForFulfillment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second one carries intent. It tells the organization what happened and why someone should care.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Activator can publish Business Events
&lt;/h3&gt;

&lt;p&gt;Activator is no longer only a consumer that reacts to events.&lt;/p&gt;

&lt;p&gt;With the preview capability, Activator can detect a condition and publish a Business Event into Real-Time Hub.&lt;/p&gt;

&lt;p&gt;That condition can come from places like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Power BI report&lt;/li&gt;
&lt;li&gt;a Real-Time Dashboard&lt;/li&gt;
&lt;li&gt;a KQL query&lt;/li&gt;
&lt;li&gt;a Fabric Warehouse SQL query&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is important because many business signals are not born as clean source-system events. They are detected from data.&lt;/p&gt;

&lt;p&gt;A downtime indicator, fraud pattern, SLA breach, or inventory threshold may only become meaningful after a query or rule evaluates current state. Activator can turn that detection into a governed event other teams can discover and consume.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Eventhouse gives Business Events memory
&lt;/h3&gt;

&lt;p&gt;Business Events can now be analyzed in Eventhouse and surfaced through Real-Time Dashboards.&lt;/p&gt;

&lt;p&gt;That changes the operating model.&lt;/p&gt;

&lt;p&gt;If events only trigger actions, teams can react in the moment but struggle to learn from the pattern. If events are also stored in Eventhouse, teams can ask better questions later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How often did this event happen?&lt;/li&gt;
&lt;li&gt;Which customers, products, regions, or systems were affected?&lt;/li&gt;
&lt;li&gt;Did the event rate change after a deployment?&lt;/li&gt;
&lt;li&gt;Which events usually happen together?&lt;/li&gt;
&lt;li&gt;Should this event feed a model, a dashboard, or an automation?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft says each Business Event maps to a dedicated KQL table in Eventhouse, with no extra pipelines or manual configuration required. That is the part that makes the feature more interesting for analytics teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Capacity ownership is now part of the design
&lt;/h3&gt;

&lt;p&gt;Business Events now follow a consumption model aligned with Azure and Fabric events.&lt;/p&gt;

&lt;p&gt;The update describes two operation types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event operations per event, covering publish, filtering, and delivery.&lt;/li&gt;
&lt;li&gt;Event listener per hour, charged while a consumer is actively listening.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The split matters.&lt;/p&gt;

&lt;p&gt;Publish operations are charged to the Event Schema Set item. Filtering and delivery are charged to the consumer capacity, such as Activator or Eventhouse. Listener time is also charged to the consumer capacity.&lt;/p&gt;

&lt;p&gt;That means event design is also a cost design. If every noisy technical signal becomes a Business Event, the architecture gets expensive and hard to reason about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture pattern I would use
&lt;/h2&gt;

&lt;p&gt;I would not start with the alert.&lt;/p&gt;

&lt;p&gt;I would start with the event contract.&lt;/p&gt;

&lt;p&gt;A Business Event should describe a meaningful change in business state, not every technical thing that happened along the way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq0sedivi397tzmm3q4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxq0sedivi397tzmm3q4d.png" alt="What changed in Fabric Business Events" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the practical pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: decide if this is really a Business Event
&lt;/h2&gt;

&lt;p&gt;Not every event deserves the label.&lt;/p&gt;

&lt;p&gt;A Business Event should pass three tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 1: Does the business care when it happens?
&lt;/h3&gt;

&lt;p&gt;Good examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PaymentFailed&lt;/li&gt;
&lt;li&gt;ShipmentDelayed&lt;/li&gt;
&lt;li&gt;HighValueOrderDetected&lt;/li&gt;
&lt;li&gt;RefundIssued&lt;/li&gt;
&lt;li&gt;DemandForecastDeviationDetected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Weak examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DiskReadError&lt;/li&gt;
&lt;li&gt;MemoryUsagePercent&lt;/li&gt;
&lt;li&gt;CurrentTemperature&lt;/li&gt;
&lt;li&gt;UnhandledExceptionLogged&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those weak examples may still matter. They may belong in telemetry, monitoring, or observability. But they are not automatically Business Events.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 2: Should more than one consumer care?
&lt;/h3&gt;

&lt;p&gt;If the signal only feeds one internal process, a direct integration may be enough.&lt;/p&gt;

&lt;p&gt;If the same event could feed operations, analytics, automation, support, finance, or AI workflows, a Business Event starts to make sense.&lt;/p&gt;

&lt;p&gt;This is where the decoupling matters. The publisher emits one governed event. Multiple consumers can subscribe without changing the original publisher.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 3: Can you name it without describing the implementation?
&lt;/h3&gt;

&lt;p&gt;A good Business Event name should sound like a business fact, not a pipeline step.&lt;/p&gt;

&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CustomerCreditLimitExceeded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Weaker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SqlQueryReturnedRows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first one is a business state. The second one is an implementation detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: define the event contract before the flow
&lt;/h2&gt;

&lt;p&gt;This is where teams often skip a step.&lt;/p&gt;

&lt;p&gt;They build the stream, wire the alert, and only then realize every consumer needs a slightly different payload.&lt;/p&gt;

&lt;p&gt;That creates a familiar mess: field remapping, version drift, unclear ownership, and consumers guessing what the event means.&lt;/p&gt;

&lt;p&gt;The Business Events documentation points to Schema Registry as the shared source for event schemas. That should be treated as the contract layer.&lt;/p&gt;

&lt;p&gt;For each Business Event, define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;event name&lt;/li&gt;
&lt;li&gt;business meaning&lt;/li&gt;
&lt;li&gt;owner&lt;/li&gt;
&lt;li&gt;source system or publisher&lt;/li&gt;
&lt;li&gt;schema version&lt;/li&gt;
&lt;li&gt;required fields&lt;/li&gt;
&lt;li&gt;optional fields&lt;/li&gt;
&lt;li&gt;event time and processing time&lt;/li&gt;
&lt;li&gt;correlation identifiers&lt;/li&gt;
&lt;li&gt;consumer expectations&lt;/li&gt;
&lt;li&gt;retention and analysis needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful minimum payload might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ShipmentDelayed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"eventTime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-01T18:04:09Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"shipmentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SHP-104920"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CUST-8841"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"delayReason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CarrierCapacity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"estimatedDelayMinutes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceSystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FulfillmentPlatform"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"correlationId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c9a4f4b2-8f3a-4f0c-9de1-9ab2d7c81240"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That payload is small, but it gives consumers enough context to act, analyze, and trace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: choose the right publisher
&lt;/h2&gt;

&lt;p&gt;The new update makes this decision more interesting.&lt;/p&gt;

&lt;p&gt;Use Eventstream when the signal starts as operational stream data.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CDC rows from an operational database&lt;/li&gt;
&lt;li&gt;IoT or device events&lt;/li&gt;
&lt;li&gt;Kafka or Event Hubs messages&lt;/li&gt;
&lt;li&gt;incoming application events&lt;/li&gt;
&lt;li&gt;high-volume signals that need filtering or enrichment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use Activator when the signal is detected from a condition.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Power BI report threshold&lt;/li&gt;
&lt;li&gt;a KQL query result&lt;/li&gt;
&lt;li&gt;a warehouse query condition&lt;/li&gt;
&lt;li&gt;a real-time dashboard rule&lt;/li&gt;
&lt;li&gt;a business condition that only exists after evaluation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use Notebook or User Data Functions when the event requires custom logic.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model scoring&lt;/li&gt;
&lt;li&gt;enrichment&lt;/li&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;business rule evaluation&lt;/li&gt;
&lt;li&gt;more complex event generation logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is to avoid treating all publishers the same. A publisher is not just a connection point. It defines where the event becomes meaningful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: separate action from history
&lt;/h2&gt;

&lt;p&gt;This is the part I like most in the update.&lt;/p&gt;

&lt;p&gt;Business Events can trigger action through consumers like Activator, Power Automate, notebooks, Spark jobs, Dataflows Gen2, or custom logic. But they can also land in Eventhouse for historical analysis.&lt;/p&gt;

&lt;p&gt;That separation is healthy.&lt;/p&gt;

&lt;p&gt;Action answers: what should happen now?&lt;/p&gt;

&lt;p&gt;History answers: what keeps happening, where, and why?&lt;/p&gt;

&lt;p&gt;If you only build action, you get automation without learning.&lt;/p&gt;

&lt;p&gt;If you only build history, you get dashboards without response.&lt;/p&gt;

&lt;p&gt;The better design does both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: put capacity in the design review
&lt;/h2&gt;

&lt;p&gt;Capacity should not be a surprise after go-live.&lt;/p&gt;

&lt;p&gt;For every Business Event, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many events per hour do we expect?&lt;/li&gt;
&lt;li&gt;Which consumers will listen continuously?&lt;/li&gt;
&lt;li&gt;Which capacity pays for publishing?&lt;/li&gt;
&lt;li&gt;Which capacity pays for filtering, delivery, and listening?&lt;/li&gt;
&lt;li&gt;Do we need every event, or only state changes that matter?&lt;/li&gt;
&lt;li&gt;Is this event too noisy for a business-level contract?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially important when teams convert raw streams into Business Events. The point is not to rename telemetry. The point is to publish meaningful moments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsidr9j8c3j8m5eksdx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjsidr9j8c3j8m5eksdx7.png" alt="Business Events design checklist" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical checklist before you ship
&lt;/h2&gt;

&lt;p&gt;Before I would put a Fabric Business Event into production, I would check this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The event has a clear business name.&lt;/li&gt;
&lt;li&gt;The event has an owner.&lt;/li&gt;
&lt;li&gt;The schema is defined before consumers are built.&lt;/li&gt;
&lt;li&gt;The schema includes event time, source, and correlation ID.&lt;/li&gt;
&lt;li&gt;Eventstream, Activator, Notebook, or UDF was chosen intentionally.&lt;/li&gt;
&lt;li&gt;At least one consumer has a real business action.&lt;/li&gt;
&lt;li&gt;Eventhouse history is useful, not just stored by default.&lt;/li&gt;
&lt;li&gt;Real-Time Dashboard visuals answer operational questions.&lt;/li&gt;
&lt;li&gt;Capacity ownership is documented.&lt;/li&gt;
&lt;li&gt;No raw telemetry stream is being disguised as a business event.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last point is the trap.&lt;/p&gt;

&lt;p&gt;Business Events are valuable when they create shared business language. They become expensive noise when every technical signal gets promoted without a contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits in Fabric architecture
&lt;/h2&gt;

&lt;p&gt;Fabric is slowly closing the gap between analytics and operational response.&lt;/p&gt;

&lt;p&gt;Power BI reports can surface conditions.&lt;/p&gt;

&lt;p&gt;Activator can detect and act.&lt;/p&gt;

&lt;p&gt;Eventstream can shape operational signals.&lt;/p&gt;

&lt;p&gt;Real-Time Hub can organize event discovery.&lt;/p&gt;

&lt;p&gt;Eventhouse can preserve and query event history.&lt;/p&gt;

&lt;p&gt;Real-Time Dashboards can show live operational state.&lt;/p&gt;

&lt;p&gt;The architecture question is no longer only “can Fabric send an alert?”&lt;/p&gt;

&lt;p&gt;The better question is: which business events deserve to become reusable contracts across the data platform?&lt;/p&gt;

&lt;p&gt;That is where this feature becomes useful.&lt;/p&gt;

&lt;p&gt;Not because alerts got prettier.&lt;/p&gt;

&lt;p&gt;Because Fabric is giving teams a way to model business moments as governed, discoverable, queryable events.&lt;/p&gt;

&lt;p&gt;Used carefully, that can reduce the distance between data, action, and learning.&lt;/p&gt;

&lt;p&gt;Used casually, it becomes another stream of noise.&lt;/p&gt;

&lt;p&gt;The difference is the contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/What-s-new-in-Fabric-Business-Events/ba-p/5189137" rel="noopener noreferrer"&gt;Microsoft Fabric Updates Blog: What’s new in Fabric Business Events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/real-time-hub/business-events/business-events-overview" rel="noopener noreferrer"&gt;Microsoft Learn: Business Events Overview in Fabric Real-Time Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/real-time-intelligence/event-streams/overview" rel="noopener noreferrer"&gt;Microsoft Learn: Microsoft Fabric Eventstreams Overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>realtime</category>
      <category>dataengineering</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Build Power BI Columns That Adapt to Each User</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Thu, 28 May 2026 22:35:27 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/build-power-bi-columns-that-adapt-to-each-user-35p8</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/build-power-bi-columns-that-adapt-to-each-user-35p8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-28-user-aware-calculated-columns-power-bi.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-28-user-aware-calculated-columns-power-bi.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxm5bppru9spd74kh3oa8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxm5bppru9spd74kh3oa8.png" alt="Power BI Expression Context setting showing Standard and User Context" width="770" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Power BI calculated columns are getting a new design option that is easy to underestimate.&lt;/p&gt;

&lt;p&gt;The setting is called &lt;strong&gt;Expression Context&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The option is &lt;strong&gt;User Context&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The result is a calculated column that can be evaluated at query time, under the security context of the user who is running the report.&lt;/p&gt;

&lt;p&gt;That opens a useful set of patterns for semantic model authors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;values that change by user culture&lt;/li&gt;
&lt;li&gt;row-level calculations that do not need to be stored as physical columns&lt;/li&gt;
&lt;li&gt;sensitive values that can stay visible to admins and blank for restricted users&lt;/li&gt;
&lt;li&gt;Direct Lake and Import models that need cleaner control over calculated column materialization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The feature is still preview territory, so I would not treat it as a casual modeling shortcut. But it is already worth understanding because it changes how we think about calculated columns in Power BI.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://www.sqlbi.com/articles/introducing-user-aware-calculated-columns-in-power-bi/" rel="noopener noreferrer"&gt;SQLBI: Introducing user-aware calculated columns in Power BI&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes with User Context
&lt;/h2&gt;

&lt;p&gt;A standard calculated column is evaluated when the table is processed.&lt;/p&gt;

&lt;p&gt;In Import mode, the result is stored in the semantic model. Once it is processed, the value is the same for every user who queries the model.&lt;/p&gt;

&lt;p&gt;A user-aware calculated column changes that behavior.&lt;/p&gt;

&lt;p&gt;When &lt;strong&gt;Expression Context&lt;/strong&gt; is set to &lt;strong&gt;User Context&lt;/strong&gt;, the expression is evaluated at query time. It runs under the active user security context, and it can use user-aware DAX functions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;USERCULTURE()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USERPRINCIPALNAME()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USEROBJECTID()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USERNAME()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CUSTOMDATA()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means the column can still behave like a column in the model, but the value can depend on who is asking the question.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7gjbi4jvw1u0qn0mk7g1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7gjbi4jvw1u0qn0mk7g1.png" alt="User Context design pattern for semantic model authors" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would think about it as a semantic model design tool, not only as a localization feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 1: build reports that speak the user language
&lt;/h2&gt;

&lt;p&gt;The cleanest first use case is localization.&lt;/p&gt;

&lt;p&gt;A Date table can expose month names or day names that change based on the user's culture. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Month =
FORMAT (
    DATE ( 2020, 'Date'[Month Number], 1 ),
    "mmmm",
    USERCULTURE()
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the user culture is English, the report can show January.&lt;/p&gt;

&lt;p&gt;If the user culture is French, the same column can show janvier.&lt;/p&gt;

&lt;p&gt;The model does not need separate month-name columns for every language. The expression can return the correct value at query time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuy1iz4m0znonmpmhg0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuy1iz4m0znonmpmhg0n.png" alt="Power BI report showing localized values for English and French users" width="799" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where the feature becomes practical. Many organizations serve the same report to users in different regions. The metadata translation story already exists for names of tables, columns, and measures. User-aware calculated columns add another piece: values inside the model can adapt too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The slicer detail that matters
&lt;/h2&gt;

&lt;p&gt;Localization creates a subtle modeling problem.&lt;/p&gt;

&lt;p&gt;If a slicer stores the selected value as translated text, that selection may not survive when the same report is viewed in another culture.&lt;/p&gt;

&lt;p&gt;For example, a slicer selection of &lt;code&gt;Sunday&lt;/code&gt; does not match &lt;code&gt;dimanche&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The better design is to let the user see the translated label but keep the selection anchored to a stable key, such as &lt;code&gt;Day of Week Number&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That is where &lt;strong&gt;Sort by Column&lt;/strong&gt; and &lt;strong&gt;Group By Columns&lt;/strong&gt; matter.&lt;/p&gt;

&lt;p&gt;SQLBI shows the TMDL version clearly:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcxhr32rsrx9b6n18hge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftcxhr32rsrx9b6n18hge.png" alt="TMDL definition showing expressionContext userContext and related column details" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The principle is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;display the user-aware text column&lt;/li&gt;
&lt;li&gt;sort it by a numeric column&lt;/li&gt;
&lt;li&gt;group it by the stable numeric identifier&lt;/li&gt;
&lt;li&gt;avoid storing report selections as translated strings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between a nice demo and a report that behaves correctly across languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 2: create virtual columns for row-level calculations
&lt;/h2&gt;

&lt;p&gt;The second pattern is less obvious and probably more important for model design.&lt;/p&gt;

&lt;p&gt;A user-aware calculated column is not materialized in Import mode. It exists in the model, but its values are not stored as a physical column in memory.&lt;/p&gt;

&lt;p&gt;That can be useful for simple row-level expressions.&lt;/p&gt;

&lt;p&gt;A common example is line amount:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Line Amount = Sales[Quantity] * Sales[Net Price]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As a standard calculated column, that expression creates another stored column. If the table is large and the value has high cardinality, the column can add memory and processing cost.&lt;/p&gt;

&lt;p&gt;As a User Context column, the same expression can behave more like a virtual column. It remains available to visuals, filters, slicers, and measures, but it does not need to be stored in the model.&lt;/p&gt;

&lt;p&gt;This is useful when the expression is simple enough for the engine to compute efficiently during query execution.&lt;/p&gt;

&lt;p&gt;Good candidates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;arithmetic on columns from the same table&lt;/li&gt;
&lt;li&gt;simple classifications with stable input columns&lt;/li&gt;
&lt;li&gt;labels or helper columns that are useful to report authors&lt;/li&gt;
&lt;li&gt;logic that benefits from being a field, not only a measure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Poor candidates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;complex row-by-row DAX&lt;/li&gt;
&lt;li&gt;expressions that call expensive table functions&lt;/li&gt;
&lt;li&gt;logic that triggers formula engine callbacks at scale&lt;/li&gt;
&lt;li&gt;anything that has not been tested with realistic data volume&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical takeaway: User Context can reduce stored model bloat, but it moves work to query time. That tradeoff needs measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 3: keep one report layout while hiding sensitive values
&lt;/h2&gt;

&lt;p&gt;The third pattern is security-aware modeling.&lt;/p&gt;

&lt;p&gt;Object-level security can hide a column completely. That is sometimes the right answer, but it can break report visuals that reference the hidden column.&lt;/p&gt;

&lt;p&gt;User-aware calculated columns give another option for some scenarios: keep the column available in the report, but return blank values for restricted users.&lt;/p&gt;

&lt;p&gt;SQLBI demonstrates this with income bracket data.&lt;/p&gt;

&lt;p&gt;The supporting table stores the sensitive value. RLS blocks that table for restricted users. A user-aware calculated column uses &lt;code&gt;LOOKUPVALUE()&lt;/code&gt; to bring the value into the visible table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fr6xddklckl4wincvmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fr6xddklckl4wincvmy.png" alt="Power BI model view with Sales, Customer, and CustomerIncome tables" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key design choice is that the sensitive lookup table stays disconnected from the main customer table.&lt;/p&gt;

&lt;p&gt;That matters because the RLS filter should block the lookup result. It should not propagate through relationships and remove the customer rows or sales rows from the report.&lt;/p&gt;

&lt;p&gt;For an admin user, the report can show the income bracket values:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr7126nber2a1kg1ig4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr7126nber2a1kg1ig4s.png" alt="Power BI matrix showing sales by income bracket for admin users" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a restricted user, the same report still renders, but the sensitive values become blank:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7dyw43vb12m6ce91xio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7dyw43vb12m6ce91xio.png" alt="Power BI matrix under View as role showing blank income bracket values" width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not a replacement for every object-level security scenario. Restricted users can still see that the column exists. But for reports where the layout must keep working while sensitive values are redacted, it is a useful pattern to test.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would evaluate this in a real model
&lt;/h2&gt;

&lt;p&gt;I would not start by asking, "Can this replace my calculated columns?"&lt;/p&gt;

&lt;p&gt;I would start with these questions:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Does the value need to change by user?
&lt;/h3&gt;

&lt;p&gt;If the expression depends on culture, identity, role, or security context, User Context may be the right design.&lt;/p&gt;

&lt;p&gt;If every user should see the same value, be more careful. The only benefit may be avoiding materialization, and that creates a query-time cost tradeoff.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Is this a value users need as a field?
&lt;/h3&gt;

&lt;p&gt;Measures are great for aggregations.&lt;/p&gt;

&lt;p&gt;Columns are useful when report authors need a field for slicers, filters, grouping, or visual axes.&lt;/p&gt;

&lt;p&gt;User-aware calculated columns can fill a gap where the logic needs to live as a field, but the model author does not want to store another physical column.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Can the expression run cheaply at query time?
&lt;/h3&gt;

&lt;p&gt;Simple arithmetic is a better candidate than complex DAX.&lt;/p&gt;

&lt;p&gt;A virtual column that saves memory but slows every report page is not a win.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Have you tested role behavior?
&lt;/h3&gt;

&lt;p&gt;For security-aware patterns, test with &lt;strong&gt;View as role&lt;/strong&gt; before trusting the design.&lt;/p&gt;

&lt;p&gt;Check that restricted users see blanks where expected, and that the rest of the report still returns the correct rows.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Are selections stable across languages?
&lt;/h3&gt;

&lt;p&gt;If the value is localized, do not let the visible label become the identity of the selection.&lt;/p&gt;

&lt;p&gt;Use stable keys for grouping and sorting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits with the May 2026 Power BI update
&lt;/h2&gt;

&lt;p&gt;The May 2026 Power BI update includes several modeling and reporting changes around Copilot, visual calculations, custom totals, report summaries, and locale behavior.&lt;/p&gt;

&lt;p&gt;One line in the Microsoft update is especially relevant here: default format string locale affects visual display, while &lt;code&gt;USERCULTURE()&lt;/code&gt; and metadata translations still use the viewer's browser locale.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;Power BI is giving model authors more control over where logic lives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;visual layer logic with visual calculations&lt;/li&gt;
&lt;li&gt;semantic model logic with DAX, TMDL, and PBIP&lt;/li&gt;
&lt;li&gt;AI readiness metadata with Prep data for AI&lt;/li&gt;
&lt;li&gt;user-aware values with Expression Context and User Context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The direction is clear: the semantic model is becoming more programmable, more reviewable, and more sensitive to the context of the person consuming the report.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://learn.microsoft.com/en-us/power-bi/fundamentals/desktop-latest-update" rel="noopener noreferrer"&gt;Microsoft Learn: May 2026 Power BI Update&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical checklist before using it
&lt;/h2&gt;

&lt;p&gt;Before I would ship a user-aware calculated column, I would check this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the feature supported in the target Power BI Desktop and service environment?&lt;/li&gt;
&lt;li&gt;Is the table storage mode compatible with the intended behavior?&lt;/li&gt;
&lt;li&gt;Does the expression use user-aware DAX functions intentionally?&lt;/li&gt;
&lt;li&gt;Is the expression simple enough to evaluate at query time?&lt;/li&gt;
&lt;li&gt;Are translated labels grouped by stable keys?&lt;/li&gt;
&lt;li&gt;Are RLS and View as role tests clean?&lt;/li&gt;
&lt;li&gt;Are report visuals still valid for restricted users?&lt;/li&gt;
&lt;li&gt;Is the behavior documented in the model repository or TMDL?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer is yes, User Context becomes a powerful tool.&lt;/p&gt;

&lt;p&gt;Not because it makes calculated columns more clever.&lt;/p&gt;

&lt;p&gt;Because it lets the semantic model respond to the user, while keeping the logic in one place.&lt;/p&gt;

&lt;p&gt;That is a useful direction for serious Power BI models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.sqlbi.com/articles/introducing-user-aware-calculated-columns-in-power-bi/" rel="noopener noreferrer"&gt;SQLBI: Introducing user-aware calculated columns in Power BI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/power-bi/fundamentals/desktop-latest-update" rel="noopener noreferrer"&gt;Microsoft Learn: See What's New in the May 2026 Power BI Update&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Written by &lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Shai Karmani&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>fabric</category>
      <category>dax</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Copy Job CDC with SQL estate is now GA in Microsoft Fabric</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Tue, 26 May 2026 23:00:53 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/copy-job-cdc-with-sql-estate-is-now-ga-in-microsoft-fabric-ggb</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/copy-job-cdc-with-sql-estate-is-now-ga-in-microsoft-fabric-ggb</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-26-copy-job-cdc-sql-estate-ga.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-26-copy-job-cdc-sql-estate-ga.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34egf5fxplu3fyv3e2tm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34egf5fxplu3fyv3e2tm.png" alt="Copy Job CDC architecture in Microsoft Fabric" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy Job CDC with SQL estate is now generally available in Microsoft Fabric Data Factory.&lt;/p&gt;

&lt;p&gt;That sounds like a data movement update.&lt;/p&gt;

&lt;p&gt;It is more useful than that.&lt;/p&gt;

&lt;p&gt;For many BI and data engineering teams, the hard part is not copying data once. The hard part is keeping analytical data aligned with operational systems after the business changes.&lt;/p&gt;

&lt;p&gt;A customer address is updated.&lt;/p&gt;

&lt;p&gt;An order status changes.&lt;/p&gt;

&lt;p&gt;A subscription is canceled.&lt;/p&gt;

&lt;p&gt;Inventory moves.&lt;/p&gt;

&lt;p&gt;A record is deleted in the source system, but the reporting layer still needs to explain what happened.&lt;/p&gt;

&lt;p&gt;Those are not edge cases. They are normal business behavior. If the analytical platform cannot handle them clearly, trust starts to leak out of the reporting layer.&lt;/p&gt;

&lt;p&gt;That is why CDC matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  What became generally available
&lt;/h2&gt;

&lt;p&gt;Microsoft announced that &lt;strong&gt;Change Data Capture support for SQL estate in Copy Job is now generally available&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The generally available SQL estate sources include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;Azure SQL Database&lt;/li&gt;
&lt;li&gt;Azure SQL Managed Instance&lt;/li&gt;
&lt;li&gt;SAP Datasphere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The generally available destinations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL Server&lt;/li&gt;
&lt;li&gt;Azure SQL Database&lt;/li&gt;
&lt;li&gt;Azure SQL Managed Instance&lt;/li&gt;
&lt;li&gt;Fabric SQL&lt;/li&gt;
&lt;li&gt;Snowflake&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft is also moving more CDC connectors through preview, including Fabric Lakehouse table, Google BigQuery, Snowflake, Oracle, SQL database in Fabric, and Fabric Data Warehouse scenarios.&lt;/p&gt;

&lt;p&gt;The important part is not the connector list by itself. The important part is that CDC is becoming a normal Data Factory pattern inside Fabric, not a side script that each team has to invent again.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Simplify-your-data-movement-with-Copy-job-CDC-with-SQL-estate/ba-p/5184211" rel="noopener noreferrer"&gt;Microsoft Fabric Updates Blog: Simplify your data movement with Copy job: CDC with SQL estate&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can actually do with it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Stop rebuilding full loads when only changes matter
&lt;/h3&gt;

&lt;p&gt;Full refresh is simple until it is not.&lt;/p&gt;

&lt;p&gt;It works when the tables are small, the source systems can handle the load, and nobody cares about latency. That changes quickly with operational SQL systems.&lt;/p&gt;

&lt;p&gt;CDC lets the pipeline focus on what changed. That can reduce load on the source system, reduce movement volume, and make analytical updates closer to operational reality.&lt;/p&gt;

&lt;p&gt;This is especially useful for tables such as orders, customers, products, subscriptions, transactions, inventory, service tickets, and account status history.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Bring SQL estate replication closer to Fabric Data Factory
&lt;/h3&gt;

&lt;p&gt;A lot of organizations already have replication logic around their SQL estate. Some of it is mature. Some of it is a set of custom jobs nobody wants to touch.&lt;/p&gt;

&lt;p&gt;Copy Job CDC gives Fabric teams a cleaner option for the right workloads.&lt;/p&gt;

&lt;p&gt;Instead of maintaining another custom replication layer, a team can move more of the pattern into Fabric Data Factory, where the data movement is visible as part of the platform.&lt;/p&gt;

&lt;p&gt;That does not mean every existing pipeline should be replaced tomorrow. It does mean new Fabric architecture decisions should consider CDC as a first-class option.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Preserve history with SCD Type 2
&lt;/h3&gt;

&lt;p&gt;For reporting, the latest value is often not enough.&lt;/p&gt;

&lt;p&gt;If a customer changed region last month, some reports need the current region. Other reports need the region that was true when the order happened.&lt;/p&gt;

&lt;p&gt;That is where slowly changing dimension Type 2 patterns matter.&lt;/p&gt;

&lt;p&gt;Microsoft also highlighted extended SCD Type 2 support for Fabric Warehouse and Synapse SQL Pool. With native SCD Type 2 in Copy Job, teams can preserve historical versions of records with effective dating and soft delete handling.&lt;/p&gt;

&lt;p&gt;That is not just a data warehouse modeling detail. It is the difference between a report that shows the current answer and a report that can explain the historical answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Treat deletes as audit events, not disappearing rows
&lt;/h3&gt;

&lt;p&gt;Deletes are dangerous in analytics.&lt;/p&gt;

&lt;p&gt;If a source record disappears and the destination simply removes it, the reporting layer may lose the ability to explain prior results.&lt;/p&gt;

&lt;p&gt;Soft delete handling is useful because the destination can mark a record as inactive instead of physically deleting it. That keeps the history visible for audit, reconciliation, and operational reporting.&lt;/p&gt;

&lt;p&gt;For finance, subscriptions, customer lifecycle, compliance, and operational analytics, that distinction matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture conversation gets better
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1pwah5re5o2v14yf096.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1pwah5re5o2v14yf096.png" alt="CDC trust contract diagram" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real value is not that Fabric can copy data from A to B.&lt;/p&gt;

&lt;p&gt;Teams have had ways to copy data for years.&lt;/p&gt;

&lt;p&gt;The value is that Fabric is making change capture, history, deletes, latency, and ownership easier to discuss as platform concerns.&lt;/p&gt;

&lt;p&gt;That changes the conversation from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we move the data?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do we trust the data after it changes?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a better architecture question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I would use this first
&lt;/h2&gt;

&lt;p&gt;I would look for workloads with these signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operational SQL source systems&lt;/li&gt;
&lt;li&gt;Tables that change frequently&lt;/li&gt;
&lt;li&gt;Reports that need fresher data than a nightly full load&lt;/li&gt;
&lt;li&gt;Business processes where historical state matters&lt;/li&gt;
&lt;li&gt;Deletes that need traceability&lt;/li&gt;
&lt;li&gt;Custom replication jobs that are becoming hard to maintain&lt;/li&gt;
&lt;li&gt;Fabric adoption where Data Factory is already part of the platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good candidates are customer dimension sync, order status tracking, subscription lifecycle reporting, inventory movement, financial transaction replication, and support or case management analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I would still be careful
&lt;/h2&gt;

&lt;p&gt;GA does not remove design responsibility.&lt;/p&gt;

&lt;p&gt;Before moving a production workload, I would still define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source ownership&lt;/li&gt;
&lt;li&gt;Expected latency&lt;/li&gt;
&lt;li&gt;Initial load strategy&lt;/li&gt;
&lt;li&gt;Change tracking assumptions&lt;/li&gt;
&lt;li&gt;Delete behavior&lt;/li&gt;
&lt;li&gt;SCD Type 2 rules&lt;/li&gt;
&lt;li&gt;Failure handling&lt;/li&gt;
&lt;li&gt;Reconciliation checks&lt;/li&gt;
&lt;li&gt;Security and access model&lt;/li&gt;
&lt;li&gt;Monitoring and support ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CDC makes the movement pattern easier. It does not automatically make the architecture clean.&lt;/p&gt;

&lt;h2&gt;
  
  
  My takeaway
&lt;/h2&gt;

&lt;p&gt;Copy Job CDC with SQL estate becoming GA is a practical Fabric milestone.&lt;/p&gt;

&lt;p&gt;It gives BI and data engineering teams a stronger native option for moving operational SQL changes into analytical systems, while preserving history and making deletes more traceable.&lt;/p&gt;

&lt;p&gt;The best use of this feature is not to treat it as another ETL checkbox.&lt;/p&gt;

&lt;p&gt;Use it to make change history, auditability, and trust explicit in the Fabric architecture.&lt;/p&gt;

&lt;p&gt;That is where the feature starts to matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>dataengineering</category>
      <category>datafactory</category>
      <category>sqlserver</category>
    </item>
    <item>
      <title>Fabric AI Functions Turn GenAI Into a Data Pipeline Step</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Tue, 26 May 2026 00:33:12 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/fabric-ai-functions-turn-genai-into-a-data-pipeline-step-42a0</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/fabric-ai-functions-turn-genai-into-a-data-pipeline-step-42a0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-24-fabric-ai-functions-data-workflows.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-24-fabric-ai-functions-data-workflows.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnih9gn53mccpjtvzlqgk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnih9gn53mccpjtvzlqgk.jpg" alt="AI Functions in Fabric data workflow" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most enterprise GenAI demos start in the wrong place.&lt;/p&gt;

&lt;p&gt;They start with a chat window.&lt;/p&gt;

&lt;p&gt;The more useful place is usually earlier: inside the data workflow, before the dashboard, before the semantic model, before the analyst has to clean the same messy text for the tenth time.&lt;/p&gt;

&lt;p&gt;That is why Fabric AI Functions are worth paying attention to.&lt;/p&gt;

&lt;p&gt;They let data teams use GenAI directly inside pandas and Spark workflows in Microsoft Fabric. Not as a separate app. Not as a one-off script sitting outside the platform. As a transformation step inside the work data teams already do.&lt;/p&gt;

&lt;p&gt;That changes the shape of the use cases.&lt;/p&gt;

&lt;p&gt;Instead of asking “how do we add a chatbot?”, the better question becomes:&lt;/p&gt;

&lt;p&gt;Where is language, document mess, or unstructured content slowing down our data pipeline?&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can actually do with it
&lt;/h2&gt;

&lt;p&gt;Fabric AI Functions expose common GenAI operations as DataFrame-friendly functions.&lt;/p&gt;

&lt;p&gt;You can use them to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;classify support tickets, survey responses, incidents, or customer feedback&lt;/li&gt;
&lt;li&gt;summarize notes, long text fields, operational logs, and service records&lt;/li&gt;
&lt;li&gt;extract fields from documents or semi-structured text&lt;/li&gt;
&lt;li&gt;translate records as part of a data preparation flow&lt;/li&gt;
&lt;li&gt;fix grammar or normalize messy text before reporting&lt;/li&gt;
&lt;li&gt;create embeddings for search, RAG, and semantic retrieval&lt;/li&gt;
&lt;li&gt;compare similarity between text values&lt;/li&gt;
&lt;li&gt;generate structured responses from instructions&lt;/li&gt;
&lt;li&gt;enrich rows in pandas or Spark without moving the workflow outside Fabric&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds simple, but it is a useful shift.&lt;/p&gt;

&lt;p&gt;For years, a lot of GenAI work around data platforms has looked like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Export data from the platform.&lt;/li&gt;
&lt;li&gt;Send it to a separate script or service.&lt;/li&gt;
&lt;li&gt;Call an AI model.&lt;/li&gt;
&lt;li&gt;Stitch the result back into the data estate.&lt;/li&gt;
&lt;li&gt;Hope the process is governed enough to survive production.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fabric AI Functions make a cleaner pattern possible.&lt;/p&gt;

&lt;p&gt;The AI step can live closer to the lakehouse, notebook, Spark job, data science workflow, Power BI preparation layer, and downstream semantic model.&lt;/p&gt;

&lt;p&gt;That is a much better starting point for teams that want AI to improve real data work, not just demo well.&lt;/p&gt;

&lt;h2&gt;
  
  
  The big changes that make this interesting
&lt;/h2&gt;

&lt;p&gt;There are a few parts that matter more than the feature list.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. GenAI becomes part of the pipeline
&lt;/h3&gt;

&lt;p&gt;The most important change is architectural.&lt;/p&gt;

&lt;p&gt;AI enrichment can become a normal transformation step.&lt;/p&gt;

&lt;p&gt;A notebook can read raw records, apply an AI function, store the output as another column or table, and send that enriched dataset into the next layer of the platform.&lt;/p&gt;

&lt;p&gt;That means AI output can be reviewed, versioned, refreshed, tested, governed, and consumed like other data assets.&lt;/p&gt;

&lt;p&gt;That is very different from treating GenAI as a sidecar experiment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcl24v8kn1c03zwiznxeq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcl24v8kn1c03zwiznxeq.jpg" alt="Before and after workflow for Fabric AI Functions" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Multimodal input makes the use cases much better
&lt;/h3&gt;

&lt;p&gt;Text classification is useful, but many business workflows are not clean text.&lt;/p&gt;

&lt;p&gt;They are PDFs.&lt;/p&gt;

&lt;p&gt;Screenshots.&lt;/p&gt;

&lt;p&gt;Images.&lt;/p&gt;

&lt;p&gt;CSV files.&lt;/p&gt;

&lt;p&gt;JSON files.&lt;/p&gt;

&lt;p&gt;Markdown notes.&lt;/p&gt;

&lt;p&gt;Operational documents that never quite made it into a table.&lt;/p&gt;

&lt;p&gt;Microsoft documents AI Functions support for image files such as JPG, PNG, GIF, and WebP, documents such as PDF, and common text formats such as MD, TXT, CSV, JSON, and XML.&lt;/p&gt;

&lt;p&gt;That opens better Fabric workflows.&lt;/p&gt;

&lt;p&gt;A team can bring files into the lakehouse, use AI to extract or summarize what matters, and store the result in structured tables for review and reporting.&lt;/p&gt;

&lt;p&gt;That is the kind of AI use case that can save real operational time.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Embeddings can be created where the content already lives
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ai.embed&lt;/code&gt; is one of the more important functions because it connects Fabric directly to search and RAG preparation.&lt;/p&gt;

&lt;p&gt;A team can take product documentation, policy files, support resolutions, internal wiki pages, field notes, or knowledge base articles and create embeddings as part of the data workflow.&lt;/p&gt;

&lt;p&gt;That creates a cleaner path from raw business content to retrieval-ready datasets.&lt;/p&gt;

&lt;p&gt;The useful part is not just the embedding itself. It is that the data team can decide what content is approved, what should be excluded, how often embeddings refresh, and what downstream applications are allowed to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The model/provider configuration is becoming more serious
&lt;/h3&gt;

&lt;p&gt;The documentation now covers configuration details around providers and models, including the default model behavior.&lt;/p&gt;

&lt;p&gt;That matters because production teams eventually need answers to basic governance questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which model is being used?&lt;/li&gt;
&lt;li&gt;Who approved it?&lt;/li&gt;
&lt;li&gt;Which data can be sent to it?&lt;/li&gt;
&lt;li&gt;Which capacity pays for it?&lt;/li&gt;
&lt;li&gt;Which workloads are allowed to use it?&lt;/li&gt;
&lt;li&gt;What happens when the output is wrong?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where Fabric AI Functions become more than a notebook convenience. They become part of the data platform operating model.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The best output is not “AI magic”. It is a reviewable data asset.
&lt;/h3&gt;

&lt;p&gt;The mistake is to take AI output and treat it as automatically trusted.&lt;/p&gt;

&lt;p&gt;The better pattern is to produce reviewable enrichment.&lt;/p&gt;

&lt;p&gt;Keep the original value.&lt;/p&gt;

&lt;p&gt;Add the AI-generated label, summary, extracted field, or embedding.&lt;/p&gt;

&lt;p&gt;Add review flags where needed.&lt;/p&gt;

&lt;p&gt;Store the result in a table with ownership and downstream rules.&lt;/p&gt;

&lt;p&gt;Then decide what is safe enough for reporting, automation, search, or user-facing apps.&lt;/p&gt;

&lt;p&gt;That is how this becomes useful without becoming sloppy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three practical things I would build first
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Support ticket enrichment
&lt;/h3&gt;

&lt;p&gt;Most support datasets contain useful signal, but the text is messy.&lt;/p&gt;

&lt;p&gt;A Fabric notebook can add AI-generated columns for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;topic classification&lt;/li&gt;
&lt;li&gt;urgency&lt;/li&gt;
&lt;li&gt;sentiment&lt;/li&gt;
&lt;li&gt;short summary&lt;/li&gt;
&lt;li&gt;product area&lt;/li&gt;
&lt;li&gt;likely ownership team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is not to pretend the model is perfect. The key is to create a reviewable enrichment layer that helps analysts and operations teams move faster.&lt;/p&gt;

&lt;p&gt;A good output table might include the original text, AI-generated labels, confidence or review flags where available, and a human-reviewed status column.&lt;/p&gt;

&lt;p&gt;That gives Power BI a better dataset without hiding the uncertainty.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Document extraction into structured tables
&lt;/h3&gt;

&lt;p&gt;A lot of business data is trapped in semi-structured documents.&lt;/p&gt;

&lt;p&gt;Invoices, forms, reports, agreements, field notes, inspection PDFs, and vendor files often contain fields that teams later retype manually.&lt;/p&gt;

&lt;p&gt;With AI Functions, the useful pattern is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Store the files in the lakehouse.&lt;/li&gt;
&lt;li&gt;List file paths as input.&lt;/li&gt;
&lt;li&gt;Use extraction or generation instructions to pull out the fields.&lt;/li&gt;
&lt;li&gt;Store the result as a structured table.&lt;/li&gt;
&lt;li&gt;Review exceptions before the data becomes trusted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That does not replace proper document processing for every scenario. It does make small and medium internal automation projects much easier to test inside Fabric.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Embeddings for search and RAG preparation
&lt;/h3&gt;

&lt;p&gt;A team can take approved internal content and create embeddings as part of the Fabric workflow.&lt;/p&gt;

&lt;p&gt;That content might include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;product documentation&lt;/li&gt;
&lt;li&gt;policy files&lt;/li&gt;
&lt;li&gt;support resolutions&lt;/li&gt;
&lt;li&gt;internal wiki pages&lt;/li&gt;
&lt;li&gt;knowledge base articles&lt;/li&gt;
&lt;li&gt;implementation notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output can become a governed retrieval layer instead of a random pile of files passed into an AI app.&lt;/p&gt;

&lt;p&gt;That matters because RAG quality starts before the chat interface. It starts with content selection, metadata, refresh rules, ownership, and preparation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51no11e1x62rwmjxjq90.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51no11e1x62rwmjxjq90.jpg" alt="Good use cases for Fabric AI Functions" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I would be careful
&lt;/h2&gt;

&lt;p&gt;Positive does not mean careless.&lt;/p&gt;

&lt;p&gt;AI Functions make enrichment easier, but the usual production questions still matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which data is allowed to be sent to the model?&lt;/li&gt;
&lt;li&gt;Is the Fabric tenant setting for Copilot and Azure OpenAI enabled intentionally?&lt;/li&gt;
&lt;li&gt;Does the workload require cross-geo processing approval?&lt;/li&gt;
&lt;li&gt;Which Fabric capacity will pay for the work?&lt;/li&gt;
&lt;li&gt;Which model/provider is configured?&lt;/li&gt;
&lt;li&gt;How will output quality be reviewed?&lt;/li&gt;
&lt;li&gt;Which outputs are allowed to flow into reports or user-facing apps?&lt;/li&gt;
&lt;li&gt;How will failures, blanks, and hallucinated values be handled?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft notes that Fabric AI Functions require a paid Fabric capacity, F2 or higher, or any P capacity. The documentation also states that AI Functions are supported in Fabric Runtime 1.3 and later, and that the default model is &lt;code&gt;gpt-4.1-mini&lt;/code&gt; unless a different model is configured.&lt;/p&gt;

&lt;p&gt;Those details matter. They turn this from a cool notebook feature into a platform decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  My take
&lt;/h2&gt;

&lt;p&gt;Fabric AI Functions are useful because they move GenAI into the unglamorous part of AI work.&lt;/p&gt;

&lt;p&gt;The pipeline.&lt;/p&gt;

&lt;p&gt;The notebook.&lt;/p&gt;

&lt;p&gt;The enrichment step.&lt;/p&gt;

&lt;p&gt;The document cleanup.&lt;/p&gt;

&lt;p&gt;The semantic preparation layer.&lt;/p&gt;

&lt;p&gt;That is where a lot of business value actually sits.&lt;/p&gt;

&lt;p&gt;Not every AI feature needs to become a chat window. Some of the most valuable AI work will happen quietly inside pipelines, quality checks, enrichment jobs, and retrieval preparation steps.&lt;/p&gt;

&lt;p&gt;The practical opportunity is simple:&lt;/p&gt;

&lt;p&gt;Take the data you already manage in Fabric. Add AI where language, documents, and meaning slow the team down. Store the result as a governed data asset. Review it before it reaches users.&lt;/p&gt;

&lt;p&gt;That is a much better direction than treating AI as a separate island next to the data platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  When did this become available?
&lt;/h2&gt;

&lt;p&gt;The official Microsoft Learn page for Fabric AI Functions currently has a documentation date of &lt;strong&gt;November 13, 2025&lt;/strong&gt; and an updated timestamp of &lt;strong&gt;May 7, 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The GitHub history for the Fabric documentation shows the AI Functions overview page existed by &lt;strong&gt;February 28, 2025&lt;/strong&gt;. A later documentation commit on &lt;strong&gt;November 24, 2025&lt;/strong&gt; is titled “Update AI Functions documentation for GA release with enhancements.” Recent documentation updates in February, March, and May 2026 added more coverage around multimodal input, schema extraction, configuration, providers, and file workflows.&lt;/p&gt;

&lt;p&gt;So the short version is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The documentation trail starts in early 2025.&lt;/li&gt;
&lt;li&gt;The GA documentation update appears in November 2025.&lt;/li&gt;
&lt;li&gt;The more interesting expansion for practical teams is the 2026 work around multimodal inputs, broader model/provider configuration, schema extraction, and file workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/data-science/ai-functions/overview" rel="noopener noreferrer"&gt;Microsoft Learn: Transform and Enrich Data with AI Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/MicrosoftDocs/fabric-docs/commits/main/docs/data-science/ai-functions/overview.md" rel="noopener noreferrer"&gt;MicrosoftDocs Fabric commit history for the AI Functions overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>ai</category>
      <category>dataengineering</category>
      <category>fabric</category>
    </item>
    <item>
      <title>Put Copilot Metadata Where Your Team Can Review It</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Wed, 20 May 2026 23:46:48 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/put-copilot-metadata-where-your-team-can-review-it-5f0o</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/put-copilot-metadata-where-your-team-can-review-it-5f0o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-20-copilot-metadata-source-control.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-20-copilot-metadata-source-control.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajvoqp9hahlucvekg3xn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fajvoqp9hahlucvekg3xn.jpg" alt="Copilot metadata and source control architecture" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copilot in Power BI is moving the semantic model into a new role.&lt;/p&gt;

&lt;p&gt;It is no longer only the layer that stores measures, relationships, tables, and security rules.&lt;/p&gt;

&lt;p&gt;It is also becoming the place where teams define how AI should understand the business.&lt;/p&gt;

&lt;p&gt;That changes the engineering standard.&lt;/p&gt;

&lt;p&gt;If Copilot uses metadata to answer business questions, that metadata should not live as invisible configuration edited by one report author on a good day.&lt;/p&gt;

&lt;p&gt;It should be reviewed.&lt;/p&gt;

&lt;p&gt;It should be versioned.&lt;/p&gt;

&lt;p&gt;It should be tested.&lt;/p&gt;

&lt;p&gt;And in serious Power BI environments, it belongs in source control.&lt;/p&gt;

&lt;h2&gt;
  
  
  The feature is not the point
&lt;/h2&gt;

&lt;p&gt;The easy version of this story is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Power BI now has tools to prepare semantic models for AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is true, but it is not the useful lesson.&lt;/p&gt;

&lt;p&gt;The more important shift is that Copilot readiness is becoming part of the semantic model lifecycle.&lt;/p&gt;

&lt;p&gt;Power BI now gives model owners tools such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI instructions&lt;/li&gt;
&lt;li&gt;AI data schema context&lt;/li&gt;
&lt;li&gt;verified answers&lt;/li&gt;
&lt;li&gt;trigger phrases&lt;/li&gt;
&lt;li&gt;Copilot testing workflows&lt;/li&gt;
&lt;li&gt;an approved-for-Copilot model setting&lt;/li&gt;
&lt;li&gt;PBIP storage for Copilot metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jd8ux1mj9tszsbnngig.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jd8ux1mj9tszsbnngig.jpg" alt="Prep data for AI in Power BI Desktop" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not report polish.&lt;/p&gt;

&lt;p&gt;This is semantic engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  The metadata now lives with the model
&lt;/h2&gt;

&lt;p&gt;The detail that matters most for engineering teams is simple:&lt;/p&gt;

&lt;p&gt;When a Power BI project is saved as PBIP, Copilot metadata is stored in a &lt;code&gt;Copilot/&lt;/code&gt; folder inside the semantic model project.&lt;/p&gt;

&lt;p&gt;The structure looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PBIP/
├── Model.SemanticModel/
│   ├── definition/
│   ├── Copilot/
│   │   ├── Instructions/
│   │   │   ├── instructions.md
│   │   │   ├── version.json
│   │   ├── VerifiedAnswers/
│   │   │   ├── definitions/
│   │   │   ├── version.json
│   │   ├── schema.json
│   │   ├── examplePrompts.json
│   │   ├── settings.json
│   │   └── version.json
│   └── definition.pbism
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means Copilot behavior can become part of the same workflow as model changes.&lt;/p&gt;

&lt;p&gt;A pull request can now include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a measure change&lt;/li&gt;
&lt;li&gt;a relationship change&lt;/li&gt;
&lt;li&gt;a description update&lt;/li&gt;
&lt;li&gt;a verified answer definition&lt;/li&gt;
&lt;li&gt;an instruction change&lt;/li&gt;
&lt;li&gt;a Copilot schema update&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those changes should be reviewed together because users experience them together.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1icjk81veu4ujbjxsbjc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1icjk81veu4ujbjxsbjc.jpg" alt="Copilot metadata is now an engineering artifact" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Most Power BI teams already know that bad semantic models create bad reports.&lt;/p&gt;

&lt;p&gt;Copilot adds another layer:&lt;/p&gt;

&lt;p&gt;Bad semantic metadata creates bad AI answers.&lt;/p&gt;

&lt;p&gt;A vague measure name is no longer just annoying for developers.&lt;/p&gt;

&lt;p&gt;A weak description is no longer just documentation debt.&lt;/p&gt;

&lt;p&gt;A poorly governed synonym or verified answer can steer users toward the wrong interpretation of the business.&lt;/p&gt;

&lt;p&gt;This is especially important for models used across multiple reports or apps. When the model becomes approved for Copilot, the risk is not isolated to one page. It can affect every experience that depends on that semantic model.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpkoqu6uls3epc5xz427.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpkoqu6uls3epc5xz427.jpg" alt="Prep data for AI options" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What should go through review
&lt;/h2&gt;

&lt;p&gt;If a team is using PBIP and Git, Copilot metadata should not be treated as noise in the repo.&lt;/p&gt;

&lt;p&gt;At minimum, I would review these changes before promotion:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Instructions&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do the instructions reflect how the business actually talks about the data?&lt;/p&gt;

&lt;p&gt;If finance calls it “net revenue” and sales calls it “bookings”, the model needs to make that distinction clear.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Verified answers&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A verified answer should be tied to a known, trusted interpretation.&lt;/p&gt;

&lt;p&gt;It should not become a workaround for a weak model.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Trigger phrases&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The phrasing should match real user language, not developer language.&lt;/p&gt;

&lt;p&gt;“Show customer churn by cohort” and “why did retention drop last month?” are not the same question.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Schema changes&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Copilot schema updates should be reviewed with table, column, relationship, and measure changes.&lt;/p&gt;

&lt;p&gt;Otherwise the AI context can drift away from the model.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Promotion requirements&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some tooling changes require a model refresh after deployment before they sync into the service.&lt;/p&gt;

&lt;p&gt;That should be part of the deployment checklist, not something discovered after users start asking questions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu65g15cwhsew93sl33lw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu65g15cwhsew93sl33lw.jpg" alt="What belongs in the pull request" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The migration from Q&amp;amp;A is a governance moment
&lt;/h2&gt;

&lt;p&gt;There is another detail teams should not ignore.&lt;/p&gt;

&lt;p&gt;Power BI can migrate older Q&amp;amp;A tooling metadata into the newer Copilot tooling format, but this is not a harmless cosmetic migration.&lt;/p&gt;

&lt;p&gt;After the upgrade, Q&amp;amp;A features are permanently disabled for the model and connected reports. Some Q&amp;amp;A metadata migrates, such as synonyms and suggested questions. Other metadata does not.&lt;/p&gt;

&lt;p&gt;That means the migration should be planned like a model change.&lt;/p&gt;

&lt;p&gt;Not like a dialog box someone clicks through.&lt;/p&gt;

&lt;p&gt;Before upgrading a production model, I would check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which reports still use Q&amp;amp;A visuals&lt;/li&gt;
&lt;li&gt;whether linguistic metadata is valid&lt;/li&gt;
&lt;li&gt;which synonyms and suggested questions are worth keeping&lt;/li&gt;
&lt;li&gt;whether business users depend on Q&amp;amp;A today&lt;/li&gt;
&lt;li&gt;how Copilot answers will be tested after migration&lt;/li&gt;
&lt;li&gt;whether the team can roll back through version history or backups if needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvt807srm1vqcwf8y9p6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvt807srm1vqcwf8y9p6.jpg" alt="Q&amp;amp;A visual after migration" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical workflow
&lt;/h2&gt;

&lt;p&gt;The best pattern is not complicated.&lt;/p&gt;

&lt;p&gt;For production semantic models, treat AI readiness as a normal engineering workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clean up the model&lt;/li&gt;
&lt;li&gt;Add descriptions, synonyms, instructions, and verified answers&lt;/li&gt;
&lt;li&gt;Save the project as PBIP&lt;/li&gt;
&lt;li&gt;Review the &lt;code&gt;Copilot/&lt;/code&gt; folder in Git&lt;/li&gt;
&lt;li&gt;Test with Copilot in Desktop or the service&lt;/li&gt;
&lt;li&gt;Check how Copilot arrived at the answer&lt;/li&gt;
&lt;li&gt;Promote through the deployment path&lt;/li&gt;
&lt;li&gt;Refresh the model if the deployment requires it&lt;/li&gt;
&lt;li&gt;Monitor feedback from real users&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzw92oh1c5ig8hhgjcko.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgzw92oh1c5ig8hhgjcko.jpg" alt="AI readiness workflow for Power BI teams" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This gives the team a simple standard:&lt;/p&gt;

&lt;p&gt;If the change can affect what Copilot tells a user, it deserves the same discipline as a DAX or model change.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would add to a PR checklist
&lt;/h2&gt;

&lt;p&gt;For a Power BI team using Copilot, I would add these checks to the semantic model review process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did any files under &lt;code&gt;Copilot/&lt;/code&gt; change?&lt;/li&gt;
&lt;li&gt;Did any measure, table, or column descriptions change?&lt;/li&gt;
&lt;li&gt;Did the change affect a verified answer?&lt;/li&gt;
&lt;li&gt;Are trigger phrases business-readable?&lt;/li&gt;
&lt;li&gt;Did someone test the answer in the Copilot pane?&lt;/li&gt;
&lt;li&gt;Did someone check how Copilot arrived at the answer?&lt;/li&gt;
&lt;li&gt;Does the model need a refresh after deployment?&lt;/li&gt;
&lt;li&gt;Are there reports or apps that inherit the approved-for-Copilot status?&lt;/li&gt;
&lt;li&gt;Is any Q&amp;amp;A migration involved?&lt;/li&gt;
&lt;li&gt;Is the change safe for every audience that can access the model?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real shift
&lt;/h2&gt;

&lt;p&gt;The real shift is not that Power BI added more AI buttons.&lt;/p&gt;

&lt;p&gt;The real shift is that AI behavior is becoming part of the analytics system.&lt;/p&gt;

&lt;p&gt;That means BI teams need to stop treating Copilot readiness as a last-mile report setting.&lt;/p&gt;

&lt;p&gt;It belongs with the semantic model.&lt;/p&gt;

&lt;p&gt;It belongs in Git.&lt;/p&gt;

&lt;p&gt;It belongs in code review.&lt;/p&gt;

&lt;p&gt;And it belongs in the same quality process as every other change that can affect business interpretation.&lt;/p&gt;

&lt;p&gt;That is how Power BI teams move from “we turned Copilot on” to “we can trust what Copilot is allowed to say.”&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>microsoftfabric</category>
      <category>githubcopilot</category>
      <category>analyticsengineering</category>
    </item>
    <item>
      <title>The Power BI Setting That Makes Semantic Models Safer</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Wed, 20 May 2026 13:00:53 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/the-power-bi-setting-that-makes-semantic-models-safer-4hh8</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/the-power-bi-setting-that-makes-semantic-models-safer-4hh8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-19-outbound-access-protection-semantic-models.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-19-outbound-access-protection-semantic-models.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most Power BI security conversations stop at the report.&lt;/p&gt;

&lt;p&gt;Who can open it?&lt;/p&gt;

&lt;p&gt;Which workspace is it in?&lt;/p&gt;

&lt;p&gt;Which RLS role applies?&lt;/p&gt;

&lt;p&gt;Can users export data?&lt;/p&gt;

&lt;p&gt;Those questions still matter. But they are no longer enough.&lt;/p&gt;

&lt;p&gt;Microsoft's preview of Outbound Access Protection for semantic models is important because it treats the semantic model as something more than a reporting artifact. It treats it as part of the data movement boundary.&lt;/p&gt;

&lt;p&gt;That is the right mental model.&lt;/p&gt;

&lt;p&gt;A semantic model can connect to multiple sources. It can use Import. It can use DirectQuery. It can combine tables. It can pass filter context into source queries. It can reach across workspaces and external endpoints.&lt;/p&gt;

&lt;p&gt;So the governance question is not only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who can consume this model?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is also:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where is this model allowed to connect?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplf8uzsbkcnk5ssl8tjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplf8uzsbkcnk5ssl8tjo.png" alt="Semantic models are part of the outbound security boundary." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The risk is not theoretical
&lt;/h2&gt;

&lt;p&gt;The uncomfortable part is that the semantic layer can become a path between sources.&lt;/p&gt;

&lt;p&gt;Imagine a composite model with data from Source A and Source B. A user selects a value that comes from Source A. A visual or relationship pushes that value into a query against Source B.&lt;/p&gt;

&lt;p&gt;The result does not have to be useful.&lt;/p&gt;

&lt;p&gt;The problem is that a sensitive value may now appear in the wrong place, such as a query sent to another endpoint or a log outside the intended boundary.&lt;/p&gt;

&lt;p&gt;That is the kind of risk many BI teams do not model explicitly.&lt;/p&gt;

&lt;p&gt;They think about permissions on the report. They think about who can see the data. They think about gateway configuration.&lt;/p&gt;

&lt;p&gt;But they do not always think about outbound movement from the workspace itself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgn8yd11ti39hk5ukrjw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgn8yd11ti39hk5ukrjw.png" alt="A semantic model can move filter context into another source query." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Outbound Access Protection changes
&lt;/h2&gt;

&lt;p&gt;Outbound Access Protection is a workspace-level control in Microsoft Fabric.&lt;/p&gt;

&lt;p&gt;When it is enabled, outbound public access is blocked by default. The workspace can only connect to destinations that have been explicitly allowed.&lt;/p&gt;

&lt;p&gt;For semantic models, the important detail is where enforcement happens. According to Microsoft's announcement, enforcement happens on the model's bound data connection. That means Power Query transformations, M expressions, and model parameters should not be able to route around the policy because the connection itself is evaluated before data moves.&lt;/p&gt;

&lt;p&gt;That is a much stronger control than hoping every model author makes the right choice manually.&lt;/p&gt;

&lt;p&gt;It also changes the review process.&lt;/p&gt;

&lt;p&gt;Before this kind of control, a workspace review might ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which reports are published here?&lt;/li&gt;
&lt;li&gt;Who has build permission?&lt;/li&gt;
&lt;li&gt;Which gateway is used?&lt;/li&gt;
&lt;li&gt;Which semantic models are certified?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the review also needs to ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which outbound destinations are allowed?&lt;/li&gt;
&lt;li&gt;Who approved each exception?&lt;/li&gt;
&lt;li&gt;Does the model really need that endpoint?&lt;/li&gt;
&lt;li&gt;Is the destination inside or outside the expected data boundary?&lt;/li&gt;
&lt;li&gt;What happens when a new source is added?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a better conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the setting lives
&lt;/h2&gt;

&lt;p&gt;The setting is under the workspace network security configuration.&lt;/p&gt;

&lt;p&gt;The relevant path is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workspace settings &amp;gt; Network security &amp;gt; Outbound access protection &amp;gt; Block outbound public access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyaow7map8kq0biptmua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyaow7map8kq0biptmua.png" alt="Cropped screenshot of the Outbound Access Protection setting in Microsoft Fabric workspace settings." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The toggle is simple. The operating model behind it is not.&lt;/p&gt;

&lt;p&gt;Turning it on without planning can break legitimate model refreshes or DirectQuery paths. Leaving it off in sensitive workspaces means the model can still be bound to destinations you may not want it to reach.&lt;/p&gt;

&lt;p&gt;This is why I would not treat Outbound Access Protection as an admin checkbox.&lt;/p&gt;

&lt;p&gt;I would treat it as a workspace design decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  The local workspace still needs to be allowed
&lt;/h2&gt;

&lt;p&gt;One detail from the announcement is easy to miss.&lt;/p&gt;

&lt;p&gt;The default configuration can block connections that are perceived as cross-workspace, including sources accessed through SQL, ADLS Gen2, and other non-Fabric connection kinds.&lt;/p&gt;

&lt;p&gt;That can include data that feels local to the workspace.&lt;/p&gt;

&lt;p&gt;For example, a semantic model may connect to a lakehouse in the same workspace through the SQL analytics endpoint or through the OneLake ADLS Gen2 path. From the policy point of view, those connection kinds may still need explicit exceptions.&lt;/p&gt;

&lt;p&gt;That matters because a team can easily say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This model only connects to our own lakehouse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the implementation detail still matters.&lt;/p&gt;

&lt;p&gt;For Import or DirectQuery, you may need the SQL endpoint fully qualified domain name. For Direct Lake style paths, you may need the ADLS Gen2 or OneLake URL pattern.&lt;/p&gt;

&lt;p&gt;The governance takeaway is simple:&lt;/p&gt;

&lt;p&gt;Do not only document the business source. Document the actual connection path.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical rollout checklist
&lt;/h2&gt;

&lt;p&gt;If I were enabling this for a real Fabric workspace, I would not start with the toggle.&lt;/p&gt;

&lt;p&gt;I would start with an inventory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4u9znw7i2lx14agtiedu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4u9znw7i2lx14agtiedu.png" alt="A practical rollout checklist for Outbound Access Protection." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The basic checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the tenant setting is available and enabled.&lt;/li&gt;
&lt;li&gt;Confirm the workspace is on the right capacity and contains supported items.&lt;/li&gt;
&lt;li&gt;Inventory every semantic model connection.&lt;/li&gt;
&lt;li&gt;Separate internal expected paths from external destinations.&lt;/li&gt;
&lt;li&gt;Add explicit exceptions for required SQL, ADLS Gen2, cloud, or gateway connections.&lt;/li&gt;
&lt;li&gt;Turn on &lt;strong&gt;Block outbound public access&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Wait for propagation.&lt;/li&gt;
&lt;li&gt;Validate Import refreshes and DirectQuery queries.&lt;/li&gt;
&lt;li&gt;Document the owner and reason for each exception.&lt;/li&gt;
&lt;li&gt;Re-review the policy whenever a new source is added.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important part is the review discipline.&lt;/p&gt;

&lt;p&gt;A new source should not be a casual model change. If it changes where the workspace can send outbound traffic, it should trigger an access review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What BI teams should take from this
&lt;/h2&gt;

&lt;p&gt;This preview is not only a security feature.&lt;/p&gt;

&lt;p&gt;It is a sign that semantic model governance is getting more serious.&lt;/p&gt;

&lt;p&gt;For years, many organizations treated semantic models as a trusted middle layer because they were built by BI teams and consumed through reports.&lt;/p&gt;

&lt;p&gt;That assumption is weaker now.&lt;/p&gt;

&lt;p&gt;Semantic models sit in the middle of more workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Power BI reports&lt;/li&gt;
&lt;li&gt;Excel connections&lt;/li&gt;
&lt;li&gt;DirectQuery chains&lt;/li&gt;
&lt;li&gt;composite models&lt;/li&gt;
&lt;li&gt;Fabric workspaces&lt;/li&gt;
&lt;li&gt;Copilot and AI experiences&lt;/li&gt;
&lt;li&gt;automation and API-driven scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As the semantic model becomes more central, it also becomes more important to control what it can reach.&lt;/p&gt;

&lt;p&gt;That is the part I like about Outbound Access Protection.&lt;/p&gt;

&lt;p&gt;It forces a better architecture question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should this workspace be allowed to send data or queries to that destination?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is yes, make it explicit.&lt;/p&gt;

&lt;p&gt;If the answer is no, the platform should block it.&lt;/p&gt;

&lt;p&gt;That is how semantic models move from useful BI assets to governed platform components.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Power-BI-Updates-Blog/Outbound-Access-Protection-for-semantic-models-Preview/ba-p/5184917" rel="noopener noreferrer"&gt;Outbound Access Protection for semantic models, Microsoft Fabric Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/security/workspace-outbound-access-protection-overview" rel="noopener noreferrer"&gt;Workspace outbound access protection overview, Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/rest/api/fabric/core/workspaces/set-network-communication-policy" rel="noopener noreferrer"&gt;Workspaces: Set Network Communication Policy REST API, Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>microsoftfabric</category>
      <category>governance</category>
      <category>security</category>
    </item>
    <item>
      <title>Before You Put a Fabric AI Agent in Production, Steal This Checklist</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Tue, 19 May 2026 12:09:34 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/before-you-put-a-fabric-ai-agent-in-production-steal-this-checklist-4dff</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/before-you-put-a-fabric-ai-agent-in-production-steal-this-checklist-4dff</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-17-fabric-ai-agent-production-checklist.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-17-fabric-ai-agent-production-checklist.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A Fabric AI Agent demo can become useful faster than most teams expect.&lt;/p&gt;

&lt;p&gt;Connect it to a semantic model. Ask a few business questions. Add context from Eventhouse, a Lakehouse, or a Warehouse. Suddenly the demo feels close to something people could use.&lt;/p&gt;

&lt;p&gt;That is exactly where teams need to slow down for one hour.&lt;/p&gt;

&lt;p&gt;Not to block the idea. To stop the first working demo from becoming a messy production workload.&lt;/p&gt;

&lt;p&gt;This is the checklist I would use before moving a Fabric AI Agent past pilot stage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx250lwlbx8958r1n1tyb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx250lwlbx8958r1n1tyb.png" alt="Medium hero" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Give the agent its own identity
&lt;/h2&gt;

&lt;p&gt;A demo can run under a human account. Production should not.&lt;/p&gt;

&lt;p&gt;If an agent depends on one person’s access, the operating model is fragile. Permissions change when that person changes role. Ownership becomes unclear. Offboarding becomes risky. Troubleshooting becomes personal instead of operational.&lt;/p&gt;

&lt;p&gt;For a production agent, the better pattern is workload identity.&lt;/p&gt;

&lt;p&gt;That means the agent has a dedicated service principal, with access that can be granted, reviewed, rotated, and removed without depending on someone’s user account.&lt;/p&gt;

&lt;p&gt;This is the first line I would draw between a pilot and something ready for business users.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Start with one narrow use case
&lt;/h2&gt;

&lt;p&gt;The easiest way to make an AI agent hard to govern is to connect it to everything.&lt;/p&gt;

&lt;p&gt;Start smaller.&lt;/p&gt;

&lt;p&gt;A useful production candidate sounds like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explain sales variance from a governed semantic model&lt;/li&gt;
&lt;li&gt;Summarize operational events from Eventhouse&lt;/li&gt;
&lt;li&gt;Answer inventory questions for a specific operations team&lt;/li&gt;
&lt;li&gt;Help finance users understand reconciliation status&lt;/li&gt;
&lt;li&gt;Query a curated warehouse table for one business workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A weak production candidate sounds like this:&lt;/p&gt;

&lt;p&gt;“Let it answer questions about our data.”&lt;/p&gt;

&lt;p&gt;That is too broad. It gives the agent no clear boundary and gives the team no clean way to review access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbkhpnruqhfqcfexw5tk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbkhpnruqhfqcfexw5tk.png" alt="Reference architecture" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Map the data sources before adding them
&lt;/h2&gt;

&lt;p&gt;For every data source the agent can reach, write down why it needs it.&lt;/p&gt;

&lt;p&gt;Not in a 20-page governance document. A short access inventory is enough:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workspace&lt;/li&gt;
&lt;li&gt;Semantic model, Eventhouse, Lakehouse, or Warehouse&lt;/li&gt;
&lt;li&gt;Read-only or operational access&lt;/li&gt;
&lt;li&gt;Business owner&lt;/li&gt;
&lt;li&gt;Approval date&lt;/li&gt;
&lt;li&gt;Review date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is simple: someone should be able to look at the agent and understand its blast radius.&lt;/p&gt;

&lt;p&gt;If nobody can explain what the agent can reach, the agent is not ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Separate dev, test, and production
&lt;/h2&gt;

&lt;p&gt;Most demos start in one workspace, with one identity, and one person who understands the setup.&lt;/p&gt;

&lt;p&gt;That is normal.&lt;/p&gt;

&lt;p&gt;Leaving it that way is the problem.&lt;/p&gt;

&lt;p&gt;Before production, I would want a clean path across environments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Development for experimentation&lt;/li&gt;
&lt;li&gt;Test for validation&lt;/li&gt;
&lt;li&gt;Production for the restricted, supported version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The identities and permissions do not always need to be complicated. They do need to be deliberate.&lt;/p&gt;

&lt;p&gt;If dev and production use the same broad access, every experiment becomes a production risk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi074alvyrw0ltrcwe7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhi074alvyrw0ltrcwe7q.png" alt="Checklist" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Confirm the audit path
&lt;/h2&gt;

&lt;p&gt;If the agent gives a bad answer, uses the wrong source, or becomes part of a business process it was not designed for, you need evidence.&lt;/p&gt;

&lt;p&gt;Before launch, answer these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which identity did the agent use?&lt;/li&gt;
&lt;li&gt;Which data source was involved?&lt;/li&gt;
&lt;li&gt;Who can review activity?&lt;/li&gt;
&lt;li&gt;Who investigates issues?&lt;/li&gt;
&lt;li&gt;How do we separate an agent issue from a model issue?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where a lot of AI work gets uncomfortable. The demo focuses on the answer. Production needs the trail behind the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Treat new data sources as a change request
&lt;/h2&gt;

&lt;p&gt;The first agent will not stay still.&lt;/p&gt;

&lt;p&gt;Someone will ask to add finance data. Then operations data. Then a shortcut. Then an Eventhouse function. Then a warehouse table.&lt;/p&gt;

&lt;p&gt;Some of those requests will be valid.&lt;/p&gt;

&lt;p&gt;They should still trigger a review.&lt;/p&gt;

&lt;p&gt;Every new data source changes the agent’s scope. That means the identity, permissions, audit path, and owner should be checked again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rfgpkhtuyqu2apx5090.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9rfgpkhtuyqu2apx5090.png" alt="Demo to production" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Before a Fabric AI Agent goes live, I would want these six checks done:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dedicated service principal&lt;/li&gt;
&lt;li&gt;Narrow use case&lt;/li&gt;
&lt;li&gt;Known data sources&lt;/li&gt;
&lt;li&gt;Separated environments&lt;/li&gt;
&lt;li&gt;Least-privilege permissions&lt;/li&gt;
&lt;li&gt;Clear audit path and owner&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If those answers are vague, the agent is still a pilot.&lt;/p&gt;

&lt;p&gt;That is not a failure. It just means the platform work is not finished.&lt;/p&gt;

&lt;p&gt;The goal is not to slow down AI agents. The goal is to make them safe enough to use with real business data.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>ai</category>
      <category>dataengineering</category>
      <category>governance</category>
    </item>
    <item>
      <title>Your Microsoft Fabric Bill Has a OneLake Problem</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Tue, 19 May 2026 11:37:28 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/your-microsoft-fabric-bill-has-a-onelake-problem-2j9i</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/your-microsoft-fabric-bill-has-a-onelake-problem-2j9i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-13-microsoft-fabric-bill-onelake-problem.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-13-microsoft-fabric-bill-onelake-problem.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most Fabric cost conversations start too late.&lt;/p&gt;

&lt;p&gt;The bill shows up. Someone opens the Capacity Metrics app. A few workspaces look suspicious. Then the team starts asking the questions they should have asked months earlier:&lt;/p&gt;

&lt;p&gt;Why is this data still here?&lt;/p&gt;

&lt;p&gt;Who owns it?&lt;/p&gt;

&lt;p&gt;Is anyone using it?&lt;/p&gt;

&lt;p&gt;Can we move it to a cheaper tier?&lt;/p&gt;

&lt;p&gt;Can we delete it safely?&lt;/p&gt;

&lt;p&gt;That is not a storage problem. That is an architecture problem.&lt;/p&gt;

&lt;p&gt;OneLake storage tiers and lifecycle management are interesting because they push Fabric teams toward a more mature operating model. Not “how much data can we land in the lake?” but “what should happen to this data after it stops being hot?”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymrrmobaquxnueyxnkjz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymrrmobaquxnueyxnkjz.png" alt="Hero visual: OneLake storage cost architecture" width="799" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OneLake changes the storage conversation
&lt;/h2&gt;

&lt;p&gt;OneLake is designed as the single logical data lake for a Fabric tenant. Microsoft describes it as the OneDrive for data: one place for analytics data across the organization, built on top of ADLS Gen2, used by Fabric experiences like lakehouses and warehouses.&lt;/p&gt;

&lt;p&gt;That simplicity is useful. It also creates a trap.&lt;/p&gt;

&lt;p&gt;When storage feels central and easy, teams can treat it like an infinite landing zone.&lt;/p&gt;

&lt;p&gt;Raw files stay forever. Staging tables become permanent. Old extracts sit next to active analytical data. Development leftovers survive because nobody wants to break something. Warehouses and lakehouses grow quietly until cost becomes visible enough to hurt.&lt;/p&gt;

&lt;p&gt;OneLake storage is billed by data stored, per GB. It does not consume Fabric CUs, but it is still a real cost line. And OneLake transactions consume existing Fabric capacity.&lt;/p&gt;

&lt;p&gt;So the design question is not only “can Fabric store this?”&lt;/p&gt;

&lt;p&gt;It is “what is the lifecycle of this data?”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjmhec7sw746zywmpxn0c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjmhec7sw746zywmpxn0c.png" alt="Diagram: OneLake Cost Architecture" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Data has temperature
&lt;/h2&gt;

&lt;p&gt;A lot of BI teams already understand this concept informally.&lt;/p&gt;

&lt;p&gt;Some data is hot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;used in daily dashboards&lt;/li&gt;
&lt;li&gt;queried by semantic models&lt;/li&gt;
&lt;li&gt;refreshed often&lt;/li&gt;
&lt;li&gt;tied to executive reporting&lt;/li&gt;
&lt;li&gt;needed for operational decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some data is warm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;used for monthly or quarterly analysis&lt;/li&gt;
&lt;li&gt;relevant for trend comparison&lt;/li&gt;
&lt;li&gt;still valuable, but not constantly queried&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some data is cold:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retained for audit&lt;/li&gt;
&lt;li&gt;rarely queried&lt;/li&gt;
&lt;li&gt;needed for compliance or reconstruction&lt;/li&gt;
&lt;li&gt;expensive to keep in the wrong place forever&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And some data should not be stored at all anymore.&lt;/p&gt;

&lt;p&gt;The mistake is treating all of these as the same class of data because they happen to live in the same lake.&lt;/p&gt;

&lt;p&gt;Storage tiers force a better conversation. Lifecycle management makes that conversation operational.&lt;/p&gt;

&lt;p&gt;The value is not only cheaper storage. The value is that someone has to define rules.&lt;/p&gt;

&lt;p&gt;Who owns this dataset?&lt;/p&gt;

&lt;p&gt;How long does it need to stay hot?&lt;/p&gt;

&lt;p&gt;What is the retrieval expectation after it cools down?&lt;/p&gt;

&lt;p&gt;What regulation or business process requires retention?&lt;/p&gt;

&lt;p&gt;What is the cleanup rule when nobody owns it anymore?&lt;/p&gt;

&lt;p&gt;Those are governance questions, not just admin settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqotn1tqt0uh0fwpu4tkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqotn1tqt0uh0fwpu4tkm.png" alt="Visual: Data lifecycle through temperature zones" width="799" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  This is where Fabric FinOps becomes real
&lt;/h2&gt;

&lt;p&gt;FinOps in analytics is often treated as capacity tuning.&lt;/p&gt;

&lt;p&gt;Pause this. Scale that. Optimize a query. Move workloads away from peak hours.&lt;/p&gt;

&lt;p&gt;All of that matters.&lt;/p&gt;

&lt;p&gt;But storage lifecycle is a different layer of cost discipline. It is less about fixing an expensive day and more about preventing an expensive architecture.&lt;/p&gt;

&lt;p&gt;A Fabric team should be able to answer a few basic questions for each important workspace:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What data is actively serving reports or models?&lt;/li&gt;
&lt;li&gt;What data is kept only for history?&lt;/li&gt;
&lt;li&gt;What data is duplicated because a pipeline was easier to build that way?&lt;/li&gt;
&lt;li&gt;What data is retained because of policy?&lt;/li&gt;
&lt;li&gt;What data has no owner and no clear use?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the team cannot answer those questions, adding lifecycle rules later will be risky. You cannot safely automate movement or deletion when nobody understands what the data is doing.&lt;/p&gt;

&lt;p&gt;That is why I would not start with “turn on tiering everywhere.”&lt;/p&gt;

&lt;p&gt;I would start with classification.&lt;/p&gt;

&lt;p&gt;A simple workspace review can expose most of the issue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;active analytical data&lt;/li&gt;
&lt;li&gt;temporary processing data&lt;/li&gt;
&lt;li&gt;historical data&lt;/li&gt;
&lt;li&gt;compliance-retained data&lt;/li&gt;
&lt;li&gt;orphaned or unknown data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only after that does tiering become useful.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5v3v3ma9h3ccy96y7093.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5v3v3ma9h3ccy96y7093.png" alt="Diagram: Fabric Storage FinOps Loop" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical operating model
&lt;/h2&gt;

&lt;p&gt;For a Fabric-heavy organization, I would handle OneLake lifecycle as an operating model, not a one-time cleanup.&lt;/p&gt;

&lt;p&gt;Start with these rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every important dataset needs an owner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If nobody owns it, nobody can approve tiering, retention, or deletion.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every workspace needs a storage review rhythm.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Monthly for active production workspaces. Quarterly for slower domains. No review means no cost control.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Temporary data needs an expiry rule.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Staging and intermediate outputs are useful. They should not become permanent by accident.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Historical data needs a retrieval expectation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the business expects instant access, that is one decision. If slower access is acceptable, that is another. Cost follows that decision.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retention needs to be explicit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;“Keep everything forever” is not a retention policy. It is usually a sign that nobody wants to make the decision.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Storage metrics need to be reviewed next to business context.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Capacity Metrics app can show where storage is growing. It cannot tell you whether that growth is justified. That part still belongs to the team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuakwp0dgj4vqle1jvr7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuakwp0dgj4vqle1jvr7j.png" alt="Visual: Fabric FinOps governance around OneLake" width="799" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would not do
&lt;/h2&gt;

&lt;p&gt;I would not treat storage tiers as a magic cost button.&lt;/p&gt;

&lt;p&gt;Moving data colder can reduce cost, but it can also create support problems if the team does not understand access patterns. Deleting data can be correct, but only when ownership and retention are clear. Automating lifecycle rules too early can turn a messy lake into a risky lake.&lt;/p&gt;

&lt;p&gt;The better sequence is:&lt;/p&gt;

&lt;p&gt;Measure first.&lt;/p&gt;

&lt;p&gt;Classify second.&lt;/p&gt;

&lt;p&gt;Apply lifecycle policies third.&lt;/p&gt;

&lt;p&gt;Review continuously.&lt;/p&gt;

&lt;p&gt;That is slower than a cleanup script, but it is much safer.&lt;/p&gt;

&lt;p&gt;And for most organizations, the expensive part is not the storage itself. It is the lack of decisions around storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The main takeaway
&lt;/h2&gt;

&lt;p&gt;OneLake storage tiers are not just a cost feature.&lt;/p&gt;

&lt;p&gt;They are a forcing function.&lt;/p&gt;

&lt;p&gt;They force Fabric teams to define data temperature, ownership, retention, and cleanup rules. They turn storage from an invisible side effect into an architectural decision.&lt;/p&gt;

&lt;p&gt;That is a good thing.&lt;/p&gt;

&lt;p&gt;Because Fabric makes it very easy to centralize data.&lt;/p&gt;

&lt;p&gt;The next maturity step is making sure the data does not stay hot, expensive, and ownerless forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/onelake/onelake-consumption" rel="noopener noreferrer"&gt;OneLake consumption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/onelake/onelake-capacity-consumption" rel="noopener noreferrer"&gt;OneLake capacity consumption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/onelake/onelake-overview" rel="noopener noreferrer"&gt;What is OneLake?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.fabric.microsoft.com/en-us/blog/onelake-costs-simplified-lowering-capacity-utilization-when-accessing-onelake?ft=All" rel="noopener noreferrer"&gt;OneLake costs simplified&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>dataengineering</category>
      <category>governance</category>
      <category>finops</category>
    </item>
    <item>
      <title>Repository Intelligence: The Real Shift Behind Microsoft Fabric + Git</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Tue, 19 May 2026 11:37:26 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/repository-intelligence-the-real-shift-behind-microsoft-fabric-git-2hn2</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/repository-intelligence-the-real-shift-behind-microsoft-fabric-git-2hn2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published at &lt;a href="https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-10-repository-intelligence-fabric-git.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-05-10-repository-intelligence-fabric-git.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2nivoczythnshj9bc3y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2nivoczythnshj9bc3y.jpg" alt="Repository Intelligence turns the Fabric repository into a reasoning surface for AI-assisted analytics engineering." width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Repository Intelligence turns the Fabric repository into a reasoning surface for AI-assisted analytics engineering.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most teams still treat Microsoft Fabric + Git integration as a source control feature.&lt;/p&gt;

&lt;p&gt;That is understandable. The obvious benefits are versioning, pull requests, rollback, branch-based development, and CI/CD. Those are useful. I want them. Any serious analytics engineering team should want them.&lt;/p&gt;

&lt;p&gt;But I do not think that is the real shift.&lt;/p&gt;

&lt;p&gt;The bigger change is what happens when a Fabric workspace stops being a collection of things inside a UI and starts becoming a machine-readable representation of the analytics platform.&lt;/p&gt;

&lt;p&gt;That is a different category of value.&lt;/p&gt;

&lt;p&gt;Once the workspace is represented as a repository, the repo is no longer just a backup of the workspace. It becomes a context layer. And once that context layer exists, AI can work against it in a much more useful way.&lt;/p&gt;

&lt;p&gt;Not as a chatbot floating above the platform.&lt;br&gt;
Not as a natural language interface on top of one semantic model.&lt;br&gt;
Not as a one-time parser for a PBIX file.&lt;/p&gt;

&lt;p&gt;As a set of repository-aware engineering Skills that understand the structure, relationships, naming conventions, business logic, and drift inside the analytics estate.&lt;/p&gt;

&lt;p&gt;That is what I mean by Repository Intelligence.&lt;/p&gt;
&lt;h2&gt;
  
  
  The mistake: stopping at source control
&lt;/h2&gt;

&lt;p&gt;Fabric Git integration already gives teams a very practical foundation. Microsoft describes it as workspace-level integration with Git, where Fabric items are represented in a repository and the workspace structure, including folders, can be preserved. Supported items include semantic models, reports, notebooks, pipelines, lakehouses, warehouses, KQL assets, data agents, and more.&lt;/p&gt;

&lt;p&gt;That matters because the repo is not just random exported files. Fabric items have a source format. For example, reports can include files like &lt;code&gt;definition.pbir&lt;/code&gt; and &lt;code&gt;report.json&lt;/code&gt;. Semantic models can include &lt;code&gt;definition.pbism&lt;/code&gt; and a definition folder with TMDL files. Each item folder also includes system metadata such as &lt;code&gt;.platform&lt;/code&gt;, with fields like type, display name, description, and logical ID.&lt;/p&gt;

&lt;p&gt;That gives us something important: an analyzable surface.&lt;/p&gt;

&lt;p&gt;Most teams use that surface for the normal ALM story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;commit changes&lt;/li&gt;
&lt;li&gt;review diffs&lt;/li&gt;
&lt;li&gt;merge to main&lt;/li&gt;
&lt;li&gt;deploy through environments&lt;/li&gt;
&lt;li&gt;roll back when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, all good.&lt;/p&gt;

&lt;p&gt;But if that is where the architecture stops, the team has only moved the workspace into Git. It has not made the workspace intelligent.&lt;/p&gt;

&lt;p&gt;The more interesting question is this:&lt;/p&gt;

&lt;p&gt;What can reason over the repository now that the repository contains enough structure to describe the analytics platform?&lt;/p&gt;
&lt;h2&gt;
  
  
  The repository becomes the workspace's memory
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8b5eu37nerkwt89wgwd6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8b5eu37nerkwt89wgwd6.png" alt="The useful unit is not one file. It is the connected graph across the workspace." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The useful unit is not one file. It is the connected graph across the workspace.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A Fabric workspace has many kinds of knowledge hiding inside it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;semantic model tables, columns, measures, relationships, roles, and perspectives&lt;/li&gt;
&lt;li&gt;report pages, visuals, filters, bookmarks, and dependencies&lt;/li&gt;
&lt;li&gt;pipelines, activities, parameters, connections, and schedules&lt;/li&gt;
&lt;li&gt;notebooks, Spark logic, lakehouse paths, and transformation patterns&lt;/li&gt;
&lt;li&gt;warehouse objects, views, procedures, and SQL logic&lt;/li&gt;
&lt;li&gt;data agents, instructions, examples, and configured sources&lt;/li&gt;
&lt;li&gt;naming conventions and folder structures&lt;/li&gt;
&lt;li&gt;business terms expressed across measures, reports, descriptions, and documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the UI, those things feel separate.&lt;/p&gt;

&lt;p&gt;In a repository, they can become connected.&lt;/p&gt;

&lt;p&gt;A measure is not just a line of DAX. It belongs to a table. It uses columns. It may repeat business logic from another measure. It may feed visuals across several reports. Those reports may be used by a finance team. The same concept may also appear in a notebook, a pipeline name, a warehouse view, and a glossary entry.&lt;/p&gt;

&lt;p&gt;That is the point.&lt;/p&gt;

&lt;p&gt;The intelligence does not come from one file. It comes from the graph across files.&lt;/p&gt;

&lt;p&gt;A single PBIX parser can tell you what is inside one report. Repository Intelligence should tell you what a change means across the workspace.&lt;/p&gt;

&lt;p&gt;That is the difference between file inspection and platform understanding.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I mean by AI Skills
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fba5hdifh53fpo53c64wv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fba5hdifh53fpo53c64wv.png" alt="A Skill is a controlled workflow over repository context, not a generic chatbot." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A Skill is a controlled workflow over repository context, not a generic chatbot.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I am using the word Skill very deliberately here.&lt;/p&gt;

&lt;p&gt;A Skill is not a generic chatbot prompt. It is a structured, reusable agent workflow designed to perform a specific engineering task against repository context.&lt;/p&gt;

&lt;p&gt;In practical terms, I would expect a Skill to live close to the repo, often as a &lt;code&gt;SKILL.md&lt;/code&gt; file or similar definition, with clear instructions, required inputs, safety rules, expected outputs, and examples.&lt;/p&gt;

&lt;p&gt;A simple repository Skill might define:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Name: DAX Complexity Reviewer
Purpose: Identify measures that are too complex, duplicated, or risky to maintain.
Inputs: TMDL files, measure definitions, relationships, report dependencies.
Output: Markdown review with risk score, affected reports, and refactoring suggestions.
Allowed actions: Read files, write report, optionally open pull request.
Not allowed: Change business logic without human approval.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a different mental model than "ask my data a question."&lt;/p&gt;

&lt;p&gt;Microsoft Fabric data agents are very useful for conversational Q&amp;amp;A over governed data sources like lakehouses, warehouses, semantic models, KQL databases, ontologies, and Microsoft Graph. They can generate SQL, DAX, or KQL under the user's permissions.&lt;/p&gt;

&lt;p&gt;Repository-aware Skills solve a different problem.&lt;/p&gt;

&lt;p&gt;They help engineers understand and improve the analytics platform itself.&lt;/p&gt;

&lt;p&gt;The data agent answers business questions.&lt;br&gt;
The repository Skill reviews the system that produces the answers.&lt;/p&gt;

&lt;p&gt;Both matter. They are not the same thing.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Repository Intelligence can actually do
&lt;/h2&gt;

&lt;p&gt;Here are examples that become much more realistic once the Fabric workspace is represented as code.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Trace lineage across the workspace
&lt;/h3&gt;

&lt;p&gt;A Skill can inspect semantic models, reports, pipelines, notebooks, lakehouse paths, and warehouse objects to build lineage that is closer to how the platform is actually maintained.&lt;/p&gt;

&lt;p&gt;Not just "this table feeds this report."&lt;/p&gt;

&lt;p&gt;More useful questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which reports would be affected if this column is renamed?&lt;/li&gt;
&lt;li&gt;Which measures depend on this calculated column?&lt;/li&gt;
&lt;li&gt;Which pipelines load the table used by this executive dashboard?&lt;/li&gt;
&lt;li&gt;Which notebooks write into lakehouse paths later used by a model?&lt;/li&gt;
&lt;li&gt;Which assets are disconnected from anything users actually consume?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the repo becomes a map, not storage.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Detect duplicated business logic
&lt;/h3&gt;

&lt;p&gt;Every mature BI estate eventually collects duplicate definitions.&lt;/p&gt;

&lt;p&gt;Revenue appears in five measures.&lt;br&gt;
Active customer logic appears in a notebook, a SQL view, and a DAX measure.&lt;br&gt;
A margin calculation changes in one report and not another.&lt;/p&gt;

&lt;p&gt;A repository-aware Skill can search across TMDL, SQL, notebooks, pipeline expressions, and documentation to find similar logic and flag drift.&lt;/p&gt;

&lt;p&gt;The best version is not just text similarity. It should understand semantic similarity.&lt;/p&gt;

&lt;p&gt;Two measures can look different and still mean the same business thing.&lt;br&gt;
Two measures can look similar and mean something different.&lt;/p&gt;

&lt;p&gt;That is exactly the kind of review where an AI workflow can help, as long as it has the right context and a human keeps final judgment.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Score DAX and model complexity
&lt;/h3&gt;

&lt;p&gt;Complexity is not automatically bad. Some measures are complex because the business is complex.&lt;/p&gt;

&lt;p&gt;But teams still need a way to see where maintenance risk is building up.&lt;/p&gt;

&lt;p&gt;A DAX complexity Skill could score measures based on signals such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;length and nesting depth&lt;/li&gt;
&lt;li&gt;repeated patterns&lt;/li&gt;
&lt;li&gt;iterator usage&lt;/li&gt;
&lt;li&gt;dependency chain depth&lt;/li&gt;
&lt;li&gt;number of downstream visuals&lt;/li&gt;
&lt;li&gt;use of ambiguous naming&lt;/li&gt;
&lt;li&gt;duplicated logic across models&lt;/li&gt;
&lt;li&gt;missing descriptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output should not be "bad measure, rewrite it."&lt;/p&gt;

&lt;p&gt;A better output is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Measure: Net Revenue YoY %
Risk: High
Why: deep dependency chain, repeated filter logic, used by 14 visuals across 3 reports.
Suggested next step: extract base revenue logic into a reusable measure and add a description.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is actionable.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Identify governance drift
&lt;/h3&gt;

&lt;p&gt;Governance problems usually show up slowly.&lt;/p&gt;

&lt;p&gt;A workspace starts with clean naming. Then a few urgent reports get built. A pipeline is copied. A measure is created without a description. RLS roles drift. Sensitivity labels are not consistent. A notebook writes to a path nobody recognizes.&lt;/p&gt;

&lt;p&gt;By the time someone notices, the workspace already feels messy.&lt;/p&gt;

&lt;p&gt;A governance drift Skill can compare the repo against standards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;naming conventions&lt;/li&gt;
&lt;li&gt;folder structure&lt;/li&gt;
&lt;li&gt;required descriptions&lt;/li&gt;
&lt;li&gt;semantic model role patterns&lt;/li&gt;
&lt;li&gt;report certification rules&lt;/li&gt;
&lt;li&gt;deployment rules&lt;/li&gt;
&lt;li&gt;forbidden shortcuts or connection patterns&lt;/li&gt;
&lt;li&gt;expected owner metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Skill does not need to be dramatic. It just needs to be consistent.&lt;/p&gt;

&lt;p&gt;Every pull request can get a small governance review before the mess becomes normal.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Regenerate useful documentation
&lt;/h3&gt;

&lt;p&gt;Most documentation fails because it is detached from the system.&lt;/p&gt;

&lt;p&gt;Someone writes it once. The model changes. The pipeline changes. The documentation becomes a museum.&lt;/p&gt;

&lt;p&gt;The repository gives us a better option.&lt;/p&gt;

&lt;p&gt;Documentation can be generated from the same files engineers are already changing.&lt;/p&gt;

&lt;p&gt;A documentation Skill could maintain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;README files for each workspace or domain&lt;/li&gt;
&lt;li&gt;semantic model dictionaries&lt;/li&gt;
&lt;li&gt;measure catalogs&lt;/li&gt;
&lt;li&gt;report inventories&lt;/li&gt;
&lt;li&gt;pipeline summaries&lt;/li&gt;
&lt;li&gt;data product ownership notes&lt;/li&gt;
&lt;li&gt;change summaries for business stakeholders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important part is not generating pretty prose.&lt;/p&gt;

&lt;p&gt;The important part is keeping the documentation close to the source of truth and refreshing it when the source changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Translate business glossary into implementation
&lt;/h3&gt;

&lt;p&gt;This is where things get interesting.&lt;/p&gt;

&lt;p&gt;Most organizations have business terms that live somewhere outside the model. Sometimes in SharePoint. Sometimes in Excel. Sometimes only in someone's head.&lt;/p&gt;

&lt;p&gt;A Skill can compare glossary terms against the repository and ask practical questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this term implemented as a measure?&lt;/li&gt;
&lt;li&gt;Is the definition consistent across models?&lt;/li&gt;
&lt;li&gt;Are the report labels aligned with the glossary?&lt;/li&gt;
&lt;li&gt;Is there a measure description users can trust?&lt;/li&gt;
&lt;li&gt;Does the DAX logic match the business definition closely enough to review?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It should not auto-create business logic and pretend it is correct.&lt;/p&gt;

&lt;p&gt;But it can scaffold the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proposed measure names&lt;/li&gt;
&lt;li&gt;draft descriptions&lt;/li&gt;
&lt;li&gt;candidate DAX patterns&lt;/li&gt;
&lt;li&gt;impacted reports&lt;/li&gt;
&lt;li&gt;questions for the business owner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes the human review sharper.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Open pull requests with context
&lt;/h3&gt;

&lt;p&gt;The natural end state is not just analysis. It is controlled action.&lt;/p&gt;

&lt;p&gt;A repository-aware Skill should be able to open a pull request that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the proposed file changes&lt;/li&gt;
&lt;li&gt;the reason for the change&lt;/li&gt;
&lt;li&gt;the affected Fabric items&lt;/li&gt;
&lt;li&gt;the lineage impact&lt;/li&gt;
&lt;li&gt;the test or validation notes&lt;/li&gt;
&lt;li&gt;the governance checks it performed&lt;/li&gt;
&lt;li&gt;questions that still require a human decision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the repo becomes the operating surface for AI-assisted analytics engineering.&lt;/p&gt;

&lt;p&gt;Not autonomous chaos.&lt;/p&gt;

&lt;p&gt;Controlled, reviewable, auditable changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical starter architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvh3wf86jvj26qvvz45a3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvh3wf86jvj26qvvz45a3.png" alt="The practical path is small: sync, index, review, assist, then controlled action." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The practical path is small: sync, index, review, assist, then controlled action.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If I were starting this in a real Fabric environment, I would not try to build a giant agent first.&lt;/p&gt;

&lt;p&gt;I would start small.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Connect the workspace to Git
&lt;/h3&gt;

&lt;p&gt;Get the basics right first. Use Fabric Git integration at the workspace level. Keep folder structure intentional. Make sure the supported items that matter to your team are actually syncing.&lt;/p&gt;

&lt;p&gt;Do not skip naming. AI depends heavily on names, descriptions, and structure. Bad naming is not just a human problem anymore. It becomes machine context debt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Build a repository index
&lt;/h3&gt;

&lt;p&gt;Create a lightweight index of the repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;item folders&lt;/li&gt;
&lt;li&gt;item types&lt;/li&gt;
&lt;li&gt;logical IDs&lt;/li&gt;
&lt;li&gt;display names&lt;/li&gt;
&lt;li&gt;semantic model files&lt;/li&gt;
&lt;li&gt;report files&lt;/li&gt;
&lt;li&gt;pipeline definitions&lt;/li&gt;
&lt;li&gt;notebook files&lt;/li&gt;
&lt;li&gt;dependency references&lt;/li&gt;
&lt;li&gt;descriptions and labels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not need to be perfect on day one.&lt;/p&gt;

&lt;p&gt;The first version can be a simple JSON index generated on every commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create three Skills, not thirty
&lt;/h3&gt;

&lt;p&gt;I would start with three Skills that create obvious value:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Workspace Documentation Skill&lt;/strong&gt;&lt;br&gt;
Regenerates README files, inventories, and semantic model summaries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Semantic Model Review Skill&lt;/strong&gt;&lt;br&gt;
Reviews measures, relationships, descriptions, naming, and obvious DAX risks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lineage Impact Skill&lt;/strong&gt;&lt;br&gt;
Answers "what breaks or changes if this asset changes?" for pull requests.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are boring in the best way. They help every team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Run Skills in pull requests
&lt;/h3&gt;

&lt;p&gt;Do not start by giving the agent write access to everything.&lt;/p&gt;

&lt;p&gt;Start with read-only reviews in pull requests.&lt;/p&gt;

&lt;p&gt;Let the Skill comment with findings. Let humans decide. Measure which findings are useful. Tune the Skill instructions. Add examples from real reviews.&lt;/p&gt;

&lt;p&gt;Only after that should you allow limited write actions, like regenerating documentation or adding missing descriptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Keep the human in the loop
&lt;/h3&gt;

&lt;p&gt;Repository Intelligence should reduce blind spots, not remove accountability.&lt;/p&gt;

&lt;p&gt;If a Skill suggests a DAX refactor, a person still owns the business meaning.&lt;br&gt;
If a Skill flags governance drift, a person still decides priority.&lt;br&gt;
If a Skill opens a PR, a person still reviews and merges.&lt;/p&gt;

&lt;p&gt;That boundary is not a weakness. It is the safety model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real asset is context
&lt;/h2&gt;

&lt;p&gt;Models will improve. APIs will change. Copilot features will keep moving. Fabric data agents will get better. The tooling around AI-assisted engineering will keep changing too.&lt;/p&gt;

&lt;p&gt;But the durable asset is the context layer.&lt;/p&gt;

&lt;p&gt;A clean, machine-readable repository that describes the analytics platform is valuable no matter which model or agent framework sits on top of it.&lt;/p&gt;

&lt;p&gt;That is the part teams should pay attention to.&lt;/p&gt;

&lt;p&gt;Not because Git is new.&lt;/p&gt;

&lt;p&gt;Because Git turns the Fabric workspace into something AI can reason about.&lt;/p&gt;

&lt;p&gt;Semantic models. Reports. Pipelines. Notebooks. KPIs. RLS roles. Naming conventions. Business logic. Documentation. All of it becomes part of the same graph.&lt;/p&gt;

&lt;p&gt;That graph is where Repository Intelligence starts.&lt;/p&gt;

&lt;p&gt;And I think that is the real shift behind Fabric + Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Skills to build first
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faavqsf57vnyzk6435f32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faavqsf57vnyzk6435f32.png" alt="A starter catalog of repository-aware Skills for Fabric teams." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A starter catalog of repository-aware Skills for Fabric teams.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you want a practical starting backlog, I would build these in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Repo Inventory Skill&lt;/strong&gt;&lt;br&gt;
Creates a structured map of all Fabric items in the repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lineage Impact Skill&lt;/strong&gt;&lt;br&gt;
Explains downstream impact for changed tables, columns, measures, notebooks, and pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DAX Complexity Skill&lt;/strong&gt;&lt;br&gt;
Scores risky measures and points reviewers to the right places.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation Refresh Skill&lt;/strong&gt;&lt;br&gt;
Updates READMEs, model dictionaries, and report inventories from the repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Governance Drift Skill&lt;/strong&gt;&lt;br&gt;
Checks naming, descriptions, RLS patterns, owners, and folder standards.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Glossary Alignment Skill&lt;/strong&gt;&lt;br&gt;
Compares business terms against measures, labels, and descriptions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pull Request Context Skill&lt;/strong&gt;&lt;br&gt;
Summarizes what changed, why it matters, and what reviewers should check.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the path I would trust.&lt;/p&gt;

&lt;p&gt;Small Skills. Clear boundaries. Real repository context. Human review.&lt;/p&gt;

&lt;p&gt;That is how AI-native analytics engineering starts to become practical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Fabric Git integration overview: &lt;a href="https://learn.microsoft.com/en-us/fabric/cicd/git-integration/intro-to-git-integration" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/fabric/cicd/git-integration/intro-to-git-integration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft Fabric Git source code format: &lt;a href="https://learn.microsoft.com/en-us/fabric/cicd/git-integration/source-code-format" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/fabric/cicd/git-integration/source-code-format&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft Fabric data agents: &lt;a href="https://learn.microsoft.com/en-us/fabric/data-science/concept-data-agent" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/fabric/data-science/concept-data-agent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Let’s connect on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>git</category>
      <category>ai</category>
      <category>powerbi</category>
    </item>
  </channel>
</rss>
