{"id":23658,"date":"2026-08-30T20:20:30","date_gmt":"2026-08-30T20:20:30","guid":{"rendered":"https:\/\/scannn.com\/agent-package-manager-for-ai-azure-engineering\/"},"modified":"2026-08-30T20:20:30","modified_gmt":"2026-08-30T20:20:30","slug":"agent-package-manager-for-ai-azure-engineering","status":"publish","type":"post","link":"https:\/\/scannn.com\/lv\/agent-package-manager-for-ai-azure-engineering\/","title":{"rendered":"Agent Package Manager for AI Azure Engineering"},"content":{"rendered":"\n<div id=\"__blog-post-container\">\n<p>AI coding tools are getting better quickly. The setup around them is still too often a pile of local files, copied prompts, one-off MCP servers, and tribal knowledge.<\/p>\n<p>One developer has custom GitHub Copilot instructions. Another has Claude agents. Someone else has Cursor rules. The platform team wants approved Azure patterns, Microsoft Learn grounding, cost guidance, security checks, and repeatable onboarding.<\/p>\n<p>Six months later, the audit question is simple and uncomfortable:<\/p>\n<blockquote>\n<p>What agent context was installed, where did it come from, and who allowed it?<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/microsoft.github.io\/apm\/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Agent Package Manager<\/a>, or APM, addresses that gap.<\/p>\n<p>APM is a dependency manager for AI agents. The official project describes the core model as declaring the skills, prompts, instructions, plugins, and MCP servers a project needs in one <code>apm.yml<\/code>, then running <code>apm install<\/code> to deploy the supported primitives to each agent harness. It also positions the lockfile as the reproducibility artifact, with exact versions and content hashes, and <code>apm-policy.yml<\/code> as the install-time governance control for dependencies, MCP servers, and targets.<\/p>\n<p>Agent configuration needs this kind of mundane, reviewable plumbing.<\/p>\n<p><\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-this-matters-for-azure-teams\">Why this matters for Azure teams<a href=\"#why-this-matters-for-azure-teams\" class=\"hash-link\" aria-label=\"Direct link to Why this matters for Azure teams\" title=\"Direct link to Why this matters for Azure teams\" translate=\"no\">\u200b<\/a><\/h2>\n<p>Azure engineering work rarely happens in one tool.<\/p>\n<p>A realistic cloud engineering repo might use:<\/p>\n<p>In my own <code>Coding<\/code> repo, the APM manifest now declares the active agent targets explicitly:<\/p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token key atrule\">targets<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> copilot<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> claude<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> cursor<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> opencode<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>It also declares local primitives and reusable agent-skill packages:<\/p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token key atrule\">dependencies<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">apm<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> DietrichGebert\/ponytail<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft\/skills\/.github\/plugins\/azure<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">sdk<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">python<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft\/skills\/.github\/plugins\/azure<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">sdk<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">dotnet<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft\/skills\/.github\/plugins\/azure<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">sdk<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">typescript<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft\/skills\/.github\/plugins\/azure<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">sdk<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">rust<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft\/skills\/.github\/plugins\/microsoft<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">foundry<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token string\" style=\"color:rgb(255, 121, 198)\">\"microsoft\/hve-core#c7ee5b9642ab1877a6b5ce5336ebc448b89b2708\"<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> dotnet\/skills<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>The workflow is familiar: declare dependencies, lock the result, and validate it.<\/p>\n<p><!-- --><\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"mcp-servers-are-dependencies-too\">MCP servers are dependencies too<a href=\"#mcp-servers-are-dependencies-too\" class=\"hash-link\" aria-label=\"Direct link to MCP servers are dependencies too\" title=\"Direct link to MCP servers are dependencies too\" translate=\"no\">\u200b<\/a><\/h2>\n<p>The part I like most is that MCP servers sit in the same dependency story.<\/p>\n<p>That matters because MCP is a tool boundary. If an agent gets access to a server, it gets access to whatever that server exposes. For Azure work, that is powerful and useful, but it should never be invisible.<\/p>\n<p>The repo manifest declares the MCP surface. These are representative entries; the complete manifest is linked in the references.<\/p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token key atrule\">dependencies<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">mcp<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> microsoft.learn.mcp<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">registry<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> <\/span><span class=\"token boolean important\">false<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">transport<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> http<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">url<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> https<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\">\/\/learn.microsoft.com\/api\/mcp<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> context7<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">registry<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> <\/span><span class=\"token boolean important\">false<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">transport<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> http<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">url<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> https<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\">\/\/mcp.context7.com\/mcp<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> azure<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">registry<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> <\/span><span class=\"token boolean important\">false<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">transport<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> stdio<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">command<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> npx<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token key atrule\">args<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">        <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">y<\/span><br\/><\/p><p><span class=\"token plain\">        <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token string\" style=\"color:rgb(255, 121, 198)\">'@azure\/mcp@latest'<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">        <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> server<\/span><br\/><\/p><p><span class=\"token plain\">        <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> start<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>This moves MCP from \u201cwhatever is configured on my machine\u201d into the repo contract.<\/p>\n<p>The manifest declares the active targets and approved MCP servers:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" loading=\"lazy\" alt=\"APM-declared targets and approved MCP servers\" src=\"https:\/\/luke.geek.nz\/assets\/images\/apm-governance-native-533ab095b8a419a49e1e66bf23c7fd11.gif\" width=\"1280\" height=\"720\" class=\"img_ev3q\"\/><\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"governance-without-ceremony\">Governance without ceremony<a href=\"#governance-without-ceremony\" class=\"hash-link\" aria-label=\"Direct link to Governance without ceremony\" title=\"Direct link to Governance without ceremony\" translate=\"no\">\u200b<\/a><\/h2>\n<p>I would not start with a giant enterprise policy.<\/p>\n<p>The smallest useful version is an allowlist:<\/p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> Hypervelocity APM baseline<\/span><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token key atrule\">version<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> 1.0.0<\/span><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token key atrule\">enforcement<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> block<\/span><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token key atrule\">dependencies<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">allow<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> DietrichGebert\/ponytail<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> dotnet\/skills<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft\/hve<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">core<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft\/skills\/<\/span><span class=\"token important\">**<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token key atrule\">mcp<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">allow<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> azure<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> context7<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> foundry<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">mcp<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> iseplaybook<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft.learn.mcp<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">docs<\/span><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft.mrc.mcp<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">transport<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token key atrule\">allow<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> http<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> sse<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> stdio<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">self_defined<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> allow<\/span><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token key atrule\">compilation<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">target<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token key atrule\">allow<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> claude<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> copilot<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> cursor<\/span><br\/><\/p><p><span class=\"token plain\">      <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> opencode<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>The policy allowlists dependency sources, MCP servers and transports, agent targets, and required manifest metadata. It is install-time governance, not a runtime sandbox: it enforces declarations before files are written, while runtime behaviour remains with the agent harness and exposed tools.<\/p>\n<p><!-- --><\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"from-one-repository-to-an-organisation\">From one repository to an organisation<a href=\"#from-one-repository-to-an-organisation\" class=\"hash-link\" aria-label=\"Direct link to From one repository to an organisation\" title=\"Direct link to From one repository to an organisation\" translate=\"no\">\u200b<\/a><\/h2>\n<p>The interesting part of APM is not just what happens in one repository.<\/p>\n<p>It is what happens when ten, fifty, or five hundred repositories need the same agent engineering baseline.<\/p>\n<p>An organisation might have separate platform, data, security, application, and AI engineering teams. They should not all have to independently discover the same skills, MCP servers, policies, and agent configuration.<\/p>\n<p>The model can instead be layered:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">                         GitHub Organisation<\/span><br\/><\/p><p><span class=\"token plain\">                                \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                       Organisation policy<\/span><br\/><\/p><p><span class=\"token plain\">                                \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/span><br\/><\/p><p><span class=\"token plain\">                \u2502               \u2502               \u2502<\/span><br\/><\/p><p><span class=\"token plain\">             Platform          Data          Security<\/span><br\/><\/p><p><span class=\"token plain\">               team            team             team<\/span><br\/><\/p><p><span class=\"token plain\">                \u2502               \u2502               \u2502<\/span><br\/><\/p><p><span class=\"token plain\">          shared skills    shared skills    shared skills<\/span><br\/><\/p><p><span class=\"token plain\">                \u2502               \u2502               \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/span><br\/><\/p><p><span class=\"token plain\">                                \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                         Team repositories<\/span><br\/><\/p><p><span class=\"token plain\">                                \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<\/span><br\/><\/p><p><span class=\"token plain\">                    \u2502           \u2502           \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                  Repo A      Repo B      Repo C<\/span><br\/><\/p><p><span class=\"token plain\">                    \u2502           \u2502           \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                  apm.yml     apm.yml     apm.yml<\/span><br\/><\/p><p><span class=\"token plain\">                    \u2502           \u2502           \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/span><br\/><\/p><p><span class=\"token plain\">                                \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                               APM<\/span><br\/><\/p><p><span class=\"token plain\">                                \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                       Agent-specific output<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>The important distinction is that teams do not need identical agent configurations.<\/p>\n<p>They need a <strong>common starting point<\/strong>.<\/p>\n<p>A platform team might provide Azure architecture, AKS, networking, monitoring, reliability, and cost guidance. A security team might provide security and identity guidance. An AI engineering team might provide Foundry and Agent Framework skills.<\/p>\n<p>Individual application teams can then add their own domain-specific context.<\/p>\n<p>That gives the organisation a useful division of responsibility:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">Organisation<\/span><br\/><\/p><p><span class=\"token plain\">    \u2502<\/span><br\/><\/p><p><span class=\"token plain\">    \u2514\u2500\u2500 What is allowed and required?<\/span><br\/><\/p><p><span class=\"token plain\">Team<\/span><br\/><\/p><p><span class=\"token plain\">    \u2502<\/span><br\/><\/p><p><span class=\"token plain\">    \u2514\u2500\u2500 What capabilities does this team need?<\/span><br\/><\/p><p><span class=\"token plain\">Repository<\/span><br\/><\/p><p><span class=\"token plain\">    \u2502<\/span><br\/><\/p><p><span class=\"token plain\">    \u2514\u2500\u2500 What does this workload specifically require?<\/span><br\/><\/p><p><span class=\"token plain\">APM<\/span><br\/><\/p><p><span class=\"token plain\">    \u2502<\/span><br\/><\/p><p><span class=\"token plain\">    \u2514\u2500\u2500 Resolve, lock, install, and audit the result.<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>This is where APM starts to look less like a developer convenience and more like an organisational distribution mechanism for agent context.<\/p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"github-makes-this-practical\">GitHub makes this practical<a href=\"#github-makes-this-practical\" class=\"hash-link\" aria-label=\"Direct link to GitHub makes this practical\" title=\"Direct link to GitHub makes this practical\" translate=\"no\">\u200b<\/a><\/h3>\n<p>For organisations using GitHub, APM can work alongside the existing repository and organisation model rather than creating another management hierarchy.<\/p>\n<p>The organisation can maintain an APM policy in its GitHub organisation configuration. APM can discover that organisation-level policy from the repository&#8217;s Git remote, allowing the same baseline to apply across participating repositories.<\/p>\n<p>For example, the organisation could establish rules around:<\/p>\n<ul>\n<li class=\"\">approved package sources<\/li>\n<li class=\"\">approved MCP servers<\/li>\n<li class=\"\">approved transports<\/li>\n<li class=\"\">allowed agent targets<\/li>\n<li class=\"\">required packages<\/li>\n<li class=\"\">required manifest metadata<\/li>\n<\/ul>\n<p>Teams still maintain their own <code>apm.yml<\/code>.<\/p>\n<p>That means the platform team does not need to edit every application repository whenever the organisational policy changes.<\/p>\n<p>The relationship is closer to:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">GitHub Organisation<\/span><br\/><\/p><p><span class=\"token plain\">        \u2502<\/span><br\/><\/p><p><span class=\"token plain\">        \u251c\u2500\u2500 Organisation APM policy<\/span><br\/><\/p><p><span class=\"token plain\">        \u2502<\/span><br\/><\/p><p><span class=\"token plain\">        \u251c\u2500\u2500 Platform packages<\/span><br\/><\/p><p><span class=\"token plain\">        \u2502<\/span><br\/><\/p><p><span class=\"token plain\">        \u2514\u2500\u2500 Team repositories<\/span><br\/><\/p><p><span class=\"token plain\">                 \u2502<\/span><br\/><\/p><p><span class=\"token plain\">                 \u251c\u2500\u2500 apm.yml<\/span><br\/><\/p><p><span class=\"token plain\">                 \u251c\u2500\u2500 apm.lock.yaml<\/span><br\/><\/p><p><span class=\"token plain\">                 \u2514\u2500\u2500 application code<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>GitHub then provides the repository governance around that model.<\/p>\n<p>Organisation rulesets can target multiple repositories and can require workflows or status checks before changes are merged. This provides a natural enforcement point for an APM audit workflow.<\/p>\n<p>The result could look like:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">Pull Request<\/span><br\/><\/p><p><span class=\"token plain\">     \u2502<\/span><br\/><\/p><p><span class=\"token plain\">     \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">GitHub Actions<\/span><br\/><\/p><p><span class=\"token plain\">     \u2502<\/span><br\/><\/p><p><span class=\"token plain\">     \u251c\u2500\u2500 apm audit --ci<\/span><br\/><\/p><p><span class=\"token plain\">     \u2502<\/span><br\/><\/p><p><span class=\"token plain\">     \u251c\u2500\u2500 dependency checks<\/span><br\/><\/p><p><span class=\"token plain\">     \u2502<\/span><br\/><\/p><p><span class=\"token plain\">     \u2514\u2500\u2500 other engineering validation<\/span><br\/><\/p><p><span class=\"token plain\">     \u2502<\/span><br\/><\/p><p><span class=\"token plain\">     \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">GitHub Ruleset<\/span><br\/><\/p><p><span class=\"token plain\">     \u2502<\/span><br\/><\/p><p><span class=\"token plain\">     \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">Required checks pass<\/span><br\/><\/p><p><span class=\"token plain\">     \u2502<\/span><br\/><\/p><p><span class=\"token plain\">     \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">Merge<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>This is important because APM policy is an <strong>install-time and CI governance mechanism<\/strong>, not a replacement for runtime security or agent sandboxing. Runtime permissions still belong to the agent harness and the underlying platform. <a href=\"https:\/\/microsoft.github.io\/apm\/enterprise\/apm-policy-getting-started\/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">APM policy documentation<\/a><\/p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-platform-team-becomes-a-paved-road\">The platform team becomes a paved road<a href=\"#the-platform-team-becomes-a-paved-road\" class=\"hash-link\" aria-label=\"Direct link to The platform team becomes a paved road\" title=\"Direct link to The platform team becomes a paved road\" translate=\"no\">\u200b<\/a><\/h3>\n<p>This changes the role of a central platform team.<\/p>\n<p>It does not need to become the team that configures every developer&#8217;s agent.<\/p>\n<p>Instead, it can provide a supported baseline.<\/p>\n<p>For example:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">HVE Azure Engineering Baseline<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Azure architecture<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Azure Well-Architected<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 AKS<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 App Service<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Functions<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 API Management<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Container Apps<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Identity<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Monitoring<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Reliability<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Cost<\/span><br\/><\/p><p><span class=\"token plain\">\u2514\u2500\u2500 Approved MCP servers<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>An application team might then consume that baseline and add:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">Application Team<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 HVE Azure Engineering Baseline<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Payments domain skills<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Application-specific instructions<\/span><br\/><\/p><p><span class=\"token plain\">\u2514\u2500\u2500 Workload-specific MCP dependencies<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>Another team might consume the same baseline but add:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">Data Team<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 HVE Azure Engineering Baseline<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Fabric skills<\/span><br\/><\/p><p><span class=\"token plain\">\u251c\u2500\u2500 Data engineering guidance<\/span><br\/><\/p><p><span class=\"token plain\">\u2514\u2500\u2500 Data-specific MCP dependencies<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>The organisation gets consistency without requiring every team to become identical.<\/p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"scaling-the-rollout\">Scaling the rollout<a href=\"#scaling-the-rollout\" class=\"hash-link\" aria-label=\"Direct link to Scaling the rollout\" title=\"Direct link to Scaling the rollout\" translate=\"no\">\u200b<\/a><\/h3>\n<p>I would also avoid trying to deploy this everywhere on day one.<\/p>\n<p>The rollout can be incremental:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">Pilot<\/span><br\/><\/p><p><span class=\"token plain\">  \u2502<\/span><br\/><\/p><p><span class=\"token plain\">  \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">One platform team<\/span><br\/><\/p><p><span class=\"token plain\">  \u2502<\/span><br\/><\/p><p><span class=\"token plain\">  \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">Several application teams<\/span><br\/><\/p><p><span class=\"token plain\">  \u2502<\/span><br\/><\/p><p><span class=\"token plain\">  \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">Organisation baseline<\/span><br\/><\/p><p><span class=\"token plain\">  \u2502<\/span><br\/><\/p><p><span class=\"token plain\">  \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">Required CI checks<\/span><br\/><\/p><p><span class=\"token plain\">  \u2502<\/span><br\/><\/p><p><span class=\"token plain\">  \u25bc<\/span><br\/><\/p><p><span class=\"token plain\">Fleet-wide adoption<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>Start with a small set of capabilities that the platform team can actually support.<\/p>\n<p>Pin reviewed versions.<\/p>\n<p>Run APM audits in CI.<\/p>\n<p>Use GitHub rulesets to make the checks required where appropriate.<\/p>\n<p>Then expand the baseline as the organisation gains confidence.<\/p>\n<p>That is a much more realistic approach than attempting to define every possible agent policy before anyone has used it.<\/p>\n<p>The goal is not to centrally control every prompt an engineer writes.<\/p>\n<p>The goal is to make the <strong>supported path easier than building an agent environment from scratch<\/strong>.<\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"lockfiles-give-you-the-forensic-answer\">Lockfiles give you the forensic answer<a href=\"#lockfiles-give-you-the-forensic-answer\" class=\"hash-link\" aria-label=\"Direct link to Lockfiles give you the forensic answer\" title=\"Direct link to Lockfiles give you the forensic answer\" translate=\"no\">\u200b<\/a><\/h2>\n<p>The lockfile is where APM starts to feel familiar.<\/p>\n<p>In this repo, <code>apm.lock.yaml<\/code> records the CLI version, generation time, resolved commits, deployed files, and content hashes. For example:<\/p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token key atrule\">lockfile_version<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> <\/span><span class=\"token string\" style=\"color:rgb(255, 121, 198)\">'1'<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token key atrule\">generated_at<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> <\/span><span class=\"token string\" style=\"color:rgb(255, 121, 198)\">'2026-08-30T20:20:30.928873+00:00'<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token key atrule\">apm_version<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> 0.20.0<\/span><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token key atrule\">dependencies<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token key atrule\">repo_url<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> DietrichGebert\/ponytail<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">host<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> github.com<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">resolved_commit<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> 2ed6c52c9d7e5e56942508591085fd45dea277d3<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">package_type<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> marketplace_plugin<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">content_hash<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> sha256<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\">595855eee726cb344087c38d7a3c29586ce8a0dd9a2e7ad8e8eedc91c8d8c575<\/span><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token key atrule\">repo_url<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> dotnet\/skills<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">host<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> github.com<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">resolved_commit<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> d68dd70857076a17d4b418649bbcd20a315d59c3<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">package_type<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> marketplace_plugin<\/span><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">content_hash<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> sha256<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\">34013ed32b6592ccd762f59215480fa5df94b82d0443b7f5288291ac786978e8<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>That answers \u201cwhat was active?\u201d more reliably than a screenshot of local settings.<\/p>\n<p>The lockfile records resolved commits and content hashes for review:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" loading=\"lazy\" alt=\"APM lockfile with resolved package commits and content hashes\" src=\"https:\/\/luke.geek.nz\/assets\/images\/apm-lockfile-native-518edb1e200b54c4671dbca41aa42efc.gif\" width=\"1280\" height=\"720\" class=\"img_ev3q\"\/><\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"evidence-from-the-repo\">Evidence from the repo<a href=\"#evidence-from-the-repo\" class=\"hash-link\" aria-label=\"Direct link to Evidence from the repo\" title=\"Direct link to Evidence from the repo\" translate=\"no\">\u200b<\/a><\/h2>\n<p>I validated the current setup with APM CLI <code>0.20.0<\/code>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" loading=\"lazy\" alt=\"APM running in a native Windows Terminal session\" src=\"https:\/\/luke.geek.nz\/assets\/images\/apm-native-terminal-9bc862f671ee57f4e38706ea4da1cdbb.gif\" width=\"1280\" height=\"720\" class=\"img_ev3q\"\/><\/p>\n<p>The useful result:<\/p>\n<div class=\"language-text codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-text codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">[*] All primitives validated successfully!<\/span><br\/><\/p><p><span class=\"token plain\">[i] Validated 86 primitives:<\/span><br\/><\/p><p><span class=\"token plain\">[i]   * 11 chatmodes<\/span><br\/><\/p><p><span class=\"token plain\">[i]   * 75 instructions<\/span><br\/><\/p><p><span class=\"token plain\">[i]   * 0 contexts<\/span><br\/><\/p><p><span class=\"token plain\">[i]   * 7 MCP dependencies<\/span><br\/><\/p><p><span class=\"token plain\">[*] All 27 check(s) passed<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>The command used:<\/p>\n<div class=\"language-powershell codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-powershell codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">apm <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">version<\/span><br\/><\/p><p><span class=\"token plain\">apm compile <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">validate<\/span><br\/><\/p><p><span class=\"token plain\">apm audit <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">ci <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">policy <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">.<\/span><span class=\"token plain\">\\apm-policy<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">.<\/span><span class=\"token plain\">yml <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">no-drift <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">no-fail-fast<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>The <code>--no-drift<\/code> flag is worth calling out. I used it because this working tree has generated-output drift unrelated to the policy example. That means the evidence proves manifest, lockfile, MCP config, and policy compliance. It does not claim the generated deployed files are fully drift-clean.<\/p>\n<p>That distinction is important. APM can be used in stages:<\/p>\n<ol>\n<li class=\"\">Get the manifest right.<\/li>\n<li class=\"\">Generate and commit the lockfile.<\/li>\n<li class=\"\">Add a small policy.<\/li>\n<li class=\"\">Pass policy checks in CI.<\/li>\n<li class=\"\">Tighten drift enforcement once generated files are clean and reproducible.<\/li>\n<\/ol>\n<p>This staged rollout avoids making a giant governance programme a prerequisite.<\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-hve-core-is\">What HVE Core is<a href=\"#what-hve-core-is\" class=\"hash-link\" aria-label=\"Direct link to What HVE Core is\" title=\"Direct link to What HVE Core is\" translate=\"no\">\u200b<\/a><\/h2>\n<p><a href=\"https:\/\/github.com\/microsoft\/hve-core\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Hypervelocity Engineering (HVE) Core<\/a> is Microsoft&#8217;s open-source library of agentic SDLC workflow building blocks for GitHub Copilot. It brings together specialised agents for research, planning, implementation, and review; reusable prompts; coding instructions; and skills.<\/p>\n<p>The value is not a magic workflow. It is a consistent set of starting points that teams can review, adapt, and use repeatedly. HVE Core is explicitly opinionated and rapidly evolving, so treat it as a source of patterns to evaluate rather than an unexamined platform dependency.<\/p>\n<p>It also makes HVE Core a useful APM example. Instead of copying external skills, agents, prompts, and instructions into a repo, APM declares the upstream package, applies the same policy controls, and locks the exact content alongside the team&#8217;s local context.<\/p>\n<p>The following is a complete example for someone new to HVE Core: declare the exact source, allow it in policy, install it, and commit the resulting lockfile. The installed content lands in the shared <code>.agents\/skills<\/code> directory, which supported agent harnesses can use.<\/p>\n<p>The quoted reference is deliberate: YAML would otherwise treat <code>#<\/code> and the commit as a comment.<\/p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<p>apm.yml<\/p>\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token key atrule\">dependencies<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">apm<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token string\" style=\"color:rgb(255, 121, 198)\">\"microsoft\/hve-core#c7ee5b9642ab1877a6b5ce5336ebc448b89b2708\"<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<p>apm-policy.yml<\/p>\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token key atrule\">dependencies<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">  <\/span><span class=\"token key atrule\">allow<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"\/><br\/><\/p><p><span class=\"token plain\">    <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> microsoft\/hve<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">core<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"language-powershell codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<p>Install and verify<\/p>\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-powershell codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">apm install <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">target agent-skills<\/span><br\/><\/p><p><span class=\"token plain\">apm audit <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">ci <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">policy <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">.<\/span><span class=\"token plain\">\\apm-policy<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">.<\/span><span class=\"token plain\">yml<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>This recorded run uses that setup in an isolated <code>agent-skills<\/code> target. APM resolves the exact commit, integrates 74 HVE Core skills, and records the commit and content hash in its lockfile:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" loading=\"lazy\" alt=\"APM installing the pinned HVE Core plugin, integrating 74 skills, and recording its lockfile entry\" src=\"https:\/\/luke.geek.nz\/assets\/images\/apm-hve-core-native-6556e66786827d34fd763f24f9aae084.gif\" width=\"1280\" height=\"720\" class=\"img_ev3q\"\/><\/p>\n<p>For a team rollout, start with the subset you can support. Pin a reviewed revision, assess the agents and skills you select, and update deliberately.<\/p>\n<p>For an Azure platform team, I would keep the first implementation small:<\/p>\n<div class=\"language-powershell codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-powershell codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token plain\">apm init<\/span><br\/><\/p><p><span class=\"token plain\">apm install<\/span><br\/><\/p><p><span class=\"token plain\">apm lock<\/span><br\/><\/p><p><span class=\"token plain\">apm audit <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">ci <\/span><span class=\"token operator\">--<\/span><span class=\"token plain\">policy <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">.<\/span><span class=\"token plain\">\\apm-policy<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">.<\/span><span class=\"token plain\">yml<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>Then add a required CI check:<\/p>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#F8F8F2;--prism-background-color:#282A36\">\n<div class=\"codeBlockContent_QJqH\">\n<pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#F8F8F2;background-color:#282A36\"><code class=\"codeBlockLines_e6Vv\"><p><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> actions\/checkout@v4<\/span><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> microsoft\/apm<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">action@v1<\/span><br\/><\/p><p><span class=\"token plain\"\/><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\"> <\/span><span class=\"token key atrule\">run<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">:<\/span><span class=\"token plain\"> apm audit <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">ci <\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">no<\/span><span class=\"token punctuation\" style=\"color:rgb(248, 248, 242)\">-<\/span><span class=\"token plain\">cache<\/span><br\/><\/p><\/code><\/pre>\n<\/div>\n<\/div>\n<p>The central platform package would carry approved guidance:<\/p>\n<ul>\n<li class=\"\">Azure Well-Architected review prompts.<\/li>\n<li class=\"\">AKS architecture and production-readiness skills.<\/li>\n<li class=\"\">Azure Functions, App Service, APIM, Container Apps, and IaC skills.<\/li>\n<li class=\"\">Azure AI Foundry and Agent Framework skills.<\/li>\n<li class=\"\">Security, identity, monitoring, reliability, and cost instructions.<\/li>\n<\/ul>\n<p>Application repos would keep local context for their own architecture and domain.<\/p>\n<p>The policy should stay focused on the supply-chain boundary:<\/p>\n<ul>\n<li class=\"\">allowed package sources<\/li>\n<li class=\"\">allowed MCP servers<\/li>\n<li class=\"\">allowed transports<\/li>\n<li class=\"\">allowed targets<\/li>\n<li class=\"\">required manifest fields<\/li>\n<\/ul>\n<p>Do not encode every engineering preference in policy. That belongs in reviewed skills, instructions, and architecture guidance.<\/p>\n<p>APM does not replace Azure Policy, Defender for Cloud, Entra ID, workload identity, network controls, human review, or runtime permission models. It is package management and CI governance for agent context.<\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-practical-caveat\">The practical caveat<a href=\"#the-practical-caveat\" class=\"hash-link\" aria-label=\"Direct link to The practical caveat\" title=\"Direct link to The practical caveat\" translate=\"no\">\u200b<\/a><\/h2>\n<p>The ecosystem is still young.<\/p>\n<p>In my setup, <code>apm lock --parallel-downloads 0<\/code> was the reliable path for generating the lockfile. A full install also surfaced useful rough edges: generated hook path drift, target-specific hook naming warnings, and checkout friction in one package on Windows.<\/p>\n<p>I consider that useful signal, not a reason to ignore the model.<\/p>\n<p>The lesson is the same as every other package ecosystem:<\/p>\n<ul>\n<li class=\"\">pin what you can<\/li>\n<li class=\"\">audit what you install<\/li>\n<li class=\"\">keep generated outputs boring<\/li>\n<li class=\"\">fix drift before making drift checks mandatory<\/li>\n<\/ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-practical-takeaway\">The practical takeaway<a href=\"#the-practical-takeaway\" class=\"hash-link\" aria-label=\"Direct link to The practical takeaway\" title=\"Direct link to The practical takeaway\" translate=\"no\">\u200b<\/a><\/h2>\n<p>Skills that guide AKS deployment, APIM configuration, Application Insights instrumentation, or Microsoft Foundry work should be versioned and reviewable. MCP servers exposing Azure operations should be declared and explicitly allowed. APM provides the manifest, lockfile, and policy checks for that work.<\/p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"references\">References<a href=\"#references\" class=\"hash-link\" aria-label=\"Direct link to References\" title=\"Direct link to References\" translate=\"no\">\u200b<\/a><\/h2>\n<\/div>\n<p><a href=\"https:\/\/luke.geek.nz\/azure\/agent-package-manager\/?utm_source=tldrit\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>AI coding tools are getting better quickly. The setup around them is still too often a pile of local files, copied prompts, one-off MCP servers, and tribal knowledge. One developer has custom GitHub Copilot instructions. Another has Claude agents. Someone else has Cursor rules. The platform team wants approved Azure patterns, Microsoft Learn grounding, cost [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":23659,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[],"class_list":["post-23658","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23658","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/comments?post=23658"}],"version-history":[{"count":0,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23658\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media\/23659"}],"wp:attachment":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media?parent=23658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/categories?post=23658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/tags?post=23658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}