<?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-06-05T23:28:26+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">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><entry><title type="html">Send a file to an agent from Power Automate or an agent flow</title><link href="https://ppautomiq.com/copilot%20studio/send-a-file-to-an-agent-from-power-automate-or-agent-flow/" rel="alternate" type="text/html" title="Send a file to an agent from Power Automate or an agent flow" /><published>2026-04-28T09:00:00+00:00</published><updated>2026-04-28T09:00:00+00:00</updated><id>https://ppautomiq.com/copilot%20studio/send-a-file-to-an-agent-from-power-automate-or-agent-flow</id><content type="html" xml:base="https://ppautomiq.com/copilot%20studio/send-a-file-to-an-agent-from-power-automate-or-agent-flow/"><![CDATA[<p>Did you know that <strong>you can pass a real file (PDF, Word, image) into a Copilot Studio agent directly from Power Automate or an agent flow</strong>?</p>

<p>The trick lives inside the <strong>Execute Agent</strong> action. Most people only fill in <code class="language-plaintext highlighter-rouge">Body/message</code> and miss the <strong>attachments</strong> array hidden under Advanced parameters. That array is what lets your agent actually receive the document and reason over it.</p>

<h2 id="the-pattern-in-one-picture">The pattern in one picture</h2>

<p>The recipe is just two actions:</p>

<ol>
  <li><strong>Get file content</strong> (SharePoint) — fetch the bytes of the file.</li>
  <li><strong>Execute Agent</strong> — call your Copilot Studio agent and attach the file.</li>
</ol>

<p><img src="/assets/images/tip-send-a-file-to-an-agent-from-power-automate-or-agent-flow.png" alt="Power Automate flow showing SharePoint Get file content followed by Execute Agent with an attachment configured" /></p>

<p>Here’s what those two actions look like in the designer, with the attachment array expanded inside Execute Agent:</p>

<p><img src="/assets/images/copilot-studio-send-file-to-agent.png" alt="SharePoint Get file content action followed by an Execute Agent action with the attachments array expanded, showing Contenttype application/pdf and a base64 data URL Contenturl" /></p>

<h2 id="step-1--get-file-content-from-sharepoint">Step 1 — Get file content from SharePoint</h2>

<p>Add the <strong>SharePoint → Get file content</strong> action and configure:</p>

<ul>
  <li><strong>Site Address</strong>: the site that hosts the document.</li>
  <li><strong>File Identifier</strong>: the path to the file, for example <code class="language-plaintext highlighter-rouge">/Shared Documents/Zava Launch Demo - Get Started Guide.pdf</code>.</li>
  <li><strong>Infer Content Type</strong>: <code class="language-plaintext highlighter-rouge">Yes</code> (so the connector returns the right MIME type).</li>
</ul>

<p>This step gives you a <code class="language-plaintext highlighter-rouge">$content</code> token that holds the file as base64-encoded bytes — exactly what the agent needs.</p>

<h2 id="step-2--add-the-execute-agent-action">Step 2 — Add the Execute Agent action</h2>

<p>Add <strong>Execute Agent</strong> and pick the agent you want to call. Then expand <strong>Advanced parameters → Show all</strong> and turn on <strong>A list of attachments</strong>.</p>

<p>Add one item to the attachments array and fill it in like this:</p>

<table>
  <thead>
    <tr>
      <th>Field</th>
      <th>Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Contenttype</td>
      <td><code class="language-plaintext highlighter-rouge">application/pdf</code> (or the right MIME type for your file)</td>
    </tr>
    <tr>
      <td>Contenturl</td>
      <td><code class="language-plaintext highlighter-rouge">data:application/pdf;base64,</code> + the <code class="language-plaintext highlighter-rouge">$content</code> from step 1</td>
    </tr>
    <tr>
      <td>Content</td>
      <td><em>leave empty</em></td>
    </tr>
    <tr>
      <td>Name</td>
      <td><code class="language-plaintext highlighter-rouge">File.pdf</code> (any friendly name with the right extension)</td>
    </tr>
    <tr>
      <td>Thumbnailurl</td>
      <td><em>leave empty</em></td>
    </tr>
  </tbody>
</table>

<p>Then set <strong>Body/message</strong> to whatever you want the agent to do with the file, for example:</p>

<blockquote>
  <p>Please summarize this</p>
</blockquote>

<p>That’s it. When the flow runs, the agent receives the file as an attachment and can read, summarize, extract, classify, or route it.</p>

<h2 id="why-the-data-url-matters">Why the data URL matters</h2>

<p>The <code class="language-plaintext highlighter-rouge">Contenturl</code> field is <strong>not</strong> a SharePoint link. It’s a <a href="https://developer.mozilla.org/en-US/docs/Web/URI/Schemes/data">data URL</a> that inlines the file bytes into the request:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>data:&lt;mimetype&gt;;base64,&lt;base64-bytes&gt;
</code></pre></div></div>

<p>Concretely, you build it as:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>data:application/pdf;base64,@{outputs('Get_file_content')?['body']}
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">$content</code> placeholder shown in the designer is just a friendly handle for that body output. The agent runtime decodes the base64 and treats it as a real attachment, the same way it would if a user dragged the file into chat.</p>

<h2 id="common-mime-types-youll-use">Common MIME types you’ll use</h2>

<table>
  <thead>
    <tr>
      <th>File type</th>
      <th>Contenttype</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>PDF</td>
      <td><code class="language-plaintext highlighter-rouge">application/pdf</code></td>
    </tr>
    <tr>
      <td>Word (.docx)</td>
      <td><code class="language-plaintext highlighter-rouge">application/vnd.openxmlformats-officedocument.wordprocessingml.document</code></td>
    </tr>
    <tr>
      <td>Excel (.xlsx)</td>
      <td><code class="language-plaintext highlighter-rouge">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</code></td>
    </tr>
    <tr>
      <td>PowerPoint</td>
      <td><code class="language-plaintext highlighter-rouge">application/vnd.openxmlformats-officedocument.presentationml.presentation</code></td>
    </tr>
    <tr>
      <td>PNG image</td>
      <td><code class="language-plaintext highlighter-rouge">image/png</code></td>
    </tr>
    <tr>
      <td>JPEG image</td>
      <td><code class="language-plaintext highlighter-rouge">image/jpeg</code></td>
    </tr>
    <tr>
      <td>Plain text</td>
      <td><code class="language-plaintext highlighter-rouge">text/plain</code></td>
    </tr>
  </tbody>
</table>

<p>Match the extension in <strong>Name</strong> to the MIME type — agents (and downstream model calls) use both signals to pick the right parser.</p>

