Blog Post

Microsoft Developer Community Blog
8 MIN READ

Six Coding Agents, One Production System: A Field Guide to AgenticOps with AKS-Lab-GitHubCopilot

kinfey's avatar
kinfey
Icon for Microsoft rankMicrosoft
May 15, 2026

The shift: from "AI helps me code" to "AI authors my repo"

For two years we've been talking about GitHub Copilot as an inline pair programmer — a clever autocomplete that lives in your editor. That framing is officially out of date.

The new reality is agentic delivery: a team of named, scoped AI agents owns slices of your repository, each with its own tools, skills, and refusal rules. They produce pull requests. They run tests. They roll deployments. And when one finishes its turn, it hands off to the next.

The microsoft/AKS-Lab-GitHubCopilot's five labs you ship ZavaShop — a multi-agent retail supply-chain control plane running on AKS + Azure Container Apps — and along the way you internalize an operating model you can carry to any project. Everything in the repo (specs, agents, MCP servers, tests, Bicep, Helm, GitHub Actions) is authored by six GitHub Copilot Custom Coding Agents working from your IDE, plus the remote GitHub Copilot Coding Agent that closes the PR loop on GitHub.

This is what AgenticOps looks like in practice.

Two layers of agents — don't confuse them

The first cognitive hurdle in this lab is keeping two very different agent populations straight:

LayerWhat it isWhen it livesExamples
Application agentsThe product you ship — the runtime ZavaShop fleet that solves a business problemProduction (AKS + ACA)InventoryAgent, SupplierAgent, LogisticsAgent, PricingAgent, OrchestratorAgent
Coding agentsThe dev-time team that writes the application agentsYour IDE + GitHubrequirements-analyst, mcp-builder, agent-builder, orchestrator-architect, test-author, deploy-engineer

Both are built with the Microsoft Agent Framework (MAF). Both use the GitHub Copilot SDK as their model provider. But they exist at different layers of the development lifecycle, and the entire lab is structured around that distinction.

If you only remember one thing from this post: the coding agents are how you build the application agents. That is the whole AgenticOps loop, compressed into one sentence.

GitHub Copilot Coding Agent vs. Custom Coding Agents

There are two flavors of "coding agent" in the GitHub Copilot ecosystem, and this lab uses both.

1. The remote GitHub Copilot Coding Agent

This is the GitHub-side, asynchronous, PR-driven agent. You assign it an issue, it spins up a sandboxed environment, writes the code, runs the tests, and opens a PR for human review. You don't watch it work — you review what it produces.

In ZavaShop, Lab 04 (Testing) explicitly uses this agent: you take a failing eval scenario, file it as an issue, assign it to Copilot, and the agent comes back with a PR. Your job is the human bar, not the keystrokes.

Important governance choice from AGENTS.md: the remote Coding Agent is allowed to open PRs against src/ and tests/ only — never against infra/ without human review. That single rule is a textbook example of agent-aware policy.

2. The local Custom Coding Agents

These are scoped, in-IDE specialist agents you select <agent name> in Copilot Chat. They live as *.agent.md files inside .github/agents/ and are discovered by VS Code on reload. Each one owns exactly one slice of the repository.

Six of them ship in this lab:

PhaseAgentOwnsRefusal rule
Requirementsrequirements-analystspecs/*.mdRefuses to write code
MCP toolsmcp-buildersrc/mcp_servers/*One server per turn
Specialist agentsagent-buildersrc/agents/<specialist>/*One specialist per turn
Orchestrationorchestrator-architectsrc/agents/orchestrator/*, src/shared/*, docker-compose.ymlOwns wiring, not business logic
Teststest-authortests/**Never edits src/
Deploydeploy-engineerinfra/**, .github/workflows/**Won't touch application code

The pattern that matters here isn't just "we made some custom agents." It's that every agent declares what it owns and what it refuses to do. That refusal envelope is what makes the system safe to delegate to. Without it, you'd just have a noisier autocomplete.

Three workflow prompts in .github/prompts/ chain the agents together so you don't have to remember the sequence:

  • /feature-from-issue — issue → spec → code → tests → PR → deploy
  • /spec-to-code — drive an existing spec through code + tests
  • /ship-it — quality gate → build → push → ACR/ACA/AKS rollout → smoke + evals

This is the closest thing I've seen to a programmable software development lifecycle.

Where AgenticOps fits in

DevOps gave us repeatable infrastructure. MLOps gave us repeatable model lifecycles. AgenticOps is what you need when the thing you're operating is itself a fleet of autonomous agents — both at build time and at runtime.

The lab makes the four pillars of AgenticOps concrete:

  1. Specs as the contract. /requirements-analyst produces specs/<slug>.md files with goals, contracts, and eval scenarios. Nothing else in the repo is built until that spec exists. Specs are the source of truth that human reviewers actually read.
  2. Skills as living documentation. .github/skills/<skill>/SKILL.md files hold shared, agent-agnostic knowledge — Python conventions, Kubernetes patterns, MAF idioms. Every coding agent declares which skills it must consult before writing code. This is how you stop drift: knowledge lives in one place and is pulled in on demand.
  3. Evals as the quality gate. The repo runs a four-layer test pyramid plus five golden eval scenarios (S1–S5). uv run poe check runs locally and in GitHub Actions. Copilot-authored PRs must pass the same bar a human does — no exceptions.
  4. Observability tied to agent identity. Every agent emits agent.name, agent.run_id, and agent.span_id through structlog. When something misbehaves in production, you can trace the line from "this evaluation failed" all the way back to "this version of this agent, on this run, called this tool with these arguments."

These four pillars aren't ZavaShop-specific. They're the contract for any AgenticOps system: scoped ownership, contracts as code, evals as gates, identity in every span.

Walking through the workshop: which agent does what, when


The five labs are five chapters of one story — ZavaShop going from an empty Azure subscription to a live retail control plane. Each lab activates a different subset of coding agents.

Lab 01 — Environment Setup (no coding agents yet)

You provision the platform: AKS cluster, ACA environment, Azure Container Registry, Key Vault, and the Workload Identity that every agent will wear. Then you install the six Custom Coding Agents into your IDE. Think of this as hiring the development team and giving them their badges.

Lab 02 — Agent Creation (four agents in play)

This is where it clicks. You start by requirements-analyst in Copilot Chat to produce the spec for each ZavaShop application agent. Then mcp-builder is invoked four times to scaffold the four MCP servers — one per domain (inventory DB, supplier API, shipping API, pricing API). Then agent-builder runs four more times to build the typed ChatAgent specialists. Finally orchestrator-architect wires them together with a MAF Workflow.

What's stunning about this lab is the handoff discipline. Every coding agent ends its turn with a line naming the next agent to invoke. You're not orchestrating the work — the agents are.

Lab 03 — Multi-Agent Orchestration & Config (two agents)

The orchestrator stops being a one-shot LLM call and becomes a deterministic Workflow. Secrets move from .env to Key Vault. The whole fleet boots locally with Docker Compose. This is orchestrator-architect's star turn — wiring A2A endpoints, MCP tool registration, Key Vault hydration, OpenTelemetry. Specs come from requirements-analyst; the rest is orchestration.

Lab 04 — Testing (both coding agent flavors)

/test-author writes the four-layer pyramid (unit, MCP contract, integration, eval). Then you switch gears: take a failing eval scenario, file it as a GitHub issue, and assign it to the remote GitHub Copilot Coding Agent. The agent works asynchronously, opens a PR, and uv run poe check decides whether it passes. This is the lab where the local-vs-remote distinction stops being abstract and starts being operational.

Lab 05 — Deployment & Run (deployment specialist)

/deploy-engineer writes the Helm chart for the AKS orchestrator and the Bicep modules for the ACA specialists. The /ship-it workflow prompt then runs the full pipeline: quality gate → ACR build → ACA deploy → AKS rollout → smoke tests → evals. GitHub Actions OIDC re-runs the same pipeline on every main push.

Notice the pattern across all five labs: at no point does a human write production code from scratch. Humans set goals, review specs, approve PRs, and run quality gates. The keystrokes belong to agents.

How Coding Agents transform the DevOps pipeline

Take a step back from the lab and ask: what actually changes in your DevOps flow when you adopt this model?

The atomic unit of work shifts. In classic DevOps the unit is the commit. In AgenticOps the unit is the spec. A spec drives one or more agents; agents produce commits; commits trigger CI; CI gates promotion. The commit becomes a derived artifact, not the starting point.

Code review changes shape. You're no longer reviewing "did this human understand the codebase?" — you're reviewing "did this agent follow its refusal rules, consult its skills, and produce something that passes the evals?" Reviewers spend less time on style and more time on intent. The diff is often less interesting than the spec it came from.

Governance becomes structural, not procedural. Instead of writing a wiki page that says "don't touch infra without review," you encode that rule in AGENTS.md and refuse to let the agent's tool set include infra paths. Policy becomes part of the agent definition, not a checklist humans hopefully remember.

The CI pipeline expands. Beyond build/test/deploy, you now have an eval stage that asks "does the system still behave correctly on the golden scenarios?" — and a Copilot-authored PR has to pass the same eval stage as a human-authored one. The pipeline is the great equalizer.

Onboarding compresses. A new engineer doesn't need to read 50 wiki pages to be productive. They read AGENTS.md, select the relevant agent walks them through. Institutional knowledge lives in .agent.md and SKILL.md files instead of senior engineers' heads.

The net effect is a pipeline that's faster, more uniform, and easier to audit. Faster because agents parallelize what humans serialize. More uniform because every change goes through the same six-agent template. Easier to audit because every artifact has a named author and a refusal rule it had to respect.

What to take away

The AKS-Lab-GitHubCopilot workshop teaches three things at once. The surface lesson is "how to build a multi-agent retail system on AKS." The middle lesson is "how to use GitHub Copilot Custom Agents and the remote Coding Agent." The deepest lesson — and the one I'd argue matters most — is how to design a development process where AI agents are first-class citizens with bounded responsibilities, not free-form copilots.

If you take the model and walk away from the lab, three patterns are worth keeping:

  1. Scope before capability. Don't give an agent every tool; give it the smallest surface that makes it useful.
  2. Specs are the API between humans and agents. Invest in requirements-analyst-style flows even if the rest of your stack isn't there yet.
  3. Evals are non-negotiable. The moment an agent can open a PR, you need a quality gate that doesn't care who the author is.

Clone the repo microsoft/AKS-Lab-GitHubCopilot , hit Developer: Reload Window, select agents in Copilot Chat, and watch six teammates show up. That's the future of the DevOps pipeline — and it's already shipping.

Resources

Updated May 14, 2026
Version 1.0
No CommentsBe the first to comment