<?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.us-east-2.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>The Hidden Visual Pattern That Gives Power BI Copilot Better Context</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Sun, 13 Sep 2026 23:44:30 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/the-hidden-visual-pattern-that-gives-power-bi-copilot-better-context-59i5</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/the-hidden-visual-pattern-that-gives-power-bi-copilot-better-context-59i5</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-09-13-power-bi-copilot-hidden-visuals.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-09-13-power-bi-copilot-hidden-visuals.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A Power BI report can contain useful analytical context that is not visible when the page first opens.&lt;/p&gt;

&lt;p&gt;Teams already use bookmarks to reveal detail panels, alternate charts, and guided explanations without crowding the default canvas. The August 2026 Power BI update makes that pattern more relevant to Copilot: report summaries and answers can now consider visuals that are hidden by default and revealed through display-only report bookmarks.&lt;/p&gt;

&lt;p&gt;This creates a useful design opportunity. A report author can keep the main page focused while making additional analytical views reachable to both the user and Copilot.&lt;/p&gt;

&lt;p&gt;The important word is &lt;strong&gt;intentional&lt;/strong&gt;. Hidden visuals should not become a place to store unexplained measures or abandoned chart experiments. They are part of the report's analytical contract now, and they need the same naming, permissions, validation, and ownership as visible visuals.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;Microsoft documents two related experiences:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;Copilot report pane&lt;/strong&gt; can summarize visuals across the report, including visuals hidden by default behind a display-only bookmark. It reads those visuals in place without changing the current bookmark state. RLS and OLS remain enforced.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Copilot narrative visual&lt;/strong&gt; lets an author turn on &lt;strong&gt;Show hidden bookmark visuals&lt;/strong&gt;, review the eligible hidden visuals, and select which ones should contribute to the narrative.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The boundary matters. Microsoft limits this behavior to display-only report bookmarks, where the bookmark changes visibility but does not save data state. The bookmark must also be reachable through a bookmark button or bookmark navigator. Personal bookmarks are not supported. Visuals on hidden pages are excluded unless a report bookmark makes them visible.&lt;/p&gt;

&lt;p&gt;This is more than a small Copilot enhancement. It changes how I would review the report canvas.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqvpv0h7et9jjj09se7yy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqvpv0h7et9jjj09se7yy.png" alt="Power BI Copilot context surface showing visible visuals and reachable hidden bookmark visuals inside the RLS and OLS security boundary." width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat hidden visuals as a second analytical surface
&lt;/h2&gt;

&lt;p&gt;A clean executive page often needs fewer visuals, not more. That does not mean every useful analytical view must disappear.&lt;/p&gt;

&lt;p&gt;A display-only bookmark can reveal a focused detail panel when a user asks for it. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a regional breakdown behind a headline KPI;&lt;/li&gt;
&lt;li&gt;a variance bridge behind a monthly result;&lt;/li&gt;
&lt;li&gt;a product mix chart behind a total margin card;&lt;/li&gt;
&lt;li&gt;a service-level detail view behind an operations summary;&lt;/li&gt;
&lt;li&gt;a definition panel that explains how the KPI is calculated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The default page remains readable. The extra context remains part of the report experience, and Copilot can use it when the documented conditions are met.&lt;/p&gt;

&lt;p&gt;This is a better design pattern than placing twelve visuals on the opening page because each stakeholder may need one of them. It also avoids creating disconnected hidden pages that users cannot reach and authors forget to maintain.&lt;/p&gt;

&lt;p&gt;But there is a catch: Copilot works from the report visuals and their metadata. A hidden chart called &lt;code&gt;Visual 27&lt;/code&gt; with a vague axis and an unexplained measure is poor context. Hiding it does not improve its meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use an authoring contract
&lt;/h2&gt;

&lt;p&gt;I would add five rules to the report review checklist.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Make the bookmark display-only
&lt;/h3&gt;

&lt;p&gt;Clear &lt;strong&gt;Data&lt;/strong&gt; for the bookmark so it changes visibility rather than storing filter or slicer state. This keeps the hidden visual eligible under Microsoft's documented behavior and avoids coupling the context panel to an old saved selection.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Give users a real path to the visual
&lt;/h3&gt;

&lt;p&gt;Use a bookmark button or bookmark navigator. A hidden visual that nobody can reach is not part of a usable report experience. Microsoft also excludes bookmarks without a user-facing affordance from this Copilot pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Name the analytical view clearly
&lt;/h3&gt;

&lt;p&gt;Use a title that describes the measure, comparison, and grain. &lt;code&gt;Margin variance by product category&lt;/code&gt; gives Copilot and the reader more context than &lt;code&gt;Variance chart&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Axis titles, units, date scope, and business terminology should be explicit. The hidden state is a layout choice, not permission to lower the metadata standard.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Keep one business question per hidden panel
&lt;/h3&gt;

&lt;p&gt;A bookmark panel should answer a recognizable follow-up question. If it contains unrelated charts, Copilot may have more material but less coherent context.&lt;/p&gt;

&lt;p&gt;A practical test is simple: can the author complete this sentence?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Open this panel when you need to understand ________.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer needs three paragraphs, the panel probably needs to be split.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Review security and freshness like any visible visual
&lt;/h3&gt;

&lt;p&gt;RLS and OLS remain enforced, which is the right security behavior. Still, test with representative roles. Also verify that the measure logic, visual filters, and refresh expectations are current. Hidden visuals are easy to miss during ordinary visual inspection.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5cuhzujwkwhf1868le5x.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5cuhzujwkwhf1868le5x.png" alt="Five-rule authoring contract for display-only bookmark visuals used as Power BI Copilot context." width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the experience, not the checkbox
&lt;/h2&gt;

&lt;p&gt;Do not validate this feature by confirming that the bookmark opens and Copilot returns text. Use a small acceptance test with a known result.&lt;/p&gt;

&lt;p&gt;Pick one report page and one hidden analytical panel. Create a question that can be answered from the visible page, then a second question that requires the hidden visual. Record the expected values before running Copilot.&lt;/p&gt;

&lt;p&gt;Run at least these four cases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Report state&lt;/th&gt;
&lt;th&gt;What to verify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visible baseline&lt;/td&gt;
&lt;td&gt;Default page&lt;/td&gt;
&lt;td&gt;Summary cites and reconciles with visible totals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden context&lt;/td&gt;
&lt;td&gt;Default page, hidden panel reachable&lt;/td&gt;
&lt;td&gt;Answer can reference the eligible hidden visual without changing bookmark state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filtered context&lt;/td&gt;
&lt;td&gt;Apply a supported filter or slicer&lt;/td&gt;
&lt;td&gt;Answer respects the current report context and cites the expected visual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restricted role&lt;/td&gt;
&lt;td&gt;Test as a representative RLS or OLS role&lt;/td&gt;
&lt;td&gt;Response does not reveal data or metadata outside that role&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the narrative visual, also verify the author's selection. Turn on &lt;strong&gt;Show hidden bookmark visuals&lt;/strong&gt;, include only the intended views, generate the narrative, and inspect the footnotes. Microsoft advises authors to read the generated summary for accuracy. That remains a required step, not a formality.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5634tnyp7yh37r6tsws.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5634tnyp7yh37r6tsws.png" alt="Four-case acceptance test for Power BI Copilot summaries that use visible and hidden bookmark visuals." width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the scope precise
&lt;/h2&gt;

&lt;p&gt;This feature does not mean Copilot reads every hidden artifact in a report.&lt;/p&gt;

&lt;p&gt;The documented pattern is narrower:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;display-only report bookmarks;&lt;/li&gt;
&lt;li&gt;a user-facing bookmark button or navigator;&lt;/li&gt;
&lt;li&gt;supported visuals;&lt;/li&gt;
&lt;li&gt;report pages and hidden visuals that meet the eligibility rules;&lt;/li&gt;
&lt;li&gt;the current user's permissions, including RLS and OLS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Copilot report pane and the Copilot narrative visual also expose different controls. The report pane can use eligible hidden visuals in summaries and answers. The narrative author explicitly chooses hidden bookmark visuals through the selection experience.&lt;/p&gt;

&lt;p&gt;That distinction belongs in documentation and QA. Otherwise, teams will assume a hidden visual is included because it exists, or assume it is excluded because the page starts with it hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical payoff
&lt;/h2&gt;

&lt;p&gt;This pattern lets report teams separate &lt;strong&gt;attention&lt;/strong&gt; from &lt;strong&gt;availability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The opening page can emphasize the few numbers that deserve immediate attention. Bookmark panels can preserve useful drill-in context. Copilot can work with those eligible views without forcing every chart onto the default canvas.&lt;/p&gt;

&lt;p&gt;That is a better report design outcome than adding more visual density for the sake of AI. It also gives teams a concrete review artifact: a list of hidden context panels, the business question each one answers, and the four test results that prove the experience works for the intended users.&lt;/p&gt;

&lt;p&gt;I would start with one report, one bookmark panel, and one known-answer test. If the pattern improves both human navigation and Copilot's cited answers, then standardize it.&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/power-bi/fundamentals/whats-new" rel="noopener noreferrer"&gt;See What's New in the August 2026 Power BI Update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/power-bi/explore-reports/copilot-pane-summarize-content" rel="noopener noreferrer"&gt;Summarize a Report With Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/power-bi/create-reports/copilot-create-narrative" rel="noopener noreferrer"&gt;Create a Narrative Visual With Copilot for Power BI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Power-BI-Updates-Blog/bg-p/fbc_pbiupdatesblog" rel="noopener noreferrer"&gt;Power BI Updates Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blogs/bg-p/fbc_fabricupdatesblogs" rel="noopener noreferrer"&gt;Fabric Updates Blog&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;
Microsoft Data and AI practitioner&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>microsoftfabric</category>
      <category>businessintelligence</category>
      <category>ai</category>
    </item>
    <item>
      <title>Power BI Maps Can Finally Follow the Analysis</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Fri, 11 Sep 2026 22:44:36 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/power-bi-maps-can-finally-follow-the-analysis-a3f</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/power-bi-maps-can-finally-follow-the-analysis-a3f</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-09-11-power-bi-azure-maps-filter-context.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-09-11-power-bi-azure-maps-filter-context.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A map is useful when it stays aligned with the question the report user is asking.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but large geographic datasets have made it difficult. The Azure Maps visual in Power BI has a 30,000 data point rendering limit. Microsoft says that points outside the initial rendered set could previously remain absent even after a user filtered the report to a smaller area.&lt;/p&gt;

&lt;p&gt;The August 2026 Power BI update changes that behavior. When the report is filtered to a smaller selection, the visual can reload the newly relevant points and automatically zoom to the visible area. Microsoft lists both improvements as generally available.&lt;/p&gt;

&lt;p&gt;This is a small feature with a useful design consequence: a map can now follow the active analysis instead of behaving like a fixed overview.&lt;/p&gt;

&lt;p&gt;My recommendation is to treat this as a report interaction change, not a formatting change. Test the filter path, the result count, and the viewport together.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;Two behaviors matter.&lt;/p&gt;

&lt;p&gt;First, the visual reloads against the filtered selection. If the initial broad view reaches the 30,000 point rendering limit, filtering to a region can bring in points that were relevant to that region but were not included in the initial rendered set.&lt;/p&gt;

&lt;p&gt;Second, the map automatically zooms to fit the currently visible data. Filters, slicers, and cross-filtering from another visual can move the viewport to the selected area without making the user pan and zoom manually.&lt;/p&gt;

&lt;p&gt;The important phrase is &lt;strong&gt;filtered selection&lt;/strong&gt;. This does not remove the 30,000 point rendering limit, and it does not turn the map into an unlimited spatial query engine. It makes the visual recalculate which points matter for the current 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9zsr7byb2955lrw74g5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9zsr7byb2955lrw74g5.png" alt="The report interaction loop: user filters, Power BI recalculates context, Azure Maps reloads the relevant selection, and the viewport fits the visible result." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Design the map as part of the report interaction
&lt;/h2&gt;

&lt;p&gt;A map should answer a geographic question that the rest of the page helps define.&lt;/p&gt;

&lt;p&gt;Consider a hypothetical service-operations report with thousands of work orders across North America. The page starts with a broad map, a date slicer, a service-category slicer, and a bar chart by region.&lt;/p&gt;

&lt;p&gt;A user selects Ontario in the bar chart and chooses the last seven days. The expected experience is now testable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The map receives the same filter context as the supporting visuals.&lt;/li&gt;
&lt;li&gt;The relevant Ontario points load for that selection.&lt;/li&gt;
&lt;li&gt;The viewport fits the visible data.&lt;/li&gt;
&lt;li&gt;The totals in the map and supporting visuals can be reconciled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The map is no longer an isolated picture. It is one step in the report's interaction contract.&lt;/p&gt;

&lt;p&gt;That contract should be explicit. Decide which visuals filter the map, whether a selection should highlight or filter, and what happens when the user clears the selection. If automatic zoom is helpful for a regional drill, it may be distracting on a page where users need a stable national frame of reference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test data completeness separately from visual usefulness
&lt;/h2&gt;

&lt;p&gt;A map that zooms correctly can still communicate the wrong thing.&lt;/p&gt;

&lt;p&gt;Start with a known test slice. Use a region and date range where you can calculate the expected row or location count outside the visual. Then compare that result with the mapped selection.&lt;/p&gt;

&lt;p&gt;Keep these questions separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the report apply the intended filter context?&lt;/li&gt;
&lt;li&gt;Did the visual load the relevant points for that context?&lt;/li&gt;
&lt;li&gt;Did the viewport fit the visible result?&lt;/li&gt;
&lt;li&gt;Can the user still understand where they are?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The release changes rendering behavior, not data quality. Duplicate coordinates, missing latitude or longitude, ambiguous geocoding, and incorrect category fields still need their own checks.&lt;/p&gt;

&lt;p&gt;If multiple rows share a coordinate, define what a point represents. Is it one work order, one customer site, or an aggregated location? The answer belongs in the model and report design, not in the user's guesswork.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a four-case acceptance test
&lt;/h2&gt;

&lt;p&gt;I would validate the update with four repeatable cases before changing a production report.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Broad view
&lt;/h3&gt;

&lt;p&gt;Open the report with its normal default filters. Record the visible extent, the supporting total, and whether the dataset is large enough to encounter the documented rendering limit.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Slicer filter
&lt;/h3&gt;

&lt;p&gt;Choose one region or business segment from a slicer. Confirm that the map reloads the relevant selection and fits the selected geography.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cross-filter
&lt;/h3&gt;

&lt;p&gt;Select a category in another visual. Confirm that the map receives the intended interaction and that the displayed geography matches the filtered totals.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Clear and reset
&lt;/h3&gt;

&lt;p&gt;Clear the selection or use the report's reset path. Confirm that the map returns to the expected default context. A smooth drill-in is only half the experience. Users also need a predictable way back.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ikmkf29fiuobqg799cb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ikmkf29fiuobqg799cb.png" alt="A four-case test matrix for broad view, slicer filter, cross-filter, and reset. Each case checks context, loaded selection, viewport, and a known comparison total." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Be careful with the 30,000 point boundary
&lt;/h2&gt;

&lt;p&gt;Microsoft documents a 30,000 data point rendering limit for this behavior. The new filtered reload helps the visual represent a smaller selected area more completely than relying on the original broad-view set.&lt;/p&gt;

&lt;p&gt;It does not mean that every filtered state will remain below the limit. A large city, dense device network, or long time window can still produce more points than the visual should render at once.&lt;/p&gt;

&lt;p&gt;Use the report design to narrow the question. A required date range, region selector, category filter, aggregation, or drill path can be more useful than placing the entire operational estate on one map.&lt;/p&gt;

&lt;p&gt;This is also where a supporting KPI or table earns its place. Give users a count they can reconcile with the map, especially when the map is intended for operational decisions rather than a high-level presentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the mobile experience
&lt;/h2&gt;

&lt;p&gt;Automatic zoom reduces manual navigation, but it does not guarantee a readable phone layout.&lt;/p&gt;

&lt;p&gt;Test the actual mobile report layout. Check whether the legend, zoom controls, tooltips, and neighboring visuals leave enough room for the selected geography. A narrow visual can technically fit the data while making individual points impossible to inspect.&lt;/p&gt;

&lt;p&gt;If the map is central to the workflow, consider a focused mobile page rather than squeezing the desktop page into portrait orientation. Keep the filter path short and make the reset action visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway
&lt;/h2&gt;

&lt;p&gt;This update makes Azure Maps more responsive to report context. The strongest use case is not a prettier map. It is a report where geographic detail arrives when the user narrows the question.&lt;/p&gt;

&lt;p&gt;Build one controlled test page. Start broad, filter to a known subset, cross-filter from another visual, and reset. Compare the map against a known count at every step.&lt;/p&gt;

