<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Zsolt Zombik</title>
    <description>The latest articles on Forem by Zsolt Zombik (@aidevme).</description>
    <link>https://forem.com/aidevme</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3762572%2Fb62d534e-81a0-41cb-928d-c997454565ea.png</url>
      <title>Forem: Zsolt Zombik</title>
      <link>https://forem.com/aidevme</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aidevme"/>
    <language>en</language>
    <item>
      <title>Canvas Apps vs Code Apps in Power Apps: When low-code hits its ceiling</title>
      <dc:creator>Zsolt Zombik</dc:creator>
      <pubDate>Fri, 17 Apr 2026 06:22:28 +0000</pubDate>
      <link>https://forem.com/aidevme/canvas-apps-vs-code-apps-in-power-apps-when-low-code-hits-its-ceiling-2hpa</link>
      <guid>https://forem.com/aidevme/canvas-apps-vs-code-apps-in-power-apps-when-low-code-hits-its-ceiling-2hpa</guid>
      <description>&lt;p&gt;You're three months into a Power Platform engagement. The Canvas App you built is impressive — multiple screens, solid Dataverse model, Power Automate flows running clean. Stakeholders are happy. The maker on the team has already started adding screens themselves.&lt;/p&gt;

&lt;p&gt;Then the requirements change. A filterable grid against 50,000 Dataverse rows. A custom chart with real-time updates. Pixel-perfect components from a Figma file. And then someone asks: "Can we write unit tests for the business logic?"&lt;/p&gt;

&lt;p&gt;You're staring at Power Fx, knowing it can't get you there. &lt;strong&gt;This is the ceiling.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📄 &lt;strong&gt;This post summarizes&lt;/strong&gt; &lt;a href="https://aidevme.com/power-apps-canvas-apps-vs-code-apps-when-low-code-hits-its-ceiling/" rel="noopener noreferrer"&gt;Power Apps: Canvas Apps vs. Code Apps – When Low-Code Hits Its Ceiling&lt;/a&gt; &lt;strong&gt;originally published on AIDevMe.&lt;/strong&gt;&lt;br&gt;
The full article includes a head-to-head comparison table across 15 dimensions, architecture deep dive with runtime execution models, complete CSP security configuration guide, decision framework with specific signals, and FAQ covering the 10 most common Code App gotchas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Code Apps are not PCF controls — this is where most architects get it wrong
&lt;/h2&gt;

&lt;p&gt;When I say "Power Apps Code Apps," most people think "PCF controls." That's not it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PCF (Power Apps Component Framework) controls&lt;/strong&gt; are individual UI components you embed in Canvas or Model-Driven Apps. They're React components with a specific lifecycle, wrapped to integrate into the Power Apps runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Apps&lt;/strong&gt; are full applications. React + TypeScript projects developed in VS Code, run locally against a live Dataverse environment, deployed as solution components. They have their own routing, state management, component tree. They access Dataverse and the full Power Platform connector catalog via the Power Apps client library (&lt;code&gt;@microsoft/power-apps&lt;/code&gt;) from JavaScript.&lt;/p&gt;

&lt;p&gt;The scaffold comes from the official template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx degit github:microsoft/PowerAppsCodeApps/templates/vite my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
pac auth create
pac &lt;span class="nb"&gt;env &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="nt"&gt;--environment&lt;/span&gt; &amp;lt;Your environment ID&amp;gt;
npm &lt;span class="nb"&gt;install
&lt;/span&gt;pac code init &lt;span class="nt"&gt;--displayname&lt;/span&gt; &lt;span class="s2"&gt;"My Code App"&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You write real TypeScript with hooks, context, custom components. Any npm package that runs in a browser is available. Full developer experience: IntelliSense, debugging, source maps, Jest test suite in CI/CD.&lt;/p&gt;

&lt;p&gt;The app inherits enterprise governance — Microsoft Entra auth, DLP enforcement, Conditional Access — but you control the architecture. It's closer to building a React web app that happens to run inside Power Platform than a Canvas App built with code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three signals that Canvas Apps are fighting you
&lt;/h2&gt;

&lt;p&gt;Canvas Apps are excellent tools. I reach for them constantly. But they have a capability ceiling, and when you hit it, you feel it immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance at scale.&lt;/strong&gt; Complex filtering and aggregations against tens of thousands of Dataverse rows require workarounds — collections, Power Automate flows, defensive UI patterns. A Code App using direct OData access through the client library? No comparison. The delegation model in Power Fx helps, but when you're writing intermediate Power Automate flows just to pre-aggregate data because the Canvas formula layer can't handle it, you've crossed the line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Component reuse and maintainability.&lt;/strong&gt; State management across 30+ screens becomes painful. You can't import npm packages. There's no dependency injection. When Canvas Apps grow beyond 40 screens, they become difficult to maintain — not because developers are careless, but because the paradigm doesn't scale to that complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No real unit testing.&lt;/strong&gt; You cannot write meaningful unit tests for Power Fx formulas the way a professional development team expects. PAC CLI has basic testing support, but it doesn't compare to Jest and React Testing Library in a Code App where you can test components, mock API calls, and validate state transitions.&lt;/p&gt;

&lt;p&gt;When you're spending more time fighting Canvas limitations than solving the business problem, it's time to move up the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architectural difference that actually matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Canvas Apps&lt;/strong&gt; operate on a platform-managed abstraction. The runtime interprets your Power Fx formulas, manages state, handles rendering, routes data calls through the connector layer. You work within the platform's model.&lt;/p&gt;

&lt;p&gt;Data calls from Canvas Apps flow through connectors over OData. Standard online connectors travel from the client through Azure API Management and the connector layer to the target data source and back — each layer adds latency. Dataverse is the fast path (direct to environment instance), but you're still inside the Power Fx abstraction. The &lt;code&gt;.msapp&lt;/code&gt; bundle is a ZIP archive of serialized screen definitions and control metadata. No direct DOM access. No module bundler. Your logic lives entirely in Power Fx.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Apps&lt;/strong&gt; operate on a developer-controlled execution model. Your TypeScript compiles to JavaScript and runs in the browser. The platform provides the host (authentication, app lifecycle) and the Power Apps client library (connector access), but everything between — component architecture, state management, rendering logic, data fetching strategy — is yours to design and own.&lt;/p&gt;

&lt;p&gt;The platform constraints move from "the runtime won't let you do this" to "the CSP policy needs to allow this origin." That's both the power and the cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security: CSP enforced strict by default
&lt;/h2&gt;

&lt;p&gt;Canvas Apps ship with Content Security Policy &lt;strong&gt;off by default&lt;/strong&gt;. Even when enabled, the default is permissive — &lt;code&gt;script-src * 'unsafe-inline' 'unsafe-eval'&lt;/code&gt; — trading security for compatibility.&lt;/p&gt;

&lt;p&gt;Code Apps enforce CSP &lt;strong&gt;strict by default&lt;/strong&gt; from day one: &lt;code&gt;connect-src 'none'&lt;/code&gt;, &lt;code&gt;script-src 'self'&lt;/code&gt;. Every outbound fetch or XHR call — including calls to your own Azure Functions backend — is blocked until you explicitly allowlist the origin in the Power Platform admin center under Settings → Privacy + Security → Content Security Policy → App tab, or via the &lt;code&gt;PowerApps_CSPConfigCodeApps&lt;/code&gt; REST API setting.&lt;/p&gt;

&lt;p&gt;For regulated industries where InfoSec needs auditable control over exactly which origins the app communicates with, this is an advantage. You can prove to a security auditor exactly which origins are allowlisted, enforce it at the platform level, and get violation reports sent to a SIEM endpoint. Canvas Apps can't offer that level of CSP specificity — only &lt;code&gt;frame-ancestors&lt;/code&gt; is customizable; everything else is platform-controlled.&lt;/p&gt;

&lt;p&gt;For developers spinning up their first Code App, it's the gotcha that costs an afternoon wondering why fetch calls silently fail. Read the CSP docs before you deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fusion team pattern: Canvas and Code, not Canvas vs Code
&lt;/h2&gt;

&lt;p&gt;Here's the insight that changed how I design solutions: &lt;strong&gt;Canvas Apps vs Code Apps isn't an either/or decision.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On the Nextwit Environment Management Application, the architecture was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dataverse&lt;/strong&gt; as the shared backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power Automate&lt;/strong&gt; for long-running provisioning workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas App&lt;/strong&gt; for the operational dashboard — maintained by a maker without developer involvement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code App&lt;/strong&gt; for the architect-facing frontend — dynamic filtering, complex state, real-time updates, custom React components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither app was a compromise. Each was exactly the right tool for its audience. This is the fusion team pattern: citizen developers and pro developers working in parallel on different parts of the same solution, each in the paradigm that fits their skills. Both apps share the same Dataverse tables, subject to the same security roles and DLP policies.&lt;/p&gt;

&lt;p&gt;When a stakeholder asks "should we use Canvas or Code Apps?" — often the right answer is "yes."&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code Apps are full React + TypeScript applications&lt;/strong&gt;, not PCF controls — they have their own routing, state management, and component tree&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Apps require Power Apps Premium licensing&lt;/strong&gt; for end-users, not standard per-user licensing — factor this into your project budget from day one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSP is enforced strict by default in Code Apps&lt;/strong&gt; — &lt;code&gt;connect-src 'none'&lt;/code&gt; will block all external API calls until you configure allowed origins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Apps must be explicitly enabled per environment&lt;/strong&gt; by an admin in the Power Platform admin center — it's off by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Canvas ceiling shows up in performance at scale, complex UI, ALM friction, and unit testing&lt;/strong&gt; — when you hit it, you feel it immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The fusion team pattern uses both&lt;/strong&gt; — Canvas for makers, Code for developers, shared Dataverse backend — this is the most powerful architectural pattern in the Power Platform toolkit right now&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Read the full article
&lt;/h2&gt;

&lt;p&gt;This post covers the strategic comparison, but the complete article on AIDevMe goes further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Head-to-head comparison table&lt;/strong&gt; across 15 dimensions (paradigm, tooling, licensing, ALM, performance ceiling, governance, CI/CD integration)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture deep dive&lt;/strong&gt; — how Canvas and Code Apps actually work at runtime, with execution model diagrams and data flow paths&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The decision framework&lt;/strong&gt; — specific signals for when to reach for Canvas, Code, or both&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic development&lt;/strong&gt; with the &lt;code&gt;microsoft/power-platform-skills&lt;/code&gt; marketplace for Claude Code and GitHub Copilot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code App setup walkthrough&lt;/strong&gt; with the npm-based CLI and PAC CLI hybrid approach&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security configuration&lt;/strong&gt; — complete CSP directive control and how to configure per environment via admin center or REST API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQ section&lt;/strong&gt; covering the 10 most common Code App gotchas (CSP failures, licensing requirements, environment enablement, ALM strategies)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://aidevme.com/power-apps-canvas-apps-vs-code-apps-when-low-code-hits-its-ceiling/" rel="noopener noreferrer"&gt;Read the complete article: Power Apps: Canvas Apps vs. Code Apps – When Low-Code Hits Its Ceiling&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>react</category>
      <category>typescript</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Under the Hood: How Dataverse Skills Actually Work (And Why It Matters for Your Copilot Credit Bill)</title>
      <dc:creator>Zsolt Zombik</dc:creator>
      <pubDate>Sat, 11 Apr 2026 06:38:03 +0000</pubDate>
      <link>https://forem.com/aidevme/under-the-hood-how-dataverse-skills-actually-work-and-why-it-matters-for-your-copilot-credit-bill-4phd</link>
      <guid>https://forem.com/aidevme/under-the-hood-how-dataverse-skills-actually-work-and-why-it-matters-for-your-copilot-credit-bill-4phd</guid>
      <description>&lt;p&gt;I asked my coding agent to "create a table for tracking employee certifications."&lt;/p&gt;

&lt;p&gt;Five minutes later: complete Dataverse schema. Five tables. Relationships. Sample data. The whole thing.&lt;/p&gt;

&lt;p&gt;But here's what kept me up that night: &lt;strong&gt;How did the agent decide which tool to use for each step?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why MCP Server for metadata queries, Python SDK for bulk data, and PAC CLI for solution export?&lt;/p&gt;

&lt;p&gt;More importantly: &lt;strong&gt;One of those costs Copilot credits. The other two don't.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's tear apart Dataverse Skills to see how it actually works.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Two Unfair Advantages
&lt;/h2&gt;

&lt;p&gt;Understanding skill internals gives you:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Cost Control Through Tool Selection
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP calls:&lt;/strong&gt; Consume Copilot credits (per 10 responses)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python SDK calls:&lt;/strong&gt; Free (direct Web API)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PAC CLI calls:&lt;/strong&gt; Free (local tooling)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When your agent uses MCP for a bulk operation that could've used the Python SDK, you're paying unnecessarily.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Organizational Knowledge as Code
&lt;/h3&gt;

&lt;p&gt;Write skills that encode your patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publisher prefix conventions&lt;/li&gt;
&lt;li&gt;Mandatory audit columns
&lt;/li&gt;
&lt;li&gt;Solution structure standards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Update one skill file → every developer follows the new pattern automatically. No retraining needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skill File Anatomy: It's Just Markdown
&lt;/h2&gt;

&lt;p&gt;Every Dataverse skill: Markdown + YAML frontmatter. That's it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft's Official Format
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dv-metadata&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;Create and modify Dataverse tables, columns, relationships, forms, and views.&lt;/span&gt;
  &lt;span class="s"&gt;Use when: "add column", "create table", "modify form".&lt;/span&gt;
  &lt;span class="s"&gt;Do not use when: exporting solutions (use dv-solution).&lt;/span&gt;
&lt;span class="s"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Skill: Metadata — Making Changes&lt;/span&gt;

&lt;span class="gs"&gt;**Do not write solution XML by hand.**&lt;/span&gt;

The correct workflow:
&lt;span class="p"&gt;1.&lt;/span&gt; Make the change in the environment via MetadataService API
&lt;span class="p"&gt;2.&lt;/span&gt; Pull the change into repo via &lt;span class="sb"&gt;`pac solution export`&lt;/span&gt; + unpack
&lt;span class="p"&gt;3.&lt;/span&gt; Commit the result

The exported XML is generated by Dataverse itself and is always valid.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; The &lt;code&gt;description&lt;/code&gt; field's "Use when" triggers are what agents use to match your prompts to skills.&lt;/p&gt;




&lt;h2&gt;
  
  
  Extended Format: Security Boundaries
&lt;/h2&gt;

&lt;p&gt;For organizational skills, extend the frontmatter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aidevme-create-table&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;Creates a new custom table in Dataverse.&lt;/span&gt;
  &lt;span class="s"&gt;Use when: "create table", "add entity", "new table".&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
&lt;span class="na"&gt;allowed-tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;python&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;file&lt;/span&gt;
  &lt;span class="c1"&gt;# NO web_fetch - prevents data exfiltration&lt;/span&gt;
&lt;span class="na"&gt;safety&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Verify publisher prefix matches active solution&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NEVER add tables to Default solution&lt;/span&gt;
&lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dataverse-connect&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dataverse-create-solution&lt;/span&gt;
&lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;normal&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The &lt;code&gt;allowed-tools&lt;/code&gt; Security Boundary
&lt;/h3&gt;

&lt;p&gt;This field restricts which tools the agent can use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A data-loading skill may allow &lt;code&gt;bash&lt;/code&gt; and &lt;code&gt;file&lt;/code&gt; for CSV imports.&lt;/p&gt;

&lt;p&gt;But allowing &lt;code&gt;web_fetch&lt;/code&gt; opens the door to prompt injection attacks that exfiltrate data via external APIs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;allowed-tools&lt;/code&gt; field is your defense against prompt injection.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How Agents Chain Skills
&lt;/h2&gt;

&lt;p&gt;When you type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a table for tracking employee certifications
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scans&lt;/strong&gt; all skills for relevance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identifies&lt;/strong&gt; &lt;code&gt;dataverse-create-table&lt;/code&gt; as primary match&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks&lt;/strong&gt; &lt;code&gt;requires&lt;/code&gt; field → loads prerequisites first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executes&lt;/strong&gt; steps in sequence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selects&lt;/strong&gt; tools based on &lt;code&gt;allowed-tools&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For complex prompts, the chain looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;dataverse-connect&lt;/span&gt;
  &lt;span class="s"&gt;└── dataverse-mcp-register&lt;/span&gt;
&lt;span class="s"&gt;dataverse-create-solution&lt;/span&gt;
&lt;span class="s"&gt;dataverse-create-table (× 5)&lt;/span&gt;
  &lt;span class="s"&gt;└── dataverse-create-column (× N)&lt;/span&gt;
  &lt;span class="s"&gt;└── dataverse-create-relationship (× 2)&lt;/span&gt;
&lt;span class="s"&gt;dataverse-load-data&lt;/span&gt;
&lt;span class="s"&gt;dataverse-query&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Not hardcoded.&lt;/strong&gt; Built from &lt;code&gt;requires&lt;/code&gt; declarations + semantic analysis.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three-Tool Strategy (The Part That Really Matters)
&lt;/h2&gt;

&lt;p&gt;Agent-driven development requires encoding tool selection logic into skills themselves.&lt;/p&gt;

&lt;p&gt;It's about three factors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cost management:&lt;/strong&gt; MCP calls = Copilot credits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational correctness:&lt;/strong&gt; Bulk ops need transactional integrity
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architectural compliance:&lt;/strong&gt; ALM needs PAC CLI for audit trails&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Tool 1: Dataverse MCP Server
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast metadata queries (&lt;code&gt;list_tables&lt;/code&gt;, &lt;code&gt;describe_table&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Simple record reads (&lt;code&gt;read_query&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Single-record operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charged per use (Copilot credits)&lt;/li&gt;
&lt;li&gt;Not optimal for bulk operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tool 2: Dataverse Python SDK
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bulk data operations (100+ records)&lt;/li&gt;
&lt;li&gt;Pandas DataFrame transformations&lt;/li&gt;
&lt;li&gt;ETL pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The advantage:&lt;/strong&gt; Uses Web API directly. &lt;strong&gt;No MCP charges.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;PowerPlatform.Dataverse.client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DataverseClient&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AzureCliCredential&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DataverseClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://yourorg.crm.dynamics.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="nc"&gt;AzureCliCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Bulk create with CreateMultiple (100x faster)
&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aidevme_firstname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consultant &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aidevme_specialization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Power Platform&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aidevme_consultant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Created &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; consultants&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tool 3: PAC CLI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solution ALM (export, import, publish)&lt;/li&gt;
&lt;li&gt;Environment management&lt;/li&gt;
&lt;li&gt;Component registration
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Solution export for ALM&lt;/span&gt;
pac solution &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; ConsultingTracker &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--path&lt;/span&gt; ./solutions/ConsultingTracker.zip &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--managed&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;

&lt;span class="c"&gt;# Publish all customizations&lt;/span&gt;
pac solution publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Decision Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;th&gt;Python SDK&lt;/th&gt;
&lt;th&gt;PAC CLI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;List tables&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read 10 records&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read 10,000 records&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create 1 record&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create 500 records&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Export solution&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The cost impact:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Typical dev session (5-table solution): 25-50 MCP calls&lt;/p&gt;

&lt;p&gt;50-person team, 10 sessions/week: &lt;strong&gt;12,500-25,000 MCP calls/month&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Industry benchmark: &lt;strong&gt;$200-800/month for 20-100 developers&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Production Example
&lt;/h2&gt;

&lt;p&gt;From &lt;a href="https://github.com/DanielKerridge/claude-code-power-platform-skills" rel="noopener noreferrer"&gt;Daniel Kerridge's claude-code-power-platform-skills&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dataverse-plugins&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;Use when developing Dataverse plugins.&lt;/span&gt;
  &lt;span class="s"&gt;Use when: "plugin", "server-side logic", "PreValidation".&lt;/span&gt;
&lt;span class="s"&gt;---&lt;/span&gt;

&lt;span class="gu"&gt;## CRITICAL RULES&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Plugins run in a sandbox.**&lt;/span&gt; Restricted access to external resources.
&lt;span class="p"&gt;
2.&lt;/span&gt; &lt;span class="gs"&gt;**2-minute timeout**&lt;/span&gt; for synchronous plugins. Use async or 
   offload to Power Automate for long operations.
&lt;span class="p"&gt;
3.&lt;/span&gt; &lt;span class="gs"&gt;**Throw `InvalidPluginExecutionException`**&lt;/span&gt; to show user-facing 
   errors. All other exceptions = generic error messages.
&lt;span class="p"&gt;
4.&lt;/span&gt; &lt;span class="gs"&gt;**Never use static variables**&lt;/span&gt; for state. Plugin instances are 
   cached and reused. Use &lt;span class="sb"&gt;`IPluginExecutionContext.SharedVariables`&lt;/span&gt;.
&lt;span class="p"&gt;
5.&lt;/span&gt; &lt;span class="gs"&gt;**Always register entity images**&lt;/span&gt; when you need pre/post values. 
   Don't make extra Retrieve calls.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; Junior developers make these mistakes once (painfully). When encoded in the skill, &lt;strong&gt;the agent never makes them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's organizational knowledge as code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing Your Own Skills
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Base Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;publisher&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-{action}-{subject}&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;What it does and when to use it.&lt;/span&gt;
  &lt;span class="s"&gt;Use when: "trigger phrases".&lt;/span&gt;
  &lt;span class="s"&gt;Do not use when: {anti-patterns}.&lt;/span&gt;
&lt;span class="s"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Skill: {Title}&lt;/span&gt;

&lt;span class="gu"&gt;## Purpose&lt;/span&gt;
What does this skill do?

&lt;span class="gu"&gt;## Pre-conditions&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; What must be true before running?
&lt;span class="p"&gt;2.&lt;/span&gt; What environment state is assumed?

&lt;span class="gu"&gt;## Steps&lt;/span&gt;

&lt;span class="gu"&gt;### Step 1: Validate inputs&lt;/span&gt;
What to check first.

&lt;span class="gu"&gt;### Step 2: Main operation&lt;/span&gt;
The actual work. Include tool calls, code examples.

&lt;span class="gu"&gt;### Step 3: Verify and report&lt;/span&gt;
How to confirm success.

&lt;span class="gu"&gt;## Error handling&lt;/span&gt;
| Error | Cause | Resolution |
|-------|-------|------------|
| ... | ... | ... |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extended Template (With Security)
&lt;/h3&gt;

&lt;p&gt;Add these optional fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;publisher&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-{action}-{subject}&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;Description with triggers.&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
&lt;span class="na"&gt;allowed-tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;python&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;file&lt;/span&gt;
&lt;span class="na"&gt;safety&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Explicit safety rules&lt;/span&gt;
&lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dataverse-connect&lt;/span&gt;
&lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;normal&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Testing Your Skills
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Claude Code
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.claude-plugin/marketplace.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My Power Platform Skills"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aidevme-create-table"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"skills/aidevme-create-table.md"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  For GitHub Copilot
&lt;/h3&gt;

&lt;p&gt;Add to &lt;code&gt;.github/plugins/yourorg/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test with explicit invocation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/aidevme-create-environment Create a sandbox named &lt;span class="s2"&gt;"Project Alpha Dev"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Debugging Checklist
&lt;/h2&gt;

&lt;p&gt;Agent using wrong tool?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;✅ Check skill's &lt;code&gt;description&lt;/code&gt; field for user's trigger phrase&lt;/li&gt;
&lt;li&gt;✅ Add explicit tool guidance in step instructions&lt;/li&gt;
&lt;li&gt;✅ Review &lt;code&gt;allowed-tools&lt;/code&gt; restrictions&lt;/li&gt;
&lt;li&gt;✅ Increase &lt;code&gt;priority&lt;/code&gt; if competing with built-in skills&lt;/li&gt;
&lt;li&gt;✅ Verify skill registration in marketplace.json&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Key Takeaway
&lt;/h2&gt;

&lt;p&gt;The most valuable IP in intent-driven development: &lt;strong&gt;well-crafted skills that encode your organization's patterns.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you write a skill that says:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Always verify publisher prefix before creating tables"&lt;/li&gt;
&lt;li&gt;"Never add to Default solution"
&lt;/li&gt;
&lt;li&gt;"Use Python SDK for 100+ records"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You're encoding decisions that would otherwise live in developer heads and tribal knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update one skill file → every agent session follows the new pattern.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next: Part 4
&lt;/h2&gt;

&lt;p&gt;Coming up: &lt;strong&gt;Enterprise Architecture View&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP billing models (real benchmarks)&lt;/li&gt;
&lt;li&gt;Managed Environment governance&lt;/li&gt;
&lt;li&gt;ALM integration patterns&lt;/li&gt;
&lt;li&gt;Security posture (prompt injection, secrets)&lt;/li&gt;
&lt;li&gt;2026 Power Platform roadmap context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The questions that determine enterprise adoption.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;📖 &lt;strong&gt;Full Technical Guide:&lt;/strong&gt; &lt;a href="https://aidevme.com/under-the-hood-how-dataverse-skills-work-and-how-to-write-your-own/" rel="noopener noreferrer"&gt;aidevme.com/under-the-hood-how-dataverse-skills-work&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Daniel Kerridge's Skills:&lt;/strong&gt; &lt;a href="https://github.com/DanielKerridge/claude-code-power-platform-skills" rel="noopener noreferrer"&gt;github.com/DanielKerridge/claude-code-power-platform-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎯 &lt;strong&gt;Microsoft Dataverse Skills:&lt;/strong&gt; &lt;a href="https://github.com/microsoft/dataverse-skills" rel="noopener noreferrer"&gt;github.com/microsoft/dataverse-skills&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Discussion
&lt;/h2&gt;

&lt;p&gt;Have you written custom Dataverse skills? What patterns are you encoding?&lt;/p&gt;

&lt;p&gt;What tool selection decisions have you made (MCP vs SDK vs CLI)?&lt;/p&gt;

&lt;p&gt;Drop a comment below 👇 — I reply to everyone.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>mcp</category>
      <category>microsoft</category>
      <category>productivity</category>
    </item>
    <item>
      <title>From Scripts to Intent: How AI Agents Are Changing Power Platform Development</title>
      <dc:creator>Zsolt Zombik</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:02:21 +0000</pubDate>
      <link>https://forem.com/aidevme/from-scripts-to-intent-how-ai-agents-are-changing-power-platform-development-f1d</link>
      <guid>https://forem.com/aidevme/from-scripts-to-intent-how-ai-agents-are-changing-power-platform-development-f1d</guid>
      <description>&lt;h2&gt;
  
  
  The Developer Tax We've All Been Paying
&lt;/h2&gt;

&lt;p&gt;If you've built anything on Power Platform, you know the workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open terminal → &lt;code&gt;pac auth create&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Switch to browser → navigate maker portal&lt;/li&gt;
&lt;li&gt;Inspect table schema&lt;/li&gt;
&lt;li&gt;Jump to docs → find correct API syntax&lt;/li&gt;
&lt;li&gt;Write PowerShell script&lt;/li&gt;
&lt;li&gt;Run it (column name typo)&lt;/li&gt;
&lt;li&gt;Fix it, run again&lt;/li&gt;
&lt;li&gt;Export solution (forgot to add the table)&lt;/li&gt;
&lt;li&gt;Go back, repeat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This constant context-switching between CLI, browser, docs, and scripts? That's what I call the &lt;strong&gt;developer tax&lt;/strong&gt; on enterprise platforms.&lt;/p&gt;

&lt;p&gt;On April 1, 2026, Microsoft's Dataverse team shipped something that fundamentally changes this equation: &lt;strong&gt;Dataverse Skills&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Shout-out to &lt;a href="https://techcommunity.microsoft.com/users/suyashkshirsagar" rel="noopener noreferrer"&gt;Suyash Kshirsagar&lt;/a&gt; from Microsoft for the excellent announcement post)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What If You Could Just... Say What You Want?
&lt;/h2&gt;

&lt;p&gt;Instead of orchestrating six different tools, what if you could describe your intent in natural language?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I'm building a recruiting system for Zava Construction 
with tables for Positions, Candidates, and Interviewers. 
Positions link to multiple Candidates, and Candidates 
can have multiple Interviewers."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Dataverse Skills installed, GitHub Copilot or Claude Code:&lt;/p&gt;

&lt;p&gt;✅ Creates a new solution with publisher prefix&lt;br&gt;&lt;br&gt;
✅ Generates tables with proper columns and data types&lt;br&gt;&lt;br&gt;
✅ Configures relationships (1:N, N:N)&lt;br&gt;&lt;br&gt;
✅ Loads sample data that matches your domain&lt;br&gt;&lt;br&gt;
✅ Validates the schema&lt;br&gt;&lt;br&gt;
✅ Exports a deployable solution package  &lt;/p&gt;

&lt;p&gt;All from a single prompt. &lt;strong&gt;Zero context-switching.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Actually Works
&lt;/h2&gt;

&lt;p&gt;Dataverse Skills is an open-source plugin that gives coding agents structured knowledge of Power Platform development patterns.&lt;/p&gt;

&lt;p&gt;Under the hood, it uses the &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; to expose Dataverse capabilities through a standardized interface that AI agents can invoke.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────┐
│   You (Natural Language Intent)    │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│  AI Agent (GitHub Copilot/Claude)  │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│      Dataverse Skills Plugin       │
│  (Translates intent → actions)     │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│   Dataverse MCP Server + PAC CLI   │
│    (Executes operations)           │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│     Your Dataverse Environment     │
└─────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Three Core Phases:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;CONNECT&lt;/strong&gt; - Authenticate, discover environments, register with MCP server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BUILD&lt;/strong&gt; - Create tables, columns, relationships, solutions, forms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OPERATE&lt;/strong&gt; - Load data, run queries, perform bulk operations&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What This Means for Different Roles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  👨‍💻 For Developers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Onboarding acceleration:&lt;/strong&gt; Junior devs can be productive on day one instead of spending weeks learning PAC CLI syntax. They describe what they need; the agent scaffolds it correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prototyping speed:&lt;/strong&gt; A full data model with sample data can be stood up in &lt;strong&gt;minutes&lt;/strong&gt; from a single prompt, not hours of maker portal clicking and script debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge embedded:&lt;/strong&gt; Best practices are encoded in the agent. No more searching wikis for "how to set up a publisher prefix correctly."&lt;/p&gt;

&lt;h3&gt;
  
  
  🏗️ For Solution Architects
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Consistency by default:&lt;/strong&gt; The plugin encodes best practices (publisher prefixes, solution structure, ALM hygiene) that propagate automatically across projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Governance without friction:&lt;/strong&gt; Because the agent uses the same tools and patterns every time, architectural standards become self-enforcing rather than requiring constant code reviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus shift:&lt;/strong&gt; You move from explaining &lt;em&gt;how&lt;/em&gt; to do things to defining &lt;em&gt;what&lt;/em&gt; should be done and &lt;em&gt;why&lt;/em&gt; — which is where architectural value actually lies.&lt;/p&gt;

&lt;h3&gt;
  
  
  👥 For Teams
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tool standardization:&lt;/strong&gt; One plugin investment works for both GitHub Copilot &lt;em&gt;and&lt;/em&gt; Claude Code users. Teams get consistent Dataverse capabilities regardless of which AI assistant they've adopted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portable knowledge:&lt;/strong&gt; Architectural patterns become portable across different coding agents rather than locked into a single vendor's ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Shift: Intent-Driven Development
&lt;/h2&gt;

&lt;p&gt;This isn't just about Dataverse. It's about a &lt;strong&gt;fundamental shift in how we interact with enterprise platforms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Traditional approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer → Manual tool orchestration → Platform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Intent-driven approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer → Natural language intent → AI agent → Automated orchestration → Platform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent becomes the &lt;strong&gt;orchestration layer&lt;/strong&gt; that handles the busywork of tool integration, API syntax, and workflow coordination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other examples of this pattern:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Business Skills&lt;/strong&gt; - Natural language → Copilot Studio conversational apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure-as-Code agents&lt;/strong&gt; - "Deploy a highly available web app on Azure" → Terraform/Bicep generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database agents&lt;/strong&gt; - "Add an audit log table to track all customer changes" → Schema migrations + triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common thread? &lt;strong&gt;You describe the intent; the agent handles the implementation.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started (15 Minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install the plugin:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# For GitHub Copilot&lt;/span&gt;
   gh copilot &lt;span class="nb"&gt;install &lt;/span&gt;dataverse-skills

   &lt;span class="c"&gt;# For Claude Code  &lt;/span&gt;
   claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;dataverse-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Authenticate:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   pac auth create &lt;span class="nt"&gt;--environment&lt;/span&gt; yourenv.crm.dynamics.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Try a prompt:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   "Create a simple inventory tracking system with 
   Products, Categories, and Suppliers tables"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Watch the agent build it&lt;/strong&gt; - Solution created, tables generated, relationships configured, sample data loaded.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. You're building with natural language.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Talk: What This Changes (And What It Doesn't)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Junior developers productive immediately (not after weeks of training)&lt;/li&gt;
&lt;li&gt;✅ Prototyping 10x faster (minutes instead of hours)&lt;/li&gt;
&lt;li&gt;✅ Best practices enforced automatically&lt;/li&gt;
&lt;li&gt;✅ Architects focus on strategy, not syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't replace:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Understanding business requirements&lt;/li&gt;
&lt;li&gt;❌ Architectural decision-making&lt;/li&gt;
&lt;li&gt;❌ Security and compliance judgment&lt;/li&gt;
&lt;li&gt;❌ Complex integration patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like Copilot for code completion—it handles the boilerplate and common patterns, freeing you to focus on the hard problems that actually require human expertise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ecosystem Play
&lt;/h2&gt;

&lt;p&gt;Dataverse Skills is part of Microsoft's broader MCP ecosystem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dataverse MCP Server&lt;/strong&gt; - The foundation that exposes Dataverse operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business Skills&lt;/strong&gt; - Link natural language to Copilot Studio apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure Skills&lt;/strong&gt; (coming) - Cloud infrastructure as intent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-party MCP servers&lt;/strong&gt; - Community-built integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a &lt;strong&gt;composable AI developer experience&lt;/strong&gt; where different skills can work together through a common protocol.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Create a recruiting system in Dataverse, 
deploy a web portal to Azure App Service,
and build a Copilot Studio conversational interface 
for candidates to check application status"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three different skills, one unified intent, end-to-end automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Take: This Is Just the Beginning
&lt;/h2&gt;

&lt;p&gt;I've spent years building on Power Platform—from PCF controls to complex Dataverse solutions to ALM automation.&lt;/p&gt;

&lt;p&gt;Every time, the &lt;strong&gt;orchestration overhead&lt;/strong&gt; was the hidden cost. Not the learning curve of the platform itself, but the cognitive load of juggling tools, memorizing syntax, and context-switching constantly.&lt;/p&gt;

&lt;p&gt;Dataverse Skills doesn't eliminate complexity—it &lt;strong&gt;abstracts the orchestration layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that changes the economics of enterprise platform development in ways we're just starting to understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;p&gt;📖 &lt;strong&gt;Full deep-dive:&lt;/strong&gt; &lt;a href="https://aidevme.com/from-scripts-to-intent-how-dataverse-skills-redefines-enterprise-development/" rel="noopener noreferrer"&gt;From Scripts to Intent: How Dataverse Skills Redefines Enterprise Development&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Related on AIDevMe:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aidevme.com/github-copilot-cli-complete-developer-guide-for-power-platform-net-and-typescript/" rel="noopener noreferrer"&gt;GitHub Copilot CLI: Complete Developer Guide for Power Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aidevme.com/github-copilot-agentic-memory-what-it-is-how-it-works/" rel="noopener noreferrer"&gt;GitHub Copilot Agentic Memory: What It Is &amp;amp; How It Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aidevme.com/claude-skills-complete-developer-guide/" rel="noopener noreferrer"&gt;Claude Skills: Complete Developer Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Questions? Thoughts?
&lt;/h2&gt;

&lt;p&gt;Have you tried Dataverse Skills yet? What's been your experience with AI-assisted development on Power Platform?&lt;/p&gt;

&lt;p&gt;Drop a comment—I'd love to hear what's working (or not working) for your team. 👇&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;About the Author&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I write at &lt;a href="https://aidevme.com" rel="noopener noreferrer"&gt;AIDevMe.com&lt;/a&gt; about Power Platform development, AI-assisted coding, and enterprise automation. If you found this helpful, follow me for more content on building better with less friction.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://aidevme.com/from-scripts-to-intent-how-dataverse-skills-redefines-enterprise-development/" rel="noopener noreferrer"&gt;aidevme.com&lt;/a&gt; on April 3, 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerplatform</category>
      <category>dataverseskills</category>
    </item>
    <item>
      <title>Power Pages Authentication Methods: The Complete Guide (2026)</title>
      <dc:creator>Zsolt Zombik</dc:creator>
      <pubDate>Wed, 01 Apr 2026 09:39:08 +0000</pubDate>
      <link>https://forem.com/aidevme/power-pages-authentication-methods-the-complete-guide-2026-2chm</link>
      <guid>https://forem.com/aidevme/power-pages-authentication-methods-the-complete-guide-2026-2chm</guid>
      <description>&lt;p&gt;"Wait, why are we storing passwords in Dataverse? Don't we have Azure AD?"&lt;/p&gt;

&lt;p&gt;The question came from a security auditor during a partner portal review. I watched the project lead shift uncomfortably in their chair. The portal had been live for six months. Hundreds of external partners were logging in daily. And suddenly, we were all wondering the same thing.&lt;/p&gt;

&lt;p&gt;The answer? It's complicated. And it revealed something I see far too often: &lt;strong&gt;teams building Power Pages portals don't fully understand the five authentication methods Microsoft provides — and most choose the wrong one&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem With Power Pages Authentication
&lt;/h2&gt;

&lt;p&gt;Microsoft Power Pages is brilliant for building external-facing portals quickly. Customer dashboards, partner collaboration sites, employee self-service pages — all built on top of Dataverse with low-code tools. It's fast. It's powerful.&lt;/p&gt;

&lt;p&gt;But here's where it gets tricky: &lt;strong&gt;authentication&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The moment you add user-restricted content, you need to answer a critical question: &lt;em&gt;How will your users prove who they are?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Power Pages gives you &lt;strong&gt;five distinct authentication methods&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Local Authentication (ASP.NET Identity)&lt;/strong&gt; — username/password stored in Dataverse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenID Connect (OIDC)&lt;/strong&gt; — modern federated authentication with Azure AD B2C or Entra ID&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SAML 2.0&lt;/strong&gt; — enterprise-grade federation with ADFS, Okta, Ping Identity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth 2.0 Social Login&lt;/strong&gt; — "Sign in with Google/Microsoft/LinkedIn"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Registration&lt;/strong&gt; — self-service account creation with invitation codes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each has a different protocol, trust model, configuration complexity, and risk profile. Choose poorly, and you're looking at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Account takeovers&lt;/li&gt;
&lt;li&gt;Regulatory compliance failures&lt;/li&gt;
&lt;li&gt;Phishing vulnerabilities&lt;/li&gt;
&lt;li&gt;A painful (and expensive) re-architecture later&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Wish Someone Had Told Me Three Years Ago
&lt;/h2&gt;

&lt;p&gt;After that security audit, I spent weeks digging through Microsoft Learn documentation, OASIS specifications, IETF RFCs, and trial-and-error testing. I wanted to understand not just &lt;em&gt;how&lt;/em&gt; each method worked, but &lt;em&gt;when&lt;/em&gt; to use it and &lt;em&gt;what security risks&lt;/em&gt; came with it.&lt;/p&gt;

&lt;p&gt;Here's what I learned:&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Authentication: Microsoft Says "Migrate Away From This"
&lt;/h3&gt;

&lt;p&gt;The built-in username/password system stores credentials directly in Dataverse contact records. It's convenient for proof-of-concept work, but Microsoft explicitly recommends migrating to Azure AD B2C for production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email-only 2FA (not phishing-resistant)&lt;/li&gt;
&lt;li&gt;No Conditional Access integration&lt;/li&gt;
&lt;li&gt;Weak password policies by default (no uppercase/digit requirements out of the box)&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;IsDemoMode&lt;/code&gt; is accidentally left &lt;code&gt;True&lt;/code&gt; in production, OTP codes are displayed in the UI — catastrophic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Rapid prototyping, internal demos, transitional scenarios&lt;br&gt;&lt;br&gt;
&lt;strong&gt;When NOT to use it:&lt;/strong&gt; Any portal with regulated data (GDPR, HIPAA, PSD2)&lt;/p&gt;

&lt;h3&gt;
  
  
  OIDC: The Modern B2C Solution
&lt;/h3&gt;

&lt;p&gt;OpenID Connect integrates with Azure AD B2C or Entra ID. It's the modern federated approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key advantage:&lt;/strong&gt; Conditional Access policies enforced at the identity provider level — device compliance, location-based restrictions, risk-based authentication&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security gotcha:&lt;/strong&gt; By default, Power Pages uses the &lt;code&gt;code id_token&lt;/code&gt; flow with &lt;code&gt;form_post&lt;/code&gt; response mode. This exposes the ID token in the browser. For better security, switch to authorization code flow with PKCE.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Customer-facing portals (B2C scenarios)&lt;/p&gt;

&lt;h3&gt;
  
  
  SAML 2.0: Enterprise-Grade Federation
&lt;/h3&gt;

&lt;p&gt;SAML is the gold standard for partner portals and B2B scenarios. It integrates with corporate identity systems like ADFS, Okta, and Ping Identity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phishing-resistant (with proper configuration)&lt;/li&gt;
&lt;li&gt;POST binding keeps tokens out of browser history&lt;/li&gt;
&lt;li&gt;Single Logout (SLO) support&lt;/li&gt;
&lt;li&gt;Group/role claims mapping for access control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Critical configuration:&lt;/strong&gt; Set &lt;code&gt;WantAssertionsSigned = True&lt;/code&gt;. Don't just validate the response envelope — validate the assertions themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Enterprise/partner portals, B2B scenarios&lt;/p&gt;

&lt;h3&gt;
  
  
  Social OAuth: Convenience vs. Security
&lt;/h3&gt;

&lt;p&gt;Let users sign in with their existing Google, Microsoft, LinkedIn, Facebook, or Twitter accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When it makes sense:&lt;/strong&gt; Consumer communities, public-facing portals where user convenience matters more than enterprise security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you give up:&lt;/strong&gt; No enterprise MFA enforcement, minimal role claims, no Single Logout&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Consumer-facing portals, community sites&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Registration: Controlled Onboarding
&lt;/h3&gt;

&lt;p&gt;Not an authentication protocol — it's a &lt;em&gt;registration workflow&lt;/em&gt;. Users can create accounts with or without invitation codes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical settings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;OpenRegistrationEnabled = False&lt;/code&gt; for enterprise portals&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CaptchaEnabled = True&lt;/code&gt; if any self-registration is allowed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ResetPasswordRequiresConfirmedEmail = True&lt;/code&gt; (not the default!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Comparison Table You Actually Need
&lt;/h2&gt;

&lt;p&gt;I built a side-by-side comparison table covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;External IdP requirements&lt;/li&gt;
&lt;li&gt;Enterprise MFA enforcement&lt;/li&gt;
&lt;li&gt;Phishing resistance&lt;/li&gt;
&lt;li&gt;Token visibility in browser&lt;/li&gt;
&lt;li&gt;Group/role claims&lt;/li&gt;
&lt;li&gt;Single Logout support&lt;/li&gt;
&lt;li&gt;Regulatory compliance fit&lt;/li&gt;
&lt;li&gt;Microsoft's recommendations&lt;/li&gt;
&lt;li&gt;Setup complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It answers the question I had during that audit: &lt;strong&gt;"Which one should I actually use?"&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Answer to That Auditor's Question
&lt;/h2&gt;

&lt;p&gt;Back to that security audit. Why were we storing passwords in Dataverse when we had Azure AD?&lt;/p&gt;

&lt;p&gt;Because the team didn't realize they had better options. They saw "authentication" in the Power Pages setup wizard, clicked a few checkboxes, and moved on.&lt;/p&gt;

&lt;p&gt;They didn't know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local auth is deprecated for production&lt;/li&gt;
&lt;li&gt;SAML 2.0 would have leveraged the existing corporate identity system&lt;/li&gt;
&lt;li&gt;Conditional Access policies could have been enforced automatically&lt;/li&gt;
&lt;li&gt;Password rotation, MFA, and account lockout policies were already managed in Azure AD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The migration took three weeks, cost the project budget, and delayed the v2 roadmap. &lt;strong&gt;All because of an authentication decision made in the first sprint.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I wrote the guide I wish had existed three years ago: a complete technical breakdown of every Power Pages authentication method with:&lt;/p&gt;

&lt;p&gt;✓ &lt;strong&gt;Step-by-step protocol flows&lt;/strong&gt; — understand exactly what happens during login&lt;br&gt;&lt;br&gt;
✓ &lt;strong&gt;Security configuration tables&lt;/strong&gt; — every critical setting with defaults and recommendations&lt;br&gt;&lt;br&gt;
✓ &lt;strong&gt;Risk analysis&lt;/strong&gt; — real-world security scenarios and how to mitigate them&lt;br&gt;&lt;br&gt;
✓ &lt;strong&gt;When to use each method&lt;/strong&gt; — and when to absolutely avoid it&lt;br&gt;&lt;br&gt;
✓ &lt;strong&gt;Side-by-side comparison&lt;/strong&gt; — answer "which one?" with confidence&lt;/p&gt;

&lt;p&gt;Whether you're wiring up your first portal, designing an enterprise solution, or preparing for a security audit, this guide has the depth you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the Full Guide
&lt;/h2&gt;

&lt;p&gt;The complete technical breakdown is here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aidevme.com/power-pages-authentication-methods-the-complete-guide-2026/" rel="noopener noreferrer"&gt;Power Pages Authentication Methods: The Complete Guide (2026)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It covers every authentication method in detail — local auth, OIDC, SAML 2.0, social OAuth, and open registration — with configuration examples, security best practices, and decision frameworks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;If you're building or securing Power Pages portals, I'd love to hear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What authentication method did you choose&lt;/strong&gt; — and why?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What "gotchas" did you run into&lt;/strong&gt; during implementation?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What surprised you&lt;/strong&gt; about Power Pages authentication?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment. Let's learn from each other's experiences.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>microsoft</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>GitHub Agentic Workflows: AI Agents Are Coming for Your Repository Maintenance Tasks (And That's a Good Thing)</title>
      <dc:creator>Zsolt Zombik</dc:creator>
      <pubDate>Wed, 01 Apr 2026 09:36:40 +0000</pubDate>
      <link>https://forem.com/aidevme/github-agentic-workflows-ai-agents-are-coming-for-your-repository-maintenance-tasks-and-thats-a-2dl5</link>
      <guid>https://forem.com/aidevme/github-agentic-workflows-ai-agents-are-coming-for-your-repository-maintenance-tasks-and-thats-a-2dl5</guid>
      <description>&lt;p&gt;Your GitHub issues pile up unlabeled. Your documentation drifts three sprints behind your code. Your CI failures sit uninvestigated. Your test coverage quietly erodes, sprint after sprint.&lt;/p&gt;

&lt;p&gt;If you manage a GitHub repository at scale — whether it's a Power Platform ALM pipeline, a PCF control library, or an enterprise DevOps monorepo — you know this grind intimately.&lt;/p&gt;

&lt;p&gt;Traditional GitHub Actions workflows are powerful, but they're fundamentally &lt;strong&gt;deterministic&lt;/strong&gt;. They execute exactly what you tell them, step by step. They don't &lt;em&gt;understand&lt;/em&gt; your repository. They don't &lt;em&gt;reason&lt;/em&gt; about context. They can't make judgment calls.&lt;/p&gt;

&lt;p&gt;Until now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter GitHub Agentic Workflows
&lt;/h2&gt;

&lt;p&gt;In February 2026, GitHub Next launched &lt;strong&gt;GitHub Agentic Workflows&lt;/strong&gt; in technical preview — bringing AI coding agents directly into GitHub Actions with security guardrails, sandboxed execution, and human-in-the-loop review.&lt;/p&gt;

&lt;p&gt;The paradigm shift is elegant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Instead of writing imperative YAML that tells GitHub &lt;em&gt;exactly what to do&lt;/em&gt;, you write natural language specifications that describe &lt;em&gt;what you want to achieve&lt;/em&gt;.&lt;/strong&gt; The AI agent figures out how.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's what a workflow looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;issues&lt;/span&gt;
&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;issues&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
&lt;span class="na"&gt;safe-outputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;add-labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
  &lt;span class="na"&gt;add-comment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Issue Triage Agent&lt;/span&gt;

Analyze new issues in this PCF control repository and apply 
appropriate labels: bug, build-error, performance, feature-request, 
fluent-ui-migration, or needs-info.

Research the codebase for relevant context. If critical diagnostic 
information is missing, request it politely. Always explain your 
classification.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a new issue opens, the agent analyzes the content, searches your codebase for context, applies appropriate labels, and leaves an explanatory comment — automatically, within seconds.&lt;/p&gt;

&lt;p&gt;No manual rules. No explicit conditionals. Just intent.&lt;/p&gt;




&lt;h2&gt;
  
  
  Welcome to "Continuous AI"
&lt;/h2&gt;

&lt;p&gt;GitHub calls this vision &lt;strong&gt;Continuous AI&lt;/strong&gt; — positioning it alongside CI/CD, not as a replacement.&lt;/p&gt;

&lt;p&gt;Just as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Integration&lt;/strong&gt; automated build verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Deployment&lt;/strong&gt; automated release pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Continuous AI&lt;/strong&gt; automates the subjective, judgment-heavy repository maintenance tasks that traditional automation simply cannot express.&lt;/p&gt;

&lt;p&gt;Think about what falls through the cracks on every team:&lt;/p&gt;

&lt;p&gt;❌ New issues sit unlabeled for days&lt;br&gt;&lt;br&gt;
❌ Documentation describes refactored features from three months ago&lt;br&gt;&lt;br&gt;
❌ Tests are added reactively, never proactively&lt;br&gt;&lt;br&gt;
❌ CI failures get acknowledged in Slack but never properly root-caused&lt;br&gt;&lt;br&gt;
❌ Repository health reports get written quarterly, if at all  &lt;/p&gt;

&lt;p&gt;These tasks require &lt;em&gt;contextual understanding&lt;/em&gt;, not just script execution. That's where AI coding agents excel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Six Core Automation Categories
&lt;/h2&gt;

&lt;p&gt;GitHub has identified six primary use cases that become practical with Agentic Workflows:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Continuous Triage&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Intelligent issue labeling, classification, and routing based on codebase context. In production on GitHub's own repositories, triage agents respond within 60 seconds with accurate, context-aware classifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Continuous Documentation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Automated documentation maintenance that stays synchronized with code changes. GitHub ran six specialized doc agents in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily Documentation Updater&lt;/strong&gt; — 96% merge rate (57/59 PRs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glossary Maintainer&lt;/strong&gt; — 100% merge rate (10/10 PRs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation Unbloat&lt;/strong&gt; — 85% merge rate (88/103 PRs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't hypothetical. These are real production results.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Continuous Code Simplification&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Autonomous refactoring agents that identify opportunities to simplify without changing functionality. In extended production use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Code Simplifier&lt;/strong&gt; — 83% merge rate (5/6 PRs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate Code Detector&lt;/strong&gt; — 79% merge rate (76/96 PRs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agents use semantic analysis (via &lt;a href="https://oraios.github.io/serena/" rel="noopener noreferrer"&gt;Serena&lt;/a&gt; toolkit) to understand code meaning, not just textual patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Continuous Test Improvement&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Proactive test generation based on code changes, coverage gaps, and bug patterns — rather than reactive "write tests after the bug ships" approaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Continuous Quality Hygiene&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Automated CI failure investigation. When workflows fail, agents analyze logs, identify root causes, and propose fixes as pull requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Continuous Reporting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Weekly or monthly repository health reports — dependency status, PR review latency, test coverage trends, deployment frequency — generated automatically with actionable insights.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works: Architecture and Security
&lt;/h2&gt;

&lt;p&gt;This isn't cowboys running unrestricted AI agents with full repository access. GitHub designed Agentic Workflows around &lt;strong&gt;principle of least privilege&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Read-only by default&lt;/strong&gt; — agents start with no write permissions&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Explicit permissions&lt;/strong&gt; — YAML frontmatter declares exactly what the agent can access&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Sandboxed execution&lt;/strong&gt; — agents run in isolated GitHub Actions containers&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Safe outputs&lt;/strong&gt; — agents can only call explicitly declared GitHub operations&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Network isolation&lt;/strong&gt; — restricted internet access prevents data exfiltration&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Human review gates&lt;/strong&gt; — agents open pull requests, they don't auto-merge  &lt;/p&gt;

&lt;p&gt;You write workflow definitions in &lt;strong&gt;Markdown with YAML frontmatter&lt;/strong&gt;. The &lt;code&gt;gh aw&lt;/code&gt; CLI extension compiles your definition into standard GitHub Actions YAML that invokes one of three AI coding agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt; (requires &lt;code&gt;COPILOT_GITHUB_TOKEN&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic Claude Code&lt;/strong&gt; (requires &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Codex&lt;/strong&gt; (requires &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-World Applications for Power Platform Developers
&lt;/h2&gt;

&lt;p&gt;For Power Platform teams, this unlocks automation scenarios that were previously impossible:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;PCF Control Repositories&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Documentation that auto-updates when TypeScript interfaces change&lt;/li&gt;
&lt;li&gt;Intelligent issue triage that understands Fluent UI migration problems vs webpack build errors&lt;/li&gt;
&lt;li&gt;Automated dependency upgrade PRs with context about breaking changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Dataverse Solution Repositories&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Schema documentation synchronized with solution export commits&lt;/li&gt;
&lt;li&gt;Weekly health reports identifying ALM pipeline failures and patterns&lt;/li&gt;
&lt;li&gt;Automated security role permission matrix updates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Power Automate Custom Connectors&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;API documentation that stays synchronized with OpenAPI spec changes&lt;/li&gt;
&lt;li&gt;Intelligent routing of issues to connector owners vs platform bugs&lt;/li&gt;
&lt;li&gt;Automated changelog generation from commit history&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Important Caveats You Need to Know
&lt;/h2&gt;

&lt;p&gt;GitHub Agentic Workflows are powerful, but they're &lt;strong&gt;technical preview&lt;/strong&gt; with real limitations:&lt;/p&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Not production-ready&lt;/strong&gt; — APIs and syntax will change&lt;br&gt;&lt;br&gt;
⚠️ &lt;strong&gt;API token costs&lt;/strong&gt; — agents make dozens of API calls per run; costs can add up&lt;br&gt;&lt;br&gt;
⚠️ &lt;strong&gt;Human oversight required&lt;/strong&gt; — always review agent-generated PRs before merging&lt;br&gt;&lt;br&gt;
⚠️ &lt;strong&gt;Prompt injection risks&lt;/strong&gt; — untrusted input (public repo issues) can manipulate agent behavior&lt;br&gt;&lt;br&gt;
⚠️ &lt;strong&gt;Evolving best practices&lt;/strong&gt; — we're all learning what works and what doesn't  &lt;/p&gt;

&lt;p&gt;This isn't replacing developers. It's augmenting repository maintenance workflows with intelligent automation that frees senior engineers from mechanical, time-consuming tasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Agentic Workflows vs Running Agents Directly in YAML
&lt;/h2&gt;

&lt;p&gt;You might ask: "Why not just call Claude or Copilot directly from GitHub Actions YAML?"&lt;/p&gt;

&lt;p&gt;You can — but you lose the safety guardrails:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Direct YAML&lt;/th&gt;
&lt;th&gt;Agentic Workflows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permissions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unrestricted (whatever the workflow has)&lt;/td&gt;
&lt;td&gt;Explicit, minimal (declared in frontmatter)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outputs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agent can call any GitHub API&lt;/td&gt;
&lt;td&gt;Agent restricted to declared safe-outputs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sandboxing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Mandatory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Audit trail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual logging&lt;/td&gt;
&lt;td&gt;Automatic, structured&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best practices&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;Built-in by GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Agentic Workflows enforce &lt;strong&gt;principle of least privilege&lt;/strong&gt; by design. You get intelligent automation &lt;em&gt;and&lt;/em&gt; enterprise-grade safety controls.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Bigger Picture: Where This Is Going
&lt;/h2&gt;

&lt;p&gt;GitHub Agentic Workflows represent something larger than a new CI/CD feature. They're a preview of &lt;strong&gt;intent-driven software development&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine a future where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers define &lt;strong&gt;what&lt;/strong&gt; should be accomplished (outcomes, quality standards, architectural principles)&lt;/li&gt;
&lt;li&gt;AI agents handle &lt;strong&gt;how&lt;/strong&gt; it gets implemented (code changes, tests, documentation, deployment)&lt;/li&gt;
&lt;li&gt;Humans provide &lt;strong&gt;judgment&lt;/strong&gt; (code review, architectural decisions, feature prioritization)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're not there yet. But technical previews like this are signposts on the path.&lt;/p&gt;

&lt;p&gt;The question isn't whether AI will change how we maintain codebases. It's whether your team will adopt it proactively — learning, experimenting, defining best practices — or reactively, two years from now when it's table stakes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;GitHub Agentic Workflows are in &lt;strong&gt;technical preview&lt;/strong&gt;. To experiment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the &lt;code&gt;gh aw&lt;/code&gt; CLI extension&lt;/li&gt;
&lt;li&gt;Pick a simple use case (issue triage is the "hello world")&lt;/li&gt;
&lt;li&gt;Create a Markdown workflow definition&lt;/li&gt;
&lt;li&gt;Configure an AI agent API key (Copilot, Claude, or Codex)&lt;/li&gt;
&lt;li&gt;Run the workflow and review the output&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start small. Learn the patterns. Iterate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Want the Full Technical Deep Dive?
&lt;/h2&gt;

&lt;p&gt;This article covers the essential concepts, but there's much more to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detailed architecture diagrams&lt;/li&gt;
&lt;li&gt;Complete workflow definition examples for Power Platform scenarios&lt;/li&gt;
&lt;li&gt;Production metrics from GitHub Next's own usage&lt;/li&gt;
&lt;li&gt;Security model comparisons&lt;/li&gt;
&lt;li&gt;Cost analysis and API token management strategies&lt;/li&gt;
&lt;li&gt;Step-by-step setup tutorials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Read the comprehensive guide:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://aidevme.com/github-agentic-workflows-the-next-evolution-of-repository-automation-for-power-platform-and-enterprise-developers/" rel="noopener noreferrer"&gt;GitHub Agentic Workflows: The Next Evolution of Repository Automation for Power Platform and Enterprise Developers&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Repository maintenance is unglamorous work. It doesn't ship features. It doesn't close customer tickets. But it determines whether your codebase remains maintainable or slowly descends into chaos.&lt;/p&gt;

&lt;p&gt;GitHub Agentic Workflows won't solve every problem. They won't replace human judgment. But they can handle the mechanical, context-heavy work that drains hours every week from your senior engineers.&lt;/p&gt;

&lt;p&gt;And those hours? They can be redirected to architecture, feature development, mentoring, and the high-leverage work that actually requires human creativity.&lt;/p&gt;

&lt;p&gt;Welcome to the era of Continuous AI.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>devops</category>
      <category>github</category>
    </item>
  </channel>
</rss>