<h2 id="where-this-pattern-shines">Where this pattern shines</h2>

<ul>
  <li><strong>Document intake</strong>: a SharePoint library trigger fires, the flow pushes the new file to an agent that classifies, extracts fields, or routes for approval.</li>
  <li><strong>Email attachments</strong>: replace step 1 with “Get attachment (V2)” from Outlook and forward the attachment straight to the agent.</li>
  <li><strong>Form uploads</strong>: a Power Apps or Forms upload lands in OneDrive/SharePoint, then an agent flow summarizes it back to the user.</li>
  <li><strong>Bulk processing</strong>: loop over a folder, send each file to the agent, and store the structured response in Dataverse or a list.</li>
</ul>

<h2 id="things-to-watch-out-for">Things to watch out for</h2>

<ul>
  <li><strong>Size limits</strong>: Execute Agent attachments inherit the agent’s file size limits. Very large PDFs may need to be split or pre-processed.</li>
  <li><strong>Don’t double-encode</strong>: <code class="language-plaintext highlighter-rouge">Get file content</code> already returns base64 in its body. Just prefix with <code class="language-plaintext highlighter-rouge">data:&lt;mime&gt;;base64,</code> — don’t run it through <code class="language-plaintext highlighter-rouge">base64()</code> again.</li>
  <li><strong>One attachment per item</strong>: each file is one entry in the array. Use <strong>Add new item</strong> for multi-file calls instead of stuffing several files into one entry.</li>
  <li><strong>Pick the right MIME type</strong>: if you set <code class="language-plaintext highlighter-rouge">application/pdf</code> but pass a Word file, the agent will struggle to parse it.</li>
</ul>

<h2 id="why-this-is-a-big-deal-for-agent-flows">Why this is a big deal for agent flows</h2>

<p>Agents become dramatically more useful when they can act on real documents instead of just text. Once you’ve wired this two-action pattern, you can chain it with classification, generative answers, Dataverse writes, or approvals — all from the same flow that picked the file up.</p>