&lt;p&gt;When the loaded selection, viewport, and supporting totals move together, the map becomes a reliable part of the analysis instead of a separate visual users have to manage.&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/Power-BI-August-2026-Feature-Summary/ba-p/5348434" rel="noopener noreferrer"&gt;Power BI August 2026 Feature Summary&lt;/a&gt;. Primary announcement for filtered-selection reload and automatic zoom in Azure Maps. The complete announcement was also verified through the &lt;a href="https://community.fabric.microsoft.com/rss/board?board.id=fbc_pbiupdatesblog" rel="noopener noreferrer"&gt;official Power BI Updates RSS feed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/azure/azure-maps/power-bi-visual-get-started" rel="noopener noreferrer"&gt;Azure Maps visual for Power BI&lt;/a&gt;. Product documentation for the Azure Maps visual, its configuration, and report interactions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/power-bi/create-reports/service-reports-visual-interactions" rel="noopener noreferrer"&gt;Change how visuals interact in a Power BI report&lt;/a&gt;. Supporting documentation for defining filter and highlight interactions between report visuals.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/power-bi/create-reports/power-bi-create-mobile-optimized-report-about" rel="noopener noreferrer"&gt;Create a mobile layout in Power BI&lt;/a&gt;. Supporting documentation for mobile-optimized report design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Practical data engineering, Microsoft Fabric, Power BI, and AI.&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>azuremaps</category>
      <category>businessintelligence</category>
      <category>dataanalytics</category>
    </item>
    <item>
      <title>Give Your Fabric AI Agent a Real Dependency Map</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Fri, 11 Sep 2026 17:23:35 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/give-your-fabric-ai-agent-a-real-dependency-map-475l</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/give-your-fabric-ai-agent-a-real-dependency-map-475l</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-09-10-fabric-lineage-review.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-09-10-fabric-lineage-review.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An AI agent can explain a proposed data-platform change much better when it can see what depends on the item being changed.&lt;/p&gt;

&lt;p&gt;That is the useful opportunity in Microsoft's September 10 announcement of the &lt;strong&gt;Fabric item relations API, in preview&lt;/strong&gt;. Two REST operations expose upstream and downstream item relationships as a graph that code can read. The response includes items, typed relations, and the workspaces referenced by those items.&lt;/p&gt;

&lt;p&gt;My first use for this would be a read-only change brief. Pick an item, retrieve its relationships, and give the reviewer an evidence-backed summary of the dependencies to inspect before approving a change.&lt;/p&gt;

&lt;p&gt;This is a proposed workflow, not a report of a production implementation or measured results. Microsoft explicitly describes the preview as intended for evaluation and development, and not recommended for production use. That boundary matters: build a small evaluation, not an automatic production deployment gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a decision, not a chatbot
&lt;/h2&gt;

&lt;p&gt;Consider a hypothetical team planning to replace a semantic model. The useful question is: which related items and teams should participate in the review?&lt;/p&gt;

&lt;p&gt;The portal's lineage view already helps a person explore those dependencies. The API makes that metadata available to another tool. A script can turn the response into a change attachment. An agent can summarize it. A reviewer can inspect the original evidence without retracing every relationship manually.&lt;/p&gt;

&lt;p&gt;I would keep the first version deliberately narrow: one familiar model, a read-only identity, one downstream request, and a short review brief. Once that output is understandable, add an upstream request to explain the model's source context.&lt;/p&gt;

&lt;p&gt;The two directions answer different questions. Downstream helps identify consumers to investigate. Upstream helps explain dependencies that feed the item. Neither direction, by itself, proves that a proposed change is compatible.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9rwu9awax6d55di5liiw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9rwu9awax6d55di5liiw.png" alt="Two separate questions: upstream identifies source context; downstream identifies consumers to review." width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the preview actually exposes
&lt;/h2&gt;

&lt;p&gt;The documented operations have these paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /v1/workspaces/{workspaceId}/items/{itemId}/relations/downstream?beta=true
GET /v1/workspaces/{workspaceId}/items/{itemId}/relations/upstream?beta=true
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are request shapes, not a complete executable authentication example. Use an approved identity and your normal protected authentication mechanism. Do not paste access tokens into a notebook, an agent prompt, or a review document.&lt;/p&gt;

&lt;p&gt;The announcement says the caller needs read permission on the item and that both user and service principal identities are supported. The preview currently requires the beta query parameter. Check the linked API reference as the contract evolves.&lt;/p&gt;

&lt;p&gt;Each response has three useful collections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;items:&lt;/strong&gt; item identifiers, types, display names, and workspace identifiers. The queried item is included too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;relations:&lt;/strong&gt; the edges connecting items, with a relation type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;workspaces:&lt;/strong&gt; workspace context for the items returned in the graph.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep identifiers in the review evidence. Display names help a human read the result, but matching on names alone makes a poor join strategy. Two items can have similar names, and a friendly name is not a durable identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve what the edges mean
&lt;/h2&gt;

&lt;p&gt;A list of item names is less useful than a typed dependency map.&lt;/p&gt;

&lt;p&gt;In Microsoft's association example, a report consumes a semantic model. The edge has the report as itemId and the model as dependentOnItemId. Read that as “the report depends on the model.” Keep that orientation intact when generating the explanation.&lt;/p&gt;

&lt;p&gt;Other relationship types describe different behavior. A Shortcut references data through a shortcut. Orchestration describes an item running or managing another item. PushData describes writing or pushing data to a dependency item. Those are different reasons for bringing an owner into a change review.&lt;/p&gt;

&lt;p&gt;The documented set of relationship types is extensible. My parser would preserve an unfamiliar type and label it for inspection rather than discard it. An unexpected relationship is useful evidence; silently dropping it makes the brief look more complete than it is.&lt;/p&gt;

&lt;p&gt;The same principle applies to scope. Describe this as an &lt;strong&gt;item dependency map&lt;/strong&gt;. Do not present it as column-level lineage, a measure dependency analyzer, or a complete inventory of every external consumer. Those are stronger claims than the item graph establishes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the agent a bounded evidence package
&lt;/h2&gt;

&lt;p&gt;The agent should summarize a structured record, not improvise a map from item names in the prompt.&lt;/p&gt;

&lt;p&gt;For a prototype, I would store the target item ID, workspace ID, request direction, retrieval time, calling identity context, raw response, and any request errors. The summary can then reference the same item IDs as the evidence.&lt;/p&gt;

&lt;p&gt;Treat names and metadata as data. An item description containing instructions is not permission for the agent to run a command, change access, or follow a link. The agent's job here is to explain the graph within the review task.&lt;/p&gt;

&lt;p&gt;A useful output has a short answer to each of these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What item are we reviewing, and when was this graph retrieved?&lt;/li&gt;
&lt;li&gt;Which returned items depend on it, and through which relation types?&lt;/li&gt;
&lt;li&gt;Which upstream dependencies help explain its context?&lt;/li&gt;
&lt;li&gt;Which workspace owners or item owners still need to be identified?&lt;/li&gt;
&lt;li&gt;What remains unverified before this change can be approved?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Owner assignment is a separate enrichment step. Do not imply the three response collections automatically provide an accountable business owner for every relationship.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbcedxiutvtd3d8fujfh3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbcedxiutvtd3d8fujfh3.png" alt="A read-only review flow: retrieve evidence, create a cited brief, then let a person review the proposed change." width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a small acceptance test
&lt;/h2&gt;

&lt;p&gt;Choose an item whose relationships your team already understands. Compare the returned graph with the portal view under the same identity context. Investigate discrepancies rather than asking the agent to explain them away.&lt;/p&gt;

&lt;p&gt;Check that an association is described in the right direction. Confirm the queried item is not counted as one of its own consumers. Check that items from different workspaces retain their workspace context. Feed the summarizer a synthetic unfamiliar relation type and verify that it remains visible.&lt;/p&gt;

&lt;p&gt;Then test failure behavior. If a request fails, the brief should say that evidence could not be retrieved. If no downstream items are returned, it should say exactly that. “No downstream items returned” is not the same conclusion as “safe to delete.”&lt;/p&gt;

&lt;p&gt;Finally, review whether the brief is actually useful. Can a reviewer find the underlying item identifiers? Can they separate an observed relationship from a proposed action? Can they see what has not been checked? Those are better prototype success criteria than how confident the generated paragraph sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep approval separate from explanation
&lt;/h2&gt;

&lt;p&gt;A dependency tells you where to look. Compatibility testing tells you whether the proposed change works.&lt;/p&gt;

&lt;p&gt;Changing a model may require report testing, refresh checks, security validation, and business sign-off even when the dependency graph is accurate. The item relations API adds useful context to that process. It does not replace it.&lt;/p&gt;

&lt;p&gt;During this preview, I would use the brief as an evaluation artifact alongside an existing review process. No automatic deletion. No permission changes. No claim that an agent has certified a change as safe.&lt;/p&gt;

&lt;p&gt;The practical win is straightforward: give the reviewer a grounded starting point, with the evidence attached. An agent that can explain what it knows, where it came from, and what still needs checking is far more useful than one that simply says “looks good.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and preview status
&lt;/h2&gt;

&lt;p&gt;Verified September 10, 2026. The announcement was readable in the official Fabric RSS feed; the Community article URL returned an access restriction during this scan. Both API reference pages were accessible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Lineage-aware-AI-with-the-Fabric-item-relations-API-Preview/ba-p/5366064" rel="noopener noreferrer"&gt;Lineage-aware AI with the Fabric item relations API (Preview)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/rss/board?board.id=fbc_fabricupdatesblogs" rel="noopener noreferrer"&gt;Official Fabric Updates RSS feed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/rest/api/fabric/core/items/get-downstream-relations(beta)" rel="noopener noreferrer"&gt;Get Downstream Relations, beta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/rest/api/fabric/core/items/get-upstream-relations(beta)" rel="noopener noreferrer"&gt;Get Upstream Relations, beta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shai Karmani&lt;/strong&gt; writes about practical Microsoft Fabric, Power BI, data engineering, and AI implementation. &lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>ai</category>
      <category>dataengineering</category>
      <category>lineage</category>
    </item>
    <item>
      <title>Let Your Fabric Gateway Scale With the Workload</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Wed, 05 Aug 2026 23:51:14 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/let-your-fabric-gateway-scale-with-the-workload-19fo</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/let-your-fabric-gateway-scale-with-the-workload-19fo</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-08-05-vnet-gateway-autoscaling.html" rel="noopener noreferrer"&gt;https://shai-kr.github.io/data-ninja-ai-lab/blog/2026-08-05-vnet-gateway-autoscaling.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8uk5vzycdoxxeqnuwpfn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8uk5vzycdoxxeqnuwpfn.png" alt="VNet gateway autoscaling operating model" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Private data access is one of those platform details that only becomes interesting when it fails.&lt;/p&gt;

&lt;p&gt;A semantic model misses its refresh window. A Dataflow Gen2 job slows down. A pipeline that usually runs fine suddenly competes with every other workload in the same evening batch window. The business sees a report that is late. The platform team sees a connectivity layer that was treated as plumbing until it became the bottleneck.&lt;/p&gt;

&lt;p&gt;That is why the new VNet data gateway autoscaling preview in Microsoft Fabric is worth paying attention to.&lt;/p&gt;

&lt;p&gt;The feature itself is straightforward: Microsoft describes autoscaling as the ability to automatically adjust the number of active gateway nodes within admin-defined minimum and maximum limits based on workload demand. In plain English, the gateway can absorb spikes and scale back down when demand falls.&lt;/p&gt;

&lt;p&gt;Useful feature. But the real opportunity is bigger than adding more gateway nodes.&lt;/p&gt;

&lt;p&gt;It is a chance to treat private data access as an operating model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters in Fabric and Power BI
&lt;/h2&gt;

&lt;p&gt;The VNet data gateway sits in a sensitive part of the architecture. Microsoft documents it as a managed way to connect Microsoft Fabric and Power Platform services to Azure and other data services inside a virtual network, without using an on-premises data gateway. It can support Fabric Dataflow Gen2, Fabric data pipelines, Copy Job, Mirroring, Power BI semantic models, and Power BI paginated reports.&lt;/p&gt;

&lt;p&gt;That means one gateway can sit behind a lot of important work.&lt;/p&gt;

&lt;p&gt;A platform team might use it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Power BI semantic model refreshes against private Azure SQL or storage;&lt;/li&gt;
&lt;li&gt;Dataflow Gen2 ingestion into a Lakehouse;&lt;/li&gt;
&lt;li&gt;Fabric pipelines and Copy Job activity;&lt;/li&gt;
&lt;li&gt;Mirroring patterns;&lt;/li&gt;
&lt;li&gt;paginated reports that still depend on secured source systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When demand grows, the gateway becomes more than a network object. It becomes shared platform capacity.&lt;/p&gt;

&lt;p&gt;Autoscaling helps with that. But it should not be enabled as a blind performance switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wrong way to think about autoscaling
&lt;/h2&gt;

&lt;p&gt;The weak version of the story is simple:&lt;/p&gt;

&lt;p&gt;"Refresh is slow, turn on autoscaling."&lt;/p&gt;

&lt;p&gt;That misses the point.&lt;/p&gt;

&lt;p&gt;Autoscaling can reduce pressure during spikes, but it will not fix every bad design around the gateway. It will not clean up duplicate refresh schedules. It will not decide which workloads deserve priority. It will not turn an overloaded semantic model into a clean one. It will not make weak ownership disappear.&lt;/p&gt;

&lt;p&gt;If the gateway has become a mystery box, scaling it may only make the mystery box more expensive.&lt;/p&gt;

&lt;p&gt;The better approach is to use autoscaling as a forcing function for platform review.&lt;/p&gt;

&lt;h2&gt;
  
  
  The review I would run first
&lt;/h2&gt;

&lt;p&gt;Before changing gateway scale settings, I would build a simple inventory.&lt;/p&gt;

&lt;p&gt;Not a six-month governance program. Just enough information to make the decision responsibly.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7dos8nw7do9cg7k86b0t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7dos8nw7do9cg7k86b0t.png" alt="Gateway autoscaling readiness checklist" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Map the workloads
&lt;/h3&gt;

&lt;p&gt;List every important workload using the gateway:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;semantic models;&lt;/li&gt;
&lt;li&gt;Dataflow Gen2 items;&lt;/li&gt;
&lt;li&gt;Fabric pipelines;&lt;/li&gt;
&lt;li&gt;Copy Jobs;&lt;/li&gt;
&lt;li&gt;Mirroring flows;&lt;/li&gt;
&lt;li&gt;paginated reports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each one, capture the owner, business criticality, schedule, expected runtime, and source system.&lt;/p&gt;

&lt;p&gt;This is not busywork. Without it, you cannot tell the difference between a real scaling need and a messy batch window.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Baseline the demand pattern
&lt;/h3&gt;

&lt;p&gt;Autoscaling is useful when demand changes. So measure demand first.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refresh windows where many semantic models start together;&lt;/li&gt;
&lt;li&gt;pipelines that overlap with executive reporting deadlines;&lt;/li&gt;
&lt;li&gt;repeated gateway-related failures;&lt;/li&gt;
&lt;li&gt;latency spikes that match predictable business cycles;&lt;/li&gt;
&lt;li&gt;low-usage periods where scaled-down capacity would make sense.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not perfect telemetry. The goal is enough evidence to avoid guessing.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Define the scale policy
&lt;/h3&gt;

&lt;p&gt;Autoscaling still needs boundaries.&lt;/p&gt;

&lt;p&gt;At minimum, I would document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;minimum gateway node count;&lt;/li&gt;
&lt;li&gt;maximum gateway node count;&lt;/li&gt;
&lt;li&gt;who owns the setting;&lt;/li&gt;
&lt;li&gt;what cost guardrails apply;&lt;/li&gt;
&lt;li&gt;when the maximum should be revisited;&lt;/li&gt;
&lt;li&gt;what incident pattern justifies a temporary change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the feature becomes an admin policy instead of a one-time UI change.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Clean the workload before scaling the gateway
&lt;/h3&gt;

&lt;p&gt;If ten semantic models refresh at the same minute because nobody reviewed the schedule, the gateway is not the root problem.&lt;/p&gt;

&lt;p&gt;Fix the obvious scheduling and ownership issues first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stagger refreshes;&lt;/li&gt;
&lt;li&gt;remove abandoned reports and models;&lt;/li&gt;
&lt;li&gt;separate critical workloads from noisy ones where possible;&lt;/li&gt;
&lt;li&gt;check whether a dataflow, warehouse, or semantic model is doing work in the wrong layer;&lt;/li&gt;
&lt;li&gt;make owners accountable for refresh design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then use autoscaling for the demand that remains.&lt;/p&gt;

&lt;h2&gt;
  
  
  A better mental model
&lt;/h2&gt;

&lt;p&gt;I would frame the gateway like this:&lt;/p&gt;

&lt;p&gt;The VNet data gateway is not only the path to private data. It is the shared access layer between Fabric workloads and protected systems.&lt;/p&gt;

&lt;p&gt;That access layer needs capacity, policy, monitoring, and ownership.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvkjf2hi33ktny2bopeao.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvkjf2hi33ktny2bopeao.png" alt="Private data access flow through the VNet gateway" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Autoscaling makes that layer more elastic. Good. But elastic does not mean unmanaged.&lt;/p&gt;

&lt;p&gt;A healthy setup should be able to answer four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which workloads depend on this gateway?&lt;/li&gt;
&lt;li&gt;What is normal demand?&lt;/li&gt;
&lt;li&gt;What happens during a spike?&lt;/li&gt;
&lt;li&gt;Who changes the limits when the pattern changes?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If those answers are clear, autoscaling becomes a useful production feature.&lt;/p&gt;

&lt;p&gt;If those answers are vague, autoscaling becomes another place where platform cost and reliability drift quietly.&lt;/p&gt;

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

&lt;p&gt;A lot of Fabric updates are pointing in the same direction: more managed platform capabilities, more API surface, more private connectivity, more operational responsibility inside the analytics estate.&lt;/p&gt;

&lt;p&gt;That is the right direction.&lt;/p&gt;

&lt;p&gt;But every managed capability still needs an owner.&lt;/p&gt;

&lt;p&gt;For BI and data teams, the practical takeaway is simple:&lt;/p&gt;

&lt;p&gt;Do not wait until the gateway becomes a refresh incident before you treat it as part of the platform.&lt;/p&gt;

&lt;p&gt;Use autoscaling as the trigger to build a cleaner gateway operating model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inventory the workloads;&lt;/li&gt;
&lt;li&gt;baseline the peaks;&lt;/li&gt;
&lt;li&gt;set guardrails;&lt;/li&gt;
&lt;li&gt;review the batch window;&lt;/li&gt;
&lt;li&gt;document the runbook.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not glamorous. It is the kind of work that makes Fabric and Power BI estates reliable enough for real business use.&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/fundamentals/whats-new" rel="noopener noreferrer"&gt;Microsoft Fabric What's New&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/VNET-Data-Gateway-Autoscaling-Preview/ba-p/5281553" rel="noopener noreferrer"&gt;VNET Data Gateway Autoscaling Preview announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/data-integration/vnet/overview" rel="noopener noreferrer"&gt;What is a virtual network data gateway&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Written by &lt;strong&gt;Shai Karmani&lt;/strong&gt;. If you work with Microsoft Fabric, Power BI, data platforms, or practical AI systems, &lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;connect with me on LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>powerbi</category>
      <category>dataengineering</category>
      <category>governance</category>
    </item>
    <item>
      <title>Make Power BI Semantic Model Settings Easier to Govern</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Sat, 01 Aug 2026 23:04:37 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/make-power-bi-semantic-model-settings-easier-to-govern-3en3</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/make-power-bi-semantic-model-settings-easier-to-govern-3en3</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-08-01-power-bi-semantic-model-settings-pane.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkn25qjj0gsuv7pevrlc5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkn25qjj0gsuv7pevrlc5.png" alt="Semantic model settings control map" width="800" height="960"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Power BI semantic model settings are becoming less of a separate admin page and more of an in-context workflow.&lt;/p&gt;

&lt;p&gt;That is a good change.&lt;/p&gt;

&lt;p&gt;In the July 2026 Power BI update, Microsoft says the semantic model settings pane becomes the default starting in August. Instead of jumping away to the full settings page, admins and model owners can open settings beside the content they are working with and update refresh schedules, credentials, and other model options with less context switching.&lt;/p&gt;

&lt;p&gt;On paper, that sounds like a UI improvement.&lt;/p&gt;

&lt;p&gt;In practice, it is a governance opportunity.&lt;/p&gt;

&lt;p&gt;A lot of Power BI estates do not fail because teams lack features. They fail because semantic model administration is scattered across too many people, too many workspaces, and too many undocumented decisions. Refresh settings are copied from old models. Credentials belong to whoever built the first version. RLS roles are rarely reviewed after release. Sensitivity labels, endorsements, descriptions, and workspace access drift quietly.&lt;/p&gt;

&lt;p&gt;A better settings pane will not fix that by itself.&lt;/p&gt;

&lt;p&gt;But it can make the right checks easier to run.&lt;/p&gt;

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

&lt;p&gt;Semantic models are no longer just datasets behind reports.&lt;/p&gt;

&lt;p&gt;They are shared business assets. They feed reports, apps, Excel, embedded experiences, Copilot experiences, and sometimes downstream automation. When the model is wrong, stale, insecure, or poorly described, the problem spreads quickly.&lt;/p&gt;

&lt;p&gt;The new settings pane matters because it brings administration closer to the model owner workflow.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Where do I find the old settings page?&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;What should we verify every time we touch a critical model?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That second question is where senior BI teams can get value.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mistake to avoid
&lt;/h2&gt;

&lt;p&gt;The easy reaction is to treat the new pane as a convenience feature.&lt;/p&gt;

&lt;p&gt;Open model. Change setting. Move on.&lt;/p&gt;

&lt;p&gt;That is fine for small personal reports. It is not enough for shared semantic models that executives, finance teams, operations teams, or customer-facing systems depend on.&lt;/p&gt;

&lt;p&gt;For production models, the pane should become part of a short review workflow.&lt;/p&gt;

&lt;p&gt;Not a huge governance ceremony. Just enough discipline to prevent the common failures.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgxskbta3qaoc6c7et29n.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgxskbta3qaoc6c7et29n.png" alt="Semantic model settings admin checklist" width="800" height="960"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The review I would run first
&lt;/h2&gt;

&lt;p&gt;If I inherited a Power BI workspace today, I would use the settings pane as the entry point for a 30 minute semantic model review.&lt;/p&gt;

&lt;p&gt;I would not start with a beautiful architecture diagram.&lt;/p&gt;

&lt;p&gt;I would start with four checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Who owns this model?
&lt;/h3&gt;

&lt;p&gt;Every important semantic model needs two owners.&lt;/p&gt;

&lt;p&gt;One business owner who knows whether the numbers are trusted.&lt;/p&gt;

&lt;p&gt;One technical owner who knows how the model refreshes, where the data comes from, how measures are maintained, and what breaks when a source changes.&lt;/p&gt;

&lt;p&gt;If the answer is "the person who built it three years ago", that model is already carrying operational risk.&lt;/p&gt;

&lt;p&gt;The settings pane cannot assign accountability by itself, but it gives the team a practical place to start the conversation.&lt;/p&gt;

&lt;p&gt;For each important model, capture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business owner;&lt;/li&gt;
&lt;li&gt;technical owner;&lt;/li&gt;
&lt;li&gt;workspace;&lt;/li&gt;
&lt;li&gt;source systems;&lt;/li&gt;
&lt;li&gt;refresh schedule;&lt;/li&gt;
&lt;li&gt;audience or org app dependency;&lt;/li&gt;
&lt;li&gt;criticality;&lt;/li&gt;
&lt;li&gt;support contact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A spreadsheet is enough for the first pass.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Does the refresh schedule match the business need?
&lt;/h3&gt;

&lt;p&gt;Refresh settings are often inherited rather than designed.&lt;/p&gt;

&lt;p&gt;A daily finance model, a near-real-time operations model, and a low-usage management report should not all follow the same pattern just because someone copied a previous dataset.&lt;/p&gt;

&lt;p&gt;For each model, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;refresh frequency;&lt;/li&gt;
&lt;li&gt;refresh window;&lt;/li&gt;
&lt;li&gt;dependency order;&lt;/li&gt;
&lt;li&gt;gateway or cloud connection path;&lt;/li&gt;
&lt;li&gt;last failure pattern;&lt;/li&gt;
&lt;li&gt;whether the business still needs that refresh frequency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical win is not always faster refresh.&lt;/p&gt;

&lt;p&gt;Sometimes the win is fewer unnecessary refreshes, less capacity pressure, and fewer false support incidents.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Are credentials and connections safe to operate?
&lt;/h3&gt;

&lt;p&gt;Credentials are one of the easiest places for Power BI estates to drift.&lt;/p&gt;

&lt;p&gt;Personal credentials work until the person leaves, changes roles, rotates a password, or loses access. Gateway mappings work until a source moves. Cloud connections work until nobody remembers why a service principal was created.&lt;/p&gt;

&lt;p&gt;For production models, I would check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;whether credentials belong to a person or an approved service identity;&lt;/li&gt;
&lt;li&gt;whether the connection is documented;&lt;/li&gt;
&lt;li&gt;whether the gateway path is still the right one;&lt;/li&gt;
&lt;li&gt;whether the model uses sources that require special privacy or network rules;&lt;/li&gt;
&lt;li&gt;whether connection failures are routed to someone who can fix them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not glamorous work. It is the work that keeps trusted reports from turning into Monday morning escalations.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Is access aligned with how the model is consumed?
&lt;/h3&gt;

&lt;p&gt;Power BI access is rarely only one thing.&lt;/p&gt;

&lt;p&gt;A user might reach a report through a workspace, a shared link, an app, an org app audience, Excel, or a direct semantic model connection. That means model access deserves its own review, not just report access.&lt;/p&gt;

&lt;p&gt;For each important model, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;workspace roles;&lt;/li&gt;
&lt;li&gt;build permissions;&lt;/li&gt;
&lt;li&gt;RLS roles and members;&lt;/li&gt;
&lt;li&gt;sensitivity labels;&lt;/li&gt;
&lt;li&gt;endorsement or certification status;&lt;/li&gt;
&lt;li&gt;downstream reports and apps;&lt;/li&gt;
&lt;li&gt;whether external sharing is relevant;&lt;/li&gt;
&lt;li&gt;whether Copilot or AI experiences may rely on the model metadata.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model is the contract. Reports are only one consumer of that contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical operating model
&lt;/h2&gt;

&lt;p&gt;The settings pane is useful because it puts more of this work closer to where model owners already work.&lt;/p&gt;

&lt;p&gt;But UI proximity is not the same as operational discipline.&lt;/p&gt;

&lt;p&gt;I would define a simple operating model around critical semantic models.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkw66jrleg9dyrqgu4i28.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkw66jrleg9dyrqgu4i28.png" alt="Semantic model settings operating model" width="800" height="960"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  For low-risk models
&lt;/h3&gt;

&lt;p&gt;A lightweight review is enough.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;named owner;&lt;/li&gt;
&lt;li&gt;refresh schedule checked;&lt;/li&gt;
&lt;li&gt;credentials confirmed;&lt;/li&gt;
&lt;li&gt;access reviewed when someone asks for build permission.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For shared departmental models
&lt;/h3&gt;

&lt;p&gt;Add a little more control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;owner register;&lt;/li&gt;
&lt;li&gt;refresh failure routing;&lt;/li&gt;
&lt;li&gt;quarterly access review;&lt;/li&gt;
&lt;li&gt;measure descriptions for core KPIs;&lt;/li&gt;
&lt;li&gt;endorsement policy;&lt;/li&gt;
&lt;li&gt;documented source systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For executive or operational models
&lt;/h3&gt;

&lt;p&gt;Treat the semantic model like production infrastructure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business and technical ownership;&lt;/li&gt;
&lt;li&gt;change review for major model updates;&lt;/li&gt;
&lt;li&gt;tested refresh dependencies;&lt;/li&gt;
&lt;li&gt;approved credential pattern;&lt;/li&gt;
&lt;li&gt;RLS and access review;&lt;/li&gt;
&lt;li&gt;monitoring for refresh failures;&lt;/li&gt;
&lt;li&gt;support path;&lt;/li&gt;
&lt;li&gt;documentation that a new admin can understand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds heavier, but it is usually lighter than explaining why the CEO dashboard is stale on the morning of a board meeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist I would keep beside the pane
&lt;/h2&gt;

&lt;p&gt;Here is the short version I would use with a BI team.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ownership&lt;/td&gt;
&lt;td&gt;Who owns the business meaning and who owns the technical model?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refresh&lt;/td&gt;
&lt;td&gt;Does the schedule match the actual business need?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependencies&lt;/td&gt;
&lt;td&gt;What upstream jobs, gateways, or sources does this model depend on?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credentials&lt;/td&gt;
&lt;td&gt;Are credentials tied to a safe identity pattern?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access&lt;/td&gt;
&lt;td&gt;Who can view, build, share, or manage the model?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RLS&lt;/td&gt;
&lt;td&gt;Are roles still correct and tested?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Labels&lt;/td&gt;
&lt;td&gt;Is the sensitivity label appropriate for the data?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endorsement&lt;/td&gt;
&lt;td&gt;Should this be promoted, certified, or left unendorsed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;Can a new admin understand how this model works?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;Who gets called when refresh fails?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is not bureaucracy. It is basic model hygiene.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits in the bigger Power BI shift
&lt;/h2&gt;

&lt;p&gt;Power BI is slowly moving more model work into the service.&lt;/p&gt;

&lt;p&gt;Web modeling, model options in the service, TMDL view on the web, measure descriptions from triple-slash comments, org apps, audience management, and richer APIs all point in the same direction.&lt;/p&gt;

&lt;p&gt;The browser is becoming a serious place to operate BI assets, not just consume reports.&lt;/p&gt;

&lt;p&gt;That creates a useful tension.&lt;/p&gt;

&lt;p&gt;More people can make changes.&lt;/p&gt;

&lt;p&gt;More changes can happen closer to the workspace.&lt;/p&gt;

&lt;p&gt;More model administration can happen without opening Desktop.&lt;/p&gt;

&lt;p&gt;That is good for speed, but it also means teams need clearer standards.&lt;/p&gt;

&lt;p&gt;The semantic model settings pane is a small feature if you only look at the screen.&lt;/p&gt;

&lt;p&gt;It is a bigger feature if you use it as the front door to model governance.&lt;/p&gt;

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

&lt;p&gt;I like this update because it makes the right admin work easier to reach.&lt;/p&gt;

&lt;p&gt;But I would not sell it internally as "new settings UI".&lt;/p&gt;

&lt;p&gt;I would sell it as a chance to clean up semantic model ownership.&lt;/p&gt;

&lt;p&gt;Pick the top ten models in the tenant. Open the settings pane. Check owners, refresh, credentials, access, labels, endorsement, and support routing.&lt;/p&gt;

&lt;p&gt;You will probably find at least one risk worth fixing before it becomes visible to the business.&lt;/p&gt;

&lt;p&gt;That is the real value.&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/power-bi/fundamentals/whats-new" rel="noopener noreferrer"&gt;See What's New in the July 2026 Power BI Update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/power-bi/transform-model/service-edit-data-models" rel="noopener noreferrer"&gt;Edit semantic models in the Power BI service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/power-bi/explore-reports/org-app-items" rel="noopener noreferrer"&gt;Get Started with Org Apps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;Shai Karmani is a senior data and AI practitioner focused on Microsoft Fabric, Power BI, analytics engineering, automation, and practical AI systems.&lt;/p&gt;

&lt;p&gt;Connect with Shai on LinkedIn: &lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/shai-kr&lt;/a&gt;&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>microsoftfabric</category>
      <category>governance</category>
      <category>analytics</category>
    </item>
    <item>
      <title>OneLake Security Just Got Easier to Trust Across Fabric</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Tue, 28 Jul 2026 22:35:54 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/onelake-security-just-got-easier-to-trust-across-fabric-19eb</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/onelake-security-just-got-easier-to-trust-across-fabric-19eb</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-07-28-onelake-security-enterprise-trust.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foeruk30ihot9thx9id2e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foeruk30ihot9thx9id2e.png" alt="OneLake Security Control Plane." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft Fabric keeps moving toward a more useful idea of governance: define access close to the data, then let more of the platform respect it.&lt;/p&gt;

&lt;p&gt;The latest OneLake security updates are worth paying attention to because they are not only about another admin setting. They make Fabric security fit better with how real enterprises already operate: groups, nested groups, service principals, shortcuts, shared lakehouses, SQL endpoints, Eventhouse, and Graph Database.&lt;/p&gt;

&lt;p&gt;That is the part that matters.&lt;/p&gt;

&lt;p&gt;A data platform does not become trusted because it has a nice diagram. It becomes trusted when the same user, group, workload identity, or agent gets the right answer through the actual path they use to reach the data.&lt;/p&gt;

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

&lt;p&gt;OneLake Security already points Fabric in the right direction. Instead of duplicating access rules in every tool, data owners can define roles and policies on the lakehouse, including row-level security, column-level security, and object-level security.&lt;/p&gt;

&lt;p&gt;The SQL analytics endpoint can then pass the signed-in user identity through to OneLake, so the endpoint is not a separate permission universe.&lt;/p&gt;

&lt;p&gt;The new updates make that model more practical.&lt;/p&gt;

&lt;p&gt;Microsoft called out improvements for SQL analytics endpoints, nested group support, shortcuts, service principals, and hub-and-spoke lakehouse patterns. In a separate OneLake security update, Microsoft also described broader engine coverage, including Eventhouse in preview and Graph Database generally available, plus a simplified column-level security experience.&lt;/p&gt;

&lt;p&gt;That combination is important because most Fabric estates are not tidy.&lt;/p&gt;

&lt;p&gt;They have central lakehouses and team-owned workspaces. They have security groups managed by IT. They have shortcuts. They have service principals. They have BI users querying through SQL endpoints. They increasingly have agents and automated workloads that need governed access too.&lt;/p&gt;

&lt;p&gt;If OneLake security works only for the clean demo path, it is not enough.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbprhcdf4fxk9tgpa53ux.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbprhcdf4fxk9tgpa53ux.png" alt="Enterprise access pattern." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SQL analytics endpoints matter so much
&lt;/h2&gt;

&lt;p&gt;The SQL analytics endpoint is one of the most important adoption bridges in Fabric.&lt;/p&gt;

&lt;p&gt;Data engineers may think in Lakehouse tables, Spark, Delta, or notebooks. BI teams and SQL operators often still need a SQL surface they can query, inspect, troubleshoot, and connect to downstream tools.&lt;/p&gt;

&lt;p&gt;That bridge is useful only if users can trust the security boundary.&lt;/p&gt;

&lt;p&gt;If a table is protected in OneLake but the SQL endpoint behaves differently, teams get nervous. If a nested group works in Entra ID but not in the data access path, admins create manual exceptions. If service principals behave differently from user identities, automation becomes fragile.&lt;/p&gt;

&lt;p&gt;The latest update matters because it addresses exactly that kind of enterprise friction.&lt;/p&gt;

&lt;p&gt;It is not glamorous. It is the work that makes the platform believable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The governance point for BI and data teams
&lt;/h2&gt;

&lt;p&gt;The instinct will be to treat this as a security team update.&lt;/p&gt;

&lt;p&gt;I would not.&lt;/p&gt;

&lt;p&gt;This affects how analytics teams design the estate.&lt;/p&gt;

&lt;p&gt;A central OneLake security model changes the questions teams should ask before they build yet another copy of the data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can this dataset stay in one governed lakehouse instead of being copied into team workspaces?&lt;/li&gt;
&lt;li&gt;Should access be managed through existing Entra groups rather than local workspace exceptions?&lt;/li&gt;
&lt;li&gt;Which columns should be governed at the data layer instead of hidden in a report?&lt;/li&gt;
&lt;li&gt;Which workloads need service principal access, and how will that be reviewed?&lt;/li&gt;
&lt;li&gt;Which query engines must be validated before the data owner calls the policy complete?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last question is the one teams often miss.&lt;/p&gt;

&lt;p&gt;A policy is not complete when it exists in the admin screen. It is complete when the expected users and workload identities get the expected result through the actual engines they use.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical rollout pattern
&lt;/h2&gt;

&lt;p&gt;If I were rolling this out, I would not start with a massive policy rebuild.&lt;/p&gt;

&lt;p&gt;I would start with one shared lakehouse, one sensitive table, and three access paths:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A normal BI user through the SQL analytics endpoint.&lt;/li&gt;
&lt;li&gt;A user who inherits access through a nested group.&lt;/li&gt;
&lt;li&gt;A workload identity or service principal used by automation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then I would validate the result against the OneLake policy.&lt;/p&gt;

&lt;p&gt;The goal is not only to prove that the feature works. The goal is to find the places where your current access model is messy.&lt;/p&gt;

&lt;p&gt;That usually means finding old groups nobody owns, shortcuts that were created for convenience, columns that should have been classified earlier, and reports that quietly depended on copied 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj0a46lqrlo4jxf1dbler.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj0a46lqrlo4jxf1dbler.png" alt="OneLake security rollout checklist." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI agent angle
&lt;/h2&gt;

&lt;p&gt;There is also an agent story here.&lt;/p&gt;

&lt;p&gt;Fabric data agents, Foundry integration, MCP endpoints, and AI-assisted data workflows are all moving in the same direction: agents need access to governed business data.&lt;/p&gt;

&lt;p&gt;That does not work if the governance model is mostly report-level hiding or workspace-level habit.&lt;/p&gt;

&lt;p&gt;Agents need a data access model that is explicit, testable, and close to the source. OneLake security improvements are part of that foundation.&lt;/p&gt;

&lt;p&gt;The point is not to give agents more data.&lt;/p&gt;

&lt;p&gt;The point is to make sure an agent sees only the data it is supposed to see, through the same governed paths a human or application would use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would watch next
&lt;/h2&gt;

&lt;p&gt;The feature direction is good. The operating model is the hard part.&lt;/p&gt;

&lt;p&gt;For Fabric admins and BI leaders, I would watch five things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how consistently OneLake security applies across the engines your teams actually use;&lt;/li&gt;
&lt;li&gt;whether nested group support matches your Entra ID design;&lt;/li&gt;
&lt;li&gt;how service principal access is requested, reviewed, and audited;&lt;/li&gt;
&lt;li&gt;how shortcuts behave in hub-and-spoke lakehouse designs;&lt;/li&gt;
&lt;li&gt;whether column-level security becomes a reusable data contract, not a one-off workaround.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where this update becomes more than a product announcement.&lt;/p&gt;

&lt;p&gt;It becomes a chance to reduce duplicated security logic across the analytics estate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;OneLake security is getting closer to how enterprise Fabric environments actually work.&lt;/p&gt;

&lt;p&gt;That is good news for BI teams, data engineers, platform admins, and anyone trying to make AI over enterprise data safer.&lt;/p&gt;

&lt;p&gt;The practical next step is simple: pick one important lakehouse and test the real access paths. SQL endpoint. Groups. Shortcuts. Service principals. Eventhouse or Graph if they are part of your architecture.&lt;/p&gt;

&lt;p&gt;If the results are consistent, you have a stronger governance foundation.&lt;/p&gt;

&lt;p&gt;If they are not, you just found the work that was already waiting for you.&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/OneLake-security-improvements-for-SQL-analytics-endpoints/ba-p/5298160" rel="noopener noreferrer"&gt;OneLake security improvements for SQL analytics endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/New-OneLake-security-improvements-for-Microsoft-Fabric/ba-p/5314377" rel="noopener noreferrer"&gt;New OneLake security improvements for Microsoft Fabric&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/fundamentals/whats-new" rel="noopener noreferrer"&gt;Microsoft Fabric What's New&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;, senior data and analytics engineering leader focused on Microsoft Fabric, Power BI, governance, and practical AI implementation.&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>powerbi</category>
      <category>governance</category>
      <category>ai</category>
    </item>
    <item>
      <title>Build Fabric Dataflows From Chat and Still Keep Control</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Mon, 27 Jul 2026 22:18:32 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/build-fabric-dataflows-from-chat-and-still-keep-control-19j2</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/build-fabric-dataflows-from-chat-and-still-keep-control-19j2</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-07-27-data-factory-mcp-control.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg59envs8mzvckw9plni0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg59envs8mzvckw9plni0.png" alt="Build From Chat. Ship With Control." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft Fabric is getting closer to a very practical version of AI-assisted data engineering.&lt;/p&gt;

&lt;p&gt;The interesting part is not that an assistant can write M code or help create a Dataflow Gen2 item. We have had code generation for a while. The useful shift is that Microsoft now has a Data Factory MCP server that exposes Fabric resource discovery and Data Factory operations through a standard assistant interface.&lt;/p&gt;

&lt;p&gt;That changes the conversation.&lt;/p&gt;

&lt;p&gt;A data engineer can ask an AI assistant to inspect available workspaces, look at connections, create or update Dataflows, work with pipelines, run jobs, monitor status, and manage schedules. That is not a demo feature. That is the start of an operational surface for AI-assisted data work.&lt;/p&gt;

&lt;p&gt;The benefit is obvious: less manual setup, fewer repeated portal steps, faster iteration, and a more natural way to build Fabric assets from intent.&lt;/p&gt;

&lt;p&gt;The risk is also obvious: if teams treat this as a shortcut around engineering discipline, they will create faster mess.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Data Factory MCP actually gives teams
&lt;/h2&gt;

&lt;p&gt;Microsoft's Data Factory MCP project describes an MCP server for Microsoft Fabric resource discovery and information retrieval, with tool coverage across authentication, gateways, connections, workspaces, dataflows, pipelines, copy jobs, Apache Airflow jobs, and capacities.&lt;/p&gt;

&lt;p&gt;That tool surface matters.&lt;/p&gt;

&lt;p&gt;It means an assistant is not only answering questions about Fabric. It can interact with the same operational objects that determine whether data work is reliable: connections, gateways, schedules, definitions, run status, and pipeline execution.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fogs4kvm3b99al1un1yj1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fogs4kvm3b99al1un1yj1.png" alt="Data Factory MCP tool surface." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Used well, this can reduce the boring friction in Data Factory work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a draft Dataflow Gen2 structure;&lt;/li&gt;
&lt;li&gt;add or update queries;&lt;/li&gt;
&lt;li&gt;connect it to known Fabric connections;&lt;/li&gt;
&lt;li&gt;create a pipeline around the flow;&lt;/li&gt;
&lt;li&gt;run a test refresh;&lt;/li&gt;
&lt;li&gt;inspect status;&lt;/li&gt;
&lt;li&gt;iterate from the same chat loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a good direction. Data engineering has too much manual plumbing. Repeated setup work should be automated.&lt;/p&gt;

&lt;p&gt;But this is also exactly why the control model matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The control point moves from authoring to review
&lt;/h2&gt;

&lt;p&gt;In the old portal-first workflow, the friction was in creation. You clicked through items, settings, connections, gateway choices, schedules, destinations, and refresh behavior.&lt;/p&gt;

&lt;p&gt;In an AI-assisted workflow, creation becomes cheaper.&lt;/p&gt;

&lt;p&gt;That does not remove the need for review. It moves the review closer to the generated definition.&lt;/p&gt;

&lt;p&gt;For a production team, the important questions are not only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can the assistant create the dataflow?&lt;/li&gt;
&lt;li&gt;Can it add a query?&lt;/li&gt;
&lt;li&gt;Can it run a pipeline?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The better questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which identity is the assistant using?&lt;/li&gt;
&lt;li&gt;Which workspace can it touch?&lt;/li&gt;
&lt;li&gt;Which connections can it discover or create?&lt;/li&gt;
&lt;li&gt;Can a human review the changed definition before it runs?&lt;/li&gt;
&lt;li&gt;Is the output destination explicit?&lt;/li&gt;
&lt;li&gt;Is the schedule owned by a team or by whoever tried the demo first?&lt;/li&gt;
&lt;li&gt;Is there a rollback path if the generated change is wrong?&lt;/li&gt;
&lt;li&gt;What gets logged when it runs?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where experienced data teams will separate themselves from teams chasing the shiny part.&lt;/p&gt;

&lt;p&gt;AI-assisted Fabric work should feel like a pull request, not like an invisible macro.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical first pilot
&lt;/h2&gt;

&lt;p&gt;The first pilot should be intentionally small.&lt;/p&gt;

&lt;p&gt;Pick one workspace, one source system, one Dataflow Gen2 item, and one pipeline. Do not give an assistant broad access to the estate just because the setup is exciting.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fub256qjekb017ep53iv7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fub256qjekb017ep53iv7.png" alt="A safer first pilot pattern." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A good pilot has four gates.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Scope gate
&lt;/h3&gt;

&lt;p&gt;Limit the assistant to a non-critical workspace and a known source. The goal is to prove the workflow, not automate the most sensitive pipeline first.&lt;/p&gt;

&lt;p&gt;The output should be a small Fabric asset that the team can inspect by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Identity gate
&lt;/h3&gt;

&lt;p&gt;Use a deliberate identity model. Interactive authentication is useful for exploration, but production patterns need service principals, managed identities, or tightly controlled user access depending on the scenario.&lt;/p&gt;

&lt;p&gt;The point is simple: the item should not depend on the wrong person being logged in at the wrong time.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Review gate
&lt;/h3&gt;

&lt;p&gt;Every generated change needs a reviewable definition. That can be a Dataflow definition, pipeline definition, schedule configuration, or connection mapping.&lt;/p&gt;

&lt;p&gt;The review should check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;source and destination;&lt;/li&gt;
&lt;li&gt;credential and connection choice;&lt;/li&gt;
&lt;li&gt;transformation logic;&lt;/li&gt;
&lt;li&gt;refresh behavior;&lt;/li&gt;
&lt;li&gt;failure path;&lt;/li&gt;
&lt;li&gt;naming and ownership;&lt;/li&gt;
&lt;li&gt;whether the change is safe to repeat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not bureaucracy. It is how teams avoid turning AI speed into production uncertainty.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Operations gate
&lt;/h3&gt;

&lt;p&gt;A created pipeline is not done when it runs once.&lt;/p&gt;

&lt;p&gt;It needs a run history, failure notification path, schedule owner, cost expectation, and cleanup rule. If the pilot creates an asset nobody owns after the demo, the pilot failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The opportunity for Fabric teams
&lt;/h2&gt;

&lt;p&gt;The real opportunity is not replacing Data Factory engineers. It is removing low-value mechanical work so engineers can spend more time on design, testing, data contracts, and operational quality.&lt;/p&gt;

&lt;p&gt;That is where this starts to matter for analytics engineering teams.&lt;/p&gt;

&lt;p&gt;Imagine a workflow where an assistant can draft the dataflow, wire the connection, create the first pipeline, and run the test, while the engineer reviews the definition and decides what gets promoted.&lt;/p&gt;

&lt;p&gt;That is useful.&lt;/p&gt;

&lt;p&gt;It is also realistic.&lt;/p&gt;

&lt;p&gt;The teams that get the most value will not be the ones that give the assistant the broadest access. They will be the ones that give it a clear lane:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;known workspaces;&lt;/li&gt;
&lt;li&gt;approved connections;&lt;/li&gt;
&lt;li&gt;reusable query patterns;&lt;/li&gt;
&lt;li&gt;naming rules;&lt;/li&gt;
&lt;li&gt;test data;&lt;/li&gt;
&lt;li&gt;review steps;&lt;/li&gt;
&lt;li&gt;promotion gates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is how AI-assisted Data Factory work becomes an engineering workflow instead of another pile of generated assets.&lt;/p&gt;

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

&lt;p&gt;Data Factory MCP is one of the more practical Fabric AI signals because it sits where work actually happens: connections, dataflows, pipelines, copy jobs, schedules, and run status.&lt;/p&gt;

&lt;p&gt;That makes it more useful than a generic chat demo.&lt;/p&gt;

&lt;p&gt;It also means Fabric admins and data teams should think about it early. Not because every team needs to adopt it immediately, but because the control model needs to be designed before assistants start changing production assets.&lt;/p&gt;

&lt;p&gt;If I were piloting this, I would start with one question:&lt;/p&gt;

&lt;p&gt;Can we let an assistant build the first draft while keeping identity, review, testing, and operations fully human-owned?&lt;/p&gt;

&lt;p&gt;If the answer is yes, this is worth testing.&lt;/p&gt;

&lt;p&gt;If the answer is no, the assistant is not the problem. The platform workflow is.&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/fundamentals/whats-new" rel="noopener noreferrer"&gt;Microsoft Fabric What's New&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/microsoft/DataFactory.MCP" rel="noopener noreferrer"&gt;Microsoft DataFactory.MCP on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/data-factory/data-source-management" rel="noopener noreferrer"&gt;Data source management in Microsoft Fabric&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/fundamentals/copilot-fabric-overview" rel="noopener noreferrer"&gt;Overview of Copilot in Fabric&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Written by &lt;strong&gt;Shai Karmani&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Connect with me on LinkedIn: &lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/shai-kr&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>dataengineering</category>
      <category>datafactory</category>
      <category>ai</category>
    </item>
    <item>
      <title>Bring Power BI Answers Into the Flow of Work With Fabric IQ</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Fri, 10 Jul 2026 03:15:08 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/bring-power-bi-answers-into-the-flow-of-work-with-fabric-iq-p96</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/bring-power-bi-answers-into-the-flow-of-work-with-fabric-iq-p96</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-07-09-fabric-iq-m365-copilot-chat-readiness.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewg0wox4jrmawv3yu5w8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewg0wox4jrmawv3yu5w8.png" alt="Fabric IQ bringing governed Power BI answers into Microsoft 365 Copilot Chat" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Power BI answers are starting to move closer to where decisions already happen.&lt;/p&gt;

&lt;p&gt;That is the useful part of Fabric IQ in Microsoft 365 Copilot Chat.&lt;/p&gt;

&lt;p&gt;The feature lets users ask Microsoft 365 Copilot questions grounded in Power BI reports and semantic models. Instead of switching to Power BI, finding the right report, applying filters, and interpreting the visual, a user can ask a data question in Copilot Chat and bring the answer into the same place where they are already working with files, chats, emails, and meetings.&lt;/p&gt;

&lt;p&gt;That sounds small if you look at it as another Copilot surface.&lt;/p&gt;

&lt;p&gt;It is bigger if you look at the workflow.&lt;/p&gt;

&lt;p&gt;For years, BI teams have tried to pull users into dashboards. This pattern starts pulling governed BI answers into the user’s normal decision path.&lt;/p&gt;

&lt;p&gt;That is a real opportunity. It also raises the bar for semantic model quality.&lt;/p&gt;

&lt;p&gt;When a Power BI report is opened by a trained analyst, the analyst brings context. They know which measure to trust, which filter matters, which visual is old, and which field name is misleading.&lt;/p&gt;

&lt;p&gt;When a question is asked through Copilot Chat, much of that implicit human context has to be built into the model, the report, the access model, and the operating process.&lt;/p&gt;

&lt;p&gt;That is the part teams should prepare for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;Microsoft’s Fabric IQ connector for Microsoft 365 Copilot Chat is currently described as a Frontier capability. It allows eligible users to ask questions grounded in Power BI reports and semantic models from Copilot Chat.&lt;/p&gt;

&lt;p&gt;The important mechanics are straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copilot uses the user’s existing permissions to access relevant Power BI content.&lt;/li&gt;
&lt;li&gt;Users can reference reports by pasting a report link, using the attachment menu when available, or naming the report in the prompt.&lt;/li&gt;
&lt;li&gt;The answer is grounded in Power BI data, then can be reconciled with broader Microsoft 365 context.&lt;/li&gt;
&lt;li&gt;Users need the right Microsoft 365 Copilot licensing and access to the relevant Power BI content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters.&lt;/p&gt;

&lt;p&gt;This does not remove BI governance. It exposes BI governance in a new place.&lt;/p&gt;

&lt;p&gt;If your semantic model is well named, secure, documented, refreshed, and owned, this can become a very useful decision layer.&lt;/p&gt;

&lt;p&gt;If the model is messy, the mess now has a new audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture pattern
&lt;/h2&gt;

&lt;p&gt;The clean mental model is not “Copilot answers everything.”&lt;/p&gt;

&lt;p&gt;The better model is this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user asks a business question in Microsoft 365 Copilot Chat.&lt;/li&gt;
&lt;li&gt;Fabric IQ helps connect that question to relevant Power BI content.&lt;/li&gt;
&lt;li&gt;The semantic model provides measures, relationships, security, business names, and definitions.&lt;/li&gt;
&lt;li&gt;Copilot brings the answer back into the user’s work context.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That makes the semantic model the contract.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewg0wox4jrmawv3yu5w8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fewg0wox4jrmawv3yu5w8.png" alt="Fabric IQ operating flow from Microsoft 365 Copilot Chat to governed Power BI data" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The report still matters. The visuals still matter. But for conversational answering, the semantic model becomes even more important because it carries the business logic.&lt;/p&gt;

&lt;p&gt;The model needs to answer questions without relying on a report author standing next to the user.&lt;/p&gt;

&lt;p&gt;That means the basics become production requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;measures need clear names&lt;/li&gt;
&lt;li&gt;field descriptions need to exist&lt;/li&gt;
&lt;li&gt;hidden technical fields should stay hidden&lt;/li&gt;
&lt;li&gt;certified models need to be obvious&lt;/li&gt;
&lt;li&gt;RLS and OLS need to be tested with real user scenarios&lt;/li&gt;
&lt;li&gt;refresh expectations need to be documented&lt;/li&gt;
&lt;li&gt;ownership needs to be visible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is glamorous. That is why it matters.&lt;/p&gt;

&lt;p&gt;Most AI failure modes in BI will not come from spectacular model hallucinations. They will come from ordinary BI hygiene gaps that were tolerable inside a dashboard and painful inside a chat answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A readiness checklist for BI teams
&lt;/h2&gt;

&lt;p&gt;Before I would promote this broadly, I would run a readiness check across four areas.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frdy2fsmsc7g8f18rtor9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frdy2fsmsc7g8f18rtor9.png" alt="Readiness map for using Fabric IQ and Power BI data answering in Microsoft 365 Copilot Chat" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Model quality
&lt;/h3&gt;

&lt;p&gt;Start with the semantic model.&lt;/p&gt;

&lt;p&gt;A conversational answer depends on the model being understandable without a human translator.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are the key measures named in business language?&lt;/li&gt;
&lt;li&gt;Do important fields have descriptions?&lt;/li&gt;
&lt;li&gt;Are technical columns hidden from the user experience?&lt;/li&gt;
&lt;li&gt;Are calculation groups, relationships, and measure folders organized enough to support discovery?&lt;/li&gt;
&lt;li&gt;Is the model certified or promoted when it should be?&lt;/li&gt;
&lt;li&gt;Are duplicate or outdated models still competing for attention?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where many teams will need cleanup.&lt;/p&gt;

&lt;p&gt;If five models all claim to represent “sales,” Copilot is not the root problem. The estate is.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Security and permissions
&lt;/h3&gt;

&lt;p&gt;Copilot uses the user’s existing access, so the permission model has to be correct before the feature becomes trusted.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is RLS tested with the same roles real users have?&lt;/li&gt;
&lt;li&gt;Is OLS used where sensitive fields should not be exposed?&lt;/li&gt;
&lt;li&gt;Are workspace permissions tighter than “everyone can view everything”?&lt;/li&gt;
&lt;li&gt;Are sensitivity labels aligned with the data’s real business meaning?&lt;/li&gt;
&lt;li&gt;Are report and semantic model permissions reviewed together?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key test is simple:&lt;/p&gt;

&lt;p&gt;If this user asks a question in chat, would we be comfortable with the same answer appearing in a meeting recap or shared work thread?&lt;/p&gt;

&lt;p&gt;If not, fix access before expanding usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Operations
&lt;/h3&gt;

&lt;p&gt;A chat answer feels immediate. That makes stale data more dangerous.&lt;/p&gt;

&lt;p&gt;Inside a report, users sometimes notice context clues: refresh timestamps, page titles, filters, bookmarks, or report notes. In chat, the answer may feel more direct and more final.&lt;/p&gt;

&lt;p&gt;That means the operating model needs to be explicit.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the refresh SLA for the model?&lt;/li&gt;
&lt;li&gt;Who owns failed refreshes?&lt;/li&gt;
&lt;li&gt;Who owns bad answers?&lt;/li&gt;
&lt;li&gt;How are model changes reviewed?&lt;/li&gt;
&lt;li&gt;Where do users report issues?&lt;/li&gt;
&lt;li&gt;How often are usage and failures reviewed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A good Copilot experience is not only a good prompt experience. It is a supportable data product.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Answer design
&lt;/h3&gt;

&lt;p&gt;Not every question should be answered the same way.&lt;/p&gt;

&lt;p&gt;Some questions need a number. Some need a trend. Some need a filtered slice. Some need a warning that the model does not contain the right context.&lt;/p&gt;

&lt;p&gt;Create a small answer design guide for the first pilot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which questions are supported&lt;/li&gt;
&lt;li&gt;which questions are out of scope&lt;/li&gt;
&lt;li&gt;which report or model should be referenced&lt;/li&gt;
&lt;li&gt;how users should phrase common questions&lt;/li&gt;
&lt;li&gt;what answer quality looks like&lt;/li&gt;
&lt;li&gt;when the user should open the report instead of relying on chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That guidance does not have to be heavy. One page is enough for a pilot.&lt;/p&gt;

&lt;p&gt;But it should exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical pilot path
&lt;/h2&gt;

&lt;p&gt;I would not roll this out across the whole Power BI estate first.&lt;/p&gt;

&lt;p&gt;I would choose one high-value scenario and make it boringly reliable.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7nuijcr3lttxiwwjz48v.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7nuijcr3lttxiwwjz48v.png" alt="Pilot path for releasing governed Power BI answers in Microsoft 365 Copilot Chat" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Choose one recurring business question
&lt;/h3&gt;

&lt;p&gt;Pick a question people already ask every week.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;“How are sales tracking this month?”&lt;/li&gt;
&lt;li&gt;“Which region is behind target?”&lt;/li&gt;
&lt;li&gt;“What changed in pipeline since last week?”&lt;/li&gt;
&lt;li&gt;“Which customers are driving the variance?”&lt;/li&gt;
&lt;li&gt;“What should I know before the forecast meeting?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid vague pilots like “ask anything about revenue.”&lt;/p&gt;

&lt;p&gt;That invites noise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Pick the trusted report and semantic model
&lt;/h3&gt;

&lt;p&gt;Choose one report and one model as the source of truth for the pilot.&lt;/p&gt;

&lt;p&gt;Do not let the first pilot search across ten similar assets.&lt;/p&gt;

&lt;p&gt;The point is to prove the answer path, not to test every governance edge case at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Prepare the model for questions
&lt;/h3&gt;

&lt;p&gt;This is the cleanup sprint.&lt;/p&gt;

&lt;p&gt;Focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business-friendly measure names&lt;/li&gt;
&lt;li&gt;descriptions for the most important fields&lt;/li&gt;
&lt;li&gt;certified status where appropriate&lt;/li&gt;
&lt;li&gt;hidden fields that should not appear in answers&lt;/li&gt;
&lt;li&gt;tested RLS and OLS&lt;/li&gt;
&lt;li&gt;refresh visibility&lt;/li&gt;
&lt;li&gt;clear ownership&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the model cannot explain itself, the chat experience will struggle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Test with real prompts
&lt;/h3&gt;

&lt;p&gt;Use the questions people actually ask.&lt;/p&gt;

&lt;p&gt;For each one, compare the Copilot answer to the Power BI report and the semantic model logic.&lt;/p&gt;

&lt;p&gt;Capture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correct answers&lt;/li&gt;
&lt;li&gt;incomplete answers&lt;/li&gt;
&lt;li&gt;confusing wording&lt;/li&gt;
&lt;li&gt;unsupported questions&lt;/li&gt;
&lt;li&gt;security or access surprises&lt;/li&gt;
&lt;li&gt;cases where opening the report is still better&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This becomes the pilot’s improvement backlog.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Publish a small user guide
&lt;/h3&gt;

&lt;p&gt;Users need guardrails, not a training course.&lt;/p&gt;

&lt;p&gt;Give them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;three example prompts that work well&lt;/li&gt;
&lt;li&gt;two examples that are out of scope&lt;/li&gt;
&lt;li&gt;the trusted report name&lt;/li&gt;
&lt;li&gt;the owner or support channel&lt;/li&gt;
&lt;li&gt;a reminder that governed data still depends on refresh and model design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is enough to start.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Review after launch
&lt;/h3&gt;

&lt;p&gt;After the pilot goes live, review what happened.&lt;/p&gt;

&lt;p&gt;Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repeated questions&lt;/li&gt;
&lt;li&gt;confusing answers&lt;/li&gt;
&lt;li&gt;reports users keep referencing manually&lt;/li&gt;
&lt;li&gt;model fields that need better names&lt;/li&gt;
&lt;li&gt;missing measures&lt;/li&gt;
&lt;li&gt;access issues&lt;/li&gt;
&lt;li&gt;opportunities to add a second scenario&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the value compounds.&lt;/p&gt;

&lt;p&gt;Every good question teaches the BI team what the model needs to support next.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would tell BI teams to do now
&lt;/h2&gt;

&lt;p&gt;Do not wait for every Copilot surface to be fully mature before cleaning up the model layer.&lt;/p&gt;

&lt;p&gt;The preparation is useful either way.&lt;/p&gt;

&lt;p&gt;A semantic model with clear names, tested security, good descriptions, certified ownership, and a refresh SLA is better for Power BI, Fabric Apps, AI skills, and Copilot Chat.&lt;/p&gt;

&lt;p&gt;The same work improves the whole estate.&lt;/p&gt;

&lt;p&gt;My short checklist would be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For each candidate semantic model:

1. Confirm business owner and technical owner.
2. Confirm the model is the trusted source for a real decision path.
3. Review measure names and descriptions.
4. Hide technical fields from user-facing experiences.
5. Test RLS and OLS with real user roles.
6. Confirm refresh SLA and failure ownership.
7. Create 10 approved example questions.
8. Test answers against the report and source logic.
9. Publish a one-page user guide.
10. Review usage and misses after launch.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the work that turns a Copilot feature into a reliable business capability.&lt;/p&gt;

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

&lt;p&gt;For a long time, the center of gravity in BI was the report.&lt;/p&gt;

&lt;p&gt;Then the semantic model became more important as teams standardized measures, lineage, security, and reusable business logic.&lt;/p&gt;

&lt;p&gt;Now conversational interfaces are pushing that model layer into more places.&lt;/p&gt;

&lt;p&gt;Microsoft 365 Copilot Chat is one of the most important places because it sits close to the work: meetings, files, messages, decisions, and follow-ups.&lt;/p&gt;

&lt;p&gt;That does not make Power BI less important.&lt;/p&gt;

&lt;p&gt;It makes Power BI governance more visible.&lt;/p&gt;

&lt;p&gt;The teams that win here will not be the teams with the most dashboards. They will be the teams with the most trustworthy models and the clearest ownership.&lt;/p&gt;

&lt;p&gt;That is a good direction.&lt;/p&gt;

&lt;p&gt;It rewards the BI work that already should have mattered: definitions, security, freshness, ownership, and practical trust.&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/connectors/microsoft-365-copilot-overview" rel="noopener noreferrer"&gt;Fabric IQ in Microsoft 365 Copilot Chat (Frontier), Microsoft Learn&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;Power BI June 2026 update, Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Want to discuss Power BI, Microsoft Fabric, or practical AI implementation? &lt;a href="https://www.linkedin.com/in/shai-kr" rel="noopener noreferrer"&gt;Connect with me on LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>microsoftfabric</category>
      <category>ai</category>
      <category>governance</category>
    </item>
    <item>
      <title>Make Fabric AI Agents Smarter With Labels You Already Own</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Mon, 06 Jul 2026 22:22:24 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/make-fabric-ai-agents-smarter-with-labels-you-already-own-2mah</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/make-fabric-ai-agents-smarter-with-labels-you-already-own-2mah</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-07-06-fabric-ai-agents-sensitivity-labels.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbst3937rsrlqdc1uy99t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbst3937rsrlqdc1uy99t.png" alt="Fabric AI agents using sensitivity labels as context signals" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft Fabric just gave sensitivity labels a more interesting job.&lt;/p&gt;

&lt;p&gt;Most teams think about sensitivity labels as governance metadata: General, Confidential, Highly Confidential, custom labels, protection policies, access rules, and audit expectations.&lt;/p&gt;

&lt;p&gt;That work still matters.&lt;/p&gt;

&lt;p&gt;But the new AI angle is better: those labels can also help Fabric AI agents decide which data belongs in an answer.&lt;/p&gt;

&lt;p&gt;That turns sensitivity labels from a control layer into a context layer.&lt;/p&gt;

&lt;p&gt;And that is a very useful shift.&lt;/p&gt;

&lt;p&gt;If an AI agent can access several reports, semantic models, lakehouses, or other Fabric items, the hard question is not only “does the user have permission?”&lt;/p&gt;

&lt;p&gt;The harder question is:&lt;/p&gt;

&lt;p&gt;Which sources should the agent consider for this question?&lt;/p&gt;

&lt;p&gt;That is where labels become valuable. They give the agent a signal your organization already understands.&lt;/p&gt;

&lt;p&gt;General data can support broader analysis. Confidential data may require tighter answer rules. Highly Confidential data may need explicit clearance, summary-only responses, escalation, or a full audit trail.&lt;/p&gt;

&lt;p&gt;The practical win is simple: better answers with less noise and clearer governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The opportunity
&lt;/h2&gt;

&lt;p&gt;AI agents do not fail only because they lack access.&lt;/p&gt;

&lt;p&gt;They also fail because they have too much undifferentiated context.&lt;/p&gt;

&lt;p&gt;A reporting skill that can read every report equally may produce an answer that is technically grounded, but still poorly scoped. It might mix public sales summaries with confidential forecast material. It might use executive planning data in a broad operational answer. It might answer with more detail than the scenario deserves.&lt;/p&gt;

&lt;p&gt;That is not a model problem. It is a context design problem.&lt;/p&gt;

&lt;p&gt;Sensitivity labels can help solve it.&lt;/p&gt;

&lt;p&gt;Microsoft’s update describes a pattern where labels guide how an AI skill or agent selects and prioritizes data. The agent still respects protection and permissions, but labels also become a relevance signal.&lt;/p&gt;

&lt;p&gt;In plain language:&lt;/p&gt;

&lt;p&gt;The label tells the agent how the organization thinks about that data.&lt;/p&gt;

&lt;p&gt;That is useful because organizations already invest time in classification. They already know which information is broadly shareable, which information needs care, and which information belongs in specific business contexts.&lt;/p&gt;

&lt;p&gt;The next step is to stop treating that classification as something only humans and compliance tools can use.&lt;/p&gt;

&lt;p&gt;Let the agent use it too.&lt;/p&gt;

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

&lt;p&gt;I would not start with a complex policy framework.&lt;/p&gt;

&lt;p&gt;I would start with a small behavior map.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftmv4nxf8h3zxsbxrhuk0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftmv4nxf8h3zxsbxrhuk0.png" alt="Label-to-agent behavior map for Fabric AI agents" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For each label category, define what the agent is allowed to do with that content.&lt;/p&gt;

&lt;p&gt;A simple first version might look like this:&lt;/p&gt;

&lt;h3&gt;
  
  
  General
&lt;/h3&gt;

&lt;p&gt;Use it freely for normal analysis.&lt;/p&gt;

&lt;p&gt;The agent can summarize it, compare it, cite it, and use it as the primary context for broad business questions.&lt;/p&gt;

&lt;p&gt;Good fit for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;public sales summaries&lt;/li&gt;
&lt;li&gt;operational KPI reports&lt;/li&gt;
&lt;li&gt;broadly shared semantic models&lt;/li&gt;
&lt;li&gt;documentation intended for many teams&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Confidential
&lt;/h3&gt;

&lt;p&gt;Use it only when relevant and when the user is authorized.&lt;/p&gt;

&lt;p&gt;The agent can summarize, but it should avoid pulling confidential detail into broad answers unless the question clearly requires it.&lt;/p&gt;

&lt;p&gt;Good fit for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;budget forecasts&lt;/li&gt;
&lt;li&gt;customer-specific analysis&lt;/li&gt;
&lt;li&gt;margin or pricing reports&lt;/li&gt;
&lt;li&gt;internal planning material&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Highly Confidential
&lt;/h3&gt;

&lt;p&gt;Use it only for explicit, cleared scenarios.&lt;/p&gt;

&lt;p&gt;The agent may need to decline, escalate, or provide a high-level briefing instead of a detailed answer.&lt;/p&gt;

&lt;p&gt;Good fit for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;executive strategy&lt;/li&gt;
&lt;li&gt;M&amp;amp;A planning&lt;/li&gt;
&lt;li&gt;legal-sensitive reporting&lt;/li&gt;
&lt;li&gt;restricted financial planning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your labels will not look exactly like this. They should not.&lt;/p&gt;

&lt;p&gt;The important part is the translation layer: label to agent behavior.&lt;/p&gt;

&lt;p&gt;Without that translation, the label exists, but the AI skill does not know what to do with it.&lt;/p&gt;

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

&lt;p&gt;Imagine a Fabric AI skill that analyzes Power BI reports and answers questions about business performance.&lt;/p&gt;

&lt;p&gt;A user asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What are our Q3 projections?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The skill can see several possible sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a General-labeled sales performance report&lt;/li&gt;
&lt;li&gt;a Confidential finance forecast semantic model&lt;/li&gt;
&lt;li&gt;a Highly Confidential executive planning report&lt;/li&gt;
&lt;li&gt;a department-specific Lakehouse table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A normal permission check answers only part of the question.&lt;/p&gt;

&lt;p&gt;The user may be allowed to access more than one of those assets. But permission alone does not tell the agent which source should shape the answer.&lt;/p&gt;

&lt;p&gt;A label-aware skill can apply a better decision model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If the question is broad and operational:
  prefer General-labeled sources
  use Confidential sources only when the question explicitly needs them
  exclude Highly Confidential sources unless the user and scenario are cleared

If Confidential sources are used:
  summarize first
  avoid unnecessary row-level detail
  record the source and rationale

If Highly Confidential sources are needed:
  require explicit clearance
  return a briefing or escalate
  log the question and source selection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not heavy governance. That is practical answer design.&lt;/p&gt;

&lt;p&gt;The agent becomes more useful because it stops treating every accessible source as equally appropriate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pilot playbook
&lt;/h2&gt;

&lt;p&gt;The safest way to use this pattern is to pilot it with one skill and one business scenario.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9py14fuookul7vcho8t1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9py14fuookul7vcho8t1.png" alt="Pilot playbook for building a label-aware Fabric AI skill" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the sequence I would use.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Pick one skill
&lt;/h3&gt;

&lt;p&gt;Do not start across the whole estate.&lt;/p&gt;

&lt;p&gt;Pick one focused AI skill:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;report analysis&lt;/li&gt;
&lt;li&gt;KPI explanation&lt;/li&gt;
&lt;li&gt;budget Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;customer summary generation&lt;/li&gt;
&lt;li&gt;operations briefing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The skill should have a clear business owner and a clear answer pattern.&lt;/p&gt;

&lt;p&gt;If nobody owns the answers, nobody will own the rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Inventory the sources
&lt;/h3&gt;

&lt;p&gt;List the Fabric items the skill can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reports&lt;/li&gt;
&lt;li&gt;semantic models&lt;/li&gt;
&lt;li&gt;lakehouses&lt;/li&gt;
&lt;li&gt;warehouses&lt;/li&gt;
&lt;li&gt;Eventhouse tables&lt;/li&gt;
&lt;li&gt;notebooks or generated outputs&lt;/li&gt;
&lt;li&gt;supporting documents, if they are part of the workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each source, capture owner, label, workspace, refresh pattern, and business purpose.&lt;/p&gt;

&lt;p&gt;This is where many teams find the first gap: important sources are unlabeled, inconsistently labeled, or owned by the wrong team.&lt;/p&gt;

&lt;p&gt;That is useful to know before the agent starts answering real questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Check label coverage
&lt;/h3&gt;

&lt;p&gt;A label-aware skill is only as good as the labels behind it.&lt;/p&gt;

&lt;p&gt;Before building rules, ask four questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are the key sources labeled?&lt;/li&gt;
&lt;li&gt;Are labels applied consistently across reports, semantic models, and data items?&lt;/li&gt;
&lt;li&gt;Does each label have a clear business meaning?&lt;/li&gt;
&lt;li&gt;Are there exceptions the agent needs to know about?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the answer is no, fix the labeling pattern first.&lt;/p&gt;

&lt;p&gt;Otherwise the skill will learn from inconsistent signals.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Write agent behavior rules
&lt;/h3&gt;

&lt;p&gt;This is the part most teams will be tempted to skip.&lt;/p&gt;

&lt;p&gt;Do not skip it.&lt;/p&gt;

&lt;p&gt;For each label, define what the skill should do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use normally&lt;/li&gt;
&lt;li&gt;use only when clearly relevant&lt;/li&gt;
&lt;li&gt;summarize instead of showing detail&lt;/li&gt;
&lt;li&gt;exclude from broad answers&lt;/li&gt;
&lt;li&gt;require a higher clearance path&lt;/li&gt;
&lt;li&gt;log usage&lt;/li&gt;
&lt;li&gt;ask a clarifying question&lt;/li&gt;
&lt;li&gt;decline and explain why&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep the rules short enough for a product owner, data owner, and compliance stakeholder to read together.&lt;/p&gt;

&lt;p&gt;If the rules are too complex for review, they will be too complex to operate.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Test answer quality
&lt;/h3&gt;

&lt;p&gt;Do not test only whether the agent blocks the right things.&lt;/p&gt;

&lt;p&gt;Test whether the answer gets better.&lt;/p&gt;

&lt;p&gt;Use a small evaluation set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;broad business questions&lt;/li&gt;
&lt;li&gt;sensitive finance questions&lt;/li&gt;
&lt;li&gt;ambiguous questions&lt;/li&gt;
&lt;li&gt;questions that should trigger clarifying prompts&lt;/li&gt;
&lt;li&gt;questions that should avoid sensitive sources&lt;/li&gt;
&lt;li&gt;questions that should escalate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then compare the agent before and after label guidance.&lt;/p&gt;

&lt;p&gt;Look for four outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less irrelevant context&lt;/li&gt;
&lt;li&gt;fewer mixed-context answers&lt;/li&gt;
&lt;li&gt;clearer explanation of source choice&lt;/li&gt;
&lt;li&gt;stronger auditability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the point of this pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  What improves when labels guide context
&lt;/h2&gt;

&lt;p&gt;The most obvious benefit is governance, but the more interesting benefit is answer quality.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F63xwymccqjv1qzeiboei.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F63xwymccqjv1qzeiboei.png" alt="Answer quality comparison with and without label guidance" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A label-aware skill can avoid a common AI problem: over-answering.&lt;/p&gt;

&lt;p&gt;If a user asks a broad question, the agent does not need to pull the most sensitive source just because it can. It can start with the broadly appropriate source and only move into restricted context when the question, permission, and scenario justify it.&lt;/p&gt;

&lt;p&gt;That makes the answer easier to trust.&lt;/p&gt;

&lt;p&gt;It also makes the system easier to explain.&lt;/p&gt;

&lt;p&gt;When someone asks why the agent used a source, the answer is not vague. It can point to a rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this source was General-labeled and appropriate for broad analysis&lt;/li&gt;
&lt;li&gt;this Confidential source was used because the question explicitly asked for forecast detail&lt;/li&gt;
&lt;li&gt;this Highly Confidential source was excluded because the user did not have the required scenario clearance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the kind of explanation real organizations need if AI agents are going to touch business data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist
&lt;/h2&gt;

&lt;p&gt;Before using sensitivity labels as AI guidance, I would want these items in place.&lt;/p&gt;

&lt;h3&gt;
  
  
  Label foundation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Key Fabric items are labeled.&lt;/li&gt;
&lt;li&gt;Labels are defined in Microsoft Purview.&lt;/li&gt;
&lt;li&gt;Labels have business meaning, not only compliance meaning.&lt;/li&gt;
&lt;li&gt;Custom labels are documented where they exist.&lt;/li&gt;
&lt;li&gt;Owners know which assets they are responsible for labeling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Agent design
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The skill has a defined business scenario.&lt;/li&gt;
&lt;li&gt;The allowed source list is explicit.&lt;/li&gt;
&lt;li&gt;Label-to-behavior rules are documented.&lt;/li&gt;
&lt;li&gt;The skill has a fallback path for ambiguous questions.&lt;/li&gt;
&lt;li&gt;The skill can explain why it used or avoided a source.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Governance and operations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Confidential and highly sensitive usage is logged.&lt;/li&gt;
&lt;li&gt;Rules are reviewed when labels change.&lt;/li&gt;
&lt;li&gt;Output behavior is tested with real example questions.&lt;/li&gt;
&lt;li&gt;There is a process for correcting mislabeled sources.&lt;/li&gt;
&lt;li&gt;The business owner can review sample answers before rollout.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quality review
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Answers use fewer irrelevant sources.&lt;/li&gt;
&lt;li&gt;Sensitive context does not leak into broad answers.&lt;/li&gt;
&lt;li&gt;Refusals are understandable.&lt;/li&gt;
&lt;li&gt;Summaries preserve meaning without exposing unnecessary detail.&lt;/li&gt;
&lt;li&gt;Audit logs show which sources shaped the answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between “we added AI” and “we designed how AI should behave around our data.”&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would avoid
&lt;/h2&gt;

&lt;p&gt;I would avoid three traps.&lt;/p&gt;

&lt;p&gt;First, do not assume access control is enough.&lt;/p&gt;

&lt;p&gt;Access control tells you what a user can reach. It does not always tell you what an AI answer should include.&lt;/p&gt;

&lt;p&gt;Second, do not build label rules only for the most sensitive case.&lt;/p&gt;

&lt;p&gt;The everyday value is often in the middle: helping agents choose between broad operational context and confidential planning context.&lt;/p&gt;

&lt;p&gt;Third, do not let every skill invent its own interpretation of labels.&lt;/p&gt;

&lt;p&gt;If one agent treats Confidential as “summary only” and another treats it as “full detail if authorized,” users will not understand the system. Create a shared pattern, then adjust only where the scenario requires it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway
&lt;/h2&gt;

&lt;p&gt;This update is bigger than it looks.&lt;/p&gt;

&lt;p&gt;Sensitivity labels are already part of Fabric and Power BI governance. Microsoft is now showing how those same labels can help AI agents produce more relevant and context-aware answers.&lt;/p&gt;

&lt;p&gt;That is exactly the kind of pattern teams need as agents move from demos to real data work.&lt;/p&gt;

&lt;p&gt;Start small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pick one skill&lt;/li&gt;
&lt;li&gt;inventory the sources&lt;/li&gt;
&lt;li&gt;check label coverage&lt;/li&gt;
&lt;li&gt;define label-to-behavior rules&lt;/li&gt;
&lt;li&gt;test whether answers improve&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best version of this is not AI with a compliance sticker on top.&lt;/p&gt;

&lt;p&gt;It is AI that understands the context your organization already uses to manage data.&lt;/p&gt;

&lt;p&gt;That is how Fabric AI agents become smarter, safer, and more useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;Microsoft Fabric Updates Blog: &lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Use-sensitivity-labels-to-improve-AI-Agents-accuracy-and/ba-p/5256054" rel="noopener noreferrer"&gt;Use sensitivity labels to improve AI Agents accuracy and organizational alignment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft Learn: &lt;a href="https://learn.microsoft.com/en-us/fabric/governance/information-protection" rel="noopener noreferrer"&gt;Information protection in Microsoft Fabric&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft Learn: &lt;a href="https://learn.microsoft.com/fabric/fundamentals/apply-sensitivity-labels" rel="noopener noreferrer"&gt;Apply sensitivity labels in Microsoft Fabric&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Shai Karmani is a data engineering, Microsoft Fabric, Power BI, and AI practitioner focused on building practical data systems people can trust.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>ai</category>
      <category>governance</category>
      <category>powerbi</category>
    </item>
    <item>
      <title>Fabric Warehouse Brings AI Enrichment Into T-SQL. Here’s the Practical Guide.</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Sun, 28 Jun 2026 00:23:05 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/fabric-warehouse-brings-ai-enrichment-into-t-sql-heres-the-practical-guide-38ff</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/fabric-warehouse-brings-ai-enrichment-into-t-sql-heres-the-practical-guide-38ff</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-27-fabric-warehouse-ai-functions-guide.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqr7327316cukdqai8fdr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqr7327316cukdqai8fdr.png" alt="Fabric Warehouse AI functions map" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fabric Data Warehouse now has preview AI functions that let you classify, summarize, translate, extract, and improve text directly from T-SQL.&lt;/p&gt;

&lt;p&gt;That is a bigger shift than it first looks.&lt;/p&gt;

&lt;p&gt;For years, a lot of text enrichment work has lived outside the warehouse. It gets handled in notebooks, one-off Python scripts, Power Query steps, spreadsheets, application code, or manual cleanup queues. Sometimes that is the right place. Often, it creates another disconnected transformation layer that nobody governs properly.&lt;/p&gt;

&lt;p&gt;The interesting part of these functions is not that Fabric can call AI from SQL. The interesting part is that common text intelligence tasks can now sit closer to governed warehouse workflows.&lt;/p&gt;

&lt;p&gt;That gives data teams a practical option:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enrich support tickets before they reach a semantic model&lt;/li&gt;
&lt;li&gt;classify messy feedback into controlled categories&lt;/li&gt;
&lt;li&gt;extract structured fields from free text&lt;/li&gt;
&lt;li&gt;translate multilingual comments for analysis&lt;/li&gt;
&lt;li&gt;summarize long operational notes&lt;/li&gt;
&lt;li&gt;clean user-entered text before reporting&lt;/li&gt;
&lt;li&gt;generate controlled response drafts from trusted data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Used well, this can reduce friction between AI experiments and production analytics.&lt;/p&gt;

&lt;p&gt;Used badly, it can bury expensive, non-deterministic logic inside report queries.&lt;/p&gt;

&lt;p&gt;The difference is architecture.&lt;/p&gt;

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

&lt;p&gt;Microsoft documents seven preview AI functions for Fabric Data Warehouse and the SQL analytics endpoint.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Practical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AI_ANALYZE_SENTIMENT(text)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;positive&lt;/code&gt;, &lt;code&gt;negative&lt;/code&gt;, &lt;code&gt;mixed&lt;/code&gt;, or &lt;code&gt;neutral&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Review analysis, support triage, survey feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AI_CLASSIFY(text, class1, class2, ...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Classifies text into labels you provide&lt;/td&gt;
&lt;td&gt;Ticket routing, complaint categories, product issue groups&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AI_EXTRACT(text, field1, field2, ...)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extracts fields as JSON&lt;/td&gt;
&lt;td&gt;Pulling problem, date, sentiment, location, or entity values from text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AI_SUMMARIZE(text)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Produces a shorter summary&lt;/td&gt;
&lt;td&gt;Condensing long notes for analysts or dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AI_GENERATE_RESPONSE(prompt, data)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generates a response from a prompt and optional data&lt;/td&gt;
&lt;td&gt;Response drafts, internal summaries, controlled explanation text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AI_TRANSLATE(text, lang_code)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Translates text into supported languages&lt;/td&gt;
&lt;td&gt;Multilingual support and feedback analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AI_FIX_GRAMMAR(text)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Corrects grammar in text&lt;/td&gt;
&lt;td&gt;Cleaning user-entered comments or notes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are not replacements for data modeling, governance, or review. They are transformation tools.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  A simple example
&lt;/h2&gt;

&lt;p&gt;Imagine a &lt;code&gt;support_cases&lt;/code&gt; table with a free-text &lt;code&gt;case_notes&lt;/code&gt; column.&lt;/p&gt;

&lt;p&gt;A useful enrichment table might include sentiment, a business category, a short summary, and structured fields extracted from the notes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;curated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;support_case_ai_enrichment&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;case_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_ANALYZE_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;sentiment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_CLASSIFY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'billing'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'delivery'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'technical issue'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'account access'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'other'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;case_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_SUMMARIZE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;case_summary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'problem'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'urgency'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'time_reported'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;extracted_json&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;support_cases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That output can then feed Power BI, a semantic model, an operations dashboard, or a downstream process.&lt;/p&gt;

&lt;p&gt;But I would not put this directly inside a report-facing query that runs every time a user opens a dashboard.&lt;/p&gt;

&lt;p&gt;Microsoft’s documentation calls out two practical constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI functions can return &lt;code&gt;NULL&lt;/code&gt; if the model cannot process the text.&lt;/li&gt;
&lt;li&gt;Typical processing speed is around 20 to 100 rows per second.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That points to the correct pattern: precompute and materialize repeated transformations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The function guide
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4xd8m8x7qouiaiydrtbv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4xd8m8x7qouiaiydrtbv.png" alt="Production workflow for Fabric Warehouse AI functions" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Use &lt;code&gt;AI_ANALYZE_SENTIMENT&lt;/code&gt; for directional signals
&lt;/h3&gt;

&lt;p&gt;Sentiment is useful when you need a rough business signal from text.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;customer review sentiment&lt;/li&gt;
&lt;li&gt;employee survey comments&lt;/li&gt;
&lt;li&gt;support ticket tone&lt;/li&gt;
&lt;li&gt;partner feedback&lt;/li&gt;
&lt;li&gt;product complaint notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;review_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_ANALYZE_SENTIMENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;review_sentiment&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_reviews&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I would not do: treat sentiment as absolute truth. It should support analysis, not replace review for high-impact cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use &lt;code&gt;AI_CLASSIFY&lt;/code&gt; when you control the categories
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AI_CLASSIFY&lt;/code&gt; is strongest when the business already knows the target categories.&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 sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;case_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_CLASSIFY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'billing'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'service'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'technical issue'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'contract'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'other'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;case_type&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;support_cases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The governance point is simple: the labels are part of the data contract. If the business changes the categories, the transformation logic changed too.&lt;/p&gt;

&lt;p&gt;Track that change like you would track a schema change.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use &lt;code&gt;AI_EXTRACT&lt;/code&gt; to turn text into structured fields
&lt;/h3&gt;

&lt;p&gt;This is the most interesting function for analytics engineering.&lt;/p&gt;

&lt;p&gt;Free text often contains useful structure, but parsing it with regular expressions gets brittle fast. &lt;code&gt;AI_EXTRACT&lt;/code&gt; lets you ask for fields and returns JSON.&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 sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;case_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'problem'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'affected_system'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'urgency'&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;extracted_case_details&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;support_cases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For reporting, I would normally parse the JSON into typed columns in a curated table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;case_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;affected_system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urgency&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;support_cases&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;CROSS&lt;/span&gt; &lt;span class="n"&gt;APPLY&lt;/span&gt; &lt;span class="n"&gt;OPENJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AI_EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;case_notes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'problem'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'affected_system'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'urgency'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;problem&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;affected_system&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;urgency&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where validation matters. Sample the output. Review wrong extractions. Keep the original text.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Use &lt;code&gt;AI_SUMMARIZE&lt;/code&gt; for readability, not evidence
&lt;/h3&gt;

&lt;p&gt;Summaries are useful when analysts need context without reading a full comment field.&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 sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;incident_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_SUMMARIZE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;incident_notes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;incident_summary&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;incidents&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The summary should not become the only version of the record. Keep the original text beside it or one click away.&lt;/p&gt;

&lt;p&gt;A summary is a reading aid. It is not the source of truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Use &lt;code&gt;AI_TRANSLATE&lt;/code&gt; when language blocks analysis
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AI_TRANSLATE&lt;/code&gt; can help standardize multilingual text for analysis.&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 sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;feedback_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;feedback_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_TRANSLATE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feedback_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'en'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;feedback_text_en&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_feedback&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft lists supported language codes including &lt;code&gt;en&lt;/code&gt;, &lt;code&gt;de&lt;/code&gt;, &lt;code&gt;fr&lt;/code&gt;, &lt;code&gt;it&lt;/code&gt;, &lt;code&gt;es&lt;/code&gt;, &lt;code&gt;el&lt;/code&gt;, &lt;code&gt;pl&lt;/code&gt;, &lt;code&gt;sv&lt;/code&gt;, &lt;code&gt;fi&lt;/code&gt;, and &lt;code&gt;cs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For global reporting, this can make feedback analysis easier. Still, translation can change nuance, especially in complaints, legal text, or regulated workflows. Keep the original language value.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Use &lt;code&gt;AI_FIX_GRAMMAR&lt;/code&gt; carefully
&lt;/h3&gt;

&lt;p&gt;Grammar correction is useful for presentation and readability.&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 sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;curated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_feedback&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;cleaned_comment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ISNULL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AI_FIX_GRAMMAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_comment&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;raw_comment&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;ISNULL&lt;/code&gt; pattern matters. Microsoft’s docs note that AI functions can return &lt;code&gt;NULL&lt;/code&gt;, so avoid overwriting useful source text with a blank result.&lt;/p&gt;

&lt;p&gt;I would use this for cleaned display fields, not for replacing the original source record.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Use &lt;code&gt;AI_GENERATE_RESPONSE&lt;/code&gt; with the most discipline
&lt;/h3&gt;

&lt;p&gt;This function can generate text from a prompt and data.&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 sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;case_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;AI_GENERATE_RESPONSE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'Write a concise internal summary for a support manager:'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;case_notes&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;manager_summary&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;support_cases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is powerful, but it is also where teams need the most control.&lt;/p&gt;

&lt;p&gt;If generated text will be sent to customers, used in decisions, or shown in operational workflows, add human review, prompt ownership, audit fields, and clear usage rules.&lt;/p&gt;

&lt;p&gt;Generated text should not quietly become an automated business action.&lt;/p&gt;

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

&lt;p&gt;I would treat each AI function output as a governed transformation.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Profile the source text first.&lt;/li&gt;
&lt;li&gt;Choose the function based on the business task.&lt;/li&gt;
&lt;li&gt;Materialize the output in a staging or enrichment table.&lt;/li&gt;
&lt;li&gt;Keep the original text.&lt;/li&gt;
&lt;li&gt;Add fallback behavior for &lt;code&gt;NULL&lt;/code&gt; results.&lt;/li&gt;
&lt;li&gt;Validate a sample of outputs.&lt;/li&gt;
&lt;li&gt;Track prompt or label changes.&lt;/li&gt;
&lt;li&gt;Monitor refresh time and cost.&lt;/li&gt;
&lt;li&gt;Separate experimental outputs from certified reporting fields.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The practical table design might include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;curated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;support_case_ai_enrichment&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;case_id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;source_text_hash&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;ai_function_used&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;ai_labels_or_prompt&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;ai_output&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;ai_output_status&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;validated_flag&lt;/span&gt; &lt;span class="nb"&gt;BIT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;validation_sample_group&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;DATETIME2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;created_by_pipeline&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may look heavy for a demo. It is not heavy for production.&lt;/p&gt;

&lt;p&gt;If the output will influence reporting, routing, prioritization, or an AI agent, someone needs to know where it came from and how it was produced.&lt;/p&gt;

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

&lt;p&gt;The strongest use cases are not generic AI demos.&lt;/p&gt;

&lt;p&gt;They are specific enrichment steps inside a real data workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;classify customer feedback before semantic model refresh&lt;/li&gt;
&lt;li&gt;extract product issue fields from support notes&lt;/li&gt;
&lt;li&gt;summarize long incident comments for operations dashboards&lt;/li&gt;
&lt;li&gt;translate multilingual survey comments for regional comparison&lt;/li&gt;
&lt;li&gt;clean messy user-entered text in curated reporting tables&lt;/li&gt;
&lt;li&gt;generate internal response drafts for review queues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the sweet spot.&lt;/p&gt;

&lt;p&gt;The warehouse becomes a controlled place to enrich text, not just store it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would avoid
&lt;/h2&gt;

&lt;p&gt;I would avoid four patterns:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calling AI functions repeatedly in interactive report queries.&lt;/li&gt;
&lt;li&gt;Treating model output as deterministic truth.&lt;/li&gt;
&lt;li&gt;Replacing original text with AI-cleaned text.&lt;/li&gt;
&lt;li&gt;Using generated responses without review, ownership, and audit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Preview features are for learning and controlled adoption. The right move is to test the pattern, measure the cost, validate outputs, and decide where it belongs in the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final take
&lt;/h2&gt;

&lt;p&gt;This is a useful direction for Fabric.&lt;/p&gt;

&lt;p&gt;Not because it makes every warehouse query smarter by default. That would be the wrong framing.&lt;/p&gt;

&lt;p&gt;It is useful because it gives data teams a practical way to move common text enrichment closer to the governed data layer.&lt;/p&gt;

&lt;p&gt;If your team already has free-text feedback, support cases, notes, reviews, comments, or multilingual text sitting in the warehouse, these functions are worth testing.&lt;/p&gt;

&lt;p&gt;Just test them like production data transformations, not like magic buttons.&lt;/p&gt;

&lt;p&gt;Start with one table, one business use case, one materialized output, and one validation sample.&lt;/p&gt;

&lt;p&gt;That is enough to learn quickly without turning AI-in-SQL into another unmanaged layer.&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>datawarehouse</category>
      <category>ai</category>
      <category>sql</category>
    </item>
    <item>
      <title>Fabric Lakehouse Health Checks Make Optimization Practical. Here’s the Runbook.</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Wed, 24 Jun 2026 22:50:45 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/fabric-lakehouse-health-checks-make-optimization-practical-heres-the-runbook-4fng</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/fabric-lakehouse-health-checks-make-optimization-practical-heres-the-runbook-4fng</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-24-fabric-lakehouse-health-checks.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjoc9sy648irud74diw7v.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjoc9sy648irud74diw7v.png" alt="Fabric Lakehouse table health loop" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft Fabric just added a small feature that can change how teams maintain Lakehouse tables.&lt;/p&gt;

&lt;p&gt;The new &lt;code&gt;sp_get_table_health_metrics&lt;/code&gt; stored procedure gives SQL analytics endpoint users a T-SQL way to inspect Lakehouse table health before deciding whether Spark maintenance is needed.&lt;/p&gt;

&lt;p&gt;That sounds narrow. It is not.&lt;/p&gt;

&lt;p&gt;For teams serving Power BI, SQL users, downstream data products, or AI workflows from Lakehouse tables, this closes an annoying operational gap: the place where users feel the slowdown is often SQL, but the maintenance action usually happens in Spark.&lt;/p&gt;

&lt;p&gt;Until now, a lot of teams handled that gap with guesswork.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;OPTIMIZE&lt;/code&gt; every night. Compact everything on a schedule. Wait until dashboards get slow. Open a notebook. Inspect Delta files. Ask support. Hope the maintenance job was worth the compute.&lt;/p&gt;

&lt;p&gt;The better pattern is simple:&lt;/p&gt;

&lt;p&gt;Check table health first. Optimize only when the evidence says to.&lt;/p&gt;

&lt;p&gt;That is the practical win here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem this solves
&lt;/h2&gt;

&lt;p&gt;Lakehouse tables can look fine logically while becoming less efficient physically.&lt;/p&gt;

&lt;p&gt;The schema is still valid. The row counts still make sense. The reports still refresh. But over time the physical layout can drift:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;too many small files&lt;/li&gt;
&lt;li&gt;too many deleted rows&lt;/li&gt;
&lt;li&gt;stale or missing checkpoints&lt;/li&gt;
&lt;li&gt;uneven row distribution&lt;/li&gt;
&lt;li&gt;invalid or weak file statistics&lt;/li&gt;
&lt;li&gt;fragmented table layout after frequent writes, deletes, or merges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users usually experience this as slower SQL queries or lagging Power BI reports.&lt;/p&gt;

&lt;p&gt;Data engineers experience it as a vague support problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The dashboard is slow. Can you check the Lakehouse?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a bad starting point. It pushes the team into reactive troubleshooting instead of evidence-based maintenance.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sp_get_table_health_metrics&lt;/code&gt; gives the SQL side a diagnostic step. It does not replace Spark maintenance, but it gives teams a better way to decide when Spark maintenance is actually justified.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the stored procedure gives you
&lt;/h2&gt;

&lt;p&gt;Microsoft’s announcement describes a built-in stored procedure for the SQL analytics endpoint that returns table health signals for Lakehouse tables.&lt;/p&gt;

&lt;p&gt;The useful part is not just one metric. It is the mix of signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PotentialAnomalyType&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PotentialAnomalyDescription&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;snapshot and checkpoint versions&lt;/li&gt;
&lt;li&gt;physical row counts&lt;/li&gt;
&lt;li&gt;deleted row counts&lt;/li&gt;
&lt;li&gt;file size distribution&lt;/li&gt;
&lt;li&gt;row count distribution&lt;/li&gt;
&lt;li&gt;deleted row distribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives you a much better conversation than “the table feels slow”.&lt;/p&gt;

&lt;p&gt;You can ask more specific questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this a small-file problem?&lt;/li&gt;
&lt;li&gt;Are deleted rows accumulating?&lt;/li&gt;
&lt;li&gt;Is the table missing a recent checkpoint?&lt;/li&gt;
&lt;li&gt;Are file statistics valid?&lt;/li&gt;
&lt;li&gt;Is this table actually healthy and the issue is somewhere else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters.&lt;/p&gt;

&lt;p&gt;A health check can save capacity by proving that a maintenance job is not needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The runbook I would use
&lt;/h2&gt;

&lt;p&gt;I would not treat this as a one-off troubleshooting command. I would turn it into a small operational runbook.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff41dmd53mw906bg26ptu.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff41dmd53mw906bg26ptu.png" alt="Fabric Lakehouse table health decision matrix" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Start with the critical tables
&lt;/h3&gt;

&lt;p&gt;Do not begin by checking every table in the Lakehouse.&lt;/p&gt;

&lt;p&gt;Start with tables that actually matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tables behind important Power BI semantic models&lt;/li&gt;
&lt;li&gt;tables queried heavily through the SQL analytics endpoint&lt;/li&gt;
&lt;li&gt;fact tables with frequent incremental writes&lt;/li&gt;
&lt;li&gt;tables touched by merge, delete, or update patterns&lt;/li&gt;
&lt;li&gt;tables used as context for AI agents or downstream apps&lt;/li&gt;
&lt;li&gt;tables with known performance complaints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps the first version focused.&lt;/p&gt;

&lt;p&gt;A table nobody queries does not need the same operational attention as the table behind the CFO dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Run the health check before maintenance
&lt;/h3&gt;

&lt;p&gt;The basic pattern is straightforward.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXEC&lt;/span&gt; &lt;span class="n"&gt;sp_get_table_health_metrics&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'schema.YourTable'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a real runbook, I would capture the output instead of only looking at it manually.&lt;/p&gt;

&lt;p&gt;For example, create a control table that stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run timestamp&lt;/li&gt;
&lt;li&gt;workspace or environment&lt;/li&gt;
&lt;li&gt;Lakehouse name&lt;/li&gt;
&lt;li&gt;table name&lt;/li&gt;
&lt;li&gt;anomaly type&lt;/li&gt;
&lt;li&gt;anomaly description&lt;/li&gt;
&lt;li&gt;selected file distribution metrics&lt;/li&gt;
&lt;li&gt;maintenance decision&lt;/li&gt;
&lt;li&gt;action taken&lt;/li&gt;
&lt;li&gt;post-check result&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to create bureaucracy. The goal is to make maintenance reviewable.&lt;/p&gt;

&lt;p&gt;If someone asks why a table was optimized yesterday, the answer should not be “because the schedule said so”.&lt;/p&gt;

&lt;p&gt;The answer should be tied to the health output.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Classify the result
&lt;/h3&gt;

&lt;p&gt;Use the anomaly fields as the first decision point.&lt;/p&gt;

&lt;p&gt;A simple classification model can work well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;None
  No maintenance action by default.
  Log the result and continue monitoring.

Too many small files
  Candidate for compaction or OPTIMIZE.
  Check whether this table is written frequently in small batches.

Too many deleted rows
  Candidate for maintenance.
  Also review the upstream write, delete, or merge pattern.

No recent checkpoint
  Review checkpoint behavior and table activity.
  Decide whether maintenance should include checkpoint handling.

Invalid file statistics
  Investigate before routine optimization.
  Do not assume compaction is the only answer.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact action should depend on your workload, table size, freshness needs, and Fabric capacity behavior. The important change is that the action comes after diagnosis.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Decide, then act
&lt;/h3&gt;

&lt;p&gt;The SQL analytics endpoint can diagnose table health. It is read-only, so it cannot perform the maintenance itself.&lt;/p&gt;

&lt;p&gt;That means the runbook needs a handoff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL health check identifies the condition&lt;/li&gt;
&lt;li&gt;orchestration layer records the result&lt;/li&gt;
&lt;li&gt;if action is needed, a Spark notebook or Lakehouse maintenance process runs the fix&lt;/li&gt;
&lt;li&gt;a post-check confirms the result&lt;/li&gt;
&lt;li&gt;the control table records what happened&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the bridge that matters.&lt;/p&gt;

&lt;p&gt;SQL sees the pain. Spark applies the fix. The pipeline connects the two.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv4nsvny3olm0nss42jsj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv4nsvny3olm0nss42jsj.png" alt="Fabric Lakehouse health based optimization pipeline" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical pipeline pattern
&lt;/h2&gt;

&lt;p&gt;I would implement the first version with a small scheduled pipeline.&lt;/p&gt;

&lt;p&gt;Not fancy. Just useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Table list
&lt;/h3&gt;

&lt;p&gt;Maintain a small configuration table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LakehouseMaintenanceTargets&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;TableName&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Priority&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="nb"&gt;bit&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;Owner&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Notes&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start with five to ten important tables. Add more only after the pattern works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Health check activity
&lt;/h3&gt;

&lt;p&gt;For each enabled table, run the stored procedure and capture the result.&lt;/p&gt;

&lt;p&gt;The exact mechanics will depend on how you orchestrate SQL activity in your Fabric environment, but the operating idea is the same: store the health output, not just the final action.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;dbo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LakehouseTableHealthLog&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;RunId&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;CheckedAt&lt;/span&gt; &lt;span class="n"&gt;datetime2&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TableName&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;PotentialAnomalyType&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;PotentialAnomalyDescription&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Decision&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ActionTaken&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Notes&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The specific metric columns can be expanded after you inspect the procedure output in your environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Decision rule
&lt;/h3&gt;

&lt;p&gt;Keep the first decision rule conservative.&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 plaintext"&gt;&lt;code&gt;If no anomaly is detected:
  Log HEALTHY
  Skip Spark maintenance

If a known maintenance anomaly is detected:
  Log ACTION_REQUIRED
  Trigger Spark maintenance for that table

If the anomaly is unclear:
  Log REVIEW_REQUIRED
  Notify the owner instead of running automatic maintenance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last branch is important.&lt;/p&gt;

&lt;p&gt;Automation should not turn every warning into a compute job. Some signals need human review, especially early in the rollout.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Spark maintenance
&lt;/h3&gt;

&lt;p&gt;When the decision is &lt;code&gt;ACTION_REQUIRED&lt;/code&gt;, run the maintenance action through Spark or the Lakehouse engine.&lt;/p&gt;

&lt;p&gt;For tables with a clear small-file problem, that may mean running &lt;code&gt;OPTIMIZE&lt;/code&gt; through a notebook.&lt;/p&gt;

&lt;p&gt;I would keep this notebook parameterized:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Parameters supplied by the pipeline
&lt;/span&gt;&lt;span class="n"&gt;lakehouse_table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;schema.YourTable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OPTIMIZE &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lakehouse_table&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not hard-code table names in five different notebooks. Pass the table name in, log the run, and keep the action traceable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Post-check
&lt;/h3&gt;

&lt;p&gt;After maintenance, run the health check again.&lt;/p&gt;

&lt;p&gt;This is the part teams often skip.&lt;/p&gt;

&lt;p&gt;If a job consumed capacity, it should produce evidence that the table health improved or at least that the expected action completed.&lt;/p&gt;

&lt;p&gt;The post-check does three useful things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proves the maintenance job had an effect&lt;/li&gt;
&lt;li&gt;catches cases where optimization did not solve the issue&lt;/li&gt;
&lt;li&gt;gives you history for future threshold decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I would measure
&lt;/h2&gt;

&lt;p&gt;I would track both technical health and operational impact.&lt;/p&gt;

&lt;p&gt;Technical health:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;number of tables checked&lt;/li&gt;
&lt;li&gt;number of anomalies detected&lt;/li&gt;
&lt;li&gt;anomaly type frequency&lt;/li&gt;
&lt;li&gt;maintenance actions triggered&lt;/li&gt;
&lt;li&gt;post-check status&lt;/li&gt;
&lt;li&gt;repeated anomalies on the same table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Operational impact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;query duration before and after maintenance for key SQL queries&lt;/li&gt;
&lt;li&gt;Power BI refresh or report interaction patterns where available&lt;/li&gt;
&lt;li&gt;Fabric capacity consumed by maintenance jobs&lt;/li&gt;
&lt;li&gt;skipped maintenance runs because tables were healthy&lt;/li&gt;
&lt;li&gt;incidents or user complaints tied to Lakehouse table performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The skipped jobs are easy to overlook, but they matter.&lt;/p&gt;

&lt;p&gt;If the health check prevents unnecessary optimization work, that is a real platform win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits in a Fabric operating model
&lt;/h2&gt;

&lt;p&gt;This feature belongs in the same conversation as monitoring, FinOps, data product ownership, and semantic model reliability.&lt;/p&gt;

&lt;p&gt;A Lakehouse table that feeds several important reports is not just storage. It is part of the production data path.&lt;/p&gt;

&lt;p&gt;For those tables, I would define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;owner&lt;/li&gt;
&lt;li&gt;expected freshness&lt;/li&gt;
&lt;li&gt;expected query pattern&lt;/li&gt;
&lt;li&gt;health check frequency&lt;/li&gt;
&lt;li&gt;maintenance decision rule&lt;/li&gt;
&lt;li&gt;escalation path&lt;/li&gt;
&lt;li&gt;last known health status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sounds heavier than “run optimize nightly”, but it is actually lighter over time.&lt;/p&gt;

&lt;p&gt;The team stops paying for blind maintenance and stops waiting for users to discover performance problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would avoid
&lt;/h2&gt;

&lt;p&gt;I would avoid four traps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trap 1: Optimizing everything because you can
&lt;/h3&gt;

&lt;p&gt;A health check is useful because it lets you avoid unnecessary work.&lt;/p&gt;

&lt;p&gt;If every signal still leads to &lt;code&gt;OPTIMIZE&lt;/code&gt;, the runbook has failed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trap 2: Treating the anomaly description as the whole diagnosis
&lt;/h3&gt;

&lt;p&gt;The anomaly is a starting point. Pair it with workload knowledge.&lt;/p&gt;

&lt;p&gt;A table written every few minutes will behave differently from a monthly snapshot table. A small-file pattern may be expected in one stage and unacceptable in another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trap 3: Ignoring the upstream write pattern
&lt;/h3&gt;

&lt;p&gt;If a table keeps accumulating small files, compaction is only part of the answer.&lt;/p&gt;

&lt;p&gt;Look upstream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;batch size&lt;/li&gt;
&lt;li&gt;write frequency&lt;/li&gt;
&lt;li&gt;partitioning choices&lt;/li&gt;
&lt;li&gt;merge patterns&lt;/li&gt;
&lt;li&gt;delete patterns&lt;/li&gt;
&lt;li&gt;source system behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maintenance cleans up the symptom. The upstream pattern often explains why it keeps coming back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trap 4: Not logging the decision
&lt;/h3&gt;

&lt;p&gt;If the runbook cannot explain what it did, it is not a runbook. It is another black box.&lt;/p&gt;

&lt;p&gt;Keep a small audit trail.&lt;/p&gt;

&lt;p&gt;Table health, decision, action, result.&lt;/p&gt;

&lt;p&gt;That is enough for a first version.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple first-week rollout
&lt;/h2&gt;

&lt;p&gt;If I were adding this to a Fabric environment, I would do it in this order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 1: Identify targets
&lt;/h3&gt;

&lt;p&gt;Pick five important Lakehouse tables.&lt;/p&gt;

&lt;p&gt;For each one, document the owner, main consumers, refresh pattern, and why it matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 2: Run manual checks
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;sp_get_table_health_metrics&lt;/code&gt; manually and review the output.&lt;/p&gt;

&lt;p&gt;Do not automate yet. First understand what healthy and unhealthy look like in your own environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 3: Create the log table
&lt;/h3&gt;

&lt;p&gt;Create the health log table and start storing results.&lt;/p&gt;

&lt;p&gt;Even if the first version is manual, logging gives you history.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 4: Add a conservative pipeline
&lt;/h3&gt;

&lt;p&gt;Automate the health check. Let the first version notify or log, not automatically optimize every table.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 5: Add one maintenance action
&lt;/h3&gt;

&lt;p&gt;Choose one clear condition, such as a small-file anomaly on a high-value table, and trigger a parameterized Spark maintenance notebook.&lt;/p&gt;

&lt;p&gt;Then run the post-check.&lt;/p&gt;

&lt;p&gt;That is enough for a useful pilot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway
&lt;/h2&gt;

&lt;p&gt;This is a good Fabric update because it moves Lakehouse maintenance closer to how teams actually operate.&lt;/p&gt;

&lt;p&gt;SQL users and Power BI users usually feel the performance issue first. Spark usually fixes the physical layout. &lt;code&gt;sp_get_table_health_metrics&lt;/code&gt; gives teams a diagnostic bridge between those two worlds.&lt;/p&gt;

&lt;p&gt;The feature is useful on its own. It becomes much more valuable when you turn it into a runbook:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pick critical tables&lt;/li&gt;
&lt;li&gt;check health before maintenance&lt;/li&gt;
&lt;li&gt;classify the anomaly&lt;/li&gt;
&lt;li&gt;act only when needed&lt;/li&gt;
&lt;li&gt;log the decision&lt;/li&gt;
&lt;li&gt;run a post-check&lt;/li&gt;
&lt;li&gt;adjust upstream write patterns when the same issue returns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between scheduled guesswork and data engineering operations.&lt;/p&gt;

&lt;p&gt;Good maintenance starts with evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;Microsoft Fabric Updates Blog: &lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Know-before-you-optimize-Diagnose-Lakehouse-table-health-with-a/ba-p/5228076" rel="noopener noreferrer"&gt;Know before you optimize: Diagnose Lakehouse table health with a single T-SQL command (Generally Available)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>lakehouse</category>
      <category>dataengineering</category>
      <category>sql</category>
    </item>
    <item>
      <title>Fabric Data Factory Makes Multi-Cloud Integration Practical. Here’s the Architecture Checklist.</title>
      <dc:creator>Shai Karmani</dc:creator>
      <pubDate>Tue, 23 Jun 2026 22:30:56 +0000</pubDate>
      <link>https://dev.to/shai_karmani_2521c2f8e837/fabric-data-factory-makes-multi-cloud-integration-practical-heres-the-architecture-checklist-22ff</link>
      <guid>https://dev.to/shai_karmani_2521c2f8e837/fabric-data-factory-makes-multi-cloud-integration-practical-heres-the-architecture-checklist-22ff</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-23-fabric-data-factory-multicloud-governance.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb16cv9cj66opj7vuc8x7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb16cv9cj66opj7vuc8x7.png" alt="Fabric Data Factory multi-cloud operating model" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microsoft Fabric Data Factory just made a useful multi-cloud pattern generally available.&lt;/p&gt;

&lt;p&gt;That matters because most companies do not live in one clean cloud. They have Azure, AWS, Google Cloud, SaaS platforms, vendor drops, legacy databases, and business-critical files that somehow need to become reliable analytics data.&lt;/p&gt;

&lt;p&gt;The exciting part is not only that Fabric can connect across clouds. The practical win is that teams can now treat multi-cloud data movement as part of a governed Fabric architecture instead of another side integration project.&lt;/p&gt;

&lt;p&gt;That is the angle I would focus on.&lt;/p&gt;

&lt;p&gt;Use Fabric Data Factory to make multi-cloud integration easier, but build the ownership model around it from day one.&lt;/p&gt;

&lt;p&gt;Microsoft’s update positions Fabric Data Factory as a way to make multi-cloud data integration and transformation easier. I agree with the direction. The question for data teams is how to turn that capability into a pattern they can operate safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The opportunity
&lt;/h2&gt;

&lt;p&gt;Multi-cloud data work usually starts with a simple request:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bring S3 files into the analytics platform&lt;/li&gt;
&lt;li&gt;combine Azure SQL data with Google Cloud Storage exports&lt;/li&gt;
&lt;li&gt;pull SaaS data into OneLake&lt;/li&gt;
&lt;li&gt;standardize vendor feeds before they hit Power BI&lt;/li&gt;
&lt;li&gt;create one governed data product from systems that live in different places&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first pipeline is rarely the problem.&lt;/p&gt;

&lt;p&gt;The problem appears when the fifth, tenth, or fiftieth pipeline shows up. Suddenly nobody is sure who owns the raw copy, where schema changes are detected, which capacity pays for the workload, what happens after a failed run, or whether downstream teams trust the curated output.&lt;/p&gt;

&lt;p&gt;Fabric Data Factory helps with the integration layer. Architecture still has to handle the operating model.&lt;/p&gt;

&lt;p&gt;That is where this update becomes useful for real teams.&lt;/p&gt;

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

&lt;p&gt;I would keep the pattern simple and explicit.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0mby1795x57cin15w59i.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0mby1795x57cin15w59i.png" alt="Fabric Data Factory multi-cloud checklist" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For every multi-cloud data flow, define six things before you scale it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Landing zone
&lt;/h3&gt;

&lt;p&gt;Decide where each source lands in Fabric.&lt;/p&gt;

&lt;p&gt;I like separating the flow into clear zones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raw copy from the external source&lt;/li&gt;
&lt;li&gt;standardized data with basic type and naming cleanup&lt;/li&gt;
&lt;li&gt;curated data that is ready for shared use&lt;/li&gt;
&lt;li&gt;published data products used by reports, semantic models, AI agents, or downstream systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This sounds obvious, but it prevents a lot of future pain.&lt;/p&gt;

&lt;p&gt;If raw S3 files, curated tables, and report-ready outputs all land in the same place, every downstream consumer starts depending on internal pipeline details. That makes change management harder than it needs to be.&lt;/p&gt;

&lt;p&gt;A clean landing model lets teams change ingestion logic without breaking everything that consumes the output.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Identity path
&lt;/h3&gt;

&lt;p&gt;Multi-cloud does not remove identity design. It makes it more important.&lt;/p&gt;

&lt;p&gt;For each source, document which identity accesses the source, which Fabric connection is used, where secrets or credentials are managed, and how access is reviewed.&lt;/p&gt;

&lt;p&gt;The key question is simple:&lt;/p&gt;

&lt;p&gt;Can you explain the identity path from the external source to the Fabric output?&lt;/p&gt;

&lt;p&gt;If the answer is no, the pipeline is not ready for production.&lt;/p&gt;

&lt;p&gt;This is especially important when the output feeds Power BI or an AI workflow. Users may only see a friendly report or agent response, but the data path behind it still needs to be governed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Transform boundary
&lt;/h3&gt;

&lt;p&gt;Fabric gives teams several places to transform data: Data Factory pipelines, Dataflows Gen2, notebooks, Lakehouse SQL, Warehouse SQL, and semantic model logic.&lt;/p&gt;

&lt;p&gt;That flexibility is useful, but it can become messy fast.&lt;/p&gt;

&lt;p&gt;Before building the pipeline, decide what belongs where.&lt;/p&gt;

&lt;p&gt;My default rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use Data Factory for orchestration and movement&lt;/li&gt;
&lt;li&gt;use Dataflows Gen2 for repeatable shaping where the team benefits from a visual transformation layer&lt;/li&gt;
&lt;li&gt;use Warehouse or Lakehouse logic for shared data products and reusable business rules&lt;/li&gt;
&lt;li&gt;use notebooks when code-based transformation is genuinely the better fit&lt;/li&gt;
&lt;li&gt;keep report-specific logic out of the ingestion layer unless it is truly only for that report&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not to create a perfect rulebook. The point is to avoid spreading the same business logic across four different tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cost model
&lt;/h3&gt;

&lt;p&gt;Multi-cloud pipelines can hide cost in several places.&lt;/p&gt;

&lt;p&gt;There is source-side cost, Fabric capacity usage, storage growth in OneLake, refresh frequency, retry behavior, and sometimes network movement. A pipeline that looks small in development can become expensive when it runs every 15 minutes across several regions or business units.&lt;/p&gt;

&lt;p&gt;Before promoting a flow, define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how often it runs&lt;/li&gt;
&lt;li&gt;what triggers it&lt;/li&gt;
&lt;li&gt;which Fabric capacity it uses&lt;/li&gt;
&lt;li&gt;how retries behave&lt;/li&gt;
&lt;li&gt;how much data is expected per run&lt;/li&gt;
&lt;li&gt;who owns the cost if the workload grows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not finance theater. It is architecture hygiene.&lt;/p&gt;

&lt;p&gt;If the business wants fresher data, the cost conversation should be attached to the value of that freshness.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Failure contract
&lt;/h3&gt;

&lt;p&gt;A multi-cloud flow needs a failure contract.&lt;/p&gt;

&lt;p&gt;Not a vague “monitor the pipeline” statement. A real contract.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what counts as failed, delayed, or degraded&lt;/li&gt;
&lt;li&gt;which failures retry automatically&lt;/li&gt;
&lt;li&gt;which failures require human review&lt;/li&gt;
&lt;li&gt;who gets notified&lt;/li&gt;
&lt;li&gt;where failed records are stored&lt;/li&gt;
&lt;li&gt;how replay is handled&lt;/li&gt;
&lt;li&gt;what downstream consumers see when the latest load is incomplete&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where many analytics pipelines become fragile. They work until they do not, then the business finds out from a stale dashboard.&lt;/p&gt;

&lt;p&gt;A failure contract turns the pipeline into something the team can operate.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Business output
&lt;/h3&gt;

&lt;p&gt;Do not end the design at ingestion.&lt;/p&gt;

&lt;p&gt;The real test is whether the pipeline produces a useful, trusted output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Warehouse table used by several teams&lt;/li&gt;
&lt;li&gt;a Lakehouse data product&lt;/li&gt;
&lt;li&gt;a Power BI semantic model&lt;/li&gt;
&lt;li&gt;a Real-Time Dashboard&lt;/li&gt;
&lt;li&gt;an AI agent context source&lt;/li&gt;
&lt;li&gt;an operational extract for another system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If nobody owns the output, the pipeline is just movement.&lt;/p&gt;

&lt;p&gt;The strongest Fabric Data Factory use cases will be the ones where a multi-cloud flow lands as a governed data product, not as another pile of copied files.&lt;/p&gt;

&lt;h2&gt;
  
  
  A low-risk rollout sequence
&lt;/h2&gt;

&lt;p&gt;I would not start by trying to standardize every cloud source in the company.&lt;/p&gt;

&lt;p&gt;Start with one valuable flow.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F231whzxcpcml4j0a13cs.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F231whzxcpcml4j0a13cs.png" alt="Fabric Data Factory low-risk rollout sequence" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pick a use case where the business value is clear and the source complexity is manageable. Then build the operating pattern around it.&lt;/p&gt;

&lt;p&gt;A good first candidate has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one or two external sources&lt;/li&gt;
&lt;li&gt;a clear business owner&lt;/li&gt;
&lt;li&gt;a visible reporting or operational outcome&lt;/li&gt;
&lt;li&gt;enough pain that the current process is worth replacing&lt;/li&gt;
&lt;li&gt;limited blast radius if the first version needs adjustment&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;daily vendor files from cloud storage into a curated Power BI model&lt;/li&gt;
&lt;li&gt;SaaS operational exports into a Fabric Warehouse table&lt;/li&gt;
&lt;li&gt;cross-cloud product usage data into OneLake for customer analytics&lt;/li&gt;
&lt;li&gt;finance or planning extracts into a governed reporting layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build the first pipeline. Document the contract. Prove the output. Then reuse the pattern.&lt;/p&gt;

&lt;p&gt;That is how multi-cloud architecture becomes repeatable instead of heroic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would avoid
&lt;/h2&gt;

&lt;p&gt;I would avoid three traps.&lt;/p&gt;

&lt;p&gt;First, do not let every team create its own connector pattern. You will get speed for a month and cleanup work for a year.&lt;/p&gt;

&lt;p&gt;Second, do not treat OneLake as a dumping ground. Landing everything is not the same as governing anything.&lt;/p&gt;

&lt;p&gt;Third, do not move business rules into whichever tool the first developer prefers. Decide where shared logic belongs and keep it reviewable.&lt;/p&gt;

&lt;p&gt;Fabric makes the technical path easier. That should give teams more room to design the operating model, not less.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway
&lt;/h2&gt;

&lt;p&gt;The GA update is good news for teams building analytics across messy real-world estates.&lt;/p&gt;

&lt;p&gt;Fabric Data Factory can make multi-cloud integration more approachable. The win is bigger when teams pair it with a clear architecture checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;define the landing zone&lt;/li&gt;
&lt;li&gt;trace the identity path&lt;/li&gt;
&lt;li&gt;choose the transform boundary&lt;/li&gt;
&lt;li&gt;model the cost&lt;/li&gt;
&lt;li&gt;write the failure contract&lt;/li&gt;
&lt;li&gt;publish a trusted business output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the version of multi-cloud data architecture I want to see more often.&lt;/p&gt;

&lt;p&gt;Not a collection of connectors.&lt;/p&gt;

&lt;p&gt;A repeatable Fabric pattern the team can actually operate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;Microsoft Fabric Updates Blog: &lt;a href="https://community.fabric.microsoft.com/t5/Fabric-Updates-Blog/Multi-cloud-data-architecture-patterns-using-Fabric-Data-Factory/ba-p/5217279" rel="noopener noreferrer"&gt;Multi-cloud data architecture patterns using Fabric Data Factory (Generally Available)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microsoftfabric</category>
      <category>dataengineering</category>
      <category>datafactory</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
