<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://ppautomiq.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ppautomiq.com/" rel="alternate" type="text/html" /><updated>2026-08-16T06:31:15+00:00</updated><id>https://ppautomiq.com/feed.xml</id><title type="html">Automiq</title><subtitle>Actionable Power Apps, Power Automate, and Copilot Studio tips, examples, and best practices to build faster and automate smarter.</subtitle><author><name>Ricardo Calejo</name></author><entry><title type="html">Your Copilot Studio agent starts billing before you publish</title><link href="https://ppautomiq.com/copilot%20studio/your-copilot-studio-agent-starts-billing-before-you-publish/" rel="alternate" type="text/html" title="Your Copilot Studio agent starts billing before you publish" /><published>2026-08-14T09:00:00+00:00</published><updated>2026-08-14T09:00:00+00:00</updated><id>https://ppautomiq.com/copilot%20studio/your-copilot-studio-agent-starts-billing-before-you-publish</id><content type="html" xml:base="https://ppautomiq.com/copilot%20studio/your-copilot-studio-agent-starts-billing-before-you-publish/"><![CDATA[<p>Most agent cost guidance starts with end-user adoption. That is too late for agents powered by the <strong>GitHub Copilot harness</strong> in Copilot Studio.</p>

<p>With this harness, billing can start while the maker is still building. Natural-language authoring, preview, testing, and evaluation can consume Copilot Credits before the agent is published. The cost starts at the workbench, not at the front door.</p>

<p><img src="/assets/images/tip-your-copilot-studio-agent-starts-billing-before-you-publish.png" alt="A maker builds an agent while a credit meter is already active and the publication gateway remains ahead" class="post-image" />
<em>The meter can move during construction, before anyone reaches the publication gateway.</em></p>

<p>This matters in tenants where Microsoft 365 Copilot licensing made AI feel like a user-license discussion. The GitHub Copilot harness has its own usage-based billing model. I would not assume that an existing Microsoft 365 Copilot license makes this consumption disappear.</p>

<h2 id="what-the-harness-changes">What the harness changes</h2>

<p>Microsoft describes a harness as the runtime between the model and what you build. It decides when to call the model, what context and components to send, how to interpret the response, and which tools to call.</p>

<p>The <strong>standard harness</strong> is built around explicit topics, branches, and predictable paths. The GitHub Copilot harness is a redesigned authoring and runtime experience. A maker describes the agent in natural language, and Copilot Studio generates the underlying configuration. Its Build, Preview, Evaluate, and Monitor tabs put the lifecycle on one surface.</p>

<p>That is not just a different editor. It changes the unit of work and the billing boundary.</p>

<p>A maker can arrive there without a tenant-wide migration project. Microsoft documents that the harness is chosen when a new agent is created, and both harnesses remain available side by side. A maker selecting the new reasoning-heavy experience has made a consequential licensing choice even if the organization never held a formal licensing workshop. Agents cannot later be transferred between the GitHub Copilot and standard harnesses.</p>

<p>For me, that is the first governance lesson: <strong>inventory the harness, not only the agent name and owner</strong>.</p>

<h2 id="three-things-consume-credits">Three things consume credits</h2>

<p>The billing overview is unusually direct. Copilot Credits cover three parts of the experience:</p>

<ol>
  <li><strong>Large language model tokens.</strong> Reasoning and generation consume model tokens.</li>
  <li><strong>Tools.</strong> This includes knowledge sources and MCP servers.</li>
  <li><strong>The harness.</strong> The orchestration runtime itself is part of consumption.</li>
</ol>

<p><img src="/assets/images/tip-copilot-harness-credit-components.svg" alt="Diagram showing model tokens, tools, and the harness contributing to total Copilot Credits" class="post-image" />
<em>Total consumption combines model work, tool use, and the harness that orchestrates the task.</em></p>

<p>This is why counting conversations is not enough. Agent design, task complexity, tool calls, and frequency all affect consumption. A maker can trigger that work by asking Copilot Studio to create an automated solution in natural language, previewing the agent, testing it, or generating and running evaluations.</p>

<p>I would treat development and test environments as cost-bearing environments from day one. “Not published” is not a cost control.</p>

<h2 id="enforcement-reaches-the-maker">Enforcement reaches the maker</h2>

<p>The enforcement policy is equally clear. If an environment has no allocated Copilot Credits, or consumes all its allocated credits, experiences that require credits stop working.</p>

<p>End users lose agent responses. Makers also lose natural-language authoring, preview and test, and the ability to generate and create agent evaluations. This is not only a production availability event. It can stop delivery work in the middle of a sprint.</p>

<p>Microsoft says some overage consumption is allowed as a grace period to avoid blocking business processes. I would not turn that sentence into a capacity plan. The public page does not give a guaranteed overage amount or duration. Plan against allocated capacity or an explicit pay-as-you-go route.</p>

<h2 id="use-manage-agents-not-spreadsheets">Use Manage Agents, not spreadsheets</h2>

<p>The current admin path is <strong>Power Platform admin center &gt; Licensing &gt; Copilot Studio &gt; Summary &gt; Manage Agents</strong>.</p>

<p>That page gives a tenant-wide list of Copilot Studio agents that incur billing charges. For each agent, an administrator can see its environment, month-to-date billed credits, configured limit, and status: <strong>Within limit</strong>, <strong>Nearing limit</strong>, or <strong>Over limit</strong>. Administrators can search, set a monthly limit, and turn an agent off.</p>

<p><img src="/assets/images/tip-copilot-harness-manage-agents.svg" alt="Generic Manage Agents list with fictional environments, billed credits, limits, and status values" class="post-image" />
<em>A generic representation of the Manage Agents view. All names and values are fictitious.</em></p>

<p>This view closes an important gap. Environment totals tell me where capacity went. The agent list tells me what is driving it. I review both because an environment can be within capacity while one experimental agent is consuming far more than expected.</p>

<h2 id="make-the-overage-policy-explicit">Make the overage policy explicit</h2>

<p>Set a monthly limit on every billing agent, including development agents. The limit can be generous. An unset limit is not a policy.</p>

<p>The behavior differs by funding model:</p>

<ul>
  <li>In a <strong>prepaid environment</strong>, the agent must remain within the capacity pool allocated to that environment.</li>
  <li>In a <strong>pay-as-you-go environment</strong>, an administrator can set any agent limit, and consumption is billed as used.</li>
</ul>

<p>Then choose the two guardrails. Notifications alert environment and tenant administrators as usage approaches the limit. A hard stop automatically turns off the agent when it reaches the limit.</p>

<p>There is also an environment-level overage decision. When preallocated capacity is exceeded, the environment can draw from available tenant capacity or bill overage to a linked pay-as-you-go plan. Write down which behavior is approved. Otherwise, one team expects continuity while another expects cost containment, and the platform cannot satisfy both assumptions.</p>

<p>I normally enable notifications first, observe a full billing cycle, and then decide where a hard stop is acceptable. A test agent and a business-critical production agent should not inherit the same response blindly.</p>

<h2 id="automate-the-control-loop">Automate the control loop</h2>

<p>The portal is useful, but a CoE should not depend on someone opening it every morning. The <a href="https://learn.microsoft.com/rest/api/power-platform/">Power Platform API</a> groups these operations under the <strong>Licensing</strong> namespace.</p>

<p>Three operations are useful building blocks:</p>

<ul>
  <li><strong>Get Tenant Capacity Details</strong> returns tenant capacity and consumption details.</li>
  <li><strong>List Currency Reports</strong> returns tenant currency reports and can include allocations and consumption.</li>
  <li><strong>Currency Allocation</strong> gets, allocates, and deallocates currency capacity for an environment.</li>
</ul>

<p>The same capabilities are exposed in Power Automate through the <a href="https://learn.microsoft.com/connectors/powerplatformadminv2/">Power Platform for Admins V2 connector</a>. Its documented action <strong>Allocate and deallocate the currencies for the environment</strong> accepts an environment ID, currency type, and allocation count. The connector also exposes the tenant capacity and currency report operations.</p>

<p><img src="/assets/images/tip-copilot-harness-governance-flow.svg" alt="Governance flow from the Licensing API through Power Automate to environment capacity reallocation" class="post-image" />
<em>A scheduled governance flow can read capacity, notify administrators, and reallocate under an approved rule.</em></p>

<p>That supports a simple control loop: read consumption on a schedule, compare it with policy, notify before enforcement, and reallocate only when an approved rule allows it. Keep an audit trail. Use a service principal where the connector action supports it. The connector documentation notes that service-principal authentication is supported for most actions, not all, so validate the exact connection you deploy.</p>

<p>I would not claim that these APIs replace every setting on Manage Agents. They automate the capacity data and allocation path documented today. Keep per-agent limit configuration in your runbook unless you have validated the corresponding resource-threshold operations for your tenant.</p>

<h2 id="three-checks-to-do-now">Three checks to do now</h2>

<ol>
  <li><strong>Inventory what bills.</strong> Open Manage Agents and record every billing agent, its harness, owner, environment, and month-to-date credits. Include work in progress.</li>
  <li><strong>Set limits, even generous ones.</strong> Separate prepaid pool policy from pay-as-you-go policy, and decide explicitly what happens in overage.</li>
  <li><strong>Notify before you block.</strong> Route nearing-limit alerts to tenant and environment administrators, then apply hard stops according to business criticality.</li>
</ol>

<p>The important change is simple: publication is no longer the beginning of the cost conversation. For GitHub Copilot harness agents, governance must begin when building begins.</p>

<h2 id="microsoft-learn-sources">Microsoft Learn sources</h2>

<ul>
  <li><a href="https://learn.microsoft.com/power-platform/admin/manage-copilot-studio-messages-capacity">Manage Copilot Studio credits and capacity</a></li>
  <li><a href="https://learn.microsoft.com/microsoft-copilot-studio/agents-experience/billing-credit-overview">Overview of usage-based billing</a></li>
  <li><a href="https://learn.microsoft.com/microsoft-copilot-studio/agents-experience/enforcement-policy-credits">Enforcement policy for Copilot Credits</a></li>
  <li><a href="https://learn.microsoft.com/rest/api/power-platform/">Microsoft Power Platform API reference</a></li>
  <li><a href="https://learn.microsoft.com/microsoft-copilot-studio/harnesses-overview">Choose a harness</a></li>
  <li><a href="https://learn.microsoft.com/microsoft-copilot-studio/agents-experience/overview">GitHub Copilot harness overview</a></li>
  <li><a href="https://learn.microsoft.com/connectors/powerplatformadminv2/">Power Platform for Admins V2 connector</a></li>