<p>Two actions. One hidden Advanced parameter. A real document in your agent’s hands.</p>]]></content><author><name>Ricardo Calejo</name></author><category term="Copilot Studio" /><category term="Copilot Studio" /><category term="Power Automate" /><category term="Agent Flows" /><category term="Execute Agent" /><category term="SharePoint" /><category term="Attachments" /><category term="Generative AI" /><category term="Document Processing" /><summary type="html"><![CDATA[Use the Execute Agent action in Power Automate or an agent flow to pass a SharePoint file to a Copilot Studio agent as an attachment using a base64 data URL.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-send-a-file-to-an-agent-from-power-automate-or-agent-flow.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-send-a-file-to-an-agent-from-power-automate-or-agent-flow.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Microsoft Agent 365 is going GA on May 1 and you should build your AI governance foundation now</title><link href="https://ppautomiq.com/governance/microsoft-agent-365-is-going-ga-build-your-ai-governance-foundation-now/" rel="alternate" type="text/html" title="Microsoft Agent 365 is going GA on May 1 and you should build your AI governance foundation now" /><published>2026-04-22T10:00:00+00:00</published><updated>2026-04-22T10:00:00+00:00</updated><id>https://ppautomiq.com/governance/microsoft-agent-365-is-going-ga-build-your-ai-governance-foundation-now</id><content type="html" xml:base="https://ppautomiq.com/governance/microsoft-agent-365-is-going-ga-build-your-ai-governance-foundation-now/"><![CDATA[<p>Did you know that <strong>Microsoft Agent 365 is generally available on May 1, 2026</strong> and it is positioned as <strong>the control plane for AI agents</strong> across your enterprise?</p>

<p>If your organization is already running Copilot Studio agents, custom agents, or third-party agents, this launch is the moment to stop treating agents as individual projects and start managing them like a workforce.</p>

<p><img src="/assets/images/tip-agent-365-launch-hero.jpeg" alt="Microsoft Agent 365 product hero image" class="post-image" />
<em>Agent 365 positions AI agents as a governable, securable workforce at enterprise scale.</em></p>

<h2 id="what-agent-365-is-and-is-not">What Agent 365 is (and is not)</h2>

<p>Agent 365 is not another agent builder. It is the <strong>governance, security, and observability layer</strong> that sits over every agent in your environment, regardless of where it was built.</p>

<p>At GA, the value is centered on five pillars:</p>

<ul>
  <li><strong>Registry</strong> - centralized inventory of every agent, including shadow agents</li>
  <li><strong>Access control</strong> - using Microsoft Entra Agent ID for least-privilege identity</li>
  <li><strong>Visualization</strong> - dashboards for performance, connections, and business impact</li>
  <li><strong>Interoperability</strong> - works with agents from Microsoft, open-source frameworks, and third-party platforms</li>
  <li><strong>Security</strong> - integrated with Microsoft Defender, Microsoft Entra, and Microsoft Purview</li>
</ul>

<p><img src="/assets/images/tip-agent-365-launch-admin-center-overview.jpeg" alt="Agent 365 overview in the Microsoft 365 admin center" class="post-image" />
<em>Agent 365 surfaces agent inventory and key analytics inside the Microsoft 365 admin center.</em></p>

<h2 id="the-reality-check-agents-are-scaling-faster-than-governance">The reality check: agents are scaling faster than governance</h2>

<p>Organizations are already seeing the classic pattern:</p>

<ul>
  <li>Business teams ship Copilot Studio agents quickly</li>
  <li>Pro-code teams build custom agents with Agent Framework</li>
  <li>Vendors introduce third-party agents into Teams and Microsoft 365</li>
  <li>Nobody has a single, trustworthy view of <em>all</em> agents running in the tenant</li>
</ul>

<p>Agent 365 is Microsoft’s answer to agent sprawl. But the product cannot fix the absence of ownership, policies, or identity hygiene - only your program can.</p>

<h2 id="build-the-house-from-the-ground">Build the house from the ground</h2>

<p>Treat Agent 365 like the walls and roof of your AI program. Walls only work on a solid foundation. If you skip the foundation, you end up with governance that looks nice in a slide but cracks under real usage.</p>

<p>Foundation layers to put in place before GA:</p>

<ol>
  <li>
    <p><strong>Ownership</strong>
Define who owns AI agent lifecycle, who owns security, and who owns compliance. Typically this is a joint model between IT, security, data, and platform CoE.</p>
  </li>
  <li>
    <p><strong>Identity</strong>
Microsoft Entra Agent ID is the access-control anchor. Agents should have identities, not shared credentials, and should follow least-privilege principles.</p>
  </li>
  <li>
    <p><strong>Classification</strong>
Classify agents by risk - internal productivity, customer-facing, data-modifying, regulated-data. Governance intensity should match risk tier.</p>
  </li>
  <li>
    <p><strong>Data boundaries</strong>
Use Microsoft Purview for sensitivity, data loss prevention, and auditability. Agents that consume enterprise data must respect information protection policies.</p>
  </li>
  <li>
    <p><strong>Threat protection</strong>
Use Microsoft Defender for runtime protection and incident response. Agents add new attack surfaces like prompt injection, tool abuse, and data exfiltration via tools.</p>
  </li>
  <li>
    <p><strong>Observability</strong>
Decide what you will monitor - agent usage, success rate, tool invocations, failures, cost, and drift. Agent 365 provides dashboards, but you must know what “healthy” looks like per agent type.</p>
  </li>
</ol>

<h2 id="a-simple-306090-plan-to-be-ready">A simple 30/60/90 plan to be ready</h2>

<h3 id="first-30-days">First 30 days</h3>

<ul>
  <li>Produce an agent inventory across Copilot Studio, custom agents, and third-party agents.</li>
  <li>Identify shadow agents that were not registered through IT.</li>
  <li>Assign owners per agent (business owner + technical owner).</li>
</ul>

<h3 id="days-30-to-60">Days 30 to 60</h3>

<ul>
  <li>Enable Microsoft Entra Agent ID readiness for production agents.</li>
  <li>Expand Microsoft Purview scope to cover agent data flows.</li>
  <li>Stand up a risk tiering model and map each agent into a tier.</li>
</ul>

<h3 id="days-60-to-90">Days 60 to 90</h3>

<ul>
  <li>Enable Agent 365 on the environments that matter most.</li>
  <li>Establish weekly governance reviews of usage, risk, and incidents.</li>
  <li>Publish the AI agent operating model internally - makers need to know the rules.</li>
</ul>

<h2 id="why-this-matters-for-enterprise-leaders">Why this matters for enterprise leaders</h2>

<p>AI agents are starting to act like a digital workforce. That means you need:</p>

<ul>
  <li>An HR-style lifecycle for agents (onboarding, access, deprecation)</li>
  <li>A security model for non-human identities</li>
  <li>A financial model for cost attribution</li>
  <li>A compliance model for auditability</li>
</ul>

<p>Agent 365 gives you the product surface to do this consistently. But the operating model has to be owned by you, not by the tool.</p>

<h2 id="common-mistakes-to-avoid-in-the-ga-window">Common mistakes to avoid in the GA window</h2>

<ul>
  <li><strong>Treating Agent 365 as a license purchase only</strong> - it is an operating model change, not just a SKU</li>
  <li><strong>Starting with tooling before ownership</strong> - without accountable owners, dashboards are ignored</li>
  <li><strong>Ignoring shadow agents</strong> - unregistered agents represent the biggest real risk</li>
  <li><strong>Skipping risk tiering</strong> - if every agent has the same controls, high-risk ones are under-governed and low-risk ones are over-governed</li>
  <li><strong>Relying on one-time reviews</strong> - agent behavior, prompts, and tools change constantly; governance must be continuous</li>
</ul>

<h2 id="what-to-do-this-week">What to do this week</h2>

<ul>
  <li>Nominate an Agent 365 program owner</li>
  <li>Start the agent inventory</li>
  <li>Align IT, security, and data teams on a shared AI governance baseline</li>
  <li>Put a May 1 readiness checkpoint on the calendar</li>
</ul>

<p>The organizations that will benefit most from Agent 365 on day one are not the ones with the most agents. They are the ones with the clearest foundation. Build the house from the ground - identity, classification, data, threat, observability, ownership - so Agent 365 becomes the control plane you already needed, not a dashboard nobody trusts.</p>

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

<ul>
  <li><a href="https://www.microsoft.com/en-us/microsoft-365/blog/2025/11/18/microsoft-agent-365-the-control-plane-for-ai-agents/">Microsoft Agent 365 announcement</a></li>
  <li><a href="https://www.microsoft.com/en-us/microsoft-365/blog/2025/11/18/microsoft-ignite-2025-copilot-and-agents-built-to-power-the-frontier-firm/">Microsoft Ignite 2025 Copilot and agents recap</a></li>
  <li><a href="https://www.microsoft.com/en-us/microsoft-copilot/blog/copilot-studio/6-core-capabilities-to-scale-agent-adoption-in-2026/">6 core capabilities to scale agent adoption in 2026</a></li>
</ul>]]></content><author><name>Ricardo Calejo</name></author><category term="Governance" /><category term="Microsoft Agent 365" /><category term="AI Governance" /><category term="Agent Management" /><category term="Entra Agent ID" /><category term="Microsoft Purview" /><category term="Microsoft Defender" /><category term="Frontier Firm" /><category term="Enterprise" /><summary type="html"><![CDATA[Microsoft Agent 365 becomes generally available on May 1, 2026. Before enabling it, build your AI governance foundation - identity, security, observability, and ownership - from the ground up.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-microsoft-agent-365-is-going-ga-build-your-ai-governance-foundation-now.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-microsoft-agent-365-is-going-ga-build-your-ai-governance-foundation-now.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Power Platform Monitor Alerts are now GA and every admin should turn them on</title><link href="https://ppautomiq.com/governance/power-platform-monitor-alerts-are-now-ga/" rel="alternate" type="text/html" title="Power Platform Monitor Alerts are now GA and every admin should turn them on" /><published>2026-04-10T01:00:00+00:00</published><updated>2026-04-10T01:00:00+00:00</updated><id>https://ppautomiq.com/governance/power-platform-monitor-alerts-are-now-ga</id><content type="html" xml:base="https://ppautomiq.com/governance/power-platform-monitor-alerts-are-now-ga/"><![CDATA[<p>Did you know that <strong>Power Platform Monitor alerts are now generally available, so you can move from reactive firefighting to proactive operations across apps, flows, and agents</strong>?</p>

<p>If your team still discovers reliability issues from user tickets, this release is a big deal. GA means the capability has reached Microsoft reliability and maturity standards for production use, not just experimentation.</p>

<p><img src="/assets/images/tip-power-platform-monitor-alerts-are-now-ga.png" alt="Monitor overview page with triggered custom and predefined alerts" class="post-image" />
<em>The alerts-centric Monitor overview gives you instant visibility into active alert conditions.</em></p>

<h2 id="what-is-now-ga-exactly">What is now GA, exactly?</h2>

<p>Power Platform Monitor alerts let tenant and environment admins define threshold-based alert rules on operational health metrics and get notified when conditions are breached.</p>

<p>At GA, you get two layers of value:</p>

<ul>
  <li><strong>Predefined alerts from Microsoft</strong> enabled by default at tenant scope</li>
  <li><strong>Custom alert rules</strong> you create for environment-wide or resource-level monitoring</li>
</ul>

<p>This combination is strong: predefined alerts help you spot obvious risk immediately, while custom rules let you tune thresholds to your own SLAs.</p>

<h2 id="the-biggest-ga-upgrade-predefined-alerts">The biggest GA upgrade: predefined alerts</h2>

<p>Predefined alerts are the fastest way to get signal without setup. Microsoft now provides built-in alert definitions for high-use resources with degraded health.</p>

<p>Examples include high-use resources dropping under baseline thresholds like:</p>

<ul>
  <li>Canvas app availability under 90%</li>
  <li>Model-driven app availability under 90%</li>
  <li>Cloud flow success rate under 90%</li>
  <li>Desktop flow success rate under 90%</li>
  <li>Agent success rate under 90%</li>
</ul>

<p>These predefined alerts are:</p>

<ul>
  <li>Turned on by default</li>
  <li>Tenant-wide</li>
  <li>Not editable</li>
  <li>Visible in Monitor (they do not send email notifications)</li>
</ul>

<p><img src="https://www.microsoft.com/en-us/power-platform/blog/wp-content/uploads/2026/03/cloud-flow-triggered-alert--1536x440.jpg" alt="Triggered predefined alert experience for cloud flows" class="post-image" />
<em>Predefined alerts surface high-use resources with degraded health, even before you create custom rules.</em></p>

<h2 id="what-custom-alerts-give-you-in-ga">What custom alerts give you in GA</h2>

<p>Custom alerts are where operations teams create real monitoring ownership.</p>

<p>You can configure:</p>

<ul>
  <li>Product and resource type (Power Apps, Power Automate, Copilot Studio)</li>
  <li>Scope (environment or specific resource)</li>
  <li>Metric, operator, and threshold</li>
  <li>Severity (Low, Medium, High)</li>
  <li>Email notifications to you and up to four additional recipients</li>
</ul>

<p><img src="https://www.microsoft.com/en-us/power-platform/blog/wp-content/uploads/2026/03/cloud-flow-alert-rule-1024x691.jpg" alt="Create custom alert rule panel in Monitor" class="post-image" />
<em>Custom alert rules let you monitor what matters to your organization, not only Microsoft defaults.</em></p>

<p>You can also manage rules centrally from the alert rules list.</p>

<p><img src="https://www.microsoft.com/en-us/power-platform/blog/wp-content/uploads/2026/03/alert-rule-list-1024x647.jpg" alt="Alert rules list in Monitor" class="post-image" />
<em>Manage, enable, disable, edit, and review your custom alert rules from one place.</em></p>

<h2 id="important-ga-realities-admins-should-know">Important GA realities admins should know</h2>

<ul>
  <li>Alerts are evaluated on a 24-hour cadence, based on aggregated metrics.</li>
  <li>Custom alert rules currently require Managed Environments.</li>
  <li>Tenant administrators and environment administrators can create/manage alerts.</li>
  <li>A tenant can have up to 50 alert rules turned on at one time.</li>
  <li>Predefined alerts are view-only and currently cannot be disabled.</li>
  <li>Predefined alerts do not send email; custom alerts can.</li>
</ul>

<p>This means you should treat Monitor alerts as proactive daily health signals, not real-time incident paging.</p>

<h2 id="recommended-rollout-pattern">Recommended rollout pattern</h2>

<p>Use a phased rollout so your team gets value fast without creating alert noise.</p>

<ol>
  <li>
    <p><strong>Start with predefined alerts</strong>
Review Monitor overview and identify which high-use resources are already showing degradation.</p>
  </li>
  <li>
    <p><strong>Create 3-5 high-value custom rules</strong>
Prioritize production environments and business-critical apps/flows.</p>
  </li>
  <li>
    <p><strong>Standardize naming</strong>
Use names like Prod - Cloud flows - Success rate under 95.</p>
  </li>
  <li>
    <p><strong>Set triage ownership</strong>
Define who checks alerts daily, who contacts makers, and who tracks remediation.</p>
  </li>
  <li>
    <p><strong>Tune thresholds monthly</strong>
Avoid stale thresholds as usage and load patterns change.</p>
  </li>
</ol>

<h2 id="what-is-supported-now">What is supported now</h2>

<p>Based on GA guidance and current documentation, alerting supports:</p>

<ul>
  <li>Code apps</li>
  <li>Canvas apps</li>
  <li>Model-driven apps</li>
  <li>Cloud flows</li>
  <li>Desktop flows</li>
  <li>Agents</li>
</ul>

<p>Work queue alerts are also available, but remain public preview.</p>

<h2 id="why-this-matters-for-enterprise-governance">Why this matters for enterprise governance</h2>

<p>Monitor alerts close a real operational gap in many Power Platform programs:</p>

<ul>
  <li>Governance teams get measurable health visibility</li>
  <li>Makers get earlier feedback before users complain</li>
  <li>Operations teams can prioritize by severity and usage impact</li>
  <li>Leadership gets a path from reactive support to proactive reliability</li>
</ul>

<p>If your platform strategy includes scale, this GA feature should be part of your standard operating model now.</p>

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

<ul>
  <li>GA announcement: https://www.microsoft.com/en-us/power-platform/blog/power-apps/power-platform-monitor-alerts-are-now-generally-available/</li>
  <li>Official alerts documentation: https://learn.microsoft.com/en-us/power-platform/admin/monitoring/alerts</li>
</ul>]]></content><author><name>Ricardo Calejo</name></author><category term="Governance" /><category term="Power Platform" /><category term="Power Platform Admin Center" /><category term="Monitor" /><category term="Monitoring Alerts" /><category term="General Availability" /><category term="Managed Environments" /><category term="Power Apps" /><category term="Power Automate" /><category term="Copilot Studio" /><category term="Operations" /><summary type="html"><![CDATA[Power Platform Monitor alerts are now generally available, giving admins predefined Microsoft-authored alerts plus custom threshold-based alerting for apps, flows, desktop flows, and agents.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-power-platform-monitor-alerts-are-now-ga.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-power-platform-monitor-alerts-are-now-ga.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Integrate Azure Key Vault with cloud and desktop flows the right way for ALM</title><link href="https://ppautomiq.com/power%20automate/integrate-azure-key-vault-with-cloud-and-desktop-flows-in-alm/" rel="alternate" type="text/html" title="Integrate Azure Key Vault with cloud and desktop flows the right way for ALM" /><published>2026-04-07T01:00:00+00:00</published><updated>2026-04-07T01:00:00+00:00</updated><id>https://ppautomiq.com/power%20automate/integrate-azure-key-vault-with-cloud-and-desktop-flows-in-alm</id><content type="html" xml:base="https://ppautomiq.com/power%20automate/integrate-azure-key-vault-with-cloud-and-desktop-flows-in-alm/"><![CDATA[<p>Did you know that <strong>the fastest way to create a credential leak in Power Automate is to hardcode secrets in your flows</strong>?</p>

<p>If your cloud flow calls APIs, databases, or line-of-business systems, those credentials have to live somewhere. Storing them in plain text variables, desktop flow steps, or copied notes turns every export, run history, and ownership change into a security event waiting to happen.</p>

<p>Azure Key Vault gives you centralized secret storage, rotation, and auditability. When you combine it with connection references and environment variables inside solutions, you get a deployment model that is secure <em>and</em> ALM-friendly.</p>

<h2 id="why-key-vault-matters-for-cloud-and-desktop-flows">Why Key Vault matters for cloud and desktop flows</h2>

<ul>
  <li><strong>Centralized secret management</strong>: Credentials and API keys live in one controlled location, not scattered across flows.</li>
  <li><strong>Rotation without flow redesign</strong>: Update the secret in Key Vault and keep the same secret name/version strategy so flows continue working.</li>
  <li><strong>Audit and control</strong>: Access to secrets is monitored and governed in Azure.</li>
  <li><strong>Cleaner ALM</strong>: Solutions move between environments without embedding environment-specific credentials.</li>
</ul>

<p>For desktop automation specifically, this is critical. Desktop flows often need sensitive values (system credentials, API tokens, file encryption keys). The secure pattern is to retrieve secrets in the cloud flow at runtime, then pass them into desktop flow inputs as late as possible.</p>

<h2 id="target-architecture-what-good-looks-like">Target architecture (what “good” looks like)</h2>

<h3 id="azure-side">Azure side</h3>

<ul>
  <li>One Key Vault per environment (<code class="language-plaintext highlighter-rouge">kv-contoso-dev</code>, <code class="language-plaintext highlighter-rouge">kv-contoso-test</code>, <code class="language-plaintext highlighter-rouge">kv-contoso-prod</code>)</li>
  <li>Same logical secret names across environments (for example, <code class="language-plaintext highlighter-rouge">erp-api-key</code>)</li>
  <li>Least-privilege access for the identity behind your Power Automate Key Vault connection</li>
</ul>

<h3 id="power-platform-side">Power Platform side</h3>

<ul>
  <li>One solution containing cloud flows, desktop flows, connection references, and environment variables</li>
  <li>Environment variables for vault-specific settings (vault name, secret name, endpoint if needed)</li>
  <li>Azure Key Vault connection reference reused by flows</li>
  <li>Cloud flow retrieves secret, then invokes desktop flow</li>
</ul>

<h3 id="alm-side">ALM side</h3>

<ul>
  <li>Unmanaged solution in Dev</li>
  <li>Managed solution in Test and Prod</li>
  <li>Connection references remapped per environment during import</li>
  <li>Environment variable values set per environment</li>
</ul>

<h2 id="step-by-step-implementation">Step-by-step implementation</h2>

<h2 id="step-1-create-key-vaults-per-environment">Step 1: Create Key Vaults per environment</h2>

<p>In Azure, create separate vaults for Dev, Test, and Prod. Do not share one vault across all environments.</p>

<p>Use a naming standard such as:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">kv-contoso-dev</code></li>
  <li><code class="language-plaintext highlighter-rouge">kv-contoso-test</code></li>
  <li><code class="language-plaintext highlighter-rouge">kv-contoso-prod</code></li>
</ul>

<p>Create secrets with the same logical names in each vault:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">erp-api-key</code></li>
  <li><code class="language-plaintext highlighter-rouge">pad-runtime-password</code></li>
  <li><code class="language-plaintext highlighter-rouge">legacy-system-client-secret</code></li>
</ul>

<p>The values differ by environment, but the names stay consistent. This simplifies flow design and ALM mapping.</p>

<p><img src="https://learn.microsoft.com/en-us/power-apps/maker/data-platform/media/env-var-secret1.png" alt="Register the Power Platform provider in Azure before using Key Vault-backed environment variables" class="post-image" />
<em>Register the Power Platform resource provider and baseline Key Vault setup in Azure.</em></p>

<h2 id="step-2-grant-least-privilege-access-to-secrets">Step 2: Grant least-privilege access to secrets</h2>

<p>Give the identity used by the Power Automate Azure Key Vault connection only the permissions it needs (typically secret read operations).</p>

<p>Good practice:</p>

<ul>
  <li>Scope access at vault level for the specific environment</li>
  <li>Avoid broad contributor/owner roles when only secret read is needed</li>
  <li>Use dedicated service principals/identities per environment when possible</li>
</ul>

<p>This prevents Dev automations from accidentally reading Prod credentials.</p>

<p><img src="https://learn.microsoft.com/en-us/power-apps/maker/data-platform/media/env-var-secret2.png" alt="Assign Key Vault Secrets User access in Azure IAM" class="post-image" />
<em>Grant least-privilege access with Key Vault Secrets User for users and service principals that need secret retrieval.</em></p>

<h2 id="step-3-build-a-solution-first-design-in-power-platform">Step 3: Build a solution-first design in Power Platform</h2>

<p>In your solution, create:</p>

<ul>
  <li>Cloud flow(s)</li>
  <li>Desktop flow(s)</li>
  <li>Azure Key Vault connection reference</li>
  <li>Environment variables</li>
</ul>

<p>Recommended environment variables:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">KV_VaultName</code></li>
  <li><code class="language-plaintext highlighter-rouge">KV_SecretName_ErpApiKey</code></li>
  <li><code class="language-plaintext highlighter-rouge">KV_SecretName_PadPassword</code></li>
</ul>

<p>Do not hardcode vault names or secret names in flow actions when ALM matters.</p>

<h2 id="step-4-configure-the-azure-key-vault-connection-reference">Step 4: Configure the Azure Key Vault connection reference</h2>

<p>Inside the solution:</p>

<ol>
  <li>Create a connection reference for Azure Key Vault.</li>
  <li>Bind it to the appropriate environment identity/account.</li>
  <li>Use this connection reference in all Key Vault actions.</li>
</ol>

<p>Connection references are what make solution imports manageable. They let you rebind to environment-specific connections at deployment time.</p>

<p><img src="https://learn.microsoft.com/en-us/power-apps/maker/data-platform/media/env-var-secret4.png" alt="Create and configure a cloud flow that retrieves environment variable secret values" class="post-image" />
<em>Use Dataverse secret retrieval in your cloud flow so values come from Key Vault at runtime, not from hardcoded steps.</em></p>

<h2 id="step-5-build-the-cloud-flow-secret-retrieval-pattern">Step 5: Build the cloud flow secret retrieval pattern</h2>

<p>In your cloud flow:</p>

<ol>
  <li>Trigger (manual/scheduled/event-driven).</li>
  <li>Read <code class="language-plaintext highlighter-rouge">KV_VaultName</code> and secret-name environment variables.</li>
  <li>Use Azure Key Vault action (Get secret) with those values.</li>
  <li>Immediately pass the secret to where it is needed (HTTP action, connector call, or Run desktop flow input).</li>
  <li>Avoid persisting secret values in Dataverse rows, compose outputs, or logs.</li>
</ol>

<p>Security hardening in the flow:</p>

<ul>
  <li>Enable <strong>Secure Inputs</strong> and <strong>Secure Outputs</strong> on all actions touching secret content.</li>
  <li>Avoid unnecessary Compose/Append variable steps that duplicate sensitive data.</li>
  <li>Keep secret handling to the smallest possible action chain.</li>
</ul>

<p><img src="https://learn.microsoft.com/en-us/power-automate/guidance/coding-guidelines/media/secure-inputs.png" alt="Enable secure inputs and secure outputs in action settings" class="post-image" />
<em>Turn on Secure Inputs and Secure Outputs for every action that handles secret values.</em></p>

<h2 id="step-6-pass-secrets-to-desktop-flows-safely">Step 6: Pass secrets to desktop flows safely</h2>

<p>For Power Automate Desktop orchestration:</p>

<ol>
  <li>Define desktop flow input variables for sensitive values.</li>
  <li>In the cloud flow, map Key Vault secret output to those inputs.</li>
  <li>In the desktop flow, consume the input only where required and avoid writing it to logs/files.</li>
  <li>Keep machine/runtime account permissions minimal and scoped to workload needs.</li>
</ol>

<p>Important: The desktop flow should not become a second secret store. Treat inbound credentials as transient runtime values.</p>

<p>Tip: For desktop scenarios that must authenticate with Key Vault-backed credentials, use the official Power Automate for desktop setup guide: https://learn.microsoft.com/power-automate/desktop-flows/create-azurekeyvault-credential</p>

<p>Why this matters in ALM:</p>

<ul>
  <li>It standardizes how machine/runtime credentials are created instead of relying on ad hoc local setup.</li>
  <li>It reduces deployment drift between Dev, Test, and Prod machines.</li>
  <li>It complements this pattern by keeping secret retrieval centralized while desktop credentials remain governed and repeatable.</li>
</ul>

<p><img src="https://learn.microsoft.com/en-us/power-automate/desktop-flows/media/trigger-desktop-flows/action-search.png" alt="Select Run a flow built with Power Automate for desktop in a cloud flow" class="post-image" />
<em>Add the desktop flow action in your cloud flow and map sensitive input variables from secure outputs.</em></p>

<p><img src="https://learn.microsoft.com/en-us/power-automate/desktop-flows/media/trigger-desktop-flows/run-desktop-flow-v2-action-properties-2.png" alt="Map desktop flow input variables from cloud flow action fields" class="post-image" />
<em>Validate input variable mapping so cloud-to-desktop secret handoff works consistently.</em></p>

<h2 id="step-7-package-for-alm-with-managed-solutions">Step 7: Package for ALM with managed solutions</h2>

<p>Use this deployment model:</p>

<ol>
  <li>Build in Dev using an unmanaged solution.</li>
  <li>Export managed solution for Test/Prod.</li>
  <li>Import managed solution into target environment.</li>
  <li>During import, remap connection references to target environment connections.</li>
  <li>Set environment variable values (<code class="language-plaintext highlighter-rouge">KV_VaultName</code>, secret names) for the target environment.</li>
</ol>

<p>What changes per environment:</p>

<ul>
  <li>Connection bindings</li>
  <li>Environment variable values</li>
  <li>Key Vault secret values in Azure</li>
</ul>

<p>What should not change per environment:</p>

<ul>
  <li>Flow logic</li>
  <li>Secret naming convention</li>
  <li>Input/output contract between cloud and desktop flows</li>
</ul>

<h2 id="step-8-validate-deployment-and-runtime-behavior">Step 8: Validate deployment and runtime behavior</h2>

<p>After each import:</p>

<ol>
  <li>Run a controlled test flow execution.</li>
  <li>Verify secrets are resolved from the target environment vault.</li>
  <li>Confirm run history does not expose secret values.</li>
  <li>Confirm desktop flow executes successfully using injected runtime inputs.</li>
  <li>Validate rollback plan (previous solution version and prior secret version if needed).</li>
</ol>

<p><img src="https://learn.microsoft.com/en-us/power-apps/maker/data-platform/media/env-var-secret7.png" alt="Verify output while keeping secret-sensitive actions secured in run history" class="post-image" />
<em>Run history validation confirms the flow works end-to-end after deployment and remapping.</em></p>

<h2 id="step-9-operate-with-rotation-and-governance-in-mind">Step 9: Operate with rotation and governance in mind</h2>

<p>Adopt an operating model, not just a setup:</p>

<ul>
  <li>Rotate secrets on a defined schedule.</li>
  <li>Keep secret names stable while rotating values/versions.</li>
  <li>Monitor failed runs for auth-related regressions after rotation.</li>
  <li>Document ownership: who rotates secrets, who updates connection bindings, who approves production deployments.</li>
</ul>

<p>This is where ALM and security meet: secure changes with predictable releases.</p>

<h2 id="common-mistakes-to-avoid">Common mistakes to avoid</h2>

<ul>
  <li>Hardcoding credentials in cloud or desktop flows</li>
  <li>Using one Key Vault for all environments</li>
  <li>Not using connection references inside solutions</li>
  <li>Skipping secure inputs/outputs on sensitive actions</li>
  <li>Exporting/importing without a checklist for environment variable and connection remapping</li>
</ul>

<h2 id="how-this-should-work-in-enterprise-alm-solutions">How this should work in enterprise ALM solutions</h2>

<p>A mature pattern looks like this:</p>

<ul>
  <li><strong>Dev</strong>: Makers build with environment variables and connection references, never raw credentials.</li>
  <li><strong>Test</strong>: Managed solution import validates that security mapping and secret retrieval work before production.</li>
  <li><strong>Prod</strong>: Deploy approvals include both solution artifacts and secret governance checks.</li>
  <li><strong>Operations</strong>: Secret rotation is coordinated with release windows and monitored through run telemetry.</li>
</ul>

<p>When this is in place, your flows become portable, auditable, and resilient. You reduce credential sprawl, cut deployment risk, and avoid rework every time environments or owners change.</p>

<p>That is exactly why integrating Azure Key Vault with cloud and desktop flows is not just a security best practice. It is an ALM best-practice.</p>]]></content><author><name>Ricardo Calejo</name></author><category term="Power Automate" /><category term="Power Automate" /><category term="Power Automate Desktop" /><category term="Azure Key Vault" /><category term="Security" /><category term="ALM" /><category term="Managed Solutions" /><category term="Connection References" /><category term="Environment Variables" /><category term="Governance" /><summary type="html"><![CDATA[A practical step-by-step guide to integrating Azure Key Vault with cloud and desktop flows, with a secure ALM pattern using solutions, connection references, and environment variables.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-integrate-azure-key-vault-with-cloud-and-desktop-flows-in-alm.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-integrate-azure-key-vault-with-cloud-and-desktop-flows-in-alm.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Child agents in Copilot Studio are your best friends</title><link href="https://ppautomiq.com/copilot%20studio/child-agents-in-copilot-studio-are-your-best-friends/" rel="alternate" type="text/html" title="Child agents in Copilot Studio are your best friends" /><published>2026-04-04T00:00:00+00:00</published><updated>2026-04-04T00:00:00+00:00</updated><id>https://ppautomiq.com/copilot%20studio/child-agents-in-copilot-studio-are-your-best-friends</id><content type="html" xml:base="https://ppautomiq.com/copilot%20studio/child-agents-in-copilot-studio-are-your-best-friends/"><![CDATA[<p>Did you know that <strong>child agents in Copilot Studio let you break a monolithic agent into focused, modular sub-agents</strong> — each with its own tools, knowledge, and instructions?</p>

<p><img src="/assets/images/tip-child-agents-related-modular-ai.jpg" alt="Abstract network of modular AI components connected as a child-agent architecture" class="post-image" />
<em>Visual concept: modular AI architecture and orchestration</em></p>

<p>When you start building agents, putting everything in one agent feels natural. A few tools, a couple of knowledge sources, some instructions — it works fine. But as the agent grows to handle more scenarios, things start to degrade: the orchestrator struggles to pick the right tool, responses become less precise, and the instructions turn into a wall of text that’s hard to maintain.</p>

<p>Child agents fix this by letting you decompose your agent into smaller, purpose-built units.</p>

<h2 id="what-child-agents-actually-give-you">What child agents actually give you</h2>

<p>A child agent is a lightweight agent that lives inside your main agent. It has its own:</p>

<ul>
  <li><strong>Instructions</strong> — focused on a single task or domain</li>
  <li><strong>Tools</strong> — only the tools relevant to that task</li>
  <li><strong>Knowledge sources</strong> — scoped to what the child agent needs to answer</li>
  <li><strong>Inputs and outputs</strong> — structured data exchange with the parent agent</li>
</ul>

<p>When the parent agent receives a user query, the orchestrator decides which child agent (or tool, or topic) should handle it — based on the child agent’s name and description. The child agent runs with its own orchestration, uses its own tools and knowledge, and returns results back to the parent.</p>

<h2 id="why-this-matters-more-than-you-think">Why this matters more than you think</h2>

<h3 id="tool-limits-stop-being-a-problem">Tool limits stop being a problem</h3>

<p>Copilot Studio agents have limits on how many tools they can effectively use. When your agent has 30+ tools all competing for the orchestrator’s attention, accuracy drops. Child agents have <strong>their own separate tool limits</strong>, so you can logically group tools across multiple child agents without hitting the ceiling on the parent.</p>

<h3 id="the-orchestrator-gets-smarter-not-dumber">The orchestrator gets smarter, not dumber</h3>

<p>With fewer choices at each level, the orchestrator makes better decisions. Instead of choosing between 40 tools, the parent agent chooses between 5 child agents — and each child agent chooses between its own small set of tools. Two precise decisions beat one confused one.</p>

<h3 id="instructions-stay-manageable">Instructions stay manageable</h3>

<p>Instead of one massive instruction block that tries to cover every scenario, each child agent gets focused instructions for its specific domain. An “IT Support” child agent has instructions about ticket creation and status checks. An “HR FAQ” child agent has instructions about leave policies and benefits. Neither clutters the other.</p>

<h3 id="testing-becomes-targeted">Testing becomes targeted</h3>

<p>When something breaks, you know exactly where to look. Test each child agent in isolation with queries specific to its domain. If the “Order Lookup” child agent returns wrong results, you fix it there — without touching the rest of the agent.</p>

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

<p>For a customer service agent, instead of building one agent with every tool and knowledge source:</p>

<ol>
  <li><strong>Parent agent</strong> — minimal instructions, handles greetings and routing</li>
  <li><strong>Order Management</strong> child agent — tools for order lookup, tracking, returns</li>
  <li><strong>Billing</strong> child agent — tools for invoice retrieval, payment status, refund requests</li>
  <li><strong>Product Support</strong> child agent — knowledge sources from product documentation, FAQ articles</li>
</ol>

<p>Each child agent is focused, testable, and maintainable independently. The parent agent’s job is simply to understand intent and delegate.</p>

<h2 id="child-agents-vs-connected-agents">Child agents vs. connected agents</h2>

<p>Child agents live <strong>inside</strong> your main agent — same solution, same deployment, same environment. They’re ideal when one team manages the whole agent and you don’t need independent ALM.</p>

<p>Connected agents are <strong>separate, independent agents</strong> that your main agent calls externally. Use those when different teams own different agents, or when you need independent publishing, authentication, or model configuration.</p>

<p>You can mix both in the same solution — use child agents for tightly coupled functionality and connected agents for independently managed capabilities.</p>

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

<ul>
  <li><strong>Name and description matter</strong> — the orchestrator routes based on these. A child agent called “Helper” with the description “Helps with things” will get misrouted constantly. Be specific.</li>
  <li><strong>Latency adds up</strong> — each child agent adds an orchestration hop. Don’t create child agents for trivial single-tool operations where the parent could handle it directly.</li>
  <li><strong>Performance degrades around 30-40 choices</strong> — if your parent agent plus all its child agents, topics, and tools exceeds this threshold, you may need to split into connected agents instead.</li>
</ul>

<p>Child agents are the difference between an agent that works at demo scale and one that works at production scale. Start using them early — restructuring a monolithic agent later is always harder than designing modular from the start.</p>]]></content><author><name>Ricardo Calejo</name></author><category term="Copilot Studio" /><category term="Copilot Studio" /><category term="Child Agents" /><category term="Multi-Agent" /><category term="Orchestration" /><category term="Agent Design" /><category term="Modularity" /><category term="Enterprise" /><summary type="html"><![CDATA[Child agents let you break a large Copilot Studio agent into focused, modular sub-agents — each with its own tools, knowledge, and instructions — keeping orchestration clean and scalable.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-child-agents-in-copilot-studio-are-your-best-friends.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-child-agents-in-copilot-studio-are-your-best-friends.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The Default Deployment Pipeline rule auto-links environments to your pipeline</title><link href="https://ppautomiq.com/governance/the-default-deployment-pipeline-rule-auto-links-environments-to-your-pipeline/" rel="alternate" type="text/html" title="The Default Deployment Pipeline rule auto-links environments to your pipeline" /><published>2026-04-01T00:00:00+00:00</published><updated>2026-04-01T00:00:00+00:00</updated><id>https://ppautomiq.com/governance/the-default-deployment-pipeline-rule-auto-links-environments-to-your-pipeline</id><content type="html" xml:base="https://ppautomiq.com/governance/the-default-deployment-pipeline-rule-auto-links-environments-to-your-pipeline/"><![CDATA[<p>Did you know that <strong>the Default Deployment Pipeline rule in environment groups automatically links every environment in the group to a specific pipeline as a development environment</strong>?</p>

<p>Normally, when you set up pipelines in Power Platform, you need to manually associate each development environment with a pipeline. That’s manageable with a few environments, but it doesn’t scale when you have dozens or hundreds of maker environments — especially if they’re being created dynamically through environment routing.</p>

<p>The <strong>Default deployment pipeline</strong> rule solves this. You configure it once on an environment group, point it to a pipeline, publish the rule, and from that point on, every environment that joins the group is automatically registered as a development environment in that pipeline. No manual linking. No admin intervention per environment.</p>

<h2 id="how-it-works">How it works</h2>

<ol>
  <li><strong>Create an environment group</strong> in Power Platform admin center (or use an existing one).</li>
  <li><strong>Go to the Rules tab</strong> for that group.</li>
  <li><strong>Configure the Default deployment pipeline rule</strong> — select the pipeline you want environments in this group to use.</li>
  <li><strong>Publish the rules.</strong></li>
</ol>

<p>From now on, any Managed Environment added to this group — whether manually or through environment routing — is automatically linked to the specified pipeline as a development environment. Makers in those environments see the pipeline immediately and can start deploying solutions through it.</p>

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

<p>Without this rule, scaling pipelines means one of two things:</p>

<ul>
  <li><strong>Manual work</strong>: An admin links each new environment to a pipeline in the Deployment Pipeline Configuration app. This is fine for a handful of environments but becomes a bottleneck at scale.</li>
  <li><strong>Personal pipelines</strong>: Makers create their own pipelines via the platform host. This works but gives less centralized visibility and control — personal pipelines can’t be shared or extended.</li>
</ul>

<p>The Default deployment pipeline rule gives you the best of both worlds: <strong>centralized governance with zero per-environment effort</strong>. The admin defines the pipeline once, and the environment group enforces it automatically across every member environment.</p>

<h2 id="combine-with-environment-routing-for-full-automation">Combine with environment routing for full automation</h2>

<p>This rule becomes especially powerful when paired with environment routing:</p>

<ol>
  <li><strong>Enable environment routing</strong> — new makers automatically get their own developer environment.</li>
  <li><strong>Point environment routing to an environment group</strong> — newly created environments land in the group and inherit its rules.</li>
  <li><strong>Configure the Default deployment pipeline rule</strong> on that group — every new environment is immediately linked to the pipeline.</li>
</ol>

<p>The result: a maker opens Power Apps or Power Automate for the first time, gets their own developer environment, and already has a governed pipeline ready to deploy their solutions to QA or production. No tickets, no waiting for an admin to configure anything.</p>

<h2 id="why-this-is-critical-for-copilot-studio-champions">Why this is critical for Copilot Studio champions</h2>

<p>This feature becomes even more important in organizations running Copilot Studio champions programs. In these scenarios, you typically have multiple business users across departments building agents in their own environments — and the number of environments grows fast as champions are onboarded.</p>

<p>Without the Default deployment pipeline rule, every time a new champion gets an environment, an admin has to manually link it to a pipeline before that champion can deploy their agent to a shared or production environment. That creates a bottleneck that slows down the very people you’re trying to empower.</p>

<p>With this rule configured on the champions’ environment group, each new champion environment is immediately pipeline-ready. The champion can build an agent in Copilot Studio, and when it’s ready, deploy it through the governed pipeline to a shared environment — without filing a ticket or waiting for IT. The admin still controls where solutions land (the target environments), but the champion gets a self-service path from day one.</p>

<p>This is especially valuable because Copilot Studio agents often iterate quickly. Champions need to test, refine, and redeploy frequently. If the pipeline isn’t there from the start, they’ll either skip ALM entirely (exporting and importing solutions manually) or wait on admin turnaround — both of which defeat the purpose of a champions program.</p>

<h2 id="what-to-keep-in-mind">What to keep in mind</h2>

<ul>
  <li>The rule is currently in <strong>preview</strong>.</li>
  <li>It links environments as <strong>development environments</strong> in the pipeline — the target environments (QA, production) still need to be configured in the pipeline itself.</li>
  <li>Only <strong>Managed Environments</strong> can be members of environment groups, so this rule naturally enforces that requirement.</li>
  <li>If an environment is removed from the group, it retains its last configuration but becomes unlocked for local admin changes.</li>
</ul>

<p>This is one of those features that quietly removes a scaling bottleneck. If you’re using pipelines and environment groups, configure this rule — it turns pipeline enrollment from a manual admin task into something that just happens.</p>]]></content><author><name>Ricardo Calejo</name></author><category term="Governance" /><category term="Governance" /><category term="Managed Environments" /><category term="Pipelines" /><category term="ALM" /><category term="Environment Groups" /><category term="Copilot Studio" /><category term="Power Platform Admin" /><category term="Deployment" /><category term="Enterprise" /><summary type="html"><![CDATA[The Default Deployment Pipeline rule in environment groups automatically links every environment in the group to a specific pipeline as a development environment — no manual configuration per environment.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ppautomiq.com/assets/images/tip-the-default-deployment-pipeline-rule-auto-links-environments-to-your-pipeline.png" /><media:content medium="image" url="https://ppautomiq.com/assets/images/tip-the-default-deployment-pipeline-rule-auto-links-environments-to-your-pipeline.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>