</ul>]]></content><author><name>Ricardo Calejo</name></author><category term="Copilot Studio" /><category term="Copilot Studio" /><category term="GitHub Copilot Harness" /><category term="Copilot Credits" /><category term="Power Platform Admin Center" /><category term="Governance" /><category term="Licensing" /><category term="Power Platform API" /><category term="Power Automate" /><summary type="html"><![CDATA[GitHub Copilot harness agents can consume Copilot Credits while makers build, preview, test, and evaluate them. Govern that spend with per-agent controls in Power Platform admin center.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-your-copilot-studio-agent-starts-billing-before-you-publish.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-your-copilot-studio-agent-starts-billing-before-you-publish.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Environment routing and DLP are the right two layers. Neither one closes your default environment</title><link href="https://ppautomiq.com/governance/environment-routing-and-dlp-neither-closes-your-default-environment/" rel="alternate" type="text/html" title="Environment routing and DLP are the right two layers. Neither one closes your default environment" /><published>2026-08-05T00:00:00+00:00</published><updated>2026-08-05T00:00:00+00:00</updated><id>https://ppautomiq.com/governance/environment-routing-and-dlp-neither-closes-your-default-environment</id><content type="html" xml:base="https://ppautomiq.com/governance/environment-routing-and-dlp-neither-closes-your-default-environment/"><![CDATA[<p>Did you know that <strong>neither environment routing nor a DLP policy stops a maker from building in your default environment</strong>?</p>

<p><img src="/assets/images/tip-environment-routing-dlp.png" alt="Two governance layers sitting above a crowded default environment, one routing makers away and one filtering connectors" class="post-image" />
<em>Two layers, two different jobs. Neither of them is a lock.</em></p>

<p>Every tenant reaches this moment. The default environment grew on its own, nobody planned it, and now there are hundreds of apps and flows inside it — some abandoned, some quietly business-critical. You want to stop the growth without stopping the organization, and the two tools everyone points you at are <strong>environment routing</strong> and <strong>data loss prevention policies</strong>.</p>

<p>They are the right two tools. But both of them are routinely credited with powers they do not have, and that gap is where a false sense of control comes from. This article is the concrete mechanics of each layer, and — more importantly — the honest boundary of each one. If you have not settled the bigger picture yet, start with <a href="/governance/your-environment-strategy-matters-more-than-any-toolkit-you-install/">your environment strategy matters more than any toolkit you install</a>; this one is what you do once that decision is made.</p>

<h2 id="layer-one-environment-routing">Layer one: environment routing</h2>

<p>Environment routing changes where a maker lands when they open a maker portal. Instead of dropping into the shared default environment, they get their own <strong>personal developer environment</strong>, created automatically on first sign-in and named after them.</p>

<p>Here is the configuration, step by step:</p>

<ol>
  <li>In the Power Platform admin center, go to <strong>Manage</strong> &gt; <strong>Tenant settings</strong> &gt; <strong>Environment routing</strong>. The panel is called <em>Create and manage environment routing rules</em>.</li>
  <li><strong>Turn routing on for the maker portals you actually use.</strong> Routing currently covers <strong>Microsoft Copilot Studio, Power Apps, and Power Automate cloud and desktop flows</strong>. It does not cover Power Pages, so a Power Pages maker still lands wherever they landed before.</li>
  <li><strong>Create a routing rule.</strong> You can target <strong>Everyone</strong>, or a specific security group. For a first rollout, target a security group — a dozen willing makers will tell you more in a week than a tenant-wide switch will tell you in a month.</li>
  <li><strong>Select an environment group</strong> for the developer environments the rule creates. This is the step people skip, and it is the one that matters: the new environment arrives already configured as a managed environment with every published rule of that group applied from the start — and those rules now include a connector policy, which we get to below.</li>
  <li><strong>Save and check rule order.</strong> When a maker opens a portal, the rules are evaluated in order and <strong>the first matching rule wins</strong>, so a broad “Everyone” rule sitting above a narrower one will swallow it.</li>
</ol>

<p><img src="/assets/images/tip-environment-routing-dlp-routing.svg" alt="Flow showing a maker opening a maker portal, matching a routing rule, and landing in a personal developer environment inside an environment group" class="post-image" />
<em>The environment group is what turns a new personal environment into a governed one on day one.</em></p>

<p>The developer environment type is fixed and cannot be changed later, and these environments do not consume your Dataverse capacity — which is usually the objection that comes up first in the room.</p>

<h2 id="what-routing-does-not-do">What routing does not do</h2>

<p>This is the part worth being precise about, because the assumption is so common. Routing decides where a maker <strong>starts</strong>. It does not decide where a maker <strong>can go</strong>.</p>

<p>Microsoft Learn answers it directly in the routing FAQ. Asked whether new makers can switch to the default environment or other environments after their own developer environment is created, the documentation says: <em>“Yes, makers can always switch to other environments.”</em></p>

<p>So routing reduces new development in the default environment, and it does that well. What it does not do is prevent it. A maker who knows the environment picker exists — and they all learn — can go straight back to the default environment and build there tomorrow. If creation in the default environment genuinely has to be controlled, routing is one input, not the answer: you pair it with the governance controls on that environment and you move the critical solutions out to environments that were designed for them.</p>

<h2 id="layer-two-a-dlp-baseline">Layer two: a DLP baseline</h2>

<p>The second layer is a data policy, and the most durable shape for it is a <strong>restrictive tenant-level baseline</strong> with deliberate exceptions, rather than a pile of per-environment policies that nobody can reason about.</p>

<ul>
  <li><strong>Scope one tenant-level policy to everything</strong>, using <strong>Exclude certain environments</strong> to carve out only the production or project environments that are explicitly governed on their own terms.</li>
  <li><strong>Put approved Microsoft 365 and line-of-business connectors in the Business group.</strong> Connectors in a group cannot share data with connectors in another group, which is the whole mechanism.</li>
  <li><strong>Put personal and unapproved connectors in Non-business, or in Blocked</strong> if they have no place in your tenant at all.</li>
  <li><strong>In the default environment, set the default group for new connectors to Blocked.</strong> The setting is called <strong>Set default group</strong>, on the <em>Pre-built connectors</em> step of the policy. New connectors then arrive blocked and have to be reviewed rather than silently becoming available. Worth knowing: connectors that cannot be blocked land in Non-business regardless, because by design they cannot be blocked.</li>
  <li><strong>Add environment-specific policies only for justified exceptions.</strong> When several policies apply to the same environment, Learn is explicit: <em>“the most restrictive policy applies to the combination of connectors.”</em> And an environment-level policy can never loosen a tenant-wide one — <em>“Environment data policies can’t override tenant-wide data policies.”</em></li>
  <li><strong>Validate against a representative sample of existing apps and flows before you enforce.</strong> This is not optional politeness. When a policy starts applying, an app that violates it goes into a suspended state and its connections are disabled — enforcement usually lands within an hour, and can take up to 24. A policy you did not test is an outage you scheduled without knowing it.</li>
</ul>

<h2 id="the-newer-option-advanced-connector-policies">The newer option: advanced connector policies</h2>

<p>Before you invest heavily in the classic model, know that there is a second generation of this layer. <strong>Advanced connector policies</strong>, currently in preview, drop the Business / Non-business / Blocked classification entirely in favour of <em>“a strict allowlist that blocks all connectors by default.”</em></p>

<p>Three things matter when you decide how much to lean on them:</p>

<ul>
  <li><strong>Where they live.</strong> For one environment: <strong>Security</strong> &gt; <strong>Data and privacy</strong> &gt; <strong>Advanced connector policies</strong>. For a whole group: <strong>Manage</strong> &gt; <strong>Environment groups</strong> &gt; the group &gt; <strong>Rules</strong> &gt; <strong>Advanced connector policies</strong>. That second path is the one that pairs with layer one — a routed developer environment inherits the group’s rules, connector policy included, from the moment it is created.</li>
  <li><strong>They coexist with what you already have.</strong> By default they run in mixed mode alongside classic data policies, with <em>“a combined policy that merges the most restrictive settings from both.”</em> There is also an ACP-only mode where classic policies are ignored — not deleted, just no longer evaluated for that scope.</li>
  <li><strong>Coverage is not complete yet.</strong> They support certified connectors only: <em>“Custom connectors and HTTP connectors aren’t yet supported”</em>, and virtual connectors are not on the roadmap at all. For those, classic data policies are still the tool. The upside is on the other end — on a managed environment, single or through a group, you can block any connector or any action, including the ones that are non-blockable in a classic policy.</li>
</ul>

<p>That last point is the practical argument for combining the two layers rather than picking one. Routed developer environments are managed environments, so a connector policy applied through the group is enforced there without the non-blockable escape hatch.</p>

<h2 id="what-connector-policies-do-not-do">What connector policies do not do</h2>

<p>A connector policy — classic or advanced — governs <strong>which connectors can be used and combined</strong>. That is the entire scope. It does not stop anyone from creating an app.</p>

<p>It is also narrower than people assume even within its own lane. From the Learn overview: <em>“Data policies are connector aware, but they don’t control connections made using the connector. In other words, data policies can’t determine whether the connector is used to connect to a development, test, or production environment.”</em></p>

<p>So this layer is a data control, not a creation control, and the advanced version does not change that. Someone can still build in the default environment all day; they just cannot reach the connectors you did not allow while doing it. That is genuinely valuable — and it is not the same thing as closing the environment.</p>

<p><img src="/assets/images/tip-environment-routing-dlp-limits.svg" alt="Side-by-side comparison showing that routing does not block returning to the default environment and connector policies do not block creating apps" class="post-image" />
<em>Two real controls with two real gaps. The gaps do not overlap, which is exactly why you need both.</em></p>

<h2 id="and-the-hundreds-of-things-already-in-there">And the hundreds of things already in there</h2>

<p>Neither layer touches what already exists. That is a separate job, and the failure mode is trying to do it in one weekend.</p>

<p>Start by <strong>inventorying</strong>, not moving. For each app and flow in the default environment you want to know the owner, the connectors it uses, its dependencies, how widely it is shared, and whether the business would notice if it stopped. The admin center Actions page surfaces unused and ownerless resources, and the CoE Starter Kit gives you the connector and usage reporting to go with it.</p>

<p>Then sort by what the asset actually is. Microsoft Learn suggests a decision along these lines: a small app with a handful of users and no confidential data can reasonably stay; something used by a wider group or touching confidential data belongs in a shared environment; a widely used or highly sensitive app belongs in a dedicated one. Anything that needs proper application lifecycle management has to leave regardless, because the default environment was never meant to carry it.</p>

<p><img src="/assets/images/tip-environment-routing-dlp-waves.svg" alt="Three-wave migration approach moving from inventory to a piloted first wave and then to the remaining apps" class="post-image" />
<em>The pilot wave exists to find the surprises while they are still cheap.</em></p>

<p>Then <strong>pilot with a representative subset</strong> — not the easiest apps, a representative one, including at least one that will be awkward. The move itself is a solution export and import, plus security roles, plus configuration and data, plus testing, plus telling the users. Only after that do you move the rest, in waves. One caution from the documentation that catches people out: restoring the default environment later can bring back the orphaned apps and flows you cleaned up, so treat cleanup as a step you do not want to undo.</p>

<h2 id="two-layers-one-baseline">Two layers, one baseline</h2>

<p>Routing shapes where new work begins. Connector policies shape what data new work can touch. Together they give you a governed starting point for everything created from now on, which is a genuinely different tenant than the one you had.</p>

<p>Neither of them closes the default environment. It stays open, every user in the tenant is still a maker in it, and the only thing that actually reduces your exposure there is moving the important things out. Assuming otherwise is the most expensive mistake in this whole area — because it feels like the work is done, right up until the day you find out it is not.</p>

<h2 id="learn-more">Learn more</h2>

<ul>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/admin/default-environment-routing">Default environment routing</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/admin/advanced-connector-policies">Advanced connector policies</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/admin/environment-groups-rules">Environment group rules</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/guidance/adoption/secure-default-environment">Secure the default environment</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/guidance/adoption/dlp-strategy">Data loss prevention strategy</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/admin/wp-data-loss-prevention">Data policies overview</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/guidance/adoption/manage-default-environment">Manage the default environment</a></li>
</ul>]]></content><author><name>Ricardo Calejo</name></author><category term="Governance" /><category term="Governance" /><category term="Environment Routing" /><category term="DLP" /><category term="Managed Environments" /><category term="Environment Groups" /><category term="Default Environment" /><category term="Power Platform Admin" /><category term="Center of Excellence" /><summary type="html"><![CDATA[Environment routing and DLP are the two layers everyone reaches for when the default environment gets out of hand. Neither one prevents a maker from building there, and knowing exactly where each stops is what keeps you from a false sense of control.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-environment-routing-dlp.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-environment-routing-dlp.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">You’re past your Power Platform request limits. More service accounts won’t help</title><link href="https://ppautomiq.com/power%20platform/past-power-platform-request-limits-more-service-accounts-wont-help/" rel="alternate" type="text/html" title="You’re past your Power Platform request limits. More service accounts won’t help" /><published>2026-08-03T09:00:00+00:00</published><updated>2026-08-03T09:00:00+00:00</updated><id>https://ppautomiq.com/power%20platform/past-power-platform-request-limits-more-service-accounts-wont-help</id><content type="html" xml:base="https://ppautomiq.com/power%20platform/past-power-platform-request-limits-more-service-accounts-wont-help/"><![CDATA[<p>Did you know that <strong>spreading your flows across more service accounts gives your tenant exactly zero additional Power Platform requests</strong>?</p>

<p><img src="/assets/images/tip-power-platform-request-limits.png" alt="Illustration of an escalation ladder with four steps rising from flow optimization to paid capacity" class="post-image" />
<em>There is a right order to climb. Most teams skip straight to the expensive steps.</em></p>

<p>It is one of the most common reactions when the throttling banners start appearing: create another account, move some flows to it, buy yourself some headroom. It feels like load balancing. It is not. The limits you are hitting are mostly <strong>not tracked where you think they are</strong>, and the ones that hurt most don’t care who owns the flow at all.</p>

<h2 id="first-understand-what-you-are-actually-looking-at">First, understand what you are actually looking at</h2>

<p>Before you spend anything, be clear about which numbers you are reading.</p>

<p>Every organization is currently in a <strong>transition period</strong>. Enforcement is less strict and the limits actually applied are more generous than the official ones. During the transition, those limits are applied <strong>at the cloud flow level</strong> rather than the user level: a Power Automate Premium user has an official limit of 40,000 requests per day, but 200,000 per cloud flow during the transition. A Process license is 250,000 officially and 500,000 during the transition. There is also a separate transition cap of <strong>1,000,000 cloud flow actions per user per day</strong>.</p>

<p><img src="/assets/images/tip-power-platform-request-limits-transition.svg" alt="Timeline showing the transition period ending after reports reach general availability, followed by six months before enforcement" class="post-image" />
<em>The clock only starts when reporting reaches general availability, and nobody has published that date yet.</em></p>

<p>Two consequences matter:</p>

<ul>
  <li><strong>Build against the official limits, not the transition ones.</strong> The transition ends after the Power Platform admin center reports become generally available, and organizations then get six months to analyze usage and buy appropriate licenses before strict enforcement begins.</li>
  <li><strong>The reports do not yet show everything.</strong> Power Platform request reporting is still in preview and currently covers <strong>Power Automate API requests only</strong>. Requests from Dataverse, Power Apps, and Microsoft Copilot Studio are not included. Whatever number you are looking at, your real platform consumption is higher.</li>
</ul>

<p>There are known reporting quirks too. In the licensed user report, entitlements appear per user per day per environment even though the limit applies per user per day, and users licensed through Power Apps per app show an entitlement of 0 when it should be 6,000. Read the consumption column with confidence; read the entitlement column with care.</p>

<h2 id="the-ladder-in-the-right-order">The ladder, in the right order</h2>

<p>Treat this as an escalation plan. Only move to the next step if the previous one genuinely isn’t enough.</p>

<p><strong>1. Optimize the flows.</strong> This is the cheapest step and usually the one with the largest return, because request consumption is driven by design, not by volume alone. Every trigger and every action counts as one request, and that includes built-in ones like Compose or Initialize Variable. Actions <strong>inside</strong> a loop run once per iteration, so a loop with 2 actions and 10 iterations costs 21 requests, not 3. Both succeeded and failed actions count. <strong>Retries and the extra calls generated by pagination count as well.</strong> Skipped actions don’t.</p>

<p>So the levers are concrete:</p>

<ul>
  <li><strong>Reduce trigger frequency</strong>, especially on polling triggers. Many flows running every minute or every hour can run far less often.</li>
  <li><strong>Add trigger conditions</strong> so the flow doesn’t start at all for events you will discard in the first branch.</li>
  <li><strong>Use <code class="language-plaintext highlighter-rouge">Filter query</code> and <code class="language-plaintext highlighter-rouge">Top count</code></strong> on connector actions to retrieve fewer items instead of looping through everything.</li>
  <li><strong>Cut unnecessary retries and pagination.</strong> Both are silent multipliers on your daily count.</li>
  <li><strong>Store a reused property with <code class="language-plaintext highlighter-rouge">Initialize Variable</code></strong> instead of referencing a large action output repeatedly, because referencing one property passes the entire output of that action into the next one.</li>
</ul>

<p><strong>2. Process license.</strong> If the flow is already lean and still heavy by nature, this is the highest action entitlement available: <strong>250,000 requests per day</strong>, applied to the flow rather than to a user. It is also <strong>stackable</strong> — up to 10 Process licenses on a single cloud flow, each adding another 250,000 requests per day. The flow must be in a solution before a Process license can be assigned. This is the step people most often get wrong, so it is worth stating plainly: if one flow exceeds its entitlement, <strong>stack more licenses on that same flow</strong> rather than splitting the workload across flows or owners.</p>

<p><strong>3. Pay-as-you-go.</strong> Link the environment to an Azure subscription and users and flows in that environment stop being throttled above their daily allocation — you pay only for the actions consumed above the limit, billed to the subscription. Flows still need a base license underneath. This is the right answer when consumption is genuinely spiky or hard to forecast, because you stop managing ceilings altogether.</p>

<p><strong>4. Capacity add-on.</strong> Each Power Platform request capacity add-on raises a limit by another 50,000 requests per 24 hours, and multiple add-ons can be assigned. Check the current conditions in the documentation before you plan around it: <strong>during the transition period these add-ons cannot be assigned to users or flows</strong>, and Microsoft’s guidance is to buy them to stay within license terms and be ready for when the transition ends, raising a support ticket if you need relief for a flow being throttled today.</p>

<h2 id="why-more-service-accounts-is-not-the-answer">Why more service accounts is not the answer</h2>

<p>This is the part that contradicts the instinct, so here are the concrete reasons.</p>

<p><strong>The capacity you would be splitting is already shared.</strong> When a flow’s owner is a service principal, the flow consumes the <strong>non-licensed user limits</strong>, and those are pooled <strong>at the tenant level</strong>. The documentation is explicit that application users, non-interactive users, administrative users, and the SYSTEM user do not each get their own limit — they share the tenant pool. For Power Automate that pool is 25,000 base requests per day with no per-license accrual. Creating a second, third, or tenth identity divides the same pool into more slices. It does not create a new one.</p>

<p><img src="/assets/images/tip-power-platform-request-limits-shared-pool.svg" alt="Diagram showing several service identities all drawing from a single shared tenant request pool" class="post-image" />
<em>More identities change who is drawing from the bucket, never how much is in it.</em></p>

<p><strong>Licensed limits aren’t poolable either, in the other direction.</strong> Capacity is tracked per individual user and per licensed flow, and it explicitly <strong>cannot be pooled at environment or tenant level</strong>. Eight users with 6,000 requests each are eight separate 6,000 allowances, never one shared 48,000. Moving ownership around just moves which allowance gets consumed.</p>

<p><strong>It does nothing to the limits that aren’t license based.</strong> There is an independent limit of <strong>100,000 requests per five minutes</strong>, applied at the flow level and independent of the license — a flow with a Process license may have 250,000 requests for the day but still cannot spend more than 100,000 of them in any five-minute window. Connector limits behave the same way: a single SharePoint connection is capped at 600 operations per minute no matter how many flows use it, and service protection limits apply per service regardless of who owns anything.</p>

<p><strong>It fragments reporting and ownership.</strong> The admin center reports already list callers individually, with caller types of System and Non-Interactive/Application. Splitting a solution across several identities scatters its consumption across several rows and several owners, which makes attribution harder, complicates ALM, and leaves you with accounts nobody wants to be responsible for.</p>

<p><strong>Some of it isn’t even supported.</strong> Non-interactive users are capped at seven per tenant and are not supported by Power Automate, so that is not a lever. And sharing one service account’s credentials across a group of users so they can run premium flows under a single license is <strong>multiplexing</strong>, which is a license violation — not a capacity strategy. Microsoft’s guidance is that service accounts are not a best practice at all, and that running flows under a <strong>service principal</strong> as owner is preferable.</p>

<p>None of this means one service identity is the correct number. Multiple service identities are perfectly reasonable when there is a <strong>real architectural reason</strong>: separating distinct business capabilities, or enforcing a security boundary between workloads with different data access. That is design. Creating identities to inflate a daily ceiling is accounting, and the platform does not honor it.</p>

<h2 id="how-to-find-the-real-consumers">How to find the real consumers</h2>

<p>You can only optimize what you can attribute. In the Power Platform admin center, go to <strong>Licensing</strong> &gt; <strong>Capacity add-ons</strong>, then on the <strong>Summary</strong> tab scroll to the <em>Add-ons</em> section and select <strong>Download reports</strong>. Choose <strong>Microsoft Power Platform requests</strong> and pick the scope you need.</p>

<p><img src="/assets/images/tip-power-platform-request-limits-reports.svg" alt="Comparison of the three Power Platform request reports and which identifiers each one provides" class="post-image" />
<em>Only two of the three reports tell you which flow spent the requests.</em></p>

<p>Each scope answers a different question, and each has a blind spot:</p>

<ul>
  <li><strong>Licensed user</strong> — consumption per user per day against their entitled quantity. Note what is missing: there is <strong>no flow or resource ID</strong>, so you can see that a user burned their allowance but not which of their flows did it. Caller ID can also be null or empty.</li>
  <li><strong>Non-licensed user</strong> — consumption for System and Non-Interactive/Application callers, plus the tenant’s total non-licensed entitlement. This one <strong>does</strong> include a resource ID, which for Power Automate is the flow ID, although it can also come back empty.</li>
  <li><strong>Per flow licensed flows</strong> — consumption and entitlement for flows carrying a Process or per-flow license, with the caller ID being the flow itself. Environment region is not available during preview.</li>
</ul>

<p>Because identifiers can be empty and the licensed user report has no flow ID at all, mapping consumption back to a solution usually means <strong>cross-referencing these exports with your own flow inventory</strong> — flow IDs, owners, and the solution each flow belongs to. If you don’t have that inventory, build it before you buy anything.</p>

<p>On the maker side, open a flow’s details page and select <strong>Analytics</strong>, then the <strong>Actions</strong> tab, to see how many actions it actually runs. And treat the warnings seriously: a flow that stays above transition period limits for <strong>14 consecutive days is suspended</strong>, with a notification to the owner.</p>

<h2 id="capacity-is-an-architecture-problem">Capacity is an architecture problem</h2>

<p>Passing your request limits is useful information. It tells you that a flow triggers more often than the business needs, that a loop is iterating over rows you could have filtered out server side, or that a genuinely high-volume process has outgrown a user license and needs to be licensed as a process.</p>

<p>What it never tells you is that you need more accounts. <strong>Redistributing work across identities changes the labels on the consumption, not the consumption itself</strong> — and it leaves you with a more fragmented estate, harder attribution, and the same throttling a month later. Optimize first, license the flow that actually does the work, and let the ceiling be a design signal rather than something to route around.</p>

<h2 id="learn-more">Learn more</h2>

<ul>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/admin/api-request-limits-allocations">Requests limits and allocations</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/admin/power-automate-licensing/faqs#action-limits-and-capacity-questions">Power Automate licensing FAQ — action limits and capacity</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/admin/power-automate-licensing/types#capacity-licenses">Types of Power Automate licenses — capacity licenses</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-automate/limits-and-config">Power Automate limits and configuration</a></li>
</ul>]]></content><author><name>Ricardo Calejo</name></author><category term="Power Platform" /><category term="Power Automate" /><category term="Power Platform" /><category term="Licensing" /><category term="Governance" /><category term="Cloud Flows" /><category term="Service Accounts" /><category term="Throttling" /><category term="Cost Optimization" /><summary type="html"><![CDATA[Passing Power Platform request limits is an architecture problem, not an accounting one. Optimize first, then stack Process licenses, then pay-as-you-go, and understand why extra service accounts add no capacity.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-power-platform-request-limits.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-power-platform-request-limits.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">You installed the Copilot Agent Kit for governance. Your makers need the other half</title><link href="https://ppautomiq.com/copilot%20studio/installed-copilot-agent-kit-for-governance-makers-need-other-half/" rel="alternate" type="text/html" title="You installed the Copilot Agent Kit for governance. Your makers need the other half" /><published>2026-07-31T09:00:00+00:00</published><updated>2026-07-31T09:00:00+00:00</updated><id>https://ppautomiq.com/copilot%20studio/installed-copilot-agent-kit-for-governance-makers-need-other-half</id><content type="html" xml:base="https://ppautomiq.com/copilot%20studio/installed-copilot-agent-kit-for-governance-makers-need-other-half/"><![CDATA[<p>Did you know that <strong>you can give your makers most of the Copilot Agent Kit without giving anyone a single row of your agent inventory</strong>?</p>

<p><img src="/assets/images/tip-agent-kit-for-makers.png" alt="The Copilot Agent Kit split into an admin half and a maker half, with the maker half highlighted" class="post-image" />
<em>Two halves, one solution. Most organizations only ever switch on the left one.</em></p>

<p>A while ago I wrote about how <a href="/governance/copilot-studio-kit-fills-the-governance-gap-your-admin-center-cant/">the kit fills the governance gap your admin center can’t</a>. That article was about the admin half — inventory, compliance, conversation quality, the things a Center of Excellence needs to sleep at night. This one is about the other half, the one almost nobody switches on: <strong>the components built for the people actually creating agents</strong>.</p>

<p>One naming note before anything else, because it will save you a search. The kit has been <strong>renamed from Copilot Studio Kit to Copilot Agent Kit</strong>. Microsoft Learn now describes it as a toolkit maintained by the Power Customer Advisory Team, and the case study spells the change out as <em>“Copilot Agent Kit (formerly known as Copilot Studio Kit)”</em>. The rebrand comes with an expanded scope, reaching into Microsoft 365 Copilot, Microsoft Agent 365, and Microsoft Foundry.</p>

<p>In practice, <strong>both names are live at the same time</strong>, and you need to search for both. The GitHub repository is still <code class="language-plaintext highlighter-rouge">Power-CAT-Copilot-Studio-Kit</code>, the managed solution file is still <code class="language-plaintext highlighter-rouge">CopilotStudioKit_managed.zip</code>, the app you open in Power Apps is still called Power CAT Copilot Studio Kit, and parts of the Learn table of contents still carry the old name. Nothing is broken — the documentation is just mid-migration.</p>

<h2 id="what-your-makers-actually-get">What your makers actually get</h2>

<p>The productivity side of the kit is not a token gesture. It is seven components, and each one solves a problem you have probably already tried to solve with a wiki page.</p>

<p><img src="/assets/images/tip-agent-kit-for-makers-components.svg" alt="The seven maker-facing components of the Copilot Agent Kit grouped by the problem each one solves" class="post-image" />
<em>Every one of these exists because a maker was otherwise going to improvise it.</em></p>

<ul>
  <li><strong>Agent Library</strong> — reusable building blocks and templates, so a new agent starts from something sanctioned instead of an empty canvas.</li>
  <li><strong>Prompt Advisor</strong> — makers submit a prompt and get back a confidence score, a detailed analysis, and suggested optimized prompts. This is your answer to uneven quality when several teams build in parallel.</li>
  <li><strong>Adaptive Cards Gallery</strong> — pre-approved card templates, which keeps makers inside the visual and behavioral standard you already signed off on.</li>
  <li><strong>Webchat Playground</strong> — customize the appearance and behavior of the agent web chat, including colors, fonts, and thumbnails, without hand-editing the embed code.</li>
  <li><strong>Test automation</strong> — run agents against test sets at scale instead of one manual conversation at a time.</li>
  <li><strong>Rubric Refinement</strong> — improve the rubrics those tests score against, so your evaluation gets sharper rather than just louder.</li>
  <li><strong>SharePoint synchronization</strong> — keep SharePoint content flowing into agent knowledge automatically.</li>
</ul>

<p>Two of these consume AI credits, so budget for it: a Generative Answers test costs roughly <strong>50 credits</strong>, and Prompt Advisor costs roughly <strong>120 credits per iteration</strong>. That is not a reason to skip them, but it is a reason to know before a maker discovers it for you.</p>

<h2 id="the-real-objection-i-am-not-opening-the-inventory-to-makers">The real objection: “I am not opening the inventory to makers”</h2>

<p>This is the objection I hear every single time, and it is a reasonable one. A tenant-wide list of every agent, every owner, and every compliance flag is not something you hand out because someone wants nicer cards.</p>

<p>You do not have to. <strong>The maker components work completely independently of Agent Inventory.</strong></p>

<p>The kit ships two security roles, and the separation between them is deliberate and sharp:</p>

<p><img src="/assets/images/tip-agent-kit-for-makers-roles.svg" alt="Access matrix comparing what the maker role and the administrator role can reach in the Copilot Agent Kit" class="post-image" />
<em>The maker role is not a watered-down admin role. It is a different job description.</em></p>

<ul>
  <li><strong>CAK - Administrator</strong> has organization-level access to most tables — the full administrative view across the environment.</li>
  <li><strong>CAK - Maker</strong> is described as limited access for users who create and test agents, typically working with <strong>their own records</strong> while holding read access to shared configuration data.</li>
</ul>

<p>Concretely, the maker role has <strong>no access at all</strong> to Agent Inventory, Conversation KPI, Agent Compliance, Conversation Analyzer, or Agent Value Summary. At the same time it gets full create, read, update, and delete on the tables behind the <strong>Webchat Playground</strong> and the <strong>Adaptive Cards Gallery</strong>, plus the test automation capability. Records like agent configurations, agent reviews, and test results are scoped to the owner, so a maker sees their own work and not their colleague’s.</p>

<p>There is one detail worth correcting, because it is widely assumed and it is wrong. <strong>The Agent Library is not scoped to “agents I created or that were shared with me.”</strong> Its visibility is based on publish status: an administrator sees all custom templates including drafts, while a maker sees <strong>published templates only</strong>, read-only. Creating, editing, and deleting custom templates stays with the admin role. That is arguably better for your purposes — makers consume a curated catalog and cannot quietly publish their own — but it is a different mechanism than row-level sharing, and it changes how you plan your rollout.</p>

<p>Two more things to check before you assign anything:</p>

<ul>
  <li><strong>The role names are inconsistent across sources.</strong> The GitHub documentation uses <code class="language-plaintext highlighter-rouge">CAK - Administrator</code> and <code class="language-plaintext highlighter-rouge">CAK - Maker</code>, while the Learn page on configuring users and teams still uses <code class="language-plaintext highlighter-rouge">CSK - Administrator</code> and <code class="language-plaintext highlighter-rouge">CSK - Maker</code>. Same roles, mid-rename. Search for both.</li>
  <li><strong>There are deprecated roles still sitting in the solution</strong> — an old Administrator, Configurator, and Tester/KPI Viewer, all suffixed with <code class="language-plaintext highlighter-rouge">Deprecated</code>. If anyone in your tenant still holds one, migrate them rather than layering a new role on top.</li>
</ul>

<p>Assign through <strong>Entra ID security group teams</strong> rather than per user. It is the documented recommendation, and it means the maker population is managed where the rest of your access already lives. If you have secured columns in play, such as the Direct Line channel secret, the kit also ships a column security profile for exactly that.</p>

<p>The practical conclusion: <strong>give makers the library, the prompt advisor, and the cards. Keep the inventory with the admin group.</strong> Widen later if it earns it.</p>

<h2 id="three-organizations-already-doing-this">Three organizations already doing this</h2>

<p>The published case studies are useful precisely because they land in different places on the admin-to-maker spectrum.</p>

<p><strong>Nationwide</strong> sits closest to governance. As their use of Copilot Studio expanded, Agent Inventory in the kit is what let them maintain visibility and control while the number of agents grew. This is the classic reason people install the kit in the first place.</p>

<p><strong>Business France</strong> is the opposite end, and the most interesting one for this argument. Their documented win is the <strong>Webchat Playground</strong>, which took them from concept to production while reducing the effort needed to embed the agent. That is a purely maker-facing component delivering a purely maker-facing outcome.</p>

<p><strong>The City of Montréal</strong> shows the two halves feeding each other. They serve <strong>1.7 million residents</strong>, with a website agent sitting on top of <strong>more than 40,000 pages of content</strong>. They use <strong>Conversation KPIs</strong> to identify where conversations go off track or fall back to generative answers, and to detect missing or poorly structured content. That is analytics from the admin half directly changing how makers design topics and where they invest their next hour.</p>

<h2 id="where-to-start">Where to start</h2>

<p>Do not stage a big bang. The kit is large, and trying to switch everything on at once is how it ends up half-configured and abandoned.</p>

<p><img src="/assets/images/tip-agent-kit-for-makers-rollout.svg" alt="A three-step rollout starting with one component and one security group before widening" class="post-image" />
<em>Each step should survive a month of real use before you take the next one.</em></p>

<p>Get the prerequisites straight first: a Dataverse environment, system administrator rights, and the <strong>Creator Kit deployed before the Agent Kit</strong>. You also need Power Apps component framework enabled for canvas apps and Code Apps enabled, licensing that covers model-driven apps and premium-connector flows, and a DLP policy that permits the connectors the solution ships with.</p>

<p>Then install from the marketplace or from the GitHub release, and let the <strong>Setup Wizard</strong> handle the connection references, environment variables, and flows. If you enable flows by hand instead, the documented order matters: grandchild flows first, then child, then the rest.</p>

<p>For the first real step, resist the urge to configure everything. Pick <strong>one maker component</strong> — the Adaptive Cards Gallery is the lowest-risk choice, because the blast radius of a bad card is a bad card. Create one Entra security group team, assign it the maker role only, and leave every inventory and analytics sync switched off. Publish two or three templates so there is something sanctioned to start from, and see what your makers do with it.</p>

<p>If you want help along the way, Power CAT runs <strong>public office hours every other week</strong>, in a US and an APAC slot, and the sessions are recorded.</p>

<h2 id="governance-and-productivity-are-the-same-kit">Governance and productivity are the same kit</h2>

<p>The reason this half goes unused is a framing problem. The kit arrives through a governance conversation, gets installed by an admin team, and inherits that team’s mental model — a monitoring tool, something you look at rather than something you build with.</p>

<p>But the components your makers need were shipped in the same solution, they run on the same Dataverse environment you already provisioned, and they are gated by a role that deliberately cannot see your inventory. You already paid the setup cost. <strong>The only thing standing between your makers and the other half of the kit is a security role assignment.</strong></p>

<h2 id="learn-more">Learn more</h2>

<ul>
  <li><a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/guidance/kit-overview">Copilot Agent Kit overview</a></li>
  <li><a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/guidance/kit-configure-users-teams">Configure users and teams</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/guidance/case-studies/copilot-agent-kit-examples">Copilot Agent Kit real-world examples</a></li>
  <li><a href="https://github.com/microsoft/Power-CAT-Copilot-Studio-Kit">Power CAT Copilot Studio Kit on GitHub</a></li>
</ul>]]></content><author><name>Ricardo Calejo</name></author><category term="Copilot Studio" /><category term="Copilot Studio" /><category term="Copilot Agent Kit" /><category term="Power CAT" /><category term="Governance" /><category term="Makers" /><category term="Adaptive Cards" /><category term="Security Roles" /><category term="Center of Excellence" /><summary type="html"><![CDATA[Most organizations install the Copilot Agent Kit for governance and stop there. Half the kit was built for makers, and you can hand that half over without giving anyone access to your agent inventory.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-agent-kit-for-makers.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-agent-kit-for-makers.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Not every automation needs an agent</title><link href="https://ppautomiq.com/power%20platform/not-every-automation-needs-an-agent/" rel="alternate" type="text/html" title="Not every automation needs an agent" /><published>2026-07-29T09:00:00+00:00</published><updated>2026-07-29T09:00:00+00:00</updated><id>https://ppautomiq.com/power%20platform/not-every-automation-needs-an-agent</id><content type="html" xml:base="https://ppautomiq.com/power%20platform/not-every-automation-needs-an-agent/"><![CDATA[<p>Did you know that <strong>many teams are building agents for work a cloud flow can do better, more predictably, and at lower cost</strong>?</p>

<p><img src="/assets/images/tip-not-every-automation-needs-an-agent.png" alt="A robotic assistant choosing between a deterministic automation pipeline and an adaptive reasoning path" class="post-image" />
<em>The right architecture separates interpretation from execution.</em></p>

<p>This is not an argument against agents. It is an argument for using them where they add something a rules-based automation cannot: <strong>interpreting ambiguity, understanding natural language, and choosing a path that isn’t known in advance</strong>.</p>

<h2 id="the-question-nobody-asks">The question nobody asks</h2>

<p>Before you choose the newest tool, ask a simpler question:</p>

<p><strong>Is this process deterministic?</strong></p>

<p>If you provide the same input and expect the same output through the same defined rules, the process is deterministic. Checking whether an invoice has all required fields, copying an approved record from system A to system B, transforming a payload, or sending a reminder every Monday does not require reasoning. It requires reliable execution.</p>

<p>A <strong>cloud flow</strong> gives you explicit conditions, actions, retries, run history, and predictable paths. You can inspect exactly what happened and test each branch.</p>

<p>An <strong>agent</strong> becomes valuable when the input or path is uncertain. A user might describe a request in their own words, omit required information, combine several intentions, or need help deciding what to do next. Copilot Studio’s generative orchestration can select tools, topics, knowledge, and other agents at runtime, ask for missing information, and use conversation context to continue the task.</p>

<p>That flexibility is the point. If you do not need it, do not pay for it or make your architecture harder to test.</p>

<h2 id="what-the-cost-really-reflects">What the cost really reflects</h2>

<p>The cost models are structurally different.</p>

<p>With <strong>Copilot Studio</strong>, consumption is measured in <strong>Copilot Credits</strong>. Microsoft documents that consumption reflects the work the agent performs to retrieve information, generate responses, and use actions or custom skills. The complexity of the task matters: planning, grounding, orchestration, and tool use are part of the work being consumed.</p>

<p>With <strong>Power Automate</strong>, capacity and service limits are tied to the flow’s license and the <strong>actions and Power Platform requests</strong> it executes. Connector actions, built-in actions, failed actions, retries, and pagination can all count. The path is explicit, so you can inspect it and estimate the work before the flow runs.</p>

<p>This does not mean every flow is cheap or every agent is expensive. Connectors, licensing model, volume, retries, AI Builder, and the surrounding services all matter. It means a fixed process usually has a <strong>more predictable consumption profile</strong> when you implement it as a flow instead of asking an agent to reason through the same route every time.</p>

<p>Do not design from a price remembered from a slide. Check the current <a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/billing-licensing">Copilot Studio licensing guidance</a>, <a href="https://learn.microsoft.com/en-us/power-platform/admin/powerapps-flow-licensing-faq">Power Platform licensing guidance</a>, and the license assigned to your environment and flow.</p>

<h2 id="a-practical-decision-grid">A practical decision grid</h2>

<table>
  <thead>
    <tr>
      <th>Use</th>
      <th>Choose it when</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Cloud flow</strong></td>
      <td>You have fixed rules, validations, system A to system B integrations, schedules, data transformations, or approvals with defined paths.</td>
    </tr>
    <tr>
      <td><strong>Agent</strong></td>
      <td>The input arrives in natural language, the user does not know the next step, intent must be interpreted, information may be missing, or the path changes by case.</td>
    </tr>
    <tr>
      <td><strong>Both</strong></td>
      <td>The agent interprets and decides; the flow executes the deterministic work. This is the most underestimated pattern.</td>
    </tr>
  </tbody>
</table>

<p>A useful shortcut is: <strong>agents handle uncertainty; flows handle certainty</strong>.</p>

<h2 id="the-hybrid-pattern">The hybrid pattern</h2>

<p>Put the <strong>agent at the front for intent</strong> and <strong>flows behind it for execution</strong>.</p>

<p><img src="/assets/images/tip-not-every-automation-hybrid-pattern.png" alt="The agent interprets an ambiguous natural-language request into structured data, and a deterministic flow executes it" class="post-image" /></p>

<p><em>Interpretation happens once, at the front. Execution stays deterministic behind it.</em></p>

<p>Imagine a user writes:</p>

<blockquote>
  <p>Create a supplier request for Contoso, starting next month, with a 25,000 EUR annual value. Finance should review it first.</p>
</blockquote>

<p>The agent can:</p>

<ol>
  <li><strong>Interpret the request</strong> and identify that the user wants to create a supplier record.</li>
  <li><strong>Extract structured fields</strong> such as supplier name, start date, annual value, and review route.</li>
  <li><strong>Ask a follow-up question</strong> if a required field is missing or ambiguous.</li>
  <li><strong>Call a cloud flow</strong> with the completed, structured input.</li>
</ol>

<p>The flow can then:</p>

<ol>
  <li><strong>Validate</strong> the fields against fixed business rules.</li>
  <li><strong>Check</strong> whether the supplier already exists.</li>
  <li><strong>Create</strong> the Dataverse record.</li>
  <li><strong>Start</strong> the defined approval path.</li>
  <li><strong>Return</strong> a structured status to the agent.</li>
</ol>

<p>The agent does the part that benefits from language and judgment. The flow does the part that must be repeatable, auditable, and testable. You keep the agent’s job small, the flow’s contract clear, and the overall cost easier to forecast.</p>

<h2 id="signs-you-chose-the-wrong-tool">Signs you chose the wrong tool</h2>

<p>Reconsider the architecture when:</p>

<ul>
  <li><strong>The agent always does exactly the same thing.</strong> There is no meaningful choice for it to make.</li>
  <li><strong>Your instructions are full of rigid rules.</strong> You are rebuilding conditions and switch branches in prose.</li>
  <li><strong>Every test must produce an identical route and result.</strong> That is a strong signal that you want deterministic execution.</li>
  <li><strong>Consumption per interaction surprises you.</strong> The agent may be doing orchestration work that the process does not need.</li>
  <li><strong>You cannot test the business logic without a conversation.</strong> Move that logic behind a typed flow contract.</li>
</ul>

<p>The opposite mistake also exists. If your flow has dozens of brittle branches trying to recognize every way a person might express the same request, you are forcing deterministic automation to solve an interpretation problem. Let an agent normalize the request first.</p>

<h2 id="the-tool-is-not-the-architecture">The tool is not the architecture</h2>

<p>The right tool is not the newest one. It is the one that solves the problem with the right <strong>cost, control, and degree of flexibility</strong>.</p>

<p>Use an agent when the work genuinely requires interpretation. Use a flow when the rules and path are already known. Use both when a human request is ambiguous but the business operation behind it must be exact.</p>

<p>Knowing when not to use an agent is part of knowing how to build good agents.</p>

<h2 id="learn-more">Learn more</h2>

<ul>
  <li><a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/billing-licensing">Copilot Studio licensing</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-platform/admin/powerapps-flow-licensing-faq">Power Platform licensing FAQs</a></li>
  <li><a href="https://learn.microsoft.com/en-us/power-automate/limits-and-config">Limits of automated, scheduled, and instant flows</a></li>
  <li><a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-generative-actions">Orchestrate agent behavior with generative AI</a></li>
</ul>]]></content><author><name>Ricardo Calejo</name></author><category term="Power Platform" /><category term="Power Automate" /><category term="Copilot Studio" /><category term="AI Agents" /><category term="Cloud Flows" /><category term="Automation" /><category term="Architecture" /><category term="Cost Optimization" /><category term="Generative Orchestration" /><summary type="html"><![CDATA[Choose agents for ambiguity and cloud flows for deterministic work. Combining both keeps automation costs predictable, execution controlled, and business logic testable.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-not-every-automation-needs-an-agent.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-not-every-automation-needs-an-agent.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The new Power Automate MCP Server turns your flows into agent tools</title><link href="https://ppautomiq.com/power%20automate/the-power-automate-mcp-server-turns-your-flows-into-agent-tools/" rel="alternate" type="text/html" title="The new Power Automate MCP Server turns your flows into agent tools" /><published>2026-07-23T09:00:00+00:00</published><updated>2026-07-23T09:00:00+00:00</updated><id>https://ppautomiq.com/power%20automate/the-power-automate-mcp-server-turns-your-flows-into-agent-tools</id><content type="html" xml:base="https://ppautomiq.com/power%20automate/the-power-automate-mcp-server-turns-your-flows-into-agent-tools/"><![CDATA[<p>Did you know that <strong>Power Automate can now publish your flows as an MCP server</strong> — turning each flow into a tool that any AI agent can discover and call?</p>

<p>This is one of the most important shifts in Power Automate since it stopped being called Microsoft Flow. Instead of an agent needing a hand-built connector for every automation, your flow becomes a standards-based tool that Copilot Studio, Azure AI, and any Model Context Protocol client can invoke directly.</p>

<h2 id="what-mcp-actually-gives-you">What MCP actually gives you</h2>

<p>The <strong>Model Context Protocol (MCP)</strong> is an open standard for how AI models talk to external tools and data. Think of it as a universal contract: an MCP server exposes a list of typed tools — each with a name, a description, and a JSON Schema for its inputs and outputs — and any MCP-compatible client can call those tools without bespoke integration work.</p>

<p>When you publish a Power Automate flow as an MCP server, the platform does the hard part for you:</p>

<ul>
  <li><strong>The flow’s inputs</strong> become the tool’s input schema.</li>
  <li><strong>The flow’s response</strong> becomes the tool’s output schema.</li>
  <li><strong>The name and description</strong> you write tell the agent when to use it.</li>
</ul>

<p>You supply the plain-language description and the parameter names. Power Automate handles the schema serialization and hosts the MCP endpoint.</p>

<h2 id="why-this-matters-more-than-another-connector">Why this matters more than another connector</h2>

<h3 id="your-automation-logic-becomes-reusable-by-any-agent">Your automation logic becomes reusable by any agent</h3>

<p>An approval flow, a “create a ticket” flow, a “look up an order” flow — each becomes a named capability in an agent’s toolbox. The same MCP server can be consumed by a Copilot Studio agent today and an Azure AI agent tomorrow, because they all speak the same protocol.</p>

<h3 id="no-custom-integration-code">No custom integration code</h3>

<p>Before MCP, wiring an agent to your automation meant custom connectors, HTTP actions, and glue code. Now the agent reads the tool manifest, sees the typed inputs, and calls the flow with structured arguments — getting structured results back.</p>

<h3 id="the-agent-decides-when-to-act">The agent decides <em>when</em> to act</h3>

<p>Because the tool has a clear name and description, the orchestrator can pick it at runtime based on the user’s intent. “Submit this purchase order for approval” maps to your approval flow; “check the status of order 4192” maps to your lookup flow — no hardcoded routing required.</p>

<h2 id="a-practical-pattern">A practical pattern</h2>

<p>Say you already have a classic approval flow. To make it agent-callable:</p>

<ol>
  <li><strong>Define clean inputs</strong> — for example <code class="language-plaintext highlighter-rouge">poNumber</code>, <code class="language-plaintext highlighter-rouge">amount</code>, <code class="language-plaintext highlighter-rouge">vendor</code>, <code class="language-plaintext highlighter-rouge">requestorUPN</code>. Clear names become clear tool parameters.</li>
  <li><strong>Return a structured response</strong> — such as <code class="language-plaintext highlighter-rouge">decision</code>, <code class="language-plaintext highlighter-rouge">approver</code>, and <code class="language-plaintext highlighter-rouge">comments</code> — so the agent gets something it can reason over.</li>
  <li><strong>Write a precise description</strong> — “Submit a purchase order for manager approval and return the decision.” This is what the orchestrator matches against.</li>
  <li><strong>Publish as an MCP server</strong> and copy the endpoint URL.</li>
  <li><strong>Register the endpoint</strong> in Copilot Studio (or your Azure AI agent) as an MCP tool.</li>
</ol>

<p>Now the agent can run real automation — send the approval, wait for the decision, update the record — all through your existing, governed Power Automate logic.</p>

<h2 id="what-to-watch-for">What to watch for</h2>

<ul>
  <li><strong>Descriptions are the routing logic.</strong> A tool called “Flow 1” with the description “does stuff” will get misrouted constantly. Treat the name and description as prompt engineering — they are how the agent decides to call your flow.</li>
  <li><strong>Governance still applies.</strong> Flows published through MCP run on real connections inside your environment. Data loss prevention (DLP) policies, connection restrictions, and environment boundaries all still apply — plan for them before you publish.</li>
  <li><strong>Keep a human in the loop for high-impact actions.</strong> If a flow does something irreversible — sending money, deleting records, emailing customers — build an approval gate into the flow. An agent should never be able to autonomously approve its own request; the approver must be a different identity from the requestor.</li>
  <li><strong>Mind authentication.</strong> Make sure the agent invokes the flow under a governed identity with least privilege, not a broad or shared account.</li>
</ul>

<p>The MCP server support is the moment your Power Automate library stops being a collection of isolated automations and becomes a shared toolbox that every AI agent in your organization can draw on. Start by exposing one well-understood flow, prove the round-trip, then expand — and let your existing automation investment do double duty as agent capabilities.</p>]]></content><author><name>Ricardo Calejo</name></author><category term="Power Automate" /><category term="Power Automate" /><category term="MCP" /><category term="Model Context Protocol" /><category term="Agent Flows" /><category term="Copilot Studio" /><category term="AI Agents" /><category term="Automation" /><category term="Integration" /><summary type="html"><![CDATA[Power Automate can now publish your cloud flows as an MCP server, so any Model Context Protocol client — Copilot Studio, Azure AI, VS Code — can discover and call them as typed tools without custom integration.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-the-power-automate-mcp-server-turns-your-flows-into-agent-tools.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-the-power-automate-mcp-server-turns-your-flows-into-agent-tools.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The new Copilot Studio editor is a faster way to build agents</title><link href="https://ppautomiq.com/copilot%20studio/the-new-copilot-studio-editor-is-a-faster-way-to-build-agents/" rel="alternate" type="text/html" title="The new Copilot Studio editor is a faster way to build agents" /><published>2026-06-05T09:00:00+00:00</published><updated>2026-06-05T09:00:00+00:00</updated><id>https://ppautomiq.com/copilot%20studio/the-new-copilot-studio-editor-is-a-faster-way-to-build-agents</id><content type="html" xml:base="https://ppautomiq.com/copilot%20studio/the-new-copilot-studio-editor-is-a-faster-way-to-build-agents/"><![CDATA[<p>Did you know that <strong>Copilot Studio has a brand-new agent editor in preview</strong> that puts everything you need to build an agent on a single page — and you turn it on with one toggle?</p>

<p><img src="/assets/images/tip-the-new-copilot-studio-editor-is-a-faster-way-to-build-agents.jpg" alt="The new Copilot Studio agent editor showing instructions with rich formatting and a right-hand pane for model, skills, tools, knowledge, and connected agents" class="post-image" />
<em>The new editor: rich-formatted instructions on the left, everything else stacked on the right</em></p>

<p>For a while now, building an agent in Copilot Studio meant bouncing between tabs — one for Tools, another for Knowledge, another for the rest. The new editor collapses all of that into a single page. And the best part: it doesn’t replace the classic experience, it sits right next to it.</p>

<h2 id="flip-one-toggle-to-try-it">Flip one toggle to try it</h2>

<p>The new editor is gated behind a <strong>New experience</strong> toggle in the top-right of Copilot Studio. Turn it on and you land in the redesigned builder; turn it off and you’re back in the classic agent editor you already know. The two modes coexist, so you can experiment without committing your whole team to it.</p>

<p><img src="/assets/images/the-new-copilot-studio-editor-is-a-faster-way-to-build-agents-new-experience.jpg" alt="Copilot Studio home page with the New experience toggle in the top-right corner and cards for creating an Agent or a Workflow" class="post-image" />
<em>The New experience toggle lives in the top-right — flip it on or off any time</em></p>

<h2 id="everything-on-one-page">Everything on one page</h2>

<p>The biggest change is layout. Instead of separate tabs, the new editor keeps your <strong>instructions</strong> front and center, with a single right-hand pane that stacks everything else:</p>

<ul>
  <li><strong>Model</strong> — pick the model that powers the agent (Claude Sonnet 4.6 was front and center in the preview).</li>
  <li><strong>Microsoft IQ</strong> — the grounding layer that brings in your organizational context.</li>
  <li><strong>Skills</strong> — attach SKILL.md files as reusable playbooks.</li>
  <li><strong>Tools</strong> — add and configure actions inline.</li>
  <li><strong>Knowledge</strong> — point the agent at your sources.</li>
  <li><strong>Connected agents</strong> — call other agents.</li>
</ul>

<p>You stop hunting through tabs and start seeing your whole agent at a glance.</p>

<h2 id="instructions-you-can-actually-format">Instructions you can actually format</h2>

<p>The instructions field now supports <strong>rich formatting</strong> — bold, numbered lists, code blocks, and links. This isn’t just cosmetic. Well-structured instructions are easier for <em>you</em> to maintain, and they help the model parse the rules and guidelines more reliably. Bold the hard constraints, number the steps it should follow in order, and drop a code block in when you need an exact format. Both the human and the AI benefit.</p>

<h2 id="skills-a-new-primitive-that-runs-python">Skills: a new primitive that runs Python</h2>

<p>The headline addition is <strong>Skills</strong> — a new primitive that replaces the old topics-and-child-agents model with something far more composable. You attach <strong>SKILL.md files</strong> straight into the agent, including skills you authored elsewhere — in Codex, Claude Code, or another AI tool — and you can add more than one. There’s also a search so you can find skills to wire in.</p>

<p>The kicker: <strong>Skills can execute real Python</strong>, right inside your agent. Each agent runs in its own <strong>container</strong>, so file generation and analysis just work — produce a report, run a data transformation, hand the user back a polished artifact — without bolting on a flow to do it. It’s a clean way to give your agent focused, reusable playbooks instead of cramming everything into the instructions block.</p>

<h2 id="its-a-rebuilt-runtime-not-a-reskin">It’s a rebuilt runtime, not a reskin</h2>

<p>This is the part that’s easy to miss: the new editor isn’t a coat of paint over the old engine. The <strong>orchestration and authoring layers were rebuilt</strong> on a proper agentic harness — a loop that calls the model, dispatches tool calls (including <strong>MCP servers</strong>), feeds the results back, and keeps going until the task is done. If you used Enhanced Task Completion in the classic UI, this is the same backend, now with a home that matches its capabilities.</p>

<p><strong>Knowledge, memory, and guardrails are first-class</strong> in this runtime — native to how it executes, not workarounds layered on top. Combined with Python Skills and containerized execution, it’s a meaningfully different product than what existed six months ago.</p>

<h2 id="configure-tools-inline">Configure tools inline</h2>

<p>Tools are now set up <strong>on the same page</strong>, not in a separate detour. When you add a tool, you see all of its inputs laid out — including which ones are required — and configure inputs and outputs right there. Fewer clicks, less context switching.</p>

<h2 id="preview-exactly-what-the-end-user-sees">Preview exactly what the end user sees</h2>

<p>The new editor adds an <strong>End user preview</strong> toggle that mirrors precisely what the person chatting with your agent will experience. It’s a small thing that saves a lot of “wait, why does it look different for them?” moments before you publish. The agent list, meanwhile, now shows <strong>Status</strong> (Draft / Published) and <strong>Channel</strong> columns so you can see at a glance where each agent stands. Evaluate and Monitor work the same as before.</p>

<h2 id="a-balanced-take">A balanced take</h2>

<p>It’s a genuinely nicer way to build — but it’s worth knowing the trade-offs people are flagging:</p>

<ul>
  <li><strong>Preview only, Early Release required.</strong> You can’t just flip a switch in any tenant — you need an <a href="https://learn.microsoft.com/en-us/power-platform/admin/early-release">Early Release environment</a> to access the new editor. Keep it off production.</li>
  <li><strong>Classic agents aren’t going away.</strong> Topics, broader channel deployment, and full analytics still live on the mainline orchestrator. Pick the right tool: classic for those scenarios, the new editor for new builds that want true agentic behavior.</li>
  <li><strong>The activity map isn’t in the test panel.</strong> If you relied on watching the orchestration path while testing, that view isn’t surfaced in the new editor’s test experience yet.</li>
  <li><strong>Single-page vs. tabs is a preference.</strong> Some builders liked the old tabbed layout for keeping a complex agent organized. Everything-on-one-page is faster for small and medium agents, but a very large agent can feel dense.</li>
</ul>

<h2 id="why-it-matters">Why it matters</h2>

<p>This is arguably the moment Copilot Studio stops being “low-code with an LLM bolted on” and starts being a proper agentic platform. Skills + Python + MCP + a containerized runtime add up to something genuinely new. The toggle means there’s low risk in trying it in an Early Release environment — build something, and flip back to classic if you need topics or broader channels. Given how quickly it’s moving through preview, getting familiar now means you won’t be caught off guard when it becomes the default.</p>

<p>#CopilotStudio #AgentBuilder #PowerPlatform #MCP #AIAgents</p>]]></content><author><name>Ricardo Calejo</name></author><category term="Copilot Studio" /><category term="Copilot Studio" /><category term="Agent Builder" /><category term="New Experience" /><category term="Skills" /><category term="Python" /><category term="MCP" /><category term="Power Platform" /><category term="Early Release" /><summary type="html"><![CDATA[Copilot Studio's new agent editor (in preview) is a ground-up rebuild — a native agent harness with Skills that run Python, containerized execution, MCP support, and first-class knowledge, memory, and guardrails. Flip the New experience toggle in an Early Release environment to try it.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-the-new-copilot-studio-editor-is-a-faster-way-to-build-agents.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-the-new-copilot-studio-editor-is-a-faster-way-to-build-agents.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">SkillWright: a Copilot Studio agent that goes shopping for skills on GitHub and installs them into Dataverse</title><link href="https://ppautomiq.com/copilot%20studio/skillwright-copilot-studio-agent-that-goes-shopping-for-skills-on-github/" rel="alternate" type="text/html" title="SkillWright: a Copilot Studio agent that goes shopping for skills on GitHub and installs them into Dataverse" /><published>2026-05-28T09:00:00+00:00</published><updated>2026-05-28T09:00:00+00:00</updated><id>https://ppautomiq.com/copilot%20studio/skillwright-copilot-studio-agent-that-goes-shopping-for-skills-on-github</id><content type="html" xml:base="https://ppautomiq.com/copilot%20studio/skillwright-copilot-studio-agent-that-goes-shopping-for-skills-on-github/"><![CDATA[<p>There’s a quiet split forming in the AI agent world.</p>

<p>On one side, an open ecosystem is forming around Agent Skills — small SKILL.md files published on GitHub that teach an agent how to do something specific. Anyone can write one. Anyone can fork one. It’s the README, but for behavior.</p>

<p>On the other side, enterprises are standing up governed skill layers inside platforms like Microsoft Dataverse — “business skills” that live behind identity, policy, and admin approval, and that any connected agent can pick up at runtime.</p>

<p>Both sides are growing fast. Neither side talks to the other. The open community ships skills daily that never make it past the firewall. The enterprise side hand-authors skills from scratch that someone, somewhere, has already written better.</p>

<p>That gap is what I wanted to close. So I built <strong>SkillWright</strong> — a Copilot Studio agent whose entire job is to source, vet, and install skills for other agents.</p>

<p>Repo (open source, swagger + agent assets included): 👉 <a href="https://github.com/dvsRCalejo/SkillWright">https://github.com/dvsRCalejo/SkillWright</a></p>

<h3 id="what-it-is">What it is</h3>
<p>SkillWright is not a chatbot. Think of it as a procurement function — but for behavior, not software.</p>

<p>Give it a topic. It goes out to public GitHub, finds candidate skills, reads them, judges whether each one is actually useful, and — for the ones I approve — installs them as business skills in Dataverse. From that moment on, every agent connected to the Dataverse MCP server can discover and use them. No rebuild. No redeploy. Update the skill once, and every agent that picks it up next gets the new version.</p>

<p>It’s authored entirely in Copilot Studio, source-controlled with the skills-for-copilot-studio VS Code tooling, and shipped as a normal solution. No custom hosting, no glue code.</p>

<p><img src="/assets/images/DEMO.gif" alt="SkillWright demo" class="post-image" /></p>

<h3 id="what-it-needs-to-run">What it needs to run</h3>
<p>I want to be honest about the platform floor here, because SkillWright leans on it:</p>

<ul>
  <li>A <strong>Managed Environment</strong> in Power Platform (for governance and policy).</li>
  <li><strong>Dataverse Intelligence</strong> enabled — this is what unlocks business skills as a first-class concept.</li>
  <li><strong>Dataverse MCP Server (preview)</strong> available in the environment.</li>
  <li>A <strong>GitHub custom connector</strong> (the one in the repo, defined by a Swagger file), authenticated with a fine-grained PAT scoped to read public repo contents.</li>
</ul>

<p>If any of those are missing, the agent will still load, but creation calls will fail — and rightly so. The governance layer is the point.</p>

<h3 id="how-it-works">How it works</h3>
<p>There are three moving parts, and I deliberately kept each one boring.</p>

<p><strong>Discovery</strong> is a custom GitHub connector with a small, surgical set of operations: search code, search repos, get a repo, get a tree, get a blob. The agent’s go-to query is filename:SKILL.md <topic> — every result whose path ends in /SKILL.md is, by convention, one skill. For folder-based skills it walks the tree recursively and pulls each file as a base64 blob.</topic></p>

<p><strong>Vetting</strong> is where the agent earns its keep. It fetches the candidate SKILL.md, decodes it, parses the name and description (which can live in YAML frontmatter or a markdown table — both are out there in the wild), and judges it against the bar I care about for business skills: clear trigger phrases, numbered step-by-step instructions, concrete examples, troubleshooting notes. Skills that turn out to be developer tasks in disguise — a scripts/ folder, a tool wrapper, something that only makes sense if you also have a shell and three CLIs installed — get flagged with a reason before I commit.</p>

<p><strong>Install</strong> is one call to the Dataverse MCP server, which creates the approved skill as a business skill — name, description, instructions, and any references/ files attached as Resources. No custom storage layer, no bespoke schema, no form to fill in. Honestly, it’s <em>easier</em> for the agent to create a well-formed business skill than it is for me to do it by hand in the maker portal — it already has the parsed content in front of it, knows the shape Dataverse expects, and just submits it. And critically: nothing is installed without an explicit confirmation from me.</p>

<h3 id="the-bit-i-find-genuinely-interesting">The bit I find genuinely interesting</h3>
<p>Here’s the insight that made the whole thing click: <strong>Agent Skills and Dataverse business skills use the same format.</strong> Same shape. Same semantics. Same SKILL.md.</p>

<p>That sounds like a small technical detail. It isn’t. It means the open skill ecosystem on GitHub and the governed enterprise skill layer in Dataverse aren’t two different worlds that need translation between them — they’re the same world with a border crossing in the middle. SkillWright is the border crossing.</p>

<p>There’s a second, weirder consequence — and this is the one I keep coming back to. The Dataverse MCP server doesn’t just <em>write</em> business skills; it also <em>reads</em> them. So the moment SkillWright finishes installing one, any <strong>other</strong> Copilot Studio agent connected to that same MCP server can see it, pick it up, and act on it on its next turn. No re-publish. No “add a skill to this agent” step. No coordination between maker and consumer. One agent installs, every other agent benefits — automatically.</p>

<p>That includes SkillWright itself. The very same agent that just installed a skill can immediately turn around and use it. The first time I watched it install a skill and then, in the next turn, behave according to that skill, I felt like I’d quietly crossed a line.</p>

<h3 id="why-i-think-this-matters">Why I think this matters</h3>
<p><strong>Reuse.</strong> Most of the skills any given business needs have already been written by someone on the internet. Hand-authoring them again is wasteful. Sourcing them — with judgment — is not.</p>

<p><strong>Governance without lock-in.</strong> The enterprise gets approval, audit, identity, and a single place to manage what agents are allowed to know. The community gets the open SKILL.md format, no proprietary fork. Nobody has to give anything up.</p>

<p><strong>Runtime discovery beats redeployment.</strong> Once a skill lives in Dataverse, every connected agent finds it on its own — no code change, no release, no per-agent wiring. That’s a very different operating model from “ship a new agent.”</p>

<h3 id="where-this-goes-next">Where this goes next</h3>
<p>I’m now thinking less about SkillWright itself and more about what changes when skill curation becomes a job an agent can do. If sourcing skills is cheap and governed, the constraint on agent capability stops being “what did we build” and starts being “what did we choose to admit.” That’s a much more interesting constraint.</p>

<p>If you want to poke at it, fork it, or break it — the repo is here: <a href="https://github.com/dvsRCalejo/SkillWright">https://github.com/dvsRCalejo/SkillWright</a></p>

<p>Which makes me wonder — and this is the real question I’d love your take on:</p>

<p><strong>If your agents could quietly pick up new skills from the public internet, vetted but not authored by you, would you let them? And where exactly would you draw the line?</strong></p>

<p>#CopilotStudio #PowerPlatform #Dataverse #MCP #AgentSkills</p>]]></content><author><name>Ricardo Calejo</name></author><category term="Copilot Studio" /><category term="Copilot Studio" /><category term="Dataverse" /><category term="Dataverse MCP" /><category term="MCP" /><category term="Agent Skills" /><category term="GitHub" /><category term="Business Skills" /><category term="Power Platform" /><category term="Governance" /><summary type="html"><![CDATA[SkillWright is a Copilot Studio procurement agent for behavior: it discovers Agent Skills in public GitHub, vets quality, and installs approved skills as governed Dataverse business skills for runtime discovery across connected agents.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-skillwright-copilot-studio-agent-that-goes-shopping-for-skills-on-github.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-skillwright-copilot-studio-agent-that-goes-shopping-for-skills-on-github.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">You can teach every agent in your organization how your business actually works — once — with business skills in Dataverse</title><link href="https://ppautomiq.com/copilot%20studio/business-skills-in-dataverse-teach-agents-how-your-organization-works/" rel="alternate" type="text/html" title="You can teach every agent in your organization how your business actually works — once — with business skills in Dataverse" /><published>2026-05-08T09:00:00+00:00</published><updated>2026-05-08T09:00:00+00:00</updated><id>https://ppautomiq.com/copilot%20studio/business-skills-in-dataverse-teach-agents-how-your-organization-works</id><content type="html" xml:base="https://ppautomiq.com/copilot%20studio/business-skills-in-dataverse-teach-agents-how-your-organization-works/"><![CDATA[<p>Did you know that <strong>the steps your team uses to qualify a lead, approve a discount, or onboard a vendor can now live in Dataverse as a natural-language “business skill” — and every AI agent your organization runs can discover and follow it automatically</strong>?</p>

<p>Most institutional knowledge lives in three places: a Word doc nobody opens, a flow somebody built two years ago, and the heads of the two senior employees who actually know how things work. The moment you point an AI agent at it, you start re-implementing that knowledge inside the agent — and again in the next agent — and again the next time the process changes.</p>

<p><strong>Business skills</strong>, now in <strong>public preview</strong> in Dataverse, fix that.</p>

<h2 id="what-a-business-skill-actually-is">What a business skill actually is</h2>

<p>A business skill is a <strong>record stored centrally in Dataverse</strong> that captures one of your organization’s processes, policies, or pieces of domain expertise as <strong>natural-language instructions</strong> — the steps, the information required, and the business rules that apply.</p>

<p>Think of it as a runbook the agent reads and follows:</p>

<ul>
  <li>“How do we qualify an inbound lead?”</li>
  <li>“How do we approve a discount over 15%?”</li>
  <li>“How do we run an onsite HVAC inspection — what questions to ask, by equipment class?”</li>
  <li>“How do we onboard a new vendor — accounts, documents, approvals, due-diligence checks?”</li>
</ul>

<p>You write the steps once, in plain language. Agents do the rest.</p>

<h2 id="how-agents-pick-them-up-the-dataverse-mcp-server">How agents pick them up: the Dataverse MCP server</h2>

<p>Business skills are surfaced through the <strong>Dataverse MCP server</strong>. Any agent connected to that server <strong>discovers relevant skills automatically at runtime</strong> and uses them to complete tasks against your Dataverse data — according to your organization’s standards.</p>

<p>Because they live in Dataverse and ride on MCP, the same skill works across <strong>every</strong> MCP-compatible client:</p>

<ul>
  <li>Microsoft Copilot Studio</li>
  <li>GitHub Copilot</li>
  <li>Visual Studio Code</li>
  <li>Azure AI Foundry</li>
  <li>Any other MCP client your team uses</li>
</ul>

<p>Define a skill once, and every agent that should follow it does — without you porting logic between platforms.</p>

<p><img src="/assets/images/tip-business-skills-build-once-use-everywhere.webp" alt="Build a business skill once and use it across every agent" /></p>

<h2 id="why-central-in-dataverse-is-the-magic-word">Why “central in Dataverse” is the magic word</h2>

<p>This is the bit makers usually miss. Storing a skill <strong>once in Dataverse</strong> instead of <strong>once per agent</strong> changes the operating model:</p>

<div style="display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0;">
  <div style="background:#fdecec;border-left:4px solid #c0392b;border-radius:8px;padding:0.9rem 1rem;">
    <div style="font-weight:600;margin-bottom:0.4rem;color:#7a1f15;">Before</div>
    <ul style="margin:0;padding-left:1.1rem;">
      <li>Each agent re-implements the process — drift is guaranteed.</li>
      <li>Process change = N agent updates, N publishes, N test cycles.</li>
      <li>Sharing means exporting/importing topics, copying flow JSON, or porting code.</li>
      <li>Governance is per-agent, fragmented across tools.</li>
    </ul>
  </div>
  <div style="background:#e8f5ed;border-left:4px solid #2e7d4f;border-radius:8px;padding:0.9rem 1rem;">
    <div style="font-weight:600;margin-bottom:0.4rem;color:#1d5132;">With business skills</div>
    <ul style="margin:0;padding-left:1.1rem;">
      <li>One skill record — every connected agent discovers and follows the same steps.</li>
      <li>Update the skill once — every connected agent picks up the change immediately.</li>
      <li>Share the skill record (Dataverse security applies) or deploy it via solutions.</li>
      <li>Skills are solution-aware and governed centrally with built-in sharing and visibility.</li>
    </ul>
  </div>
</div>

<p>No republishing. No tracking down individual agent configurations. Update the source of truth and the change applies everywhere.</p>

<h2 id="create-share-and-govern-from-power-apps">Create, share, and govern from Power Apps</h2>

<p>Business skills live in Dataverse, but you author and manage them in <strong>Power Apps</strong>. From <code class="language-plaintext highlighter-rouge">make.powerapps.com</code> you can:</p>

<ul>
  <li><strong>Create</strong> a skill by writing the process in natural language, or <strong>upload existing documentation</strong> (an SOP, a runbook, a process Word doc) and let it become the skill.</li>
  <li><strong>Share</strong> with specific people, teams, or security roles using the standard Dataverse sharing model.</li>
  <li><strong>Govern</strong> with built-in visibility controls — who can see it, who can edit it.</li>
  <li><strong>Deploy</strong> across environments by adding the skill to a Power Platform solution and shipping it through your existing ALM pipelines.</li>
</ul>

<p>Prefer to work conversationally? You can <strong>create and update skills by asking an agent</strong>, through the Dataverse MCP server itself.</p>

<p><img src="/assets/images/tip-business-skills-in-power-apps.webp" alt="Business skills page in Power Apps" /></p>

<h2 id="a-real-customer-example">A real customer example</h2>

<p><a href="https://velrada.com/">Velrada</a> built <a href="https://velrada.com/fieldlens/">Inspection Agent</a> to help worksite supervisors and field workers track equipment maintenance. The agent uses business skills to drive the inspection itself: for an onsite HVAC check, it invokes a skill that determines the right questions for that <strong>equipment class</strong>, looks up the <strong>last inspection outcomes</strong>, and pulls in <strong>historic issues</strong> — producing a consolidated, conversational report and follow-up guidance.</p>

<p>Update the inspection process for HVAC units, and every Inspection Agent in the field follows the new steps the next time it runs. No app updates. No re-deployments.</p>

<h2 id="who-this-is-for">Who this is for</h2>

<p>Business skills are aimed at three audiences:</p>

<ul>
  <li><strong>Makers</strong> who want to codify how their team actually operates instead of re-explaining it to every agent.</li>
  <li><strong>Agent builders</strong> who need agents to follow real, organization-specific processes — not generic LLM instructions.</li>
  <li><strong>Admins</strong> who need governance over how business knowledge is shared, versioned, and deployed across environments.</li>
</ul>

<h2 id="get-started">Get started</h2>

<p>To switch this on today (public preview):</p>

<ol>
  <li><strong>Enable <a href="https://learn.microsoft.com/power-apps/maker/data-platform/data-platform-intelligence">Dataverse intelligence</a></strong> in the Power Platform admin center for the target environment.</li>
  <li>Open <a href="https://make.powerapps.com/">Power Apps</a> and go to the <strong>Business skills</strong> page from the left navigation.</li>
  <li><strong>Create your first skill</strong> — write it in natural language or upload an existing process document.</li>
  <li><strong>Connect an agent</strong> to the <a href="https://aka.ms/dataversemcppreview">Dataverse MCP server</a> and watch it discover and follow the skill.</li>
</ol>

<p>Want a head start? Microsoft ships a <a href="https://aka.ms/DVBusinessSkillRepo">sample business skills repository on GitHub</a> with production-ready examples you can install directly into your environment.</p>

<p>If you’re already building agents, business skills are the missing layer between <strong>what the agent knows</strong> and <strong>what your organization actually does</strong>. Start small: pick one process that’s currently re-implemented in two or more agents, write it as a business skill, and rip the duplicates out. The first time the process changes and you only edit it in one place, you’ll feel the difference.</p>

<h2 id="learn-more">Learn more</h2>

<ul>
  <li><a href="https://learn.microsoft.com/power-apps/maker/data-platform/data-platform-intelligence">What is Dataverse intelligence?</a></li>
  <li><a href="https://learn.microsoft.com/power-apps/maker/data-platform/data-platform-business-skill-overview">Business skills overview</a></li>
  <li><a href="https://learn.microsoft.com/power-apps/maker/data-platform/data-platform-business-skills">Create and use business skills</a></li>
  <li><a href="https://aka.ms/DVBusinessSkillRepo">Sample business skills on GitHub</a></li>
  <li><a href="https://www.microsoft.com/en-us/power-platform/blog/2026/05/01/business-skills/">Announcement: Introducing business skills — Teach agents how your organization works</a></li>
</ul>]]></content><author><name>Ricardo Calejo</name></author><category term="Copilot Studio" /><category term="Copilot Studio" /><category term="Business Skills" /><category term="Dataverse" /><category term="Dataverse MCP" /><category term="Dataverse Intelligence" /><category term="Agents" /><category term="Power Apps" /><category term="MCP" /><category term="ALM" /><category term="Public Preview" /><summary type="html"><![CDATA[Business skills (public preview) let you capture organizational processes, policies, and domain expertise as natural-language instructions in Dataverse. Any agent connected to the Dataverse MCP server — Copilot Studio, GitHub Copilot, VS Code, Foundry — discovers and follows them at runtime. Define once, govern centrally, update everywhere.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-business-skills-in-dataverse-teach-agents-how-your-organization-works.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-business-skills-in-dataverse-teach-agents-how-your-organization-works.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">You can make every pipeline deployment pass an automated code review</title><link href="https://ppautomiq.com/governance/make-every-pipeline-deployment-pass-an-automated-code-review/" rel="alternate" type="text/html" title="You can make every pipeline deployment pass an automated code review" /><published>2026-05-01T09:00:00+00:00</published><updated>2026-05-01T09:00:00+00:00</updated><id>https://ppautomiq.com/governance/make-every-pipeline-deployment-pass-an-automated-code-review</id><content type="html" xml:base="https://ppautomiq.com/governance/make-every-pipeline-deployment-pass-an-automated-code-review/"><![CDATA[<p>Did you know that <strong>Power Platform Pipelines can require a passing code review — for canvas apps, Power Automate flows, and Copilot Studio agents — before a solution is even exported from the development environment</strong>?</p>

<p>Most teams stop at Solution Checker. Solution Checker is great for platform-level safety (deprecated APIs, security smells, supportability), but it doesn’t grade <em>craftsmanship</em>: control naming, formula complexity, delegation issues, topic design in agents, trigger phrase quality, and the dozens of other things that separate a healthy solution from one that will haunt you in production.</p>

<p>The good news: you can wire <strong>Solution checker enforcement</strong> (at the environment) <strong>+ Power CAT Tools Code Review</strong> (for craftsmanship) <strong>+ Copilot Studio Kit</strong> (for agent governance) <strong>+ Power Platform Pipelines gated extensions</strong> (the glue) into a single multi-dimensional quality gate. None of these are new tools — they’re just rarely combined.</p>

<h2 id="layer-1--solution-checker-enforced-at-the-managed-environment">Layer 1 — Solution Checker, enforced at the Managed Environment</h2>

<p>This is the foundation. <strong>Solution Checker enforcement is configured per Managed Environment</strong>, not per pipeline. When set to <strong>Block</strong>, any solution with critical issues is <strong>rejected at import time</strong> — <em>before</em> anything changes in the environment — regardless of whether it arrived through a pipeline, a manual import, or DevOps.</p>

<p><img src="/assets/images/tip-pipeline-code-review-managed-environment-solution-checker.png" alt="Solution checker enforcement settings on a Managed Environment" /></p>

<p>Set this once on each target environment (or, even better, on an <strong>environment group</strong> so every member environment inherits it — pair this with <a href="2026-04-01-the-default-deployment-pipeline-rule-auto-links-environments-to-your-pipeline.md">the Default Deployment Pipeline rule</a> and you get governance-by-default for every new environment).</p>

<p>But Solution Checker won’t tell you that a canvas app has 800 controls on one screen, or that a Copilot Studio topic has only one trigger phrase. That’s where layer 2 comes in.</p>

<h2 id="layer-2--power-cat-tools-real-code-review-for-makers">Layer 2 — Power CAT Tools: real code review for makers</h2>

<p>The <a href="https://github.com/microsoft/Power-CAT-Tools"><strong>Power CAT Tools</strong></a> suite ships a <strong>Power Platform Code Review tool</strong> that analyzes solutions against a customizable checklist of patterns. Some patterns are evaluated automatically (control counts, media size, network traces, formulas), others are marked pass/fail by a reviewer with comments and links back to specific code locations.</p>

<p>What it covers today:</p>

<ul>
  <li><strong>Canvas apps</strong> — control limits, embedded media, slow network requests, formula breakdowns, App Checker integration.</li>
  <li><strong>Power Automate</strong> — flow patterns from <code class="language-plaintext highlighter-rouge">POWERAUTOMATE_PATTERNS.md</code>.</li>
  <li><strong>Copilot Studio agents</strong> — the <a href="https://github.com/microsoft/Power-CAT-Tools/blob/main/COPILOTSTUDIO_PATTERNS.md">Copilot Studio Agent patterns</a>: trigger phrase count, single-word phrases, long phrases, condition count, flow count, SharePoint auth mode, unused topics, synonyms quality, duplicate regex entities, end-of-conversation usage.</li>
</ul>

<p>A review produces a <strong>summary dashboard</strong> (passed / failed / pending patterns) plus detailed insights — all stored in Dataverse tables in the governance environment. That’s the key: the results are queryable.</p>

<h2 id="layer-3--copilot-studio-kit-for-agent-governance">Layer 3 — Copilot Studio Kit for agent governance</h2>

<p>For Copilot Studio agent solutions, <a href="2026-03-27-copilot-studio-kit-fills-the-governance-gap-your-admin-center-cant.md">the Copilot Studio Kit</a> adds the behavioral dimension that even Power CAT can’t see: conversation analytics, escalation rates, topic coverage, session quality. If your pipeline is shipping an agent, the agent’s <em>runtime</em> data is part of the review, not just its design.</p>

<h2 id="layer-4--power-platform-pipelines-gated-extensions">Layer 4 — Power Platform Pipelines gated extensions</h2>

<p>This is what turns the above from “tools we have” into “gate every deployment must pass.” Power Platform Pipelines exposes three <a href="https://learn.microsoft.com/en-us/power-platform/alm/extend-pipelines"><strong>gated extensions</strong></a> — custom steps you can insert into a deployment and signal complete or reject:</p>

<p><img src="/assets/images/tip-pipeline-code-review-three-gated-extensions.png" alt="The three gated extensions in Power Platform Pipelines" /></p>

<ul>
  <li><strong>Pre-export Step Required</strong> — fires <code class="language-plaintext highlighter-rouge">OnDeploymentRequested</code>. Runs <em>before</em> the solution is exported from the dev environment. Only enabled on the first stage (e.g., Dev → UAT). <strong>This is where you put the code-review gate.</strong></li>
  <li><strong>Is Delegated Deployment</strong> — for service-principal-based approvals.</li>
  <li><strong>Pre-deployment Step Required</strong> — fires <code class="language-plaintext highlighter-rouge">OnPreDeploymentStarted</code> after approval, before the deployment runs in the next environment.</li>
</ul>

<p><img src="/assets/images/tip-pipeline-code-review-pipelines-extensibility-train.png" alt="Pipelines extensibility train diagram showing where each gated extension fires" /></p>

<p>Each gated step stays <strong>pending</strong> until your custom logic calls back with the right action:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">UpdatePreExportStepStatus</code> (or <code class="language-plaintext highlighter-rouge">UpdatePreDeploymentStepStatus</code>) with <strong>status 20</strong> = complete, deployment continues.</li>
  <li>Same action with <strong>status 30</strong> = reject, deployment fails. You can include both <strong>maker-facing comments</strong> (“Your canvas app has 412 controls on screen <code class="language-plaintext highlighter-rouge">BrowseGallery1</code> — please refactor before resubmitting”) and admin-facing comments.</li>
</ul>

<h2 id="putting-it-together-the-gate-flow">Putting it together: the gate flow</h2>

<p>In your <strong>pipelines host environment</strong>, build a cloud flow that:</p>

<ol>
  <li><strong>Triggers on <code class="language-plaintext highlighter-rouge">OnDeploymentRequested</code></strong> (Dataverse → <em>When an action is performed</em> → category <em>Power Platform Pipelines</em>) — optionally filtered by pipeline name with a trigger condition like <code class="language-plaintext highlighter-rouge">@equals(triggerOutputs()?['body/OutputParameters/DeploymentPipelineName'], 'Contoso Pipeline')</code>.</li>
  <li><strong>Identifies the solution</strong> being deployed from the trigger output parameters.</li>
  <li><strong>Queries the governance environment</strong> (Power CAT Tools Dataverse tables) for the most recent Code Review record for that solution. Decision logic, for example:
    <ul>
      <li>Reject if no review exists in the last <em>N</em> days.</li>
      <li>Reject if any <strong>critical</strong> pattern is marked Failed.</li>
      <li>Reject if the pass rate is below your threshold.</li>
    </ul>
  </li>
  <li><strong>For Copilot Studio agent solutions</strong>, additionally query Copilot Studio Kit data for the agent’s quality scores.</li>
  <li><strong>Calls <code class="language-plaintext highlighter-rouge">UpdatePreExportStepStatus</code></strong> (Dataverse → <em>Perform an unbound action</em>) with status <code class="language-plaintext highlighter-rouge">20</code> and a confirmation comment, or status <code class="language-plaintext highlighter-rouge">30</code> with a reject comment listing exactly what failed.</li>
</ol>

<p>The maker sees the result inline in the pipeline run history — including your comments — and either fixes the issues and resubmits, or proceeds. The solution isn’t even exported until the gate clears.</p>

<blockquote>
  <p>Microsoft ships a <a href="https://download.microsoft.com/download/7/2/6/72633cb9-e046-4f3d-88ba-d64bffb6107a/PipelinesExtensibilitySamples_v1_June_2023_1_0_0_1.zip">PipelinesExtensibilitySamples</a> managed solution with starter flows for all three gated extensions — start there and replace the placeholder logic with your Power CAT / Copilot Studio Kit lookups.</p>
</blockquote>

<h2 id="why-this-combo-is-the-magic-not-just-one-of-them">Why this combo is the magic, not just one of them</h2>

<p>Each layer covers what the others don’t:</p>

<table>
  <thead>
    <tr>
      <th>Layer</th>
      <th>What it catches</th>
      <th>What it misses</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Solution Checker (env-enforced)</td>
      <td>Platform safety: deprecated APIs, supportability, security smells</td>
      <td>Craftsmanship, agent design, performance design</td>
    </tr>
    <tr>
      <td>Power CAT Code Review</td>
      <td>Canvas/Flow/Agent design patterns, control counts, formula quality, trigger phrases</td>
      <td>Runtime behavior, security policies</td>
    </tr>
    <tr>
      <td>Copilot Studio Kit</td>
      <td>Agent runtime quality: escalation, resolution, topic coverage</td>
      <td>Build-time design issues</td>
    </tr>
    <tr>
      <td>Pipelines gated extension</td>
      <td>The mechanism that <strong>enforces</strong> all of the above on every deployment</td>
      <td>(the glue)</td>
    </tr>
  </tbody>
</table>

<p>Run all four and your pipeline stops being a deployment mechanism — it becomes a <strong>maker enablement loop</strong>. Every deployment teaches the maker something concrete and gives them a self-service path to fix it. No manual code reviews, no admin tickets, no “we’ll check it later in production.”</p>

<h2 id="a-note-on-staging-the-rollout">A note on staging the rollout</h2>

<p>Don’t enable rejection on day one — you’ll create a riot. The recommended ramp:</p>

<ol>
  <li><strong>Sprint 1–2:</strong> Build the gate in <strong>observe-only mode</strong> — always call <code class="language-plaintext highlighter-rouge">UpdatePreExportStepStatus</code> with status <code class="language-plaintext highlighter-rouge">20</code> (complete) but log what <em>would</em> have been rejected.</li>
  <li><strong>Sprint 3–4:</strong> Switch to <strong>warn mode</strong> — complete the step but post the would-have-been-rejected comments to the maker so they see what’s coming.</li>
  <li><strong>Sprint 5+:</strong> Flip to <strong>block</strong> — start rejecting on the patterns the team has agreed are non-negotiable. Keep the rest as warnings.</li>
</ol>

<p>Same staging works for the Solution Checker enforcement on Managed Environments (Off → Warn → Block).</p>

<p>This is one of those quiet-but-powerful combinations that the platform fully supports today — almost nobody connects all the pieces. If you already have pipelines and Managed Environments, you’re three configuration steps and one cloud flow away from automated, multi-dimensional code review on every deployment.</p>]]></content><author><name>Ricardo Calejo</name></author><category term="Governance" /><category term="Governance" /><category term="Pipelines" /><category term="ALM" /><category term="Solution Checker" /><category term="Managed Environments" /><category term="Power CAT Tools" /><category term="Copilot Studio Kit" /><category term="Code Review" /><category term="Quality Gates" /><category term="Enterprise" /><summary type="html"><![CDATA[Combine Solution checker enforcement on Managed Environments with a pre-export pipeline extension that checks Power CAT Tools and Copilot Studio Kit data — every deployment passes a real code review before it ships.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-make-every-pipeline-deployment-pass-an-automated-code-review.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-make-every-pipeline-deployment-pass-an-automated-code-review.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>