<?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>DEV Community: Marcel.Lupo</title>
    <description>The latest articles on DEV Community by Marcel.Lupo (@pwd9000).</description>
    <link>https://dev.to/pwd9000</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg</url>
      <title>DEV Community: Marcel.Lupo</title>
      <link>https://dev.to/pwd9000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pwd9000"/>
    <language>en</language>
    <item>
      <title>Can Copilot Fix Its Own Security Findings? Testing GitHub Agentic Autofix</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Mon, 17 Aug 2026 14:22:50 +0000</pubDate>
      <link>https://dev.to/pwd9000/can-copilot-fix-its-own-security-findings-testing-github-agentic-autofix-351b</link>
      <guid>https://dev.to/pwd9000/can-copilot-fix-its-own-security-findings-testing-github-agentic-autofix-351b</guid>
      <description>&lt;h2&gt;
  
  
  Can Copilot Fix Its Own Security Findings? Testing GitHub Agentic Autofix
&lt;/h2&gt;

&lt;p&gt;GitHub can now assign a code scanning alert directly to Copilot cloud agent. The agent explores the repository, changes code, attempts validation, and opens a draft pull request. That is more ambitious than generating a patch beside one vulnerable line. It is also not the same as proving that a vulnerability is gone.&lt;/p&gt;

&lt;p&gt;The practical answer to the title is therefore: &lt;strong&gt;Copilot can attempt end-to-end remediation, but the strength of the evidence depends on the scanner and your CI controls. A human still owns the security decision.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This deep dive goes beyond my earlier &lt;a href="https://dev.to/pwd9000/using-github-copilot-coding-agent-for-devops-automation-3f43"&gt;introduction to Copilot coding agent&lt;/a&gt;. Rather than surveying general coding tasks, it examines one narrow DevSecOps question: how should a team test, review, and govern agentic autofix without mistaking automation for assurance?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Evidence boundary:&lt;/strong&gt; Agentic autofix is a paid public preview. I have not invented a successful run, timing result, credit charge, or vulnerability closure. The experiment below is a reproducible evaluation design for an eligible sandbox. Product behaviour is grounded in GitHub's 10 July 2026 announcement, its 16 July clarification, and linked GitHub documentation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What GitHub Announced, and What It Clarified
&lt;/h2&gt;

&lt;p&gt;On 10 July 2026, GitHub announced &lt;a href="https://github.blog/changelog/2026-07-10-agentic-autofix-for-code-scanning-alerts-in-public-preview" rel="noopener noreferrer"&gt;agentic autofix for code scanning alerts in public preview&lt;/a&gt;. The original workflow is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Assign one or more code scanning alerts to Copilot.&lt;/li&gt;
&lt;li&gt;Copilot cloud agent inspects relevant files across the codebase.&lt;/li&gt;
&lt;li&gt;It proposes a fix and attempts to validate it.&lt;/li&gt;
&lt;li&gt;It iterates when necessary.&lt;/li&gt;
&lt;li&gt;It opens a draft pull request containing the changes, an explanation, and validation details.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub says generation typically takes two to four minutes, but that is product guidance, not a result measured in this article.&lt;/p&gt;

&lt;p&gt;The editor's note added on &lt;strong&gt;16 July 2026&lt;/strong&gt; matters. It clarified that assignment works for &lt;strong&gt;all first-party and third-party code scanning alerts&lt;/strong&gt;. In other words, eligibility is not limited to CodeQL findings. Alerts uploaded by integrated tools through SARIF can also be assigned.&lt;/p&gt;

&lt;p&gt;That does not make all validation equal. GitHub's detailed &lt;a href="https://docs.github.com/en/enterprise-cloud@latest/code-security/concepts/code-scanning/autofix-for-code-scanning" rel="noopener noreferrer"&gt;autofix documentation&lt;/a&gt; says agentic autofix re-runs CodeQL using the code-scanning query suite on a best-effort basis. It cannot confirm alerts from custom CodeQL queries or the security-extended suite through that validation path, and fix quality for third-party alerts is not guaranteed.&lt;/p&gt;

&lt;p&gt;This distinction is the centre of a sound evaluation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Answer in the preview&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Can the alert be assigned?&lt;/td&gt;
&lt;td&gt;Yes, for first-party and third-party code scanning alerts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can Copilot edit multiple files?&lt;/td&gt;
&lt;td&gt;Yes. The cloud agent explores the wider codebase.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does GitHub open a pull request?&lt;/td&gt;
&lt;td&gt;Yes, normally a draft pull request with a summary and validation notes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is the originating finding always re-proven as closed?&lt;/td&gt;
&lt;td&gt;No. Built-in validation has scanner and query-suite limits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is the pull request ready to merge without review?&lt;/td&gt;
&lt;td&gt;No. Validation, behaviour, dependencies, and risk still require human review.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not extend the claim beyond code scanning. Dependabot and secret scanning are separate alert families with their own remediation workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Agent Loop Is the Real Change
&lt;/h2&gt;

&lt;p&gt;Classic Copilot Autofix translates alert context into a single suggested change. Agentic autofix delegates a task to Copilot cloud agent, which can use repository context and tools over several iterations.&lt;/p&gt;

&lt;p&gt;The loop is roughly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alert context
    -&amp;gt; inspect related code and repository instructions
    -&amp;gt; form a remediation plan
    -&amp;gt; edit one or more files
    -&amp;gt; run available analysis and tests
    -&amp;gt; inspect failures or remaining findings
    -&amp;gt; revise the change
    -&amp;gt; open a draft pull request for review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Repository and organisation custom instructions apply while the agent works. That makes existing engineering guidance part of the control plane. A repository that tells agents to run focused tests, avoid new dependencies, and preserve public APIs gives the remediation loop better constraints than a repository with no executable acceptance criteria.&lt;/p&gt;

&lt;p&gt;Validation must still be read scanner by scanner:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CodeQL code-scanning suite:&lt;/strong&gt; Copilot can re-run CodeQL and use the result to iterate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom or security-extended CodeQL queries:&lt;/strong&gt; the documented built-in re-run does not prove those alerts are resolved. Re-run the repository's actual advanced setup in PR CI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-party SARIF alerts:&lt;/strong&gt; assignment is supported, but the scanner's own PR workflow remains the authoritative check. A clean CodeQL result does not close a Semgrep, Snyk, Checkmarx, or other third-party finding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Functional behaviour:&lt;/strong&gt; no static analyser proves that the application still meets its requirements. Unit, integration, contract, and negative security tests remain essential.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent may also report that it could not validate a fix or that an alert appears to be a false positive. That is useful evidence, not an invitation to auto-dismiss the finding.&lt;/p&gt;


&lt;h2&gt;
  
  
  Four Ways to Assign Work
&lt;/h2&gt;

&lt;p&gt;GitHub exposes the same remediation idea through four entry points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Individual alert UI:&lt;/strong&gt; open a code scanning alert and choose &lt;strong&gt;Assign to Copilot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert backlog batch:&lt;/strong&gt; select between 1 and 25 alerts and assign them together. Copilot works on the selected set in one pull request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security campaign:&lt;/strong&gt; select between 1 and 25 campaign alerts for one pull request. This fits an organised remediation deadline, but it increases review and rollback coupling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REST API:&lt;/strong&gt; update one code scanning alert and set &lt;code&gt;assignees&lt;/code&gt; to &lt;code&gt;['copilot-swe-agent[bot]']&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The repository includes a &lt;a href="//./code/assign-alert-to-copilot.ps1"&gt;safe PowerShell REST helper&lt;/a&gt;. Preview its target without making a request:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;/code/assign-alert-to-copilot.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Owner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'acme-security'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Repository&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'agentic-autofix-lab'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-AlertNumber&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-WhatIf&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For an authorised run, set &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; in the process environment and omit &lt;code&gt;-WhatIf&lt;/code&gt;. The helper sends:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;PATCH /repos/acme-security/agentic-autofix-lab/code-scanning/alerts/42
Accept: application/vnd.github+json
X-GitHub-Api-Version: 2026-03-10

{"assignees":["copilot-swe-agent[bot]"]}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;a href="https://docs.github.com/en/enterprise-cloud@latest/rest/code-scanning/code-scanning?apiVersion=2026-03-10#update-a-code-scanning-alert" rel="noopener noreferrer"&gt;Update a code scanning alert endpoint&lt;/a&gt; returns &lt;code&gt;200 OK&lt;/code&gt; on success. Classic personal access tokens need &lt;code&gt;security_events&lt;/code&gt; for private or public repositories, or &lt;code&gt;public_repo&lt;/code&gt; for public repositories only. Use the least-privileged supported token for your automation and never place it in the script, command history, or repository.&lt;/p&gt;

&lt;p&gt;Start with one alert. A batch saves orchestration time, but it makes attribution harder: which edit fixed which alert, which check failed, and which change should be reverted? Batch only alerts that share a component, scanner, owner, and rollback unit.&lt;/p&gt;


&lt;h2&gt;
  
  
  Licence, Policy, and Cost Boundaries
&lt;/h2&gt;

&lt;p&gt;The preview requires both sides of the product boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An active &lt;strong&gt;GitHub Code Security or GitHub Advanced Security&lt;/strong&gt; licence.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;GitHub Copilot licence&lt;/strong&gt; with Copilot cloud agent enabled.&lt;/li&gt;
&lt;li&gt;Copilot Autofix available in the repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Administrators can disable Copilot Autofix at enterprise, organisation, or repository level. Because agentic autofix relies on that setting, disabling classic Autofix also blocks the agentic experience. Administrators can separately opt repositories out of Copilot cloud agent. When the cloud agent is unavailable, assigning an alert falls back to classic Copilot Autofix instead of starting an agentic session. An enterprise policy set to not allowed cannot be overridden lower in the hierarchy, allowing it merely lets organisation and repository administrators choose.&lt;/p&gt;

&lt;p&gt;The billing model is materially different from classic Autofix:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Copilot licence&lt;/th&gt;
&lt;th&gt;AI Credits&lt;/th&gt;
&lt;th&gt;Actions minutes&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Classic Copilot Autofix&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Not for generation&lt;/td&gt;
&lt;td&gt;One suggested fix to review and apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agentic autofix&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Iterative agent session and draft PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual remediation&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Normal CI usage&lt;/td&gt;
&lt;td&gt;Engineer-authored change and PR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;During public preview, AI Credits are consumed only when a fix runs on alerts assigned to Copilot. The announcement says this usage is not itemised separately from other Copilot activity during the preview. Agent activity also consumes GitHub Actions minutes. Do not promise a fixed cost per alert: session depth, batch size, tests, runner type, and retries can change consumption.&lt;/p&gt;

&lt;p&gt;Set a pilot budget before enabling broad campaigns. Track assigned alerts, agent sessions, Actions duration, PR outcome, and human review time together. A cheap generated patch that creates an expensive review queue is not a successful control.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Reproducible Sandbox Evaluation
&lt;/h2&gt;

&lt;p&gt;Use an organisation-owned sandbox that has the required licences and policies. Do not test with production secrets, customer data, or a live deployment path.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Prepare representative findings
&lt;/h3&gt;

&lt;p&gt;Create three small, intentionally vulnerable examples with deterministic tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A CodeQL alert from the documented code-scanning suite.&lt;/li&gt;
&lt;li&gt;A CodeQL alert produced only by your custom or security-extended configuration.&lt;/li&gt;
&lt;li&gt;A third-party alert uploaded as SARIF by the scanner you actually use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep each case on the default branch, record the alert number and tool, and ensure the scanner also runs on pull requests. Add functional tests that fail if a simplistic security patch changes intended behaviour.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Establish the baseline
&lt;/h3&gt;

&lt;p&gt;Before assignment, record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit SHA, scanner version, query suite, rule ID, severity, and alert URL.&lt;/li&gt;
&lt;li&gt;Passing and failing test results.&lt;/li&gt;
&lt;li&gt;Existing alert count for every enabled scanner.&lt;/li&gt;
&lt;li&gt;Repository instructions and agent setup workflow revision.&lt;/li&gt;
&lt;li&gt;The expected secure behaviour, including negative test cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without that baseline, an alert disappearing could mean a real fix, a changed path, a scanner configuration change, or stale analysis.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Run isolated assignments
&lt;/h3&gt;

&lt;p&gt;Assign one alert at a time through the UI. Reserve the API helper for a second pass after the manual flow is understood. Capture the agent session log, draft PR, changed files, explanation, validation commands, Actions runs, elapsed time, and AI Credit reporting available to your administrators.&lt;/p&gt;

&lt;p&gt;Do not steer the first run unless it is blocked. You want to observe the default behaviour. In a later run, add precise repository instructions and compare whether the agent chooses better tests and smaller changes. Because model output is non-deterministic, repeat representative cases rather than treating one success as a rate.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Apply a merge gate
&lt;/h3&gt;

&lt;p&gt;A candidate passes only when all applicable checks are true:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Reviewer question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scanner closure&lt;/td&gt;
&lt;td&gt;Did the original scanner, rule, configuration, and branch report the finding as fixed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regression scan&lt;/td&gt;
&lt;td&gt;Did the change introduce new first-party or third-party alerts?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional safety&lt;/td&gt;
&lt;td&gt;Do unit, integration, contract, and negative security tests pass?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patch quality&lt;/td&gt;
&lt;td&gt;Is the root cause fixed without broad rewrites or suppression?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency integrity&lt;/td&gt;
&lt;td&gt;Are new names real, supported, pinned appropriately, and licence-approved?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Can every changed file be traced to the assigned alert?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewability&lt;/td&gt;
&lt;td&gt;Is the PR small enough for a security-aware engineer to understand?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operations&lt;/td&gt;
&lt;td&gt;Are configuration, telemetry, runbooks, and rollback impacts addressed?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Report outcomes as &lt;strong&gt;validated&lt;/strong&gt;, &lt;strong&gt;partially validated&lt;/strong&gt;, &lt;strong&gt;not validated&lt;/strong&gt;, or &lt;strong&gt;incorrect&lt;/strong&gt;. “PR opened” and “agent says fixed” are activity measures, not security outcomes.&lt;/p&gt;


&lt;h2&gt;
  
  
  Review Risks and Rollback
&lt;/h2&gt;

&lt;p&gt;GitHub's &lt;a href="https://docs.github.com/en/enterprise-cloud@latest/code-security/responsible-use/security-and-quality-ai-features" rel="noopener noreferrer"&gt;responsible-use guidance&lt;/a&gt; is direct: generated fixes can contain syntax errors, change semantics, address only part of a vulnerability, introduce another vulnerability, or suggest an unsupported or even fabricated dependency. Large files and repositories can also cause relevant context to be truncated. The same alert may produce different changes on repeated runs.&lt;/p&gt;

&lt;p&gt;Review the data flow, trust boundaries, error paths, and tests, not just the highlighted line. Watch for common weak fixes such as swallowing an exception, removing functionality, adding a broad allow-list, weakening input validation, or suppressing the rule. Verify every dependency independently.&lt;/p&gt;

&lt;p&gt;Before merge, rollback is simple: stop steering the session, close the draft PR, and retain the session log for evaluation. After merge, revert the remediation PR rather than hand-editing around it, then rerun the original scanner and functional tests. Never dismiss an alert merely to align the dashboard with the agent's claim.&lt;/p&gt;

&lt;p&gt;One-alert PRs make this process much cleaner. For batch remediation, require a commit or clearly separable diff per alert and confirm the entire batch shares one rollback decision.&lt;/p&gt;

&lt;p&gt;GitHub states that data handled by Copilot Autofix is not used for LLM training, but your normal source-code access, data classification, and third-party scanner policies still apply.&lt;/p&gt;


&lt;h2&gt;
  
  
  Troubleshooting the Preview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Assignment does not start an agentic session:&lt;/strong&gt; check the Code Security or Advanced Security licence, Copilot licence, cloud agent policy, Copilot Autofix setting, repository opt-out, Actions availability, and your access to the alert. When cloud agent is unavailable, assignment can fall back to classic Copilot Autofix. Remember that upstream enterprise policy wins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The REST helper returns an error:&lt;/strong&gt; &lt;code&gt;400&lt;/code&gt; usually points to the request, &lt;code&gt;403&lt;/code&gt; can indicate an archived repository or missing Code Security entitlement, &lt;code&gt;404&lt;/code&gt; can indicate an inaccessible repository or alert, and &lt;code&gt;503&lt;/code&gt; is a service availability response. Confirm API version &lt;code&gt;2026-03-10&lt;/code&gt;, token scopes, alert number, and repository before retrying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A PR opens without convincing validation:&lt;/strong&gt; inspect the agent session log. Determine whether the alert came from a custom query, the security-extended suite, or a third-party scanner. Ensure the exact scanner runs on the PR and that its credentials and dependencies are available without weakening the agent environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The alert stays open after a plausible fix:&lt;/strong&gt; compare branch, commit SHA, analysis category, and configuration. The same alert can be produced by multiple code scanning configurations, and stale configurations can disagree. Re-run the authoritative workflow rather than relying on the PR description.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The patch is too broad:&lt;/strong&gt; ask Copilot in a PR comment to reduce scope, preserve the public API, and add a regression test. If the design remains difficult to verify, close the PR and remediate manually. Delegation is optional; accountability is not.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Sensible Adoption Path
&lt;/h2&gt;

&lt;p&gt;Start in observe mode with low-complexity, well-tested alerts in a non-production repository. Use individual assignments and require a security-aware reviewer. Compare agentic autofix with classic suggestions and manual fixes on patch size, scanner closure, regressions, review time, elapsed time, and cost.&lt;/p&gt;

&lt;p&gt;Move to broader repositories only after the same scanner-specific gates are automated in branch protection. Introduce small homogeneous batches next. Security campaigns should come last, after ownership, budgets, concurrency, rollback, and audit evidence are established.&lt;/p&gt;

&lt;p&gt;The feature is promising because it can do the tedious middle of remediation: investigate context, draft a multi-file change, run tools, and package evidence in a pull request. Its value is not that Copilot can mark its own work correct. Its value is that it can produce a testable candidate while deterministic scanners, repository tests, policy, and human review remain independent.&lt;/p&gt;

&lt;p&gt;That is the right answer to “Can Copilot fix its own security findings?” Let it try. Make your delivery system prove the result.&lt;/p&gt;


&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 17-08-2026&lt;/p&gt;

</description>
      <category>github</category>
      <category>security</category>
      <category>devsecops</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Agentic DevOps Needs Observability: Trace GitHub Copilot with OpenTelemetry</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Wed, 05 Aug 2026 07:16:58 +0000</pubDate>
      <link>https://dev.to/pwd9000/agentic-devops-needs-observability-trace-github-copilot-with-opentelemetry-405c</link>
      <guid>https://dev.to/pwd9000/agentic-devops-needs-observability-trace-github-copilot-with-opentelemetry-405c</guid>
      <description>&lt;h2&gt;
  
  
  Agentic DevOps Needs Observability: Trace GitHub Copilot with OpenTelemetry
&lt;/h2&gt;

&lt;p&gt;An agent can read files, call a model, run tools, delegate to a subagent and edit code in one request. When that request feels slow or fails, a final chat message is not enough evidence to explain what happened.&lt;/p&gt;

&lt;p&gt;On 8 July 2026, GitHub announced &lt;a href="https://github.blog/changelog/2026-07-08-enterprise-managed-opentelemetry-export-for-vs-code-and-cli" rel="noopener noreferrer"&gt;enterprise-managed OpenTelemetry export for VS Code and Copilot CLI&lt;/a&gt;. Administrators can now direct Copilot telemetry to an approved collector and govern the endpoint, transport, resource attributes, headers and content capture.&lt;/p&gt;

&lt;p&gt;That enterprise control builds on the OpenTelemetry support already documented in VS Code. Copilot Chat can emit traces, metrics and events for agent orchestration, model calls and tool execution. The result is operational evidence for questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which part of an agent request consumed the time?&lt;/li&gt;
&lt;li&gt;Which model or tool is producing errors?&lt;/li&gt;
&lt;li&gt;How many model turns does a task require?&lt;/li&gt;
&lt;li&gt;Are subagents linked to the parent trace?&lt;/li&gt;
&lt;li&gt;Is telemetry reaching the collector without capturing prompts or source code?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is important to set the boundary early. Telemetry can show latency, errors, token use and observed user actions. It does not prove that generated code is correct, that an engineer was productive, or that an agent made a good decision. Tests, reviews and delivery outcomes remain separate evidence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Current status:&lt;/strong&gt; Product behaviour and managed-setting values in this tutorial reflect the official documentation available on 5 August 2026. Pilot managed settings against your supported client versions before broad deployment.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;You will run Jaeger locally in Docker, configure VS Code to export Copilot agent telemetry over OTLP/HTTP, produce an agent trace and inspect its hierarchy. Content capture remains disabled throughout the local walkthrough.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copilot Chat in VS Code
        |
        | OTLP/HTTP on localhost:4318
        v
Jaeger all-in-one container
        |
        v
Trace UI on localhost:16686
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The sample also includes an enterprise &lt;code&gt;managed-settings.json&lt;/code&gt; shape for a later rollout. Local Jaeger uses transient in-memory storage, so this is a development exercise rather than a production observability platform.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a current VS Code build with GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;Docker Desktop or Docker Engine with Docker Compose&lt;/li&gt;
&lt;li&gt;permission to run a local container and bind ports &lt;code&gt;16686&lt;/code&gt;, &lt;code&gt;4317&lt;/code&gt; and &lt;code&gt;4318&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;a workspace where you can send a harmless agent request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No GitHub enterprise administration is required for the local exercise. Enterprise-managed delivery requires the appropriate GitHub plan and administrative access.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Understand the Trace You Are Looking For
&lt;/h2&gt;

&lt;p&gt;VS Code follows the OpenTelemetry Generative AI semantic conventions where a standard attribute exists. A typical request creates this span tree:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;invoke_agent copilot
  |-- chat &amp;lt;model&amp;gt;              model requests one or more tools
  |-- execute_tool &amp;lt;tool-name&amp;gt;  VS Code runs the tool
  |-- chat &amp;lt;model&amp;gt;              model produces the next action or response
  `-- execute_hook &amp;lt;hook-name&amp;gt;  when a configured hook runs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;invoke_agent&lt;/code&gt; wraps the full orchestration. Each &lt;code&gt;chat&lt;/code&gt; span represents one model API call, while each &lt;code&gt;execute_tool&lt;/code&gt; span records an individual tool invocation. A subagent receives the trace context, so its own &lt;code&gt;invoke_agent&lt;/code&gt; span appears below the parent tool span when the runtime can propagate that context.&lt;/p&gt;

&lt;p&gt;The attributes use three namespaces:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Namespace&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gen_ai.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OpenTelemetry GenAI semantic conventions, including operation, provider, model and token attributes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github.copilot.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Canonical Copilot-specific attributes for new queries and dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copilot_chat.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Legacy VS Code extension attributes retained for compatibility&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prefer &lt;code&gt;gen_ai.*&lt;/code&gt; and &lt;code&gt;github.copilot.*&lt;/code&gt; for new dashboards. The legacy namespace is still useful when an existing query depends on it.&lt;/p&gt;

&lt;p&gt;Even with content capture off, metadata can include the repository remote, branch, commit SHA, GitHub organisation, model, token counts, tool names and errors. Treat that metadata according to your organisation's data classification rather than assuming that "no prompts" means "no sensitive context".&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Start Jaeger Locally
&lt;/h2&gt;

&lt;p&gt;The tutorial pins the current Jaeger 2.20 all-in-one image and binds every port to the loopback interface:&lt;/p&gt;




&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;jaeger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cr.jaegertracing.io/jaegertracing/jaeger:2.20.0&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:16686:16686'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:4317:4317'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:4318:4318'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;From the post directory, start it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;code/compose.yaml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;up&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;code/compose.yaml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ps&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open &lt;code&gt;http://localhost:16686&lt;/code&gt;. The service list can be empty because no trace has arrived yet. Port &lt;code&gt;4318&lt;/code&gt; receives OTLP/HTTP, &lt;code&gt;4317&lt;/code&gt; receives OTLP/gRPC, and &lt;code&gt;16686&lt;/code&gt; serves the Jaeger UI.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Enable Copilot OpenTelemetry Without Content
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;Preferences: Open User Settings (JSON)&lt;/strong&gt; in VS Code and merge these keys into your settings:&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;"github.copilot.chat.otel.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.chat.otel.exporterType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"otlp-http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.chat.otel.otlpEndpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:4318"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.chat.otel.captureContent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;p&gt;Reload VS Code after changing the configuration. Keeping &lt;code&gt;captureContent&lt;/code&gt; false excludes full prompts, responses, system prompts, tool schemas, tool arguments and tool results. Metadata such as timing, model names and token counts is still emitted.&lt;/p&gt;

&lt;p&gt;You can configure the same route with environment variables such as &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;, but environment variables override user settings. A managed policy overrides both. The effective value order is managed policy, environment variable, user setting, then default.&lt;/p&gt;

&lt;p&gt;Do not append &lt;code&gt;/v1/traces&lt;/code&gt; to this base endpoint. An OTLP/HTTP exporter constructs signal-specific paths from &lt;code&gt;http://localhost:4318&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Generate and Inspect a Trace
&lt;/h2&gt;

&lt;p&gt;Send a small agent request that causes at least one read-only tool call:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read package.json, explain what each script validates, and do not edit any files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Wait for the response, then return to Jaeger:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select &lt;code&gt;copilot-chat&lt;/code&gt; in &lt;strong&gt;Service&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Find Traces&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open the newest &lt;code&gt;invoke_agent&lt;/code&gt; trace.&lt;/li&gt;
&lt;li&gt;Expand the &lt;code&gt;chat&lt;/code&gt; and &lt;code&gt;execute_tool&lt;/code&gt; children.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Inspect the root duration first. A long root with short model spans can indicate tool or orchestration time. A long &lt;code&gt;chat&lt;/code&gt; span points towards model or network latency. Repeated &lt;code&gt;chat&lt;/code&gt; and &lt;code&gt;execute_tool&lt;/code&gt; pairs show how many reasoning turns the task needed. An &lt;code&gt;error.type&lt;/code&gt; attribute marks a failed operation.&lt;/p&gt;

&lt;p&gt;Useful attributes include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gen_ai.request.model&lt;/code&gt; and &lt;code&gt;gen_ai.response.model&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gen_ai.usage.input_tokens&lt;/code&gt; and &lt;code&gt;gen_ai.usage.output_tokens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gen_ai.tool.name&lt;/code&gt; and &lt;code&gt;gen_ai.tool.type&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.copilot.agent.type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;github.copilot.git.repository&lt;/code&gt;, branch and commit attributes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;copilot_chat.time_to_first_token&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should not see &lt;code&gt;gen_ai.input.messages&lt;/code&gt;, &lt;code&gt;gen_ai.output.messages&lt;/code&gt;, tool arguments or tool results because content capture is disabled.&lt;/p&gt;

&lt;p&gt;Jaeger is ideal for this trace walkthrough, but it is not the complete destination for every emitted signal. Use an OpenTelemetry Collector with a metrics and logs backend when you want durable metrics, event analysis, retention controls and alerting.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5: Turn Signals Into Useful SLIs
&lt;/h2&gt;

&lt;p&gt;Start with service level indicators that describe the system, not the developer. Set targets only after measuring a representative baseline.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Example SLI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Are agent requests completing promptly?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot_chat.agent.invocation.duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;95th percentile end-to-end duration below a team-defined threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are model calls responsive?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gen_ai.client.operation.duration&lt;/code&gt; and &lt;code&gt;copilot_chat.time_to_first_token&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;95th percentile model duration and time to first token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are tools reliable?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;copilot_chat.tool.call.count&lt;/code&gt;, duration and &lt;code&gt;error.type&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Successful tool calls divided by all tool calls, grouped by tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are tasks looping?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot_chat.agent.turn.count&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Percentage of invocations above a reviewed turn-count threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is token demand changing?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gen_ai.client.token.usage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Input and output token distribution by resolved model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are edits retained?&lt;/td&gt;
&lt;td&gt;edit acceptance and survival metrics&lt;/td&gt;
&lt;td&gt;Trend for investigation, never a correctness score&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Events add detail around individual moments. Examples include &lt;code&gt;copilot_chat.session.start&lt;/code&gt;, &lt;code&gt;copilot_chat.tool.call&lt;/code&gt;, &lt;code&gt;copilot_chat.agent.turn&lt;/code&gt;, edit feedback and cloud-session invocation. Use them to explain a metric change, such as which tool began failing after an extension update.&lt;/p&gt;

&lt;p&gt;Avoid leaderboards based on token counts, accepted lines or session volume. More activity can mean harder work, unnecessary loops or a misconfigured agent. Edit acceptance and survival are behavioural observations, not proof of quality or productivity.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 6: Apply Privacy Before Scale
&lt;/h2&gt;

&lt;p&gt;OpenTelemetry is off by default, and content capture is separately opt-in. Keep that separation in production.&lt;/p&gt;

&lt;p&gt;A practical privacy review should cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data categories in attributes, events and optional content&lt;/li&gt;
&lt;li&gt;approved collector endpoints and TLS validation&lt;/li&gt;
&lt;li&gt;access control for traces, metrics and logs&lt;/li&gt;
&lt;li&gt;retention, deletion and regional storage requirements&lt;/li&gt;
&lt;li&gt;sampling and attribute limits&lt;/li&gt;
&lt;li&gt;repository URLs, branch names and commit identifiers&lt;/li&gt;
&lt;li&gt;whether prompts, file contents or tool results are ever justified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If content is required for a short investigation, use a restricted pilot, a defined expiry and a collector with suitable access controls. Return to metadata-only capture afterwards. Observability data should not become an ungoverned copy of source code and conversations.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 7: Manage Configuration Centrally
&lt;/h2&gt;

&lt;p&gt;The 8 July announcement lets administrators deliver a &lt;code&gt;telemetry&lt;/code&gt; block through native MDM, server-managed settings or a protected file. This example keeps content disabled and locked:&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;"telemetry"&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;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://otel-gateway.corp.example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http/protobuf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"captureContent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lockCaptureContent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serviceName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"github-copilot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resourceAttributes"&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;"deployment.environment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"team.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;"developer-platform"&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;"headers"&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;"X-Scope-OrgID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"developer-platform"&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;p&gt;The header is deliberately non-secret. Supply real collector credentials through your managed delivery system, never in a repository. Managed exporter headers are applied only to the Copilot Chat extension exporter and are not copied into environment variables, which prevents them leaking into tool subprocesses. In the current release, those managed headers are also not delivered to the agent host process, so test authentication for every client path.&lt;/p&gt;

&lt;p&gt;Two precedence rules matter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For managed channels, native MDM wins over server-managed settings, which wins over file-based settings. From VS Code 1.128, the highest channel that supplies any managed settings wins outright rather than merging with lower channels.&lt;/li&gt;
&lt;li&gt;For each telemetry value, policy wins over environment variables, user settings and defaults.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On Windows, native settings use &lt;code&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\GitHubCopilot&lt;/code&gt;. File-based settings use &lt;code&gt;%ProgramFiles%\GitHubCopilot\managed-settings.json&lt;/code&gt;. Server-managed settings come from &lt;code&gt;copilot/managed-settings.json&lt;/code&gt; in the selected &lt;code&gt;.github-private&lt;/code&gt; governance repository.&lt;/p&gt;

&lt;p&gt;File-based settings should be administrator-owned, not world-writable and not symlinked. Use &lt;strong&gt;Developer: Policy Diagnostics&lt;/strong&gt; to confirm the active channel. Reload VS Code when telemetry policy changes because the agent host resolves its configuration at startup.&lt;/p&gt;

&lt;p&gt;Enterprise team specialisation became available on 3 August 2026, but it does not make every managed key team-overridable. Teams can specialise the model and bypass-permission keys that an enterprise marks as overridable, and can add plugins and marketplaces. Telemetry remains an enterprise-level decision in the current reference.&lt;/p&gt;

&lt;p&gt;There is one vocabulary caveat. The VS Code user setting and enterprise guide use exporter values such as &lt;code&gt;otlp-http&lt;/code&gt; and &lt;code&gt;otlp-grpc&lt;/code&gt;, while the current GitHub managed-settings reference lists &lt;code&gt;http/json&lt;/code&gt; and &lt;code&gt;http/protobuf&lt;/code&gt; as the accepted values for &lt;code&gt;telemetry.protocol&lt;/code&gt;. Treat the live managed-settings reference and your deployed client build as the contract during a pilot rather than copying a user-setting value blindly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Copilot CLI Transport Caveats
&lt;/h2&gt;

&lt;p&gt;Not every CLI trace has the same parentage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A background Copilot CLI agent hosted by VS Code produces a &lt;code&gt;copilot-chat&lt;/code&gt; wrapper span with native &lt;code&gt;github-copilot&lt;/code&gt; SDK spans beneath it in the same trace.&lt;/li&gt;
&lt;li&gt;A terminal CLI session runs in a separate process. It emits independent root traces under service &lt;code&gt;github-copilot&lt;/code&gt;, so it is not linked to the extension trace.&lt;/li&gt;
&lt;li&gt;The terminal CLI runtime supports OTLP/HTTP only. If gRPC is configured, it still uses HTTP. Point it at an HTTP-capable port such as &lt;code&gt;4318&lt;/code&gt; unless the backend deliberately serves both protocols on one port.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Search both &lt;code&gt;copilot-chat&lt;/code&gt; and &lt;code&gt;github-copilot&lt;/code&gt; before concluding that telemetry is missing. Also verify that collector authentication works for the agent host and terminal process, especially when the extension receives a managed header that those paths do not.&lt;/p&gt;
&lt;h2&gt;
  
  
  OpenTelemetry Is Not Session Audit Streaming
&lt;/h2&gt;

&lt;p&gt;GitHub's &lt;a href="https://github.blog/changelog/2026-07-02-copilot-agent-session-streaming-is-now-in-public-preview" rel="noopener noreferrer"&gt;Copilot agent session streaming&lt;/a&gt; is a separate enterprise capability in public preview for Enterprise Managed Users, including GitHub Enterprise Cloud with data residency. It sends Copilot usage records across supported clients to an audit stream or exposes the latest 48 hours through an enterprise REST API. It is designed for central auditability and can include session prompts, responses and tool calls when enabled.&lt;/p&gt;

&lt;p&gt;OpenTelemetry is client-side operational instrumentation sent to an OTLP collector selected by the user or administrator. It gives detailed timing, hierarchy, errors, model metadata and tool telemetry.&lt;/p&gt;

&lt;p&gt;Use OTel for reliability engineering and trace diagnosis. Use session audit streaming for enterprise governance, compliance and cross-client activity records. One does not replace the other, and their access, retention and privacy decisions should be reviewed independently.&lt;/p&gt;
&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Jaeger has no &lt;code&gt;copilot-chat&lt;/code&gt; service
&lt;/h3&gt;

&lt;p&gt;Confirm the container is running, the endpoint is &lt;code&gt;http://localhost:4318&lt;/code&gt;, OTel is enabled and VS Code was reloaded. Send a new request after enabling telemetry because earlier sessions are not backfilled.&lt;/p&gt;
&lt;h3&gt;
  
  
  The collector returns &lt;code&gt;404&lt;/code&gt; or connection errors
&lt;/h3&gt;

&lt;p&gt;Use the base OTLP/HTTP endpoint without &lt;code&gt;/v1/traces&lt;/code&gt;. Check that port &lt;code&gt;4318&lt;/code&gt; is published and that a proxy or endpoint security rule is not intercepting loopback traffic.&lt;/p&gt;
&lt;h3&gt;
  
  
  CLI traces appear disconnected
&lt;/h3&gt;

&lt;p&gt;That is expected for terminal CLI sessions. Search the &lt;code&gt;github-copilot&lt;/code&gt; service. Only background CLI sessions hosted in the VS Code process share the extension trace.&lt;/p&gt;
&lt;h3&gt;
  
  
  Prompt or tool content is absent
&lt;/h3&gt;

&lt;p&gt;That is the expected result with &lt;code&gt;captureContent: false&lt;/code&gt;. Do not enable content merely to make a trace look richer. Start with metadata and use VS Code's Agent Debug Log for local diagnosis where appropriate.&lt;/p&gt;
&lt;h3&gt;
  
  
  A user setting has no effect
&lt;/h3&gt;

&lt;p&gt;Check environment variables and &lt;strong&gt;Developer: Policy Diagnostics&lt;/strong&gt;. Managed values override environment variables and user settings, while environment variables override user settings.&lt;/p&gt;
&lt;h3&gt;
  
  
  Metrics do not appear in Jaeger
&lt;/h3&gt;

&lt;p&gt;Jaeger is the trace viewer in this tutorial. Route the emitted metrics and events through an OpenTelemetry Collector to a backend that supports those signal types.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cleanup and Rollout
&lt;/h2&gt;

&lt;p&gt;Stop and remove the local container:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;code/compose.yaml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;down&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--remove-orphans&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For enterprise rollout, begin with a small device group and metadata-only capture. Confirm endpoint authentication, both service names, CLI transport behaviour and policy precedence. Then define a short list of reliability SLIs, retention controls and alert owners. Review false alarms before expanding coverage.&lt;/p&gt;

&lt;p&gt;Correlate telemetry with tests, review findings, incidents and deployment outcomes when evaluating an agentic workflow. Keep those evidence sources distinct. A fast, low-token trace can still produce an incorrect change, while a slow trace may reflect a genuinely difficult task.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Agentic DevOps needs the same operational discipline as any other distributed system. A connected &lt;code&gt;invoke_agent&lt;/code&gt; trace makes model calls, tools, hooks and subagents inspectable without capturing conversation content by default. Start locally, establish reliable signals, govern the export path and keep correctness claims tied to engineering evidence rather than telemetry volume.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 05-08-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>opentelemetry</category>
      <category>devops</category>
      <category>observability</category>
    </item>
    <item>
      <title>Human-in-the-Loop Agentic DevOps: Govern AI Automation in GitHub Issues</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Mon, 27 Jul 2026 10:37:38 +0000</pubDate>
      <link>https://dev.to/pwd9000/human-in-the-loop-agentic-devops-govern-ai-automation-in-github-issues-472h</link>
      <guid>https://dev.to/pwd9000/human-in-the-loop-agentic-devops-govern-ai-automation-in-github-issues-472h</guid>
      <description>&lt;h2&gt;
  
  
  Human-in-the-Loop Agentic DevOps: Govern AI Automation in GitHub Issues
&lt;/h2&gt;

&lt;p&gt;The biggest question in agentic DevOps is no longer, "Can an AI agent automate this?"&lt;/p&gt;

&lt;p&gt;It is, "How much authority should we give it, and what happens when it is unsure?"&lt;/p&gt;

&lt;p&gt;That distinction matters. An agent that suggests a label for an issue is useful. An agent that confidently closes the wrong production incident is a new operational problem.&lt;/p&gt;

&lt;p&gt;On 23 July 2026, GitHub announced &lt;a href="https://github.blog/changelog/2026-07-23-agent-automation-controls-in-github-issues-in-public-preview/" rel="noopener noreferrer"&gt;agent automation controls in GitHub Issues&lt;/a&gt; in public preview. These controls add confidence levels, rationales and human approval to agent-driven issue updates.&lt;/p&gt;

&lt;p&gt;For DevOps teams, this is more important than another clever prompt. It gives us a practical way to introduce automation gradually, inspect why an agent wants to act, and keep people involved where judgement still matters.&lt;/p&gt;

&lt;p&gt;In this post, we will explore how the controls work, where they fit into agentic DevOps, and how to build an adoption model that earns trust rather than assumes it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Current status:&lt;/strong&gt; Agent automation controls in GitHub Issues are in public preview and subject to change at the time of this writing - 27 July 2026.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Automation Gap
&lt;/h2&gt;

&lt;p&gt;Traditional DevOps automation is usually deterministic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IF pull request has label "deploy-production"
AND required checks pass
THEN start the production deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The rule may be complicated, but the outcome is predictable. We can test the conditions and explain exactly why the automation ran.&lt;/p&gt;

&lt;p&gt;Agentic automation is different:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read this issue.
Understand what the author needs.
Choose the right service, severity and owner.
Decide whether it is a duplicate.
Take the appropriate action.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is powerful because the agent can reason over messy, incomplete language. It is also probabilistic. Two similar issues may produce different recommendations, and a confident answer can still be wrong.&lt;/p&gt;

&lt;p&gt;This creates an awkward gap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Full manual triage&lt;/strong&gt; is safe but slow and repetitive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full autonomous triage&lt;/strong&gt; is fast but can make silent, high-impact mistakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-in-the-loop triage&lt;/strong&gt; lets the agent do the reading and reasoning while a person retains control over uncertain actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to insert an approval into every automated step. That would simply turn engineers into an expensive confirmation button. The goal is to automate according to confidence, impact and reversibility.&lt;/p&gt;


&lt;h2&gt;
  
  
  What GitHub Added to Issues
&lt;/h2&gt;

&lt;p&gt;The public preview introduces three related controls for updates made by GitHub Agentic Workflows or Copilot cloud agent automations.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Confidence
&lt;/h3&gt;

&lt;p&gt;The agent can associate a &lt;strong&gt;high&lt;/strong&gt;, &lt;strong&gt;medium&lt;/strong&gt; or &lt;strong&gt;low&lt;/strong&gt; confidence level with a proposed issue action.&lt;/p&gt;

&lt;p&gt;Repository administrators choose the minimum confidence required for changes to apply automatically. Actions below that threshold remain suggestions for a human to review.&lt;/p&gt;

&lt;p&gt;This creates a useful middle ground:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent confidence&lt;/th&gt;
&lt;th&gt;Example policy&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Auto-apply low-risk metadata&lt;/td&gt;
&lt;td&gt;Change is applied&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Require a maintainer decision&lt;/td&gt;
&lt;td&gt;Suggestion waits for review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Always require review&lt;/td&gt;
&lt;td&gt;Suggestion waits for review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Confidence is not correctness. It is a routing signal. A high-confidence mistake is still a mistake, so the consequence of the action must influence your policy too.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Rationale
&lt;/h3&gt;

&lt;p&gt;Every supported agent action can include a short explanation of why it was proposed or applied.&lt;/p&gt;

&lt;p&gt;Instead of seeing only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Added label: &lt;code&gt;incident&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;you can see the reasoning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Suggested &lt;code&gt;incident&lt;/code&gt; because the issue reports an active production outage and includes failed health-check results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That explanation helps reviewers make a faster decision and leaves a more useful trail in the issue timeline. It also gives teams evidence for improving prompts and automation rules when the same misunderstanding appears repeatedly.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Suggestions and approvals
&lt;/h3&gt;

&lt;p&gt;Changes that do not meet the configured automation threshold appear as suggestions on the issue. Reviewers can accept or decline them individually or process multiple suggestions together.&lt;/p&gt;

&lt;p&gt;At launch, the controls support agent actions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;changing labels&lt;/li&gt;
&lt;li&gt;setting issue fields&lt;/li&gt;
&lt;li&gt;changing the issue type&lt;/li&gt;
&lt;li&gt;assigning or unassigning users and agents&lt;/li&gt;
&lt;li&gt;closing issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;has:suggestions&lt;/code&gt; issue search qualifier helps maintainers find issues waiting for human review.&lt;/p&gt;

&lt;p&gt;GitHub also exposes these capabilities through its REST and GraphQL APIs, which makes it possible to build approval queues and reporting around the same model.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Human-in-the-Loop Flow
&lt;/h2&gt;

&lt;p&gt;A well-designed issue automation should separate observation, recommendation and authority:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New or updated issue
        |
        v
Agent reads repository context
        |
        v
Agent proposes action + confidence + rationale
        |
        +---------------------------+
        |                           |
        v                           v
Meets automation threshold     Below threshold
        |                           |
        v                           v
Low-risk action applied        Suggestion queued
        |                           |
        v                           v
Timeline records why           Human accepts or declines
        |                           |
        +-------------+-------------+
                      |
                      v
             Outcome is auditable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;There are two important ideas in this flow.&lt;/p&gt;

&lt;p&gt;First, the agent does not merely output an answer. It produces an &lt;strong&gt;action proposal&lt;/strong&gt; with enough context to review.&lt;/p&gt;

&lt;p&gt;Second, the threshold is not universal. A platform team may auto-apply a documentation label at high confidence but always require approval before closing an issue or assigning an on-call engineer.&lt;/p&gt;

&lt;p&gt;That is policy based on risk, not enthusiasm for AI.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Practical DevOps Scenario
&lt;/h2&gt;

&lt;p&gt;Imagine an internal platform repository receiving these issues every day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a deployment workflow timed out&lt;/li&gt;
&lt;li&gt;a developer cannot authenticate to a test cluster&lt;/li&gt;
&lt;li&gt;Terraform documentation is out of date&lt;/li&gt;
&lt;li&gt;a production service is returning errors&lt;/li&gt;
&lt;li&gt;a request duplicates an existing backlog item&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An agent could inspect each issue, repository metadata and previous examples, then propose:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue signal&lt;/th&gt;
&lt;th&gt;Proposed action&lt;/th&gt;
&lt;th&gt;Sensible control&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mentions a Markdown typo&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;documentation&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Auto-apply at high confidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Includes failed workflow URL&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;ci-cd&lt;/code&gt; and assign platform team&lt;/td&gt;
&lt;td&gt;Review at medium or low confidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reports active customer impact&lt;/td&gt;
&lt;td&gt;Set type to incident and add &lt;code&gt;severity-1&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Always review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Matches an existing issue&lt;/td&gt;
&lt;td&gt;Close as duplicate with reference&lt;/td&gt;
&lt;td&gt;Always review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requests a known self-service task&lt;/td&gt;
&lt;td&gt;Assign a specialised agent&lt;/td&gt;
&lt;td&gt;Review until the workflow is proven&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice that the risky actions are not necessarily the most technically complicated. Closing an issue is easy to execute but can hide real work. Assigning a person is easy too, but repeatedly assigning the wrong on-call engineer creates noise and erodes trust.&lt;/p&gt;

&lt;p&gt;Human-in-the-loop design is about &lt;strong&gt;consequence&lt;/strong&gt;, not implementation difficulty.&lt;/p&gt;


&lt;h2&gt;
  
  
  Build a Trust Ladder, Not an Autonomy Switch
&lt;/h2&gt;

&lt;p&gt;Teams often discuss AI automation as if it has two settings: on or off. A safer model is a trust ladder.&lt;/p&gt;
&lt;h3&gt;
  
  
  Level 1: Observe
&lt;/h3&gt;

&lt;p&gt;The agent analyses issues and produces a report, but changes nothing.&lt;/p&gt;

&lt;p&gt;Use this stage to compare recommendations with decisions your maintainers actually make. Record false positives, ambiguous categories and missing repository context.&lt;/p&gt;
&lt;h3&gt;
  
  
  Level 2: Suggest
&lt;/h3&gt;

&lt;p&gt;The agent proposes labels, fields, assignments or closures. Humans review every action.&lt;/p&gt;

&lt;p&gt;This is where rationales become valuable. Reviewers should be able to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the agent identify the right evidence?&lt;/li&gt;
&lt;li&gt;Is the confidence believable?&lt;/li&gt;
&lt;li&gt;Is the proposed action reversible?&lt;/li&gt;
&lt;li&gt;Would we make the same decision?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Level 3: Auto-apply low-risk actions
&lt;/h3&gt;

&lt;p&gt;Allow high-confidence, reversible metadata changes such as adding a broad area label.&lt;/p&gt;

&lt;p&gt;Keep monitoring declined or corrected actions. If maintainers routinely undo an automated label, the system has not earned that level of authority.&lt;/p&gt;
&lt;h3&gt;
  
  
  Level 4: Expand by evidence
&lt;/h3&gt;

&lt;p&gt;Gradually add actions only after measuring their performance and operational impact.&lt;/p&gt;

&lt;p&gt;Do not promote every action together. Your automation may be excellent at identifying documentation issues and poor at recognising duplicates. Those capabilities deserve different policies.&lt;/p&gt;
&lt;h3&gt;
  
  
  Level 5: Retain hard approval boundaries
&lt;/h3&gt;

&lt;p&gt;Some decisions should remain human-owned even if the agent performs well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;closing security or incident reports&lt;/li&gt;
&lt;li&gt;changing severity for active production events&lt;/li&gt;
&lt;li&gt;assigning privileged remediation work&lt;/li&gt;
&lt;li&gt;triggering deployments or infrastructure changes&lt;/li&gt;
&lt;li&gt;making decisions with compliance or customer impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maturity is not maximum autonomy. Maturity is knowing which authority should never be delegated silently.&lt;/p&gt;


&lt;h2&gt;
  
  
  Confidence Is a Signal, Not a Control
&lt;/h2&gt;

&lt;p&gt;This deserves special attention.&lt;/p&gt;

&lt;p&gt;GitHub describes the approval experience as a workflow convenience, not a security boundary. If an automation has permission to update an issue directly, a suggestion panel does not remove that underlying authority.&lt;/p&gt;

&lt;p&gt;That means confidence thresholds and approvals must sit inside a broader security model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;grant the smallest practical repository permissions&lt;/li&gt;
&lt;li&gt;keep untrusted issue content away from secrets&lt;/li&gt;
&lt;li&gt;constrain the tools available to the agent&lt;/li&gt;
&lt;li&gt;record actions and rationales&lt;/li&gt;
&lt;li&gt;use branch protection and environment protection for code and deployments&lt;/li&gt;
&lt;li&gt;treat prompts as guidance, not access control&lt;/li&gt;
&lt;li&gt;retain independent review for consequential changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An issue comment can contain prompt injection just as a source file can. A malicious or accidental instruction may attempt to redirect the agent, expose available context or convince it to take an unrelated action.&lt;/p&gt;

&lt;p&gt;Human review reduces risk, but permission design limits the possible damage.&lt;/p&gt;


&lt;h2&gt;
  
  
  Agent Automation Controls vs Agentic Workflows
&lt;/h2&gt;

&lt;p&gt;These names are easy to mix up, so here is the distinction:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent automation controls in Issues&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add confidence, rationale and review to supported issue actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Agentic Workflows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Define reasoning-based repository automation in Markdown and run it through GitHub Actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copilot cloud agent automations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Run scheduled or event-driven background tasks with Copilot cloud agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copilot coding agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complete development tasks and open pull requests for review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The controls are the governance layer for agent-driven issue changes. Agentic Workflows and cloud agent automations are ways to produce those changes.&lt;/p&gt;

&lt;p&gt;This is similar to familiar DevOps patterns. A deployment workflow performs work, while an environment protection rule controls whether that work may proceed. The implementation and the decision boundary are related, but they are not the same thing.&lt;/p&gt;


&lt;h2&gt;
  
  
  Where Human Review Can Fail
&lt;/h2&gt;

&lt;p&gt;Adding a person does not automatically make a system safe. Poorly designed review processes create their own failure modes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Approval fatigue
&lt;/h3&gt;

&lt;p&gt;If every obvious label waits for approval, maintainers will accept suggestions without reading them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt; Auto-apply proven, low-impact actions and reserve attention for ambiguity or consequence.&lt;/p&gt;
&lt;h3&gt;
  
  
  Automation bias
&lt;/h3&gt;

&lt;p&gt;Reviewers may trust a confident recommendation because it came from an agent and includes a polished rationale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt; Ask reviewers to verify the cited evidence, not the quality of the prose.&lt;/p&gt;
&lt;h3&gt;
  
  
  Stale suggestions
&lt;/h3&gt;

&lt;p&gt;An issue can change while a recommendation waits in the queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt; Re-evaluate suggestions after meaningful issue updates and avoid applying decisions based on outdated context.&lt;/p&gt;
&lt;h3&gt;
  
  
  Invisible corrections
&lt;/h3&gt;

&lt;p&gt;Teams may fix wrong labels manually without recording that the agent was wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt; Track declined, reverted and corrected actions so automation quality can be measured.&lt;/p&gt;
&lt;h3&gt;
  
  
  Authority creep
&lt;/h3&gt;

&lt;p&gt;An automation starts with triage, then gradually gains broader write permissions because they are convenient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt; Review permissions and action scope as part of the same change-control process used for production workflows.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Bigger DevOps Lesson
&lt;/h2&gt;

&lt;p&gt;Agentic DevOps changes the shape of automation.&lt;/p&gt;

&lt;p&gt;We are moving from workflows that execute explicit instructions to systems that interpret intent and choose actions. That makes automation more capable, but it also means uncertainty must become visible.&lt;/p&gt;

&lt;p&gt;Confidence, rationale and approval are useful because they turn hidden model judgement into an inspectable workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;confidence helps route the decision&lt;/li&gt;
&lt;li&gt;rationale helps a reviewer understand it&lt;/li&gt;
&lt;li&gt;approval keeps authority with the right person&lt;/li&gt;
&lt;li&gt;audit history helps the team improve the system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these replaces permissions, sandboxing, protected environments or independent review. They complement those controls.&lt;/p&gt;

&lt;p&gt;The best agentic DevOps system is not the one that removes humans from every loop. It is the one that removes people from repetitive work while bringing them back at exactly the points where context, accountability and judgement matter.&lt;/p&gt;

&lt;p&gt;Start with suggestions. Measure the corrections. Expand only when the automation earns your trust.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 27-07-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>github</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>Run GitHub Copilot CLI in GitHub Actions Without PATs or Runaway AI Costs</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Mon, 20 Jul 2026 16:02:20 +0000</pubDate>
      <link>https://dev.to/pwd9000/run-github-copilot-cli-in-github-actions-without-pats-or-runaway-ai-costs-3dpf</link>
      <guid>https://dev.to/pwd9000/run-github-copilot-cli-in-github-actions-without-pats-or-runaway-ai-costs-3dpf</guid>
      <description>&lt;h2&gt;
  
  
  Run GitHub Copilot CLI in GitHub Actions Without PATs or Runaway AI Costs
&lt;/h2&gt;

&lt;p&gt;AI automation in CI has always had two awkward questions: which long-lived token do you give the agent, and how do you stop an unattended run from spending more than expected?&lt;/p&gt;

&lt;p&gt;GitHub has now addressed both. Since 2 July 2026, GitHub Copilot CLI can authenticate inside GitHub Actions with the workflow's built-in &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;. No personal access token (PAT) is required. Copilot CLI also supports per-session AI credit limits, so a non-interactive run can stop when it reaches the amount you set.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will build a manually triggered repository-review workflow that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authenticates without a stored PAT&lt;/li&gt;
&lt;li&gt;uses read-only repository permissions&lt;/li&gt;
&lt;li&gt;caps each Copilot session with &lt;code&gt;--max-ai-credits&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;writes the report to the GitHub Actions job summary&lt;/li&gt;
&lt;li&gt;checks that the agent did not modify the checkout&lt;/li&gt;
&lt;li&gt;limits duplicate and long-running jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a useful starting point for repository health checks, CI failure analysis, release preparation, and scheduled engineering reports.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Current status:&lt;/strong&gt; AI credit session limits are in public preview. The syntax and billing behaviour described here were verified against GitHub's documentation on 20 July 2026.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;The finished workflow has a deliberately small trust boundary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer selects Run workflow
             |
             v
GitHub Actions creates a short-lived GITHUB_TOKEN
             |
             | contents: read
             | copilot-requests: write
             v
Copilot CLI reviews the ephemeral checkout
             |
             | --max-ai-credits 31, 50, or 100
             v
Markdown report is written to the job summary
             |
             v
Workflow verifies that the checkout is unchanged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;There is no PAT in repository secrets. The workflow token exists only for the job, and its permissions are declared explicitly. AI credits used in an organisation-owned repository are billed to the organisation.&lt;/p&gt;

&lt;p&gt;This tutorial invokes Copilot CLI directly because that makes the authentication, permissions, and cost boundary easy to inspect. GitHub recommends &lt;a href="https://github.com/github/gh-aw" rel="noopener noreferrer"&gt;GitHub Agentic Workflows&lt;/a&gt; for most production automation because it adds safeguards designed for unattended agents. We will compare the two approaches later.&lt;/p&gt;


&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You will need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an organisation-owned GitHub repository with GitHub Actions enabled&lt;/li&gt;
&lt;li&gt;Copilot CLI enabled for the organisation&lt;/li&gt;
&lt;li&gt;permission to update the organisation's Copilot policies&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;Allow use of Copilot CLI billed to the organization&lt;/strong&gt; policy enabled&lt;/li&gt;
&lt;li&gt;enough organisation AI credit budget for the test run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The session-limit feature requires Copilot CLI &lt;code&gt;1.0.66&lt;/code&gt; or later. The workflow installs the latest version so that both &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; authentication and &lt;code&gt;--max-ai-credits&lt;/code&gt; are available.&lt;/p&gt;

&lt;p&gt;No PAT, API key, or custom Actions secret is required.&lt;/p&gt;
&lt;h3&gt;
  
  
  How AI credits translate to cost
&lt;/h3&gt;

&lt;p&gt;GitHub defines one AI credit as $0.01 USD. A limit of 50 AI credits therefore represents a nominal session boundary of $0.50 USD.&lt;/p&gt;

&lt;p&gt;Session limits are &lt;strong&gt;soft caps&lt;/strong&gt;. Copilot only knows the cost of a response after that response completes, so an in-flight response can make the final usage slightly higher than the configured limit. Session limits complement organisation budgets and cost centres; they do not replace them.&lt;/p&gt;

&lt;p&gt;GitHub also recommends setting a limit above 30 credits because many model calls cost more than 20 credits. That is why this tutorial offers 31 as the lowest choice rather than using a tiny value that may prevent useful work.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Enable Organisation Billing for the Workflow
&lt;/h2&gt;

&lt;p&gt;An organisation owner must allow Actions workflows to bill Copilot CLI usage directly to the organisation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the organisation settings on GitHub.com.&lt;/li&gt;
&lt;li&gt;Navigate to the organisation's GitHub Copilot policy settings.&lt;/li&gt;
&lt;li&gt;Find the &lt;strong&gt;Copilot CLI&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;Confirm that &lt;strong&gt;Allow use of Copilot CLI billed to the organization&lt;/strong&gt; is selected.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub enables this setting by default when the existing Copilot CLI policy is enabled, but it is worth checking before debugging a failed workflow.&lt;/p&gt;

&lt;p&gt;When this policy is active, a workflow can authenticate with &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; by declaring one additional permission:&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="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&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;copilot-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;contents: read&lt;/code&gt; lets the checkout action read the repository. &lt;code&gt;copilot-requests: write&lt;/code&gt; allows the token to make Copilot requests billed to the organisation. It does not grant write access to repository contents.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2: Add the Bounded Repository Review Workflow
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/copilot-ci-review.yml&lt;/code&gt; in the repository you want Copilot to inspect.&lt;/p&gt;




&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Copilot CLI repository review&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;max_ai_credits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Maximum AI credits for this Copilot session&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;50'&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;choice&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;31'&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;50'&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;100'&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;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;copilot-requests&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;concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;copilot-ci-review-${{ github.ref }}&lt;/span&gt;
  &lt;span class="na"&gt;cancel-in-progress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;review&lt;/span&gt;&lt;span class="pi"&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;Run bounded Copilot review&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;timeout-minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&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;Check out repository&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v6&lt;/span&gt;

      &lt;span class="pi"&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;Install latest Copilot CLI&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;npm install --global @github/copilot@latest&lt;/span&gt;
          &lt;span class="s"&gt;copilot --version&lt;/span&gt;

      &lt;span class="pi"&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;Review repository&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;copilot&lt;/span&gt;
        &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.token }}&lt;/span&gt;
          &lt;span class="na"&gt;MAX_AI_CREDITS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ inputs.max_ai_credits }}&lt;/span&gt;
          &lt;span class="na"&gt;REPORT_PATH&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.temp }}/copilot-review.md&lt;/span&gt;
          &lt;span class="na"&gt;PROMPT&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;Perform a read-only review of this repository at the current commit. Do not modify files. Produce a concise Markdown report containing: likely build and test commands based on repository evidence; the top three reliability or security risks with repository-relative file references; missing or weak automated checks; and three prioritised actions. Do not print secrets, tokens, or environment-variable values.&lt;/span&gt;


        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;set -o pipefail&lt;/span&gt;
          &lt;span class="s"&gt;copilot --yolo -p "$PROMPT" \&lt;/span&gt;
            &lt;span class="s"&gt;--max-ai-credits "$MAX_AI_CREDITS" \&lt;/span&gt;
            &lt;span class="s"&gt;| tee "$REPORT_PATH"&lt;/span&gt;

      &lt;span class="pi"&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;Publish Copilot report&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ always() }}&lt;/span&gt;
        &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;REPORT_PATH&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ runner.temp }}/copilot-review.md&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;if [[ -s "$REPORT_PATH" ]]; then&lt;/span&gt;
            &lt;span class="s"&gt;cat "$REPORT_PATH" &amp;gt;&amp;gt; "$GITHUB_STEP_SUMMARY"&lt;/span&gt;
          &lt;span class="s"&gt;else&lt;/span&gt;
            &lt;span class="s"&gt;echo "## Copilot CLI review" &amp;gt;&amp;gt; "$GITHUB_STEP_SUMMARY"&lt;/span&gt;
            &lt;span class="s"&gt;echo "No report was produced. Check the workflow log." &amp;gt;&amp;gt; "$GITHUB_STEP_SUMMARY"&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;

      &lt;span class="pi"&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;Verify Copilot made no file changes&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ always() }}&lt;/span&gt;
        &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;if [[ -n "$(git status --porcelain)" ]]; then&lt;/span&gt;
            &lt;span class="s"&gt;echo "Copilot changed the checkout unexpectedly:"&lt;/span&gt;
            &lt;span class="s"&gt;git status --short&lt;/span&gt;
            &lt;span class="s"&gt;exit 1&lt;/span&gt;
          &lt;span class="s"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also find the complete sample in &lt;a href="//./code/copilot-ci-review.yml"&gt;&lt;code&gt;code/copilot-ci-review.yml&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let us unpack the controls that matter.&lt;/p&gt;
&lt;h3&gt;
  
  
  Manual trigger and bounded choices
&lt;/h3&gt;

&lt;p&gt;The workflow only runs through &lt;code&gt;workflow_dispatch&lt;/code&gt;. That avoids automatically feeding code from untrusted pull requests into an agent with broad local tool access.&lt;/p&gt;

&lt;p&gt;The credit limit is a &lt;code&gt;choice&lt;/code&gt; rather than free text. Users can select 31, 50, or 100 credits, but cannot inject arbitrary shell content through the workflow input.&lt;/p&gt;
&lt;h3&gt;
  
  
  Short-lived authentication
&lt;/h3&gt;

&lt;p&gt;This line exposes the job's automatically generated token to Copilot CLI:&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="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.token }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The token is created for the workflow job, constrained by the &lt;code&gt;permissions&lt;/code&gt; block, and expires when the job ends. There is no secret to rotate and no individual developer identity tied to the automation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Non-interactive execution
&lt;/h3&gt;

&lt;p&gt;GitHub's direct-invocation example uses &lt;code&gt;--yolo&lt;/code&gt; so Copilot does not pause for interactive tool approvals in Actions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--yolo&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PROMPT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--max-ai-credits&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MAX_AI_CREDITS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The name is memorable because the risk is real. &lt;code&gt;--yolo&lt;/code&gt; gives Copilot broad access to the workflow environment. A prompt saying "do not modify files" is guidance, not a security boundary.&lt;/p&gt;

&lt;p&gt;The actual boundaries are the manual trigger, read-only repository permission, ephemeral runner, timeout, credit cap, and final clean-worktree check. Do not add deployment credentials or production secrets to this job.&lt;/p&gt;
&lt;h3&gt;
  
  
  Report outside the checkout
&lt;/h3&gt;

&lt;p&gt;The report is written to &lt;code&gt;${{ runner.temp }}&lt;/code&gt; instead of the repository workspace. This lets the final step use &lt;code&gt;git status --porcelain&lt;/code&gt; to detect any tracked or untracked file created by the agent.&lt;/p&gt;

&lt;p&gt;The report step uses &lt;code&gt;if: ${{ always() }}&lt;/code&gt;. If Copilot reaches the credit limit or exits with an error after producing partial output, the workflow still attempts to publish that output to the job summary.&lt;/p&gt;
&lt;h3&gt;
  
  
  Two independent limits
&lt;/h3&gt;

&lt;p&gt;The workflow combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--max-ai-credits&lt;/code&gt;, which bounds model usage for the Copilot session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timeout-minutes: 10&lt;/code&gt;, which bounds total job runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The concurrency group also cancels an older run on the same branch when a replacement starts. This reduces accidental duplicate spend.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Run the Workflow
&lt;/h2&gt;

&lt;p&gt;Commit the workflow to the repository's default branch, then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the repository on GitHub.com.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Actions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Copilot CLI repository review&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Run workflow&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Keep the first run at &lt;strong&gt;50&lt;/strong&gt; AI credits.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Run workflow&lt;/strong&gt; again to confirm.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The job should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;check out the repository&lt;/li&gt;
&lt;li&gt;install the latest Copilot CLI package&lt;/li&gt;
&lt;li&gt;print the installed version&lt;/li&gt;
&lt;li&gt;authenticate with &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;inspect the repository within the selected credit limit&lt;/li&gt;
&lt;li&gt;publish a Markdown report&lt;/li&gt;
&lt;li&gt;verify that the checkout remains unchanged&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open the completed run and select &lt;strong&gt;Summary&lt;/strong&gt;. A successful result will resemble:&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="gu"&gt;## Repository review&lt;/span&gt;

&lt;span class="gu"&gt;### Likely build and test commands&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="sb"&gt;`npm ci`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm test`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="sb"&gt;`npm run lint`&lt;/span&gt;

&lt;span class="gu"&gt;### Reliability or security risks&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; The deployment workflow uses a floating third-party action version...
&lt;span class="p"&gt;2.&lt;/span&gt; Integration tests do not cover the authentication failure path...
&lt;span class="p"&gt;3.&lt;/span&gt; Dependency updates are not automated...

&lt;span class="gu"&gt;### Prioritised actions&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Pin external actions to reviewed commit SHAs.
&lt;span class="p"&gt;2.&lt;/span&gt; Add an authentication failure integration test.
&lt;span class="p"&gt;3.&lt;/span&gt; Enable grouped dependency update pull requests.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The exact findings will depend on the repository and model. Treat the report as triage input, not as proof that the repository is secure or production-ready.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Prove the Cost Boundary
&lt;/h2&gt;

&lt;p&gt;Run the workflow again and select &lt;strong&gt;31&lt;/strong&gt; AI credits. A sufficiently complex repository review may reach the limit before completing.&lt;/p&gt;

&lt;p&gt;When a non-interactive session reaches its limit, Copilot stops cleanly and the command ends. Because the cap is soft, a response already in progress completes first and may take the final total slightly above 31 credits.&lt;/p&gt;

&lt;p&gt;Do not rely on forcing the limit as a deterministic test. Model selection, token usage, and repository complexity all affect consumption. The repeatable checks are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;confirm the log shows &lt;code&gt;--max-ai-credits&lt;/code&gt; receiving the selected value&lt;/li&gt;
&lt;li&gt;confirm an over-limit run stops rather than waiting for human input&lt;/li&gt;
&lt;li&gt;review organisation usage in GitHub's billing and usage dashboards&lt;/li&gt;
&lt;li&gt;apply organisation budgets or cost-centre budgets as the outer spending boundary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;User-level budgets are not considered when Actions usage is billed directly to the organisation because the activity is not attributed to an individual user.&lt;/p&gt;


&lt;h2&gt;
  
  
  Security Hardening Before Reuse
&lt;/h2&gt;

&lt;p&gt;Direct Copilot CLI execution is powerful, but it needs the same threat modelling as any other privileged CI automation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;th&gt;Control in this tutorial&lt;/th&gt;
&lt;th&gt;Production recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Long-lived credential theft&lt;/td&gt;
&lt;td&gt;Uses job-scoped &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Do not replace it with a PAT unless there is a documented requirement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repository modification&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;contents: read&lt;/code&gt; and clean-worktree check&lt;/td&gt;
&lt;td&gt;Keep write operations in a separate reviewed job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Untrusted pull request content&lt;/td&gt;
&lt;td&gt;Manual trigger only&lt;/td&gt;
&lt;td&gt;Never run this pattern on forked PRs with sensitive credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unbounded model usage&lt;/td&gt;
&lt;td&gt;Selectable &lt;code&gt;--max-ai-credits&lt;/code&gt; value&lt;/td&gt;
&lt;td&gt;Add organisation budgets, alerts, and cost-centre attribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runaway execution&lt;/td&gt;
&lt;td&gt;Ten-minute timeout and concurrency cancellation&lt;/td&gt;
&lt;td&gt;Tune the timeout to the smallest useful value&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret disclosure&lt;/td&gt;
&lt;td&gt;No extra secrets and prompt forbids printing environment values&lt;/td&gt;
&lt;td&gt;Keep deployment secrets out of the job entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unsafe agent output&lt;/td&gt;
&lt;td&gt;Human reads the job summary&lt;/td&gt;
&lt;td&gt;Never execute commands copied from the report automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency drift&lt;/td&gt;
&lt;td&gt;CLI version is printed in the log&lt;/td&gt;
&lt;td&gt;Pin a tested CLI version after validating new releases&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For high-assurance environments, pin &lt;code&gt;actions/checkout&lt;/code&gt; to a reviewed full commit SHA rather than a moving major-version tag. You can also pin &lt;code&gt;@github/copilot&lt;/code&gt; after testing a specific release that supports both token authentication and session limits.&lt;/p&gt;

&lt;p&gt;Remember that repository content can contain prompt-injection instructions. Read-only GitHub permissions stop a compromised prompt from pushing code, but the agent can still read files available in the checkout and interact with its local runner environment. Keep the environment intentionally sparse.&lt;/p&gt;


&lt;h2&gt;
  
  
  Direct Copilot CLI or GitHub Agentic Workflows?
&lt;/h2&gt;

&lt;p&gt;GitHub's documentation recommends Agentic Workflows for most automation scenarios. Direct CLI invocation still has a useful place when you need to add one bounded reasoning step to an existing workflow.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Consideration&lt;/th&gt;
&lt;th&gt;Direct Copilot CLI step&lt;/th&gt;
&lt;th&gt;GitHub Agentic Workflows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Definition&lt;/td&gt;
&lt;td&gt;Standard Actions YAML&lt;/td&gt;
&lt;td&gt;Natural-language Markdown compiled to Actions YAML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Existing workflow integration&lt;/td&gt;
&lt;td&gt;Straightforward&lt;/td&gt;
&lt;td&gt;Better suited to agent-first workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;GITHUB_TOKEN&lt;/code&gt; with &lt;code&gt;copilot-requests: write&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;GITHUB_TOKEN&lt;/code&gt; by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guardrails&lt;/td&gt;
&lt;td&gt;You design them&lt;/td&gt;
&lt;td&gt;Includes agent-focused integrity, firewall, safe-output, and threat-detection controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;A bounded task inside an established pipeline&lt;/td&gt;
&lt;td&gt;Issue triage, reporting, compliance, and change-producing autonomous workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use the direct pattern when you understand and control the prompt, trigger, tools, and environment. Start with Agentic Workflows when the agent will process untrusted content, propose repository changes, or operate across a broader part of the software delivery lifecycle.&lt;/p&gt;


&lt;h2&gt;
  
  
  Practical Variations
&lt;/h2&gt;

&lt;p&gt;Once the basic workflow is working, the same pattern can support several read-only DevOps tasks:&lt;/p&gt;
&lt;h3&gt;
  
  
  CI failure analysis
&lt;/h3&gt;

&lt;p&gt;Download test results or build logs as artifacts, then ask Copilot to identify the likely failure chain and recommend the next diagnostic action. Avoid passing raw secrets or environment dumps into the prompt.&lt;/p&gt;
&lt;h3&gt;
  
  
  Release-readiness report
&lt;/h3&gt;

&lt;p&gt;Ask Copilot to inspect changelogs, dependency updates, migrations, tests, and deployment definitions, then produce a checklist for a human release owner.&lt;/p&gt;
&lt;h3&gt;
  
  
  Infrastructure review
&lt;/h3&gt;

&lt;p&gt;Ask Copilot to review Terraform, Bicep, Kubernetes, or workflow files for risky defaults, missing validation, and likely operational gaps. Keep cloud credentials out of the job and do not let the report apply changes automatically.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scheduled repository health summary
&lt;/h3&gt;

&lt;p&gt;Replace &lt;code&gt;workflow_dispatch&lt;/code&gt; with a trusted &lt;code&gt;schedule&lt;/code&gt; trigger after the prompt and cost profile are stable. Keep concurrency, timeout, permissions, and AI credit limits in place.&lt;/p&gt;


&lt;h2&gt;
  
  
  Validate the Result
&lt;/h2&gt;

&lt;p&gt;Use this checklist before adopting the workflow more broadly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] The organisation policy allows Copilot CLI usage billed to the organisation.&lt;/li&gt;
&lt;li&gt;[ ] The workflow contains no PAT or custom authentication secret.&lt;/li&gt;
&lt;li&gt;[ ] Permissions are limited to &lt;code&gt;contents: read&lt;/code&gt; and &lt;code&gt;copilot-requests: write&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;[ ] The installed Copilot CLI version is &lt;code&gt;1.0.66&lt;/code&gt; or later.&lt;/li&gt;
&lt;li&gt;[ ] The selected credit value appears in the Copilot command.&lt;/li&gt;
&lt;li&gt;[ ] The report appears in the Actions job summary.&lt;/li&gt;
&lt;li&gt;[ ] The final clean-worktree check passes.&lt;/li&gt;
&lt;li&gt;[ ] The run appears in organisation billing and usage data.&lt;/li&gt;
&lt;li&gt;[ ] A human reviews the output before taking action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a stronger validation, temporarily add a harmless tracked test file to the prompt's requested output. The clean-worktree step should detect the change and fail. Remove that test immediately afterwards; the production prompt should remain read-only.&lt;/p&gt;


&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Copilot returns an authentication or permission error
&lt;/h3&gt;

&lt;p&gt;Check all three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The organisation policy &lt;strong&gt;Allow use of Copilot CLI billed to the organization&lt;/strong&gt; is enabled.&lt;/li&gt;
&lt;li&gt;The workflow declares &lt;code&gt;copilot-requests: write&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GITHUB_TOKEN: ${{ github.token }}&lt;/code&gt; is present on the Copilot step.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also confirm that the repository belongs to the organisation whose policy and billing you configured.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;code&gt;--max-ai-credits&lt;/code&gt; is unknown
&lt;/h3&gt;

&lt;p&gt;The installed CLI is too old. Session limits require Copilot CLI &lt;code&gt;1.0.66&lt;/code&gt; or later. Check the version printed by the installation step and reinstall the latest package:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; @github/copilot@latest
copilot &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  The run exceeds the selected credit value
&lt;/h3&gt;

&lt;p&gt;This can happen because the session limit is a soft cap. A model response already in progress is allowed to finish. Use the session limit together with organisation budgets and spending limits.&lt;/p&gt;
&lt;h3&gt;
  
  
  The report step runs after Copilot fails
&lt;/h3&gt;

&lt;p&gt;That is intentional. &lt;code&gt;if: ${{ always() }}&lt;/code&gt; preserves partial output and writes a diagnostic message when no report exists. The overall job still retains the Copilot step's failure state.&lt;/p&gt;
&lt;h3&gt;
  
  
  The clean-worktree check fails
&lt;/h3&gt;

&lt;p&gt;Inspect the &lt;code&gt;git status --short&lt;/code&gt; output. The prompt may have caused Copilot to create or edit a file despite the read-only instruction. Tighten the task, remove unnecessary tools or credentials, and consider moving the use case to Agentic Workflows before enabling it again.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Running an AI agent in CI no longer needs to mean storing a developer's PAT or accepting an open-ended model bill. GitHub Actions can issue Copilot CLI a short-lived, narrowly scoped &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, while &lt;code&gt;--max-ai-credits&lt;/code&gt; gives every run an explicit session boundary.&lt;/p&gt;

&lt;p&gt;The important lesson is that authentication and cost controls are only part of the design. The trigger, repository permissions, runner contents, timeout, prompt, output handling, and human approval path all determine whether the automation is trustworthy.&lt;/p&gt;

&lt;p&gt;Start with a manually triggered, read-only report like this one. Measure its output and cost, keep the environment free of sensitive credentials, and only expand its authority when the workflow has earned it.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 20-07-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>githubactions</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Microsoft Build 2026: Top announcements from a DevOps lens</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Wed, 03 Jun 2026 16:44:20 +0000</pubDate>
      <link>https://dev.to/pwd9000/microsoft-build-2026-top-announcements-from-a-devops-lens-419k</link>
      <guid>https://dev.to/pwd9000/microsoft-build-2026-top-announcements-from-a-devops-lens-419k</guid>
      <description>&lt;h2&gt;
  
  
  Microsoft Build 2026: Top announcements from a DevOps lens
&lt;/h2&gt;

&lt;p&gt;Microsoft Build 2026 was not just another Copilot-heavy keynote. It felt like Microsoft drawing a new operating model for software delivery, where AI agents do real work across code, infrastructure, data, security, and operations.&lt;/p&gt;

&lt;p&gt;For DevOps teams, the interesting question is not "what was announced?". It is "what changes how we build, ship, govern, and secure software?". I have ranked the ten announcements below through that lens, based on developer impact, platform maturity, and how often the same themes appeared across Microsoft, GitHub, Azure, and community recap coverage.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. GitHub Copilot app becomes the control centre for agentic development
&lt;/h2&gt;

&lt;p&gt;The biggest DevOps signal from Build was the new &lt;a href="https://github.blog/news-insights/product-news/github-copilot-app-the-agent-native-desktop-experience/" rel="noopener noreferrer"&gt;GitHub Copilot app&lt;/a&gt;. GitHub describes it as an agent-native desktop experience where developers can track sessions, issues, pull requests, background automation, and active work from one place.&lt;/p&gt;

&lt;p&gt;This matters because agentic development can create a new kind of operational sprawl. One agent investigates a bug, another works through a backlog item, and another updates a pull request after review. Without a control plane, that quickly becomes hard to audit.&lt;/p&gt;

&lt;p&gt;From a DevOps angle, the useful pieces are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;isolated git worktrees for parallel agent sessions&lt;/li&gt;
&lt;li&gt;Agent Merge to monitor CI, checks, reviewers, and merge readiness&lt;/li&gt;
&lt;li&gt;canvases that make plans, pull requests, terminal output, deployment state, and workflow progress inspectable&lt;/li&gt;
&lt;li&gt;local and cloud sandboxes for bounded execution&lt;/li&gt;
&lt;li&gt;expanded Copilot code review with custom skills, MCP servers, and workflow actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is GitHub moving from "AI writes code" to "AI participates in the delivery workflow". That is a much bigger shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Microsoft Foundry matures into a production agent platform
&lt;/h2&gt;

&lt;p&gt;Microsoft Foundry had one of the most important Build updates for teams that want to move agents out of demos and into production. The &lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-build-2026/" rel="noopener noreferrer"&gt;Microsoft Foundry Build 2026 recap&lt;/a&gt; highlights hosted agents, Toolboxes, Memory, Foundry IQ, tracing, evaluations, Agent Optimizer, and governance improvements.&lt;/p&gt;

&lt;p&gt;The headline for DevOps is that agents now have more of the platform services we expect from production workloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;managed runtime and sandboxed sessions&lt;/li&gt;
&lt;li&gt;filesystem access and durable state&lt;/li&gt;
&lt;li&gt;scheduled routines for recurring automation&lt;/li&gt;
&lt;li&gt;a single governed endpoint for tools through Toolboxes&lt;/li&gt;
&lt;li&gt;memory for procedural, user, and session context&lt;/li&gt;
&lt;li&gt;tracing, evaluations, guardrails, and optimisation loops&lt;/li&gt;
&lt;li&gt;publishing into Teams and Microsoft 365 Copilot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are building platform engineering workflows, incident helpers, release assistants, or environment automation agents, this is the announcement to watch. Foundry is becoming the runtime layer where those agents can be deployed, observed, and governed.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Microsoft Execution Containers bring containment to local agents
&lt;/h2&gt;

&lt;p&gt;Agents that can read files, call tools, browse, and run code are useful. They are also risky. The &lt;a href="https://blogs.windows.com/windowsdeveloper/?p=57809" rel="noopener noreferrer"&gt;Windows developer announcements&lt;/a&gt; introduced Microsoft Execution Containers, or MXC, as a policy-driven execution layer for agents.&lt;/p&gt;

&lt;p&gt;MXC lets developers declare what an agent can access, such as files or network resources, with containment boundaries enforced at runtime. Microsoft also announced Agent 365 integration with MXC, bringing Defender, Entra, Intune, and Purview protections to local agents.&lt;/p&gt;

&lt;p&gt;For DevOps and security teams, this is the kind of boring infrastructure that makes agentic workflows viable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explicit policy boundaries&lt;/li&gt;
&lt;li&gt;OS-enforced containment&lt;/li&gt;
&lt;li&gt;enterprise identity and manageability&lt;/li&gt;
&lt;li&gt;safer local automation&lt;/li&gt;
&lt;li&gt;a path for security teams to approve agent usage without blocking developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The future of AI-assisted DevOps cannot be "let the model loose on my laptop". It needs identity, containment, permissions, and auditability. MXC is one of the most important steps in that direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Windows 365 for Agents gives agents managed Cloud PCs
&lt;/h2&gt;

&lt;p&gt;Microsoft also announced &lt;a href="https://techcommunity.microsoft.com/blog/windows-itpro-blog/made-for-developers-and-agents-windows-365-at-build-2026/4519041" rel="noopener noreferrer"&gt;Windows 365 for Agents&lt;/a&gt;, designed to give agents secure, managed Cloud PCs for enterprise workflows.&lt;/p&gt;

&lt;p&gt;This is more interesting than it sounds. A lot of enterprise automation still depends on applications, browsers, internal portals, legacy workflows, and UI paths that do not have clean APIs. Giving agents a managed Cloud PC means they can interact with those systems inside a controlled environment rather than running ad hoc on a developer workstation.&lt;/p&gt;

&lt;p&gt;For DevOps teams, likely use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;release checklist automation across legacy systems&lt;/li&gt;
&lt;li&gt;environment validation through browser-based admin portals&lt;/li&gt;
&lt;li&gt;infrastructure support tasks where APIs are incomplete&lt;/li&gt;
&lt;li&gt;secure no-code and pro-code agent execution&lt;/li&gt;
&lt;li&gt;temporary automation environments that can be governed centrally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is also a reminder that agentic automation will not replace every old system overnight. It may first wrap and operate them more safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Work IQ APIs make Microsoft 365 context available to agents
&lt;/h2&gt;

&lt;p&gt;Microsoft announced that &lt;a href="https://www.microsoft.com/en-us/microsoft-365/blog/2026/06/02/announcing-the-new-work-iq-apis/" rel="noopener noreferrer"&gt;Work IQ APIs&lt;/a&gt; will be generally available on 16 June 2026. Work IQ gives agents access to business context from email, calendar, meetings, chats, files, people, collaboration patterns, and line-of-business systems.&lt;/p&gt;

&lt;p&gt;For DevOps teams, this matters because software delivery is not only code. It is also conversations, approvals, calendars, incident notes, architecture decisions, change windows, ownership, and organisational context.&lt;/p&gt;

&lt;p&gt;The Work IQ API domains are especially relevant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat, for programmatic access to Microsoft 365 Copilot responses and agents&lt;/li&gt;
&lt;li&gt;Context, for agent-ready context and source data&lt;/li&gt;
&lt;li&gt;Tools, for actions like sending emails, scheduling meetings, and uploading documents&lt;/li&gt;
&lt;li&gt;Workspaces, for storing intermediate state during long-running agent work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine an incident agent that can read the meeting notes, identify the service owner, summarise the active change, draft a post-incident review, and schedule the follow-up. That only works if the agent has governed access to workplace context.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Rayfin targets prompt-to-production enterprise app backends
&lt;/h2&gt;

&lt;p&gt;On the Azure side, one of the more practical announcements was &lt;a href="https://azure.microsoft.com/en-us/blog/microsoft-build-2026-building-agentic-apps-with-microsoft-fabric-and-microsoft-databases/" rel="noopener noreferrer"&gt;Rayfin&lt;/a&gt;, an open-source SDK and CLI for building enterprise-grade application backends on Microsoft Fabric.&lt;/p&gt;

&lt;p&gt;The pitch is simple. Coding agents can create applications quickly, but production applications still need databases, authentication, data models, access policies, operational state, and governance. Rayfin lets developers and agents define those backend pieces in code, then deploy them into Fabric.&lt;/p&gt;

&lt;p&gt;That is valuable for DevOps because it gives teams a more structured path from prototype to production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data models live in code&lt;/li&gt;
&lt;li&gt;access policies become programmable&lt;/li&gt;
&lt;li&gt;app data lands in OneLake&lt;/li&gt;
&lt;li&gt;GitHub-based workflows can drive backend changes&lt;/li&gt;
&lt;li&gt;Fabric provides enterprise security and scale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This could become an important bridge between AI-generated application code and the platform controls enterprises need before anything goes live.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Azure HorizonDB brings PostgreSQL into the AI application era
&lt;/h2&gt;

&lt;p&gt;Databases were another major theme. Microsoft introduced &lt;a href="https://azure.microsoft.com/en-us/blog/microsoft-build-2026-building-agentic-apps-with-microsoft-fabric-and-microsoft-databases/" rel="noopener noreferrer"&gt;Azure HorizonDB&lt;/a&gt;, a fully managed PostgreSQL-compatible database for AI-powered applications, now in public preview.&lt;/p&gt;

&lt;p&gt;The DevOps relevance is architecture simplification. Agentic applications often need transactional data, vector search, semantic search, AI model access, and integration with analytics and orchestration systems. Teams frequently stitch those pieces together themselves, which increases operational complexity.&lt;/p&gt;

&lt;p&gt;HorizonDB aims to reduce that stitching with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL compatibility&lt;/li&gt;
&lt;li&gt;zone resilience by default&lt;/li&gt;
&lt;li&gt;elastic storage up to 128 TB&lt;/li&gt;
&lt;li&gt;scale-out compute up to 3,072 vCores&lt;/li&gt;
&lt;li&gt;vector search and integrated AI model management&lt;/li&gt;
&lt;li&gt;connectivity to Microsoft Foundry and Fabric&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For platform teams, this could reduce the number of bespoke data services needed for AI app patterns, especially when PostgreSQL is already the standard operational database.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Cosmos DB improves local development and agent memory
&lt;/h2&gt;

&lt;p&gt;The same Azure data announcement also included useful updates for &lt;a href="https://azure.microsoft.com/en-us/blog/microsoft-build-2026-building-agentic-apps-with-microsoft-fabric-and-microsoft-databases/" rel="noopener noreferrer"&gt;Azure Cosmos DB&lt;/a&gt;. The Linux Emulator is now generally available, which means developers can build and test Cosmos DB applications locally across Linux, macOS, and Windows without a cloud dependency.&lt;/p&gt;

&lt;p&gt;That is excellent news for DevOps pipelines because local and CI-friendly emulators help teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shorten feedback loops&lt;/li&gt;
&lt;li&gt;reduce cloud dependency during tests&lt;/li&gt;
&lt;li&gt;improve repeatability across developer machines and build agents&lt;/li&gt;
&lt;li&gt;catch data access issues earlier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Microsoft also previewed semantic reranking and an agent memory toolkit using Cosmos DB, Azure Durable Functions, and Foundry models. Persistent agent memory will become a common requirement for real operational agents, especially for support, incident, and customer-facing workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Windows developer experience gets serious quality-of-life upgrades
&lt;/h2&gt;

&lt;p&gt;Build also brought several developer experience updates for Windows that matter to DevOps practitioners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://blogs.windows.com/windowsdeveloper/?p=57809" rel="noopener noreferrer"&gt;Coreutils for Windows&lt;/a&gt; is generally available&lt;/li&gt;
&lt;li&gt;WSL containers are coming to public preview&lt;/li&gt;
&lt;li&gt;Windows Developer Configurations are generally available&lt;/li&gt;
&lt;li&gt;Intelligent Terminal is in experimental preview&lt;/li&gt;
&lt;li&gt;Windows 365 with Developer configuration is in public preview&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest practical win is consistency. DevOps teams often move between Windows, Linux, WSL, containers, CI runners, and cloud shells. Coreutils for Windows and WSL containers reduce the friction between those environments.&lt;/p&gt;

&lt;p&gt;Windows Developer Configurations, powered by WinGet, also matters for platform engineering. A reproducible developer workstation is part of the software supply chain. If teams can bootstrap VS Code, GitHub Copilot, WSL, PowerShell 7, and developer-optimised settings with one configuration, onboarding and environment drift both improve.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. MDASH and agentic security raise the bar for AI-era AppSec
&lt;/h2&gt;

&lt;p&gt;Security also had a clear agentic theme. Microsoft highlighted &lt;a href="https://www.microsoft.com/en-us/security/blog/2026/05/12/defense-at-ai-speed-microsofts-new-multi-model-agentic-security-system-tops-leading-industry-benchmark/" rel="noopener noreferrer"&gt;MDASH&lt;/a&gt;, a multi-model agentic security system that uses teams of agents to find exploitable bugs.&lt;/p&gt;

&lt;p&gt;For DevSecOps teams, this is less about replacing scanners and more about changing the shape of security automation. Traditional tools are good at known patterns. Agentic security systems can reason across code paths, dependencies, runtime behaviour, and exploitability hypotheses.&lt;/p&gt;

&lt;p&gt;The lesson for engineering teams is clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expect more AI-generated code&lt;/li&gt;
&lt;li&gt;expect more AI-reviewed code&lt;/li&gt;
&lt;li&gt;expect attackers to use AI too&lt;/li&gt;
&lt;li&gt;invest in automated review, policy, sandboxing, and exploitability analysis&lt;/li&gt;
&lt;li&gt;keep humans in the loop for risk decisions, not repetitive triage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The DevOps teams that win here will combine AI speed with strong policy, testing, review, and traceability.&lt;/p&gt;




&lt;h2&gt;
  
  
  The pattern: Microsoft is building the agent operating model
&lt;/h2&gt;

&lt;p&gt;Taken together, the announcements point to one big pattern. Microsoft is not only adding AI features to existing products. It is building an operating model for agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub is the workflow and code control plane&lt;/li&gt;
&lt;li&gt;Foundry is the production agent runtime&lt;/li&gt;
&lt;li&gt;Windows and Windows 365 provide local and cloud execution environments&lt;/li&gt;
&lt;li&gt;Work IQ, Foundry IQ, Fabric IQ, and Web IQ provide context&lt;/li&gt;
&lt;li&gt;Fabric, HorizonDB, and Cosmos DB provide data foundations&lt;/li&gt;
&lt;li&gt;MXC, Agent 365, Defender, Entra, Intune, and Purview provide governance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why Build 2026 is important for DevOps. The conversation has moved from "can AI write code?" to "can AI safely participate in the delivery system?".&lt;/p&gt;

&lt;h2&gt;
  
  
  What DevOps teams should do next
&lt;/h2&gt;

&lt;p&gt;You do not need to adopt everything at once. I would start with four practical actions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Map where agents already touch your delivery workflow, including IDEs, pull requests, tests, incident response, and documentation.&lt;/li&gt;
&lt;li&gt;Define guardrails for agent access to repositories, environments, secrets, networks, and production data.&lt;/li&gt;
&lt;li&gt;Experiment with agent workflows in GitHub and Foundry, but require traces, evaluations, and human approval for high-risk actions.&lt;/li&gt;
&lt;li&gt;Review your platform architecture for AI workloads, especially databases, memory, retrieval, observability, and sandboxed execution.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most exciting part of Build 2026 is not a single feature. It is that the pieces are starting to connect. For DevOps teams, that creates an opportunity to design AI into the software delivery lifecycle deliberately, rather than letting it arrive as another unmanaged tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 03-06-2026&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>ai</category>
      <category>github</category>
    </item>
    <item>
      <title>GitHub Copilot CLI Plugins and Marketplaces: Extend Your Terminal Agent</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Wed, 27 May 2026 14:02:50 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-copilot-cli-plugins-and-marketplaces-extend-your-terminal-agent-16pc</link>
      <guid>https://dev.to/pwd9000/github-copilot-cli-plugins-and-marketplaces-extend-your-terminal-agent-16pc</guid>
      <description>&lt;h2&gt;
  
  
  GitHub Copilot CLI Plugins and Marketplaces: Extend Your Terminal Agent
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot CLI already gives you an AI assistant in the terminal. Plugins make it more powerful by letting you install reusable agents, skills, hooks, and tool integrations as packages.&lt;/p&gt;

&lt;p&gt;Instead of manually copying prompt files, wiring MCP servers, or sharing setup notes in a wiki, you can package those capabilities once and install them from a marketplace. In this guide, we will look at how Copilot CLI plugins work, how to find and install them, how marketplaces are structured, and how to build a small plugin of your own.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quick tip:&lt;/strong&gt; if you ever forget a flag, run &lt;code&gt;copilot plugin --help&lt;/code&gt; or &lt;code&gt;copilot plugin &amp;lt;subcommand&amp;gt; --help&lt;/code&gt;. The CLI ships its own up to date reference.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How a plugin reaches your machine
&lt;/h3&gt;

&lt;p&gt;Before diving in, it helps to see the bigger picture. Plugins are not installed at the repository level. They are installed per developer, into the local Copilot CLI folder on each machine. That means every developer chooses which plugins they want, and the Copilot CLI on their machine becomes aware of those agents, skills, hooks, and MCP servers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; +-----------------------------+        +--------------------------------+
 |     Plugin Marketplace      |        |        Plugin Package          |
 |    (e.g. awesome-copilot)   | -----&amp;gt; |  agents | skills | hooks       |
 |                             |        |  MCP servers | LSP servers     |
 +-----------------------------+        +----------------+---------------+
                                                         |
                                       copilot plugin install &amp;lt;plugin&amp;gt;
                                       (run on each developer's machine)
                                                         |
                                                         v
 +-------------------------------------------------------------------+
 |                      Developer's local machine                    |
 |                                                                   |
 |   ~/.copilot/installed-plugins/&amp;lt;marketplace&amp;gt;/&amp;lt;plugin-name&amp;gt;        |
 |   ~/.copilot/installed-plugins/_direct/&amp;lt;source-id&amp;gt;                |
 |                              |                                    |
 |                              v                                    |
 |              Copilot CLI loads agents, skills, MCP                |
 +-------------------------------------------------------------------+

   Note: each developer installs independently. Nothing is stored
   at the repository level, so two engineers on the same repo can
   have completely different plugin sets active.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Key things to notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The marketplace hosts the plugin definitions, but nothing is active until a developer installs it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;copilot plugin install&lt;/code&gt; runs locally on a developer's machine, so each engineer ends up with their own set of installed plugins.&lt;/li&gt;
&lt;li&gt;Installed contents live under the user's home directory at &lt;code&gt;~/.copilot/installed-plugins/&lt;/code&gt;, which is why two developers on the same repo can have completely different plugin sets.&lt;/li&gt;
&lt;li&gt;The Copilot CLI on that machine then picks up those installed agents, skills, and MCP servers in future sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your team wants everyone to use the same set, you do not check the plugin into the repo. Instead, you publish a curated marketplace and ask developers to install from it, or you use enterprise plugin standards (covered later) to enable plugins centrally.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Want central, reproducible management?&lt;/strong&gt; If you would rather pin and roll out a consistent set of agents across a team or organisation, instead of relying on each developer to run &lt;code&gt;copilot plugin install&lt;/code&gt;, take a look at my previous post on the Agent Package Manager (APM): &lt;a href="https://dev.to/pwd9000/agent-package-manager-apm-a-devops-guide-to-reproducible-ai-agents-4c25"&gt;Agent Package Manager (APM): A DevOps Guide to Reproducible AI Agents&lt;/a&gt;. It complements the per-developer plugin model shown above by adding versioning and reproducibility on top.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Are these the same as GitHub Copilot Extensions?
&lt;/h3&gt;

&lt;p&gt;This is a common point of confusion, so let us clear it up first. GitHub Copilot Extensions and Copilot CLI plugins are different systems.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;GitHub Copilot Extensions&lt;/th&gt;
&lt;th&gt;Copilot CLI plugins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where they run&lt;/td&gt;
&lt;td&gt;VS Code, Visual Studio, JetBrains, github.com&lt;/td&gt;
&lt;td&gt;Copilot CLI in your terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distribution&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/marketplace?type=apps&amp;amp;copilot_app=true" rel="noopener noreferrer"&gt;GitHub Marketplace&lt;/a&gt; (GitHub Apps)&lt;/td&gt;
&lt;td&gt;Git-repository based plugin marketplaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install command&lt;/td&gt;
&lt;td&gt;Install on GitHub.com, enable in the IDE&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What they extend&lt;/td&gt;
&lt;td&gt;The Copilot chat experience in IDEs&lt;/td&gt;
&lt;td&gt;The Copilot CLI agent, its tools, agents, skills, and MCP servers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both extend Copilot, but they are not interchangeable. This post is about the CLI flavour.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is a Copilot CLI Plugin?
&lt;/h2&gt;

&lt;p&gt;A Copilot CLI plugin is an installable package that extends GitHub Copilot CLI with reusable customisations. According to the official &lt;a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-cli-plugins" rel="noopener noreferrer"&gt;about CLI plugins&lt;/a&gt; page, plugins can bundle:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Typical location&lt;/th&gt;
&lt;th&gt;What it adds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom agents&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agents/*.agent.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Specialist agent modes for focused work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skills&lt;/td&gt;
&lt;td&gt;&lt;code&gt;skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reusable task instructions and workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hooks.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Commands that run at lifecycle events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP servers&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.mcp.json&lt;/code&gt; or &lt;code&gt;.github/mcp.json&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;External tools and data sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LSP servers&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;lsp.json&lt;/code&gt; or &lt;code&gt;.github/lsp.json&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Language server integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That means a plugin is not just an MCP server. It is a distribution format. A plugin can contain only a custom agent, only a set of skills, a bundle of MCP servers, or a combination of all of these.&lt;/p&gt;

&lt;p&gt;After installation, Copilot CLI stores plugin contents under the user's Copilot directory and loads them into future sessions. Marketplace plugins are installed under:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.copilot/installed-plugins/&amp;lt;marketplace&amp;gt;/&amp;lt;plugin-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Direct installs are stored under:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.copilot/installed-plugins/_direct/&amp;lt;source-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;The plugin manifest itself (&lt;code&gt;plugin.json&lt;/code&gt;) can live in any of these locations inside the plugin repo, checked in this order: &lt;code&gt;.plugin/plugin.json&lt;/code&gt;, &lt;code&gt;plugin.json&lt;/code&gt;, &lt;code&gt;.github/plugin/plugin.json&lt;/code&gt;, or &lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt;. The last one exists for compatibility with Claude Code plugin layouts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Plugins versus manual configuration
&lt;/h3&gt;

&lt;p&gt;You can add custom agents, MCP servers, and skills manually without using a plugin at all. Plugins are simply a better way to distribute those things. The official docs summarise it like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Manual configuration in a repository&lt;/th&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scope&lt;/td&gt;
&lt;td&gt;Single repository&lt;/td&gt;
&lt;td&gt;Any project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sharing&lt;/td&gt;
&lt;td&gt;Manual copy and paste&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versioning&lt;/td&gt;
&lt;td&gt;Git history&lt;/td&gt;
&lt;td&gt;Marketplace versions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;Searching repositories&lt;/td&gt;
&lt;td&gt;Marketplace browsing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you find yourself copying the same &lt;code&gt;agents/&lt;/code&gt; folder into multiple repositories, that is a strong signal it should be a plugin.&lt;/p&gt;


&lt;h2&gt;
  
  
  How Plugins Relate to MCP
&lt;/h2&gt;

&lt;p&gt;MCP, or Model Context Protocol, is the open standard used by AI tools to connect models to external tools and data sources. GitHub documents MCP support across Copilot surfaces in &lt;a href="https://docs.github.com/en/copilot/concepts/about-mcp" rel="noopener noreferrer"&gt;About Model Context Protocol&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Copilot CLI can use MCP servers directly, without plugins. For example, you can add an MCP server interactively:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/mcp add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or you can edit the global MCP configuration file:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.copilot/mcp-config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A plugin can wrap that configuration and make it reusable. Instead of telling every developer to paste the same JSON into their config file, you can ship the MCP server configuration inside a plugin and let them install it with one command.&lt;/p&gt;

&lt;p&gt;For example, a plugin might include this &lt;code&gt;.mcp.json&lt;/code&gt; file:&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;"mcpServers"&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;"playwright"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"@playwright/mcp@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"tools"&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="s2"&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;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;p&gt;That plugin would give Copilot CLI browser automation tools through the Playwright MCP server whenever the plugin is loaded.&lt;/p&gt;


&lt;h2&gt;
  
  
  Finding Plugins
&lt;/h2&gt;

&lt;p&gt;Copilot CLI ships with two registered marketplaces by default:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Marketplace&lt;/th&gt;
&lt;th&gt;Repository&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copilot-plugins&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/github/copilot-plugins" rel="noopener noreferrer"&gt;&lt;code&gt;github/copilot-plugins&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Official GitHub Copilot plugins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/github/awesome-copilot" rel="noopener noreferrer"&gt;&lt;code&gt;github/awesome-copilot&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Community collection of plugins, agents, skills, prompts, and MCP integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can list the marketplaces registered with your CLI:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin marketplace list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Inside an interactive Copilot CLI session, use the slash command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To browse plugins from a marketplace:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin marketplace browse awesome-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or from inside the session:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace browse awesome-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;awesome-copilot&lt;/code&gt; project also has a web UI at &lt;a href="https://awesome-copilot.github.com" rel="noopener noreferrer"&gt;awesome-copilot.github.com&lt;/a&gt;, which is useful when you want to search and filter through community entries before installing anything locally.&lt;/p&gt;

&lt;p&gt;There is also a separate &lt;a href="https://github.com/mcp" rel="noopener noreferrer"&gt;GitHub MCP Registry&lt;/a&gt; for discovering MCP servers. That registry is useful when you want raw MCP servers, but it is not the same thing as a Copilot CLI plugin marketplace. Plugins can bundle MCP servers, but marketplaces distribute complete Copilot CLI plugin packages.&lt;/p&gt;


&lt;h2&gt;
  
  
  Installing and Managing Plugins
&lt;/h2&gt;

&lt;p&gt;The main install command is:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;plugin-spec&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The plugin specification can point to a marketplace entry, a GitHub repository, a subdirectory, another Git URL, or a local folder.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Install source&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Marketplace entry&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install database-data-management@awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub repository root&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install johnpapa/ai-ready&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub repository subdirectory&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install dotnet/skills:plugins/dotnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install https://github.com/owner/repo.git&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local path&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install ./my-plugin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can also install from inside an interactive session:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin install database-data-management@awesome-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Useful management commands include:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin list
copilot plugin update &amp;lt;plugin-name&amp;gt;
copilot plugin update &lt;span class="nt"&gt;--all&lt;/span&gt;
copilot plugin disable &amp;lt;plugin-name&amp;gt;
copilot plugin &lt;span class="nb"&gt;enable&lt;/span&gt; &amp;lt;plugin-name&amp;gt;
copilot plugin uninstall &amp;lt;plugin-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Marketplace management uses a nested command group:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin marketplace add owner/repo
copilot plugin marketplace list
copilot plugin marketplace browse &amp;lt;marketplace-name&amp;gt;
copilot plugin marketplace remove &amp;lt;marketplace-name&amp;gt;
copilot plugin marketplace remove &lt;span class="nt"&gt;--force&lt;/span&gt; &amp;lt;marketplace-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;--force&lt;/code&gt; option matters. If a marketplace has installed plugins, Copilot CLI will not remove it unless you explicitly force removal, which also removes the plugins installed from that marketplace.&lt;/p&gt;


&lt;h2&gt;
  
  
  Good Plugins to Try
&lt;/h2&gt;

&lt;p&gt;Here are a few useful examples from the official and community marketplaces. Always inspect a plugin before installing it, especially if it defines MCP servers or hooks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Marketplace&lt;/th&gt;
&lt;th&gt;What it is useful for&lt;/th&gt;
&lt;th&gt;Install command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;advanced-security&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot-plugins&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitHub Advanced Security workflows such as secret scanning and dependency scanning&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install advanced-security@copilot-plugins&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spark&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot-plugins&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitHub Spark integration&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install spark@copilot-plugins&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Azure skills and Azure MCP server integration&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install azure@awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;microsoft-docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Microsoft Learn documentation through MCP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install microsoft-docs@awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;devops-oncall&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Incident triage chat mode, prompts, and instructions for DevOps on-call work&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install devops-oncall@awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dotnet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Everyday .NET and C# development skills&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install dotnet@awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dotnet-test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;.NET testing, coverage, and framework-specific test guidance&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install dotnet-test@awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chrome-devtools-plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chrome DevTools and browser debugging workflows&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install chrome-devtools-plugin@awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ai-ready&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Repository analysis and AI-readiness configuration&lt;/td&gt;
&lt;td&gt;&lt;code&gt;copilot plugin install ai-ready@awesome-copilot&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For DevOps engineers, the Azure, database, documentation, browser debugging, and security plugins are the most immediately practical. They extend the CLI from a general assistant into a specialist operator for the stack you actually use.&lt;/p&gt;


&lt;h2&gt;
  
  
  Building Your Own Plugin
&lt;/h2&gt;

&lt;p&gt;Let us build a small plugin that gives Copilot CLI a specialised deployment helper agent and a deployment checklist skill.&lt;/p&gt;

&lt;p&gt;Create this folder structure:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-devops-plugin/
├── plugin.json
├── agents/
│   └── release-engineer.agent.md
└── skills/
    └── deployment-checklist/
        └── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The only required field in &lt;code&gt;plugin.json&lt;/code&gt; is &lt;code&gt;name&lt;/code&gt;, but real plugins should include a description, version, author, licence, keywords, and explicit component paths.&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;"devops-release-helper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Release engineering helpers for CI/CD, deployment checks, and incident-safe rollouts."&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;"author"&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;"Example Platform Team"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"platform@example.com"&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;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&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="s2"&gt;"devops"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deployment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cicd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agents/"&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="s2"&gt;"skills/"&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;p&gt;Now create the agent file:&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;release-engineer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Helps plan, validate, and troubleshoot safe production releases.&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bash'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;view'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rg'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;glob'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You are a release engineering assistant. Focus on safe deployments, rollback-readiness, observability, and clear operator hand-offs.

Before recommending a deployment, check for:
&lt;span class="p"&gt;
-&lt;/span&gt; CI status and failing tests
&lt;span class="p"&gt;-&lt;/span&gt; Database migrations and rollback impact
&lt;span class="p"&gt;-&lt;/span&gt; Feature flags and progressive rollout options
&lt;span class="p"&gt;-&lt;/span&gt; Monitoring dashboards, alerts, and log queries
&lt;span class="p"&gt;-&lt;/span&gt; Rollback commands and owner contact points
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then create the skill:&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;deployment-checklist&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a deployment readiness checklist for the current repository.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Review the current repository and produce a deployment readiness checklist.

Include:
&lt;span class="p"&gt;
1.&lt;/span&gt; Build and test validation
&lt;span class="p"&gt;2.&lt;/span&gt; Infrastructure or configuration changes
&lt;span class="p"&gt;3.&lt;/span&gt; Database migration risk
&lt;span class="p"&gt;4.&lt;/span&gt; Secrets and environment variables
&lt;span class="p"&gt;5.&lt;/span&gt; Monitoring and alerting checks
&lt;span class="p"&gt;6.&lt;/span&gt; Rollback plan
&lt;span class="p"&gt;7.&lt;/span&gt; Post-deployment verification

Flag anything that looks risky or missing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Install it locally:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin &lt;span class="nb"&gt;install&lt;/span&gt; ./my-devops-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Check that Copilot CLI can see it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then start an interactive session and inspect loaded agents and skills:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/agent
/skills list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you change files inside a local plugin, reinstall it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin &lt;span class="nb"&gt;install&lt;/span&gt; ./my-devops-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Plugin contents are cached at install time, so editing the source folder does not automatically update the installed copy.&lt;/p&gt;


&lt;h2&gt;
  
  
  Creating a Plugin Marketplace
&lt;/h2&gt;

&lt;p&gt;A Copilot CLI marketplace is not the same as the traditional &lt;a href="https://github.com/marketplace" rel="noopener noreferrer"&gt;GitHub Marketplace&lt;/a&gt;. It is a Git repository based registry. Any repository can become a marketplace by adding a &lt;code&gt;marketplace.json&lt;/code&gt; file at:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.github/plugin/marketplace.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A simple marketplace might look like this:&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;"platform-team-plugins"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"owner"&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;"Example Platform Team"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"platform@example.com"&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;"metadata"&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;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Curated Copilot CLI plugins for our engineering organisation."&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="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;"plugins"&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;"devops-release-helper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Release engineering helpers for CI/CD and safe deployments."&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;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./plugins/devops-release-helper"&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;p&gt;If that file lives in &lt;code&gt;octo-org/platform-copilot-plugins&lt;/code&gt;, users can register the marketplace with:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin marketplace add octo-org/platform-copilot-plugins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then they can browse it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin marketplace browse platform-team-plugins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And install from it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot plugin &lt;span class="nb"&gt;install &lt;/span&gt;devops-release-helper@platform-team-plugins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is where marketplaces become powerful for teams. A platform team can curate approved plugins for cloud operations, security reviews, incident response, documentation, and release engineering. Developers get a simple install command, while the organisation keeps the source in Git where it can be reviewed, versioned, and audited.&lt;/p&gt;


&lt;h2&gt;
  
  
  Enterprise Plugin Standards
&lt;/h2&gt;

&lt;p&gt;For larger organisations, GitHub documents &lt;a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-enterprise-plugin-standards" rel="noopener noreferrer"&gt;enterprise plugin standards&lt;/a&gt; as a public preview feature. Enterprise administrators can publish standard marketplaces and enabled plugins through &lt;code&gt;.github/copilot/settings.json&lt;/code&gt; in the enterprise &lt;code&gt;.github-private&lt;/code&gt; repository.&lt;/p&gt;

&lt;p&gt;An example configuration looks like this:&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;"extraKnownMarketplaces"&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;"our-internal-marketplace"&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;"source"&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;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"repo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acme-corp/copilot-plugins"&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;span class="nl"&gt;"enabledPlugins"&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;"security-scanner@our-internal-marketplace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code-standards@our-internal-marketplace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;p&gt;This gives enterprises a central way to make known marketplaces available and enable approved plugins for users.&lt;/p&gt;


&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;Plugins can change what Copilot CLI can do, so treat them like developer tooling that runs with your local permissions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Inspect before installing
&lt;/h3&gt;

&lt;p&gt;Before installing a plugin, inspect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;plugin.json&lt;/code&gt;, to understand what components are included&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.mcp.json&lt;/code&gt;, to see which external tools or endpoints are configured&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hooks.json&lt;/code&gt;, to see commands that may run automatically&lt;/li&gt;
&lt;li&gt;Agent and skill instructions, to understand behavioural changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://github.com/github/awesome-copilot" rel="noopener noreferrer"&gt;&lt;code&gt;github/awesome-copilot&lt;/code&gt;&lt;/a&gt; repository also warns that community customisations come from third-party developers and should be inspected before use.&lt;/p&gt;
&lt;h3&gt;
  
  
  Understand MCP policy
&lt;/h3&gt;

&lt;p&gt;For Copilot Business and Enterprise, GitHub documents that MCP server use is controlled by organisation or enterprise policy and is disabled by default. If a plugin relies on MCP servers, users may need admin policy changes before it can work.&lt;/p&gt;
&lt;h3&gt;
  
  
  Be careful with tool approvals
&lt;/h3&gt;

&lt;p&gt;Copilot CLI has a tool approval model for actions such as shell commands and file changes. Approving a broad command for the rest of a session can be convenient, but it also increases risk. Keep approval narrow when you are testing a new plugin, and avoid running the CLI with &lt;code&gt;--allow-all-tools&lt;/code&gt; while you are evaluating an untrusted plugin. Use &lt;code&gt;--allow-tool&lt;/code&gt; for the specific tools you actually need.&lt;/p&gt;
&lt;h3&gt;
  
  
  Prefer reviewed marketplaces
&lt;/h3&gt;

&lt;p&gt;For teams, the best pattern is to create an internal marketplace. Put plugin changes through pull request review, pin versions where possible, and document what each plugin is allowed to do.&lt;/p&gt;


&lt;h2&gt;
  
  
  Practical DevOps Use Cases
&lt;/h2&gt;

&lt;p&gt;Here are a few ways I would use Copilot CLI plugins in a DevOps workflow.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Plugin pattern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloud operations&lt;/td&gt;
&lt;td&gt;Bundle Azure or AWS MCP servers with cloud runbook skills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident response&lt;/td&gt;
&lt;td&gt;Ship an incident commander agent with log query and triage skills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release engineering&lt;/td&gt;
&lt;td&gt;Package deployment checklists, rollback prompts, and CI/CD helpers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security review&lt;/td&gt;
&lt;td&gt;Combine GitHub Advanced Security skills with secure coding agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;Install documentation MCP plugins so Copilot can ground answers in official docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform enablement&lt;/td&gt;
&lt;td&gt;Publish internal standards as agents and skills through a team marketplace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key point is repeatability. A good plugin turns tribal knowledge into a versioned package that every engineer can install and use in the same way.&lt;/p&gt;


&lt;h2&gt;
  
  
  Limitations and Current State
&lt;/h2&gt;

&lt;p&gt;There are a few important details to keep in mind.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The docs do not show a &lt;code&gt;copilot plugin search&lt;/code&gt; command. Discovery is through marketplace browsing and web UIs such as &lt;code&gt;awesome-copilot.github.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Plugin files are cached at install time. Reinstall local plugins after editing them.&lt;/li&gt;
&lt;li&gt;Plugin agents and skills do not override project-level or personal customisations. Project context still wins.&lt;/li&gt;
&lt;li&gt;MCP servers from plugins may be affected by organisation or enterprise policy.&lt;/li&gt;
&lt;li&gt;Enterprise plugin standards and the GitHub MCP Registry are documented as public preview features, so behaviour may change.&lt;/li&gt;
&lt;li&gt;There is no separate plugin pricing model documented in the sources I reviewed. Plugins appear to be part of the Copilot CLI experience, but marketplace entries may depend on external services with their own costs.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;Copilot CLI plugins are a practical way to make the terminal agent fit your real workflow. They turn agents, skills, hooks, MCP servers, and language integrations into installable packages. Marketplaces then give teams and communities a way to share those packages without copy-paste setup instructions.&lt;/p&gt;

&lt;p&gt;If you are just getting started, browse &lt;code&gt;awesome-copilot&lt;/code&gt;, install one or two plugins that match your stack, and inspect how they are structured. Then build a small internal plugin for a workflow your team repeats every week. Deployment checks, incident triage, and security review are all great first candidates.&lt;/p&gt;

&lt;p&gt;The best plugins will not replace engineering judgement. They will capture your team's judgement and make it easier to apply consistently from the terminal.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 27-05-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>cli</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Agent Package Manager (APM): A DevOps Guide to Reproducible AI Agents</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Tue, 21 Apr 2026 14:21:12 +0000</pubDate>
      <link>https://dev.to/pwd9000/agent-package-manager-apm-a-devops-guide-to-reproducible-ai-agents-4c25</link>
      <guid>https://dev.to/pwd9000/agent-package-manager-apm-a-devops-guide-to-reproducible-ai-agents-4c25</guid>
      <description>&lt;h2&gt;
  
  
  Agent Package Manager (APM): A DevOps Guide to Reproducible AI Agents
&lt;/h2&gt;

&lt;p&gt;If you have been customising GitHub Copilot, Claude Code, or Cursor for your team, you have probably hit the same wall I did. You spend a weekend crafting the perfect set of instructions, prompts, skills, and chat modes, you commit them to &lt;code&gt;.github/&lt;/code&gt; and &lt;code&gt;.claude/&lt;/code&gt;, and then a teammate joins the project and has a totally different agent experience because their config drifted weeks ago.&lt;/p&gt;

&lt;p&gt;There has been no &lt;code&gt;package.json&lt;/code&gt; for AI agent configuration. Until now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/microsoft/apm" rel="noopener noreferrer"&gt;&lt;strong&gt;APM (Agent Package Manager)&lt;/strong&gt;&lt;/a&gt; is an open-source project from Microsoft that treats agent configuration the same way npm, pip, or NuGet treat code dependencies. You declare what your project needs in an &lt;code&gt;apm.yml&lt;/code&gt; file, commit a lockfile, and every developer or CI runner gets the exact same agent setup in seconds.&lt;/p&gt;

&lt;p&gt;In this post we will look at APM from a DevOps angle, walk through a first install, and then wire it up to the &lt;a href="https://awesome-copilot.github.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;awesome-copilot&lt;/strong&gt;&lt;/a&gt; marketplace so you can pull in battle-tested plugins, skills, and agents without writing any of your own.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2yz8qxr7y36zrh7um44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff2yz8qxr7y36zrh7um44.png" alt="APM GitHub repository" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why APM Matters for DevOps
&lt;/h2&gt;

&lt;p&gt;The official tagline on the &lt;a href="https://github.com/microsoft/apm" rel="noopener noreferrer"&gt;microsoft/apm README&lt;/a&gt; says it plainly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;APM – Agent Package Manager. An open-source, community-driven dependency manager for AI agents. Think &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, or &lt;code&gt;Cargo.toml&lt;/code&gt;, but for AI agent configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From a platform engineering perspective, that unlocks a few things we normally take for granted on the code side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility.&lt;/strong&gt; An &lt;code&gt;apm.lock.yaml&lt;/code&gt; pins every dependency to a full 40-character commit SHA, so a clone today and a clone in six months produce the same agent behaviour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portability.&lt;/strong&gt; The same manifest works across GitHub Copilot, Claude Code, Cursor, OpenCode, and Codex. Write once, run in every editor on the team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance.&lt;/strong&gt; No central registry means there is no single point of compromise. Everything resolves from git, over SSH or HTTPS, and a built-in &lt;code&gt;apm audit&lt;/code&gt; scans for hidden Unicode and prompt-injection payloads at install time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI friendly.&lt;/strong&gt; There is an official &lt;a href="https://github.com/microsoft/apm-action" rel="noopener noreferrer"&gt;&lt;code&gt;microsoft/apm-action&lt;/code&gt;&lt;/a&gt;, a SARIF output for Code Scanning, and a bundle-and-ship flow (&lt;code&gt;apm pack&lt;/code&gt; / &lt;code&gt;apm unpack&lt;/code&gt;) for matrix and air-gapped builds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No runtime footprint.&lt;/strong&gt; Per the &lt;a href="https://microsoft.github.io/apm/enterprise/security/" rel="noopener noreferrer"&gt;security docs&lt;/a&gt;, APM has no telemetry, no callbacks, and no arbitrary code execution. It is literally &lt;code&gt;git clone&lt;/code&gt; plus &lt;code&gt;cp&lt;/code&gt; plus a manifest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APM is still a &lt;strong&gt;working draft&lt;/strong&gt; (manifest schema 0.1, CLI in the 0.x range), so pin versions and expect the odd rough edge, but the shape of the tool is already very useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Concepts in Plain English
&lt;/h2&gt;

&lt;p&gt;APM introduces a handful of concepts. Here is what they actually mean.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Where it lives&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apm.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manifest that declares your project's agent dependencies.&lt;/td&gt;
&lt;td&gt;Repo root, committed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apm.lock.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lockfile pinning every dep to an exact commit SHA.&lt;/td&gt;
&lt;td&gt;Repo root, committed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apm_modules/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Where downloaded packages are cached. Think &lt;code&gt;node_modules&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;Repo root, gitignored.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployed files&lt;/td&gt;
&lt;td&gt;Primitives copied into &lt;code&gt;.github/&lt;/code&gt;, &lt;code&gt;.claude/&lt;/code&gt;, &lt;code&gt;.cursor/&lt;/code&gt;, etc. after install.&lt;/td&gt;
&lt;td&gt;Committed, so Copilot on github.com also sees them.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primitives&lt;/td&gt;
&lt;td&gt;The building blocks: instructions, prompts, agents, skills, chatmodes, hooks, plugins, MCP servers.&lt;/td&gt;
&lt;td&gt;Inside packages.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketplace&lt;/td&gt;
&lt;td&gt;A git-hosted index (e.g. awesome-copilot) you can search and install from.&lt;/td&gt;
&lt;td&gt;Remote.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important DevOps takeaway is that &lt;strong&gt;&lt;code&gt;apm.yml&lt;/code&gt;, &lt;code&gt;apm.lock.yaml&lt;/code&gt;, and the deployed files under &lt;code&gt;.github/&lt;/code&gt;, &lt;code&gt;.claude/&lt;/code&gt;, and &lt;code&gt;.cursor/&lt;/code&gt; all get committed&lt;/strong&gt;. &lt;code&gt;apm_modules/&lt;/code&gt; does not. This is exactly the opposite of npm, and it is deliberate: it means Copilot on github.com and any teammate who has not run &lt;code&gt;apm install&lt;/code&gt; yet still get the correct context.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing the APM CLI
&lt;/h2&gt;

&lt;p&gt;APM ships native binaries for macOS, Linux, and Windows x86_64. Pick whichever installer suits your platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux and macOS:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://aka.ms/apm-unix | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Windows (PowerShell):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://aka.ms/apm-windows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Homebrew, Scoop, or pip (alternative paths):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;microsoft/apm/apm

&lt;span class="c"&gt;# Scoop (Windows)&lt;/span&gt;
scoop bucket add apm https://github.com/microsoft/scoop-apm
scoop &lt;span class="nb"&gt;install &lt;/span&gt;apm

&lt;span class="c"&gt;# pip (works but the native installer is the recommended path)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;apm-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Verify the install and check for updates:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm &lt;span class="nt"&gt;--version&lt;/span&gt;
apm update &lt;span class="nt"&gt;--check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;apm update&lt;/code&gt; will self-upgrade using the same native installer that put it on your machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw42998kotvfbob9f5rqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw42998kotvfbob9f5rqz.png" alt="APM documentation home" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Your First &lt;code&gt;apm.yml&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Scaffold a manifest in an existing repo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-devops-project
apm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That creates an &lt;code&gt;apm.yml&lt;/code&gt; that looks roughly like this. Here is the richer version straight out of the &lt;a href="https://microsoft.github.io/apm/guides/dependencies/" rel="noopener noreferrer"&gt;dependencies guide&lt;/a&gt;, annotated so you can see what each line buys you:&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-project&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;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;apm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# A whole Anthropic skill (folder with SKILL.md + assets)&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;anthropics/skills/skills/frontend-design&lt;/span&gt;

    &lt;span class="c1"&gt;# A plugin from the awesome-copilot marketplace&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github/awesome-copilot/plugins/context-engineering&lt;/span&gt;

    &lt;span class="c1"&gt;# A single agent primitive file from any repo&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github/awesome-copilot/agents/api-architect.agent.md&lt;/span&gt;

    &lt;span class="c1"&gt;# A full APM package pinned to a tag&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;microsoft/apm-sample-package#v1.0.0&lt;/span&gt;

    &lt;span class="c1"&gt;# Any git host (GitLab, Bitbucket, Azure DevOps, self-hosted)&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;https://gitlab.com/acme/coding-standards.git&lt;/span&gt;

    &lt;span class="c1"&gt;# Local path, useful for monorepos&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./packages/my-shared-skills&lt;/span&gt;

    &lt;span class="c1"&gt;# Object form when you need a sub-path and a ref&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;git&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://gitlab.com/acme/coding-standards.git&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;instructions/security&lt;/span&gt;
      &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v2.0&lt;/span&gt;

  &lt;span class="na"&gt;mcp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# MCP server reference from the GitHub MCP Registry&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;io.github.github/github-mcp-server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The dependency string follows a consistent pattern: &lt;strong&gt;&lt;code&gt;&amp;lt;host&amp;gt;/&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;[/&amp;lt;sub-path&amp;gt;][#&amp;lt;ref&amp;gt;]&lt;/code&gt;&lt;/strong&gt;. If you omit the host, &lt;code&gt;github.com&lt;/code&gt; is assumed. Ref pinning is standard git: tags (&lt;code&gt;#v1.0.0&lt;/code&gt;), branches (&lt;code&gt;#main&lt;/code&gt;), or raw commits (&lt;code&gt;#a1b2c3…&lt;/code&gt;).&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Use APM: A 5 Minute Walkthrough
&lt;/h2&gt;

&lt;p&gt;Let us take the exact example the APM maintainer shared and run it end to end.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Install a single plugin on the fly
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm &lt;span class="nb"&gt;install &lt;/span&gt;github/awesome-copilot/plugins/context-engineering
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Three things happen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;APM clones the &lt;code&gt;github/awesome-copilot&lt;/code&gt; repo (shallow, depth 1) into &lt;code&gt;apm_modules/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It detects that &lt;code&gt;plugins/context-engineering&lt;/code&gt; is a plugin folder (has a &lt;code&gt;plugin.json&lt;/code&gt;) and copies its primitives into &lt;code&gt;.github/&lt;/code&gt;, &lt;code&gt;.claude/&lt;/code&gt;, &lt;code&gt;.cursor/&lt;/code&gt;, or wherever your target agent expects them.&lt;/li&gt;
&lt;li&gt;It adds an entry to &lt;code&gt;apm.yml&lt;/code&gt; under &lt;code&gt;dependencies.apm:&lt;/code&gt; and records the resolved commit SHA in &lt;code&gt;apm.lock.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  2. Or commit a full manifest and install everything
&lt;/h3&gt;

&lt;p&gt;Hand-edit &lt;code&gt;apm.yml&lt;/code&gt; with the dependencies you want, then run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This resolves every dep in the manifest (including transitive ones), pins each to a commit SHA, and deploys the primitives into your project.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Inspect what you pulled in
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm deps list          &lt;span class="c"&gt;# flat table, with primitive counts&lt;/span&gt;
apm deps tree          &lt;span class="c"&gt;# hierarchical view of transitive deps&lt;/span&gt;
apm view github/awesome-copilot/plugins/context-engineering versions   &lt;span class="c"&gt;# list tags/branches&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4. Keep things fresh
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm outdated           &lt;span class="c"&gt;# diff lockfile vs remote refs&lt;/span&gt;
apm deps update        &lt;span class="c"&gt;# re-resolve and bump the lockfile&lt;/span&gt;
apm uninstall github/awesome-copilot/plugins/context-engineering
apm prune              &lt;span class="c"&gt;# remove anything no longer referenced&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  5. Commit the right files
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# .gitignore
apm_modules/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Commit &lt;code&gt;apm.yml&lt;/code&gt;, &lt;code&gt;apm.lock.yaml&lt;/code&gt;, and the deployed &lt;code&gt;.github/&lt;/code&gt;, &lt;code&gt;.claude/&lt;/code&gt;, &lt;code&gt;.cursor/&lt;/code&gt; directories. Your teammates now get the identical agent setup after &lt;code&gt;git pull &amp;amp;&amp;amp; apm install&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Wiring Up the awesome-copilot Marketplace
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://awesome-copilot.github.com/" rel="noopener noreferrer"&gt;awesome-copilot&lt;/a&gt; is GitHub's community-curated library of Copilot agents, instructions, skills, prompts, chat modes, hooks, and plugins. It is pre-registered as the default marketplace in Copilot CLI and VS Code, and APM knows about it too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjj339rxbkyun4w4pj17w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjj339rxbkyun4w4pj17w.png" alt="awesome-copilot home" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Register and search
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm marketplace add github/awesome-copilot
apm marketplace list
apm search &lt;span class="s2"&gt;"terraform@awesome-copilot"&lt;/span&gt;
apm marketplace browse awesome-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Install with the short &lt;code&gt;@awesome-copilot&lt;/code&gt; suffix
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm &lt;span class="nb"&gt;install &lt;/span&gt;azure-cloud-development@awesome-copilot
apm &lt;span class="nb"&gt;install &lt;/span&gt;devops-oncall@awesome-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is equivalent to the long form &lt;code&gt;apm install github/awesome-copilot/plugins/azure-cloud-development&lt;/code&gt;, but nicer to type and easier to share in docs.&lt;/p&gt;

&lt;p&gt;Crucially, and this is the point the APM maintainer was making, &lt;strong&gt;awesome-copilot entries do not need to ship their own &lt;code&gt;apm.yml&lt;/code&gt;&lt;/strong&gt;. APM detects the shape of each folder (plugin, skill, hook package, single primitive file) and handles it correctly. You get to consume the full community catalogue without the authors having to adopt APM first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvywj4m8m2kkgm1fue50.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnvywj4m8m2kkgm1fue50.png" alt="awesome-copilot plugins" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  DevOps picks worth installing today
&lt;/h3&gt;

&lt;p&gt;Here are a handful of entries I reach for on every project. Verify names against the live marketplace before pinning, since the catalogue moves fast.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entry&lt;/th&gt;
&lt;th&gt;APM reference&lt;/th&gt;
&lt;th&gt;Why DevOps engineers care&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Azure cloud development plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github/awesome-copilot/plugins/azure-cloud-development&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bicep, Terraform, serverless, cost optimisation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevOps on-call plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github/awesome-copilot/plugins/devops-oncall&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prompts and a chat mode for incident triage on Azure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure IaC generator agent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github/awesome-copilot/agents/azure-iac-generator.agent.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Single-file agent, drops in as &lt;code&gt;.agent.md&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Policy analyser agent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github/awesome-copilot/agents/azure-policy-analyzer.agent.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reviews policy assignments and compliance.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent governance skill&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github/awesome-copilot/skills/agent-governance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Guardrails and review checklists for agent rollouts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent supply chain skill&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github/awesome-copilot/skills/agent-supply-chain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Threat modelling for agent dependencies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App Insights instrumentation skill&lt;/td&gt;
&lt;td&gt;&lt;code&gt;github/awesome-copilot/skills/appinsights-instrumentation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adds telemetry calls to your code.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A realistic &lt;code&gt;apm.yml&lt;/code&gt; for a DevOps repo might look like this:&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;platform-engineering-toolkit&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;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;apm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github/awesome-copilot/plugins/azure-cloud-development#main&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github/awesome-copilot/plugins/devops-oncall&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github/awesome-copilot/skills/agent-governance&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github/awesome-copilot/skills/appinsights-instrumentation&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github/awesome-copilot/agents/azure-iac-generator.agent.md&lt;/span&gt;
  &lt;span class="na"&gt;mcp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;io.github.github/github-mcp-server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run &lt;code&gt;apm install&lt;/code&gt;, commit the result, and every engineer on the team picks up the same Azure, DevOps, and governance tooling the next time they pull.&lt;/p&gt;


&lt;h2&gt;
  
  
  Running APM in CI
&lt;/h2&gt;

&lt;p&gt;For pipeline reproducibility, use the official &lt;a href="https://github.com/microsoft/apm-action" rel="noopener noreferrer"&gt;&lt;code&gt;microsoft/apm-action&lt;/code&gt;&lt;/a&gt; (GitHub Actions) or the native installer in any other CI system.&lt;/p&gt;

&lt;p&gt;A minimal GitHub Actions example that enforces lockfile integrity and runs the security audit:&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Agent Config CI&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;apm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&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;Install APM&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;curl -sSL https://aka.ms/apm-unix | sh&lt;/span&gt;

      &lt;span class="pi"&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;Resolve dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apm install --dry-run&lt;/span&gt;

      &lt;span class="pi"&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;Security audit&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apm audit --ci -f sarif -o apm-audit.sarif&lt;/span&gt;

      &lt;span class="pi"&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;Upload SARIF&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github/codeql-action/upload-sarif@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;sarif_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apm-audit.sarif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A few things to call out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apm install --dry-run&lt;/code&gt; fails the job if the lockfile and manifest disagree, catching accidental drift in PRs.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apm audit&lt;/code&gt; scans downloaded primitives for hidden Unicode and prompt-injection characters (the "Glassworm" class of attacks) and can emit SARIF for GitHub Code Scanning, JSON for custom pipelines, or Markdown for step summaries.&lt;/li&gt;
&lt;li&gt;For matrix or air-gapped builds, use &lt;code&gt;apm pack --archive&lt;/code&gt; in one job to produce a tarball and &lt;code&gt;apm unpack&lt;/code&gt; in downstream jobs to avoid re-cloning every dep.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Publishing Your Own APM Package
&lt;/h2&gt;

&lt;p&gt;There is no registry and no &lt;code&gt;apm publish&lt;/code&gt;. Publishing is literally "push to a git repo". The layout the &lt;a href="https://microsoft.github.io/apm/getting-started/first-package/" rel="noopener noreferrer"&gt;first-package tutorial&lt;/a&gt; recommends is:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-team-standards/
├── apm.yml
└── .apm/
    ├── instructions/
    ├── prompts/
    ├── skills/
    ├── agents/
    └── hooks/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Workflow:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm init my-team-standards
&lt;span class="c"&gt;# drop primitives under .apm/...&lt;/span&gt;
git init &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial package"&lt;/span&gt;
git tag v1.0.0
git remote add origin https://github.com/my-org/my-team-standards.git
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main &lt;span class="nt"&gt;--tags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Teammates or other repos consume it with:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apm &lt;span class="nb"&gt;install &lt;/span&gt;my-org/my-team-standards#v1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Tag releases with semver, keep a CHANGELOG, and treat breaking changes the way you would for any library.&lt;/p&gt;


&lt;h2&gt;
  
  
  DevOps Best Practices and Pitfalls
&lt;/h2&gt;

&lt;p&gt;A short list of things I wish I had known before I started using APM in anger.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pin with tags, not &lt;code&gt;main&lt;/code&gt;.&lt;/strong&gt; It is tempting to track a branch, but the whole point of the lockfile is that upgrades are deliberate. Use &lt;code&gt;#v1.0.0&lt;/code&gt; style refs and bump with &lt;code&gt;apm deps update&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit the deployed files.&lt;/strong&gt; If you do not commit &lt;code&gt;.github/&lt;/code&gt;, &lt;code&gt;.claude/&lt;/code&gt;, or &lt;code&gt;.cursor/&lt;/code&gt;, Copilot on github.com (and first-time clones before &lt;code&gt;apm install&lt;/code&gt;) will miss context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;devDependencies&lt;/code&gt; for authoring helpers.&lt;/strong&gt; When you are building a plugin with &lt;code&gt;apm init --plugin&lt;/code&gt;, anything you &lt;code&gt;apm install --dev&lt;/code&gt; is excluded from the shipped bundle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep MCP trust explicit.&lt;/strong&gt; Transitive MCP servers require &lt;code&gt;--trust-transitive-mcp&lt;/code&gt; to auto-register. That is a feature, not an annoyance: an &lt;code&gt;.agent.md&lt;/code&gt; you installed should not be allowed to silently bring a new MCP server into your editor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat APM deps like any other supply chain.&lt;/strong&gt; Review the upstream repo, pin to a commit SHA for critical deps, and run &lt;code&gt;apm audit&lt;/code&gt; in CI. The &lt;a href="https://awesome-copilot.github.com/" rel="noopener noreferrer"&gt;agent-supply-chain skill&lt;/a&gt; in awesome-copilot is a decent starting checklist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global installs have their place.&lt;/strong&gt; &lt;code&gt;apm install -g &amp;lt;pkg&amp;gt;&lt;/code&gt; deploys to &lt;code&gt;~/.copilot/&lt;/code&gt;, &lt;code&gt;~/.claude/&lt;/code&gt;, and friends, which is handy for personal utilities you want everywhere, without touching per-project manifests.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;APM finally gives AI agent configuration the same treatment we have long given our code: a manifest, a lockfile, transitive resolution, a marketplace, audit tooling, and CI integration. For DevOps and platform engineering teams, that is the difference between "my Copilot is faster than yours" and "our whole team benefits from the same curated agent stack, reproducibly, every time".&lt;/p&gt;

&lt;p&gt;Combine it with &lt;a href="https://awesome-copilot.github.com/" rel="noopener noreferrer"&gt;awesome-copilot&lt;/a&gt; and you get an instant on-ramp: hundreds of community-maintained plugins, skills, and agents you can pull into any project with one line of YAML.&lt;/p&gt;

&lt;p&gt;My suggested next steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the APM CLI and run &lt;code&gt;apm init&lt;/code&gt; in one of your repos.&lt;/li&gt;
&lt;li&gt;Add one plugin from awesome-copilot, for example &lt;code&gt;apm install devops-oncall@awesome-copilot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Commit &lt;code&gt;apm.yml&lt;/code&gt;, &lt;code&gt;apm.lock.yaml&lt;/code&gt;, and the deployed files, then wire up &lt;code&gt;microsoft/apm-action&lt;/code&gt; in CI.&lt;/li&gt;
&lt;li&gt;Once you are comfortable, package your own team standards under &lt;code&gt;.apm/&lt;/code&gt; and share them across repos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to dig deeper, the &lt;a href="https://microsoft.github.io/apm/" rel="noopener noreferrer"&gt;APM docs&lt;/a&gt;, the &lt;a href="https://microsoft.github.io/apm/reference/cli-commands/" rel="noopener noreferrer"&gt;CLI reference&lt;/a&gt;, and the &lt;a href="https://microsoft.github.io/apm/enterprise/security/" rel="noopener noreferrer"&gt;enterprise security guide&lt;/a&gt; are the three pages worth bookmarking.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 21-04-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>github</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>Steer GitHub Copilot CLI Sessions Remotely from Any Device</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Wed, 15 Apr 2026 14:27:00 +0000</pubDate>
      <link>https://dev.to/pwd9000/steer-github-copilot-cli-sessions-remotely-from-any-device-3mee</link>
      <guid>https://dev.to/pwd9000/steer-github-copilot-cli-sessions-remotely-from-any-device-3mee</guid>
      <description>&lt;h2&gt;
  
  
  Steer GitHub Copilot CLI Sessions Remotely from Any Device
&lt;/h2&gt;

&lt;p&gt;You kick off a complex refactoring task in Copilot CLI, then realise you need to leave your desk. Maybe it is time for lunch, a meeting just started, or you simply want to keep an eye on progress from your phone while you are on the couch. Until now, walking away from your terminal meant walking away from your session.&lt;/p&gt;

&lt;p&gt;That changed on 13 April 2026 when GitHub shipped &lt;strong&gt;remote access for Copilot CLI sessions&lt;/strong&gt; in public preview. You can now start a session on your workstation and pick it up, monitor it, and steer it from &lt;strong&gt;GitHub.com&lt;/strong&gt; or &lt;strong&gt;GitHub Mobile&lt;/strong&gt;, all in real time.&lt;/p&gt;

&lt;p&gt;If you have been following the &lt;a href="https://dev.to/pwd9000/series/38622"&gt;GitHub Copilot series&lt;/a&gt;, you will know we have covered the CLI in depth in the &lt;a href="https://dev.to/pwd9000/github-copilot-cli-a-devops-engineers-practical-guide-to-ai-powered-terminal-automation-1jh0"&gt;Copilot CLI Practical DevOps Guide&lt;/a&gt;. This post focuses entirely on the new remote access capability, how to enable it, what you can do with it, and how to make it work smoothly for everyday developer workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Copilot CLI Remote Access?
&lt;/h2&gt;

&lt;p&gt;In a nutshell, remote access lets you &lt;strong&gt;stream a running Copilot CLI session to GitHub&lt;/strong&gt; so you can interact with it from any browser or from the GitHub Mobile app.&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;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Public preview (April 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Available on&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub.com, GitHub Mobile (iOS beta via TestFlight, Android beta via Google Play)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who can use it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Copilot Individual, Business, and Enterprise users (policy must be enabled for org/enterprise seats)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session privacy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only the account that started the session can view or interact remotely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Output limit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;60 MB of session output streamed to the remote interface&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The local CLI session continues to run on your machine. Remote access simply gives you a window into that session from another device. All shell commands, file operations, and tool executions remain local.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you can use remote access, make sure you have the following in place.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Latest Copilot CLI version
&lt;/h3&gt;

&lt;p&gt;Make sure you are running the latest version of Copilot CLI. Inside an interactive session, use the &lt;code&gt;/update&lt;/code&gt; slash command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. A GitHub repository
&lt;/h3&gt;

&lt;p&gt;Your working directory must contain a Git repository hosted on &lt;strong&gt;GitHub.com&lt;/strong&gt;. If you try to enable remote access outside a GitHub repository, the CLI will display:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Remote session disabled: not in a GitHub repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Policy enabled (organisation and enterprise users)
&lt;/h3&gt;

&lt;p&gt;For users with a Copilot seat from an organisation, the &lt;strong&gt;Remote Control&lt;/strong&gt; policy must be enabled by an enterprise or organisation owner. This policy is &lt;strong&gt;off by default&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Individual Copilot subscribers (Pro, Pro+) can use remote access without any additional policy configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Organisation owners can enable the policy under:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Organisation Settings &amp;gt; Copilot &amp;gt; Policies &amp;gt; Remote Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For enterprise-level policy management, see the &lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-cli/administer-copilot-cli-for-your-enterprise" rel="noopener noreferrer"&gt;GitHub docs on administering Copilot CLI&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. An interactive session
&lt;/h3&gt;

&lt;p&gt;Remote access is only available for &lt;strong&gt;interactive sessions&lt;/strong&gt;. It is not available when you use the CLI programmatically with the &lt;code&gt;--prompt&lt;/code&gt; command-line option, for example when using the CLI in a script.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Machine must stay online
&lt;/h3&gt;

&lt;p&gt;The CLI session must be actively running on a machine with an internet connection. If the machine goes to sleep or loses connectivity, remote access is unavailable until it comes back online. We will cover how to handle this with the &lt;code&gt;/keep-alive&lt;/code&gt; command later in this post.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Enable Remote Access
&lt;/h2&gt;

&lt;p&gt;There are three ways to enable remote access, depending on your workflow preference.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option A: The /remote slash command (mid-session)
&lt;/h3&gt;

&lt;p&gt;Already in an interactive session? Simply type:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/remote
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The CLI connects to GitHub.com and displays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;URL&lt;/strong&gt; in the format &lt;code&gt;https://github.com/OWNER/REPO/tasks/TASK_ID&lt;/code&gt; that you can open in any browser.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;QR code&lt;/strong&gt; you can scan with your phone to jump straight into GitHub Mobile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxy82ensshqbwkvhrro0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxy82ensshqbwkvhrro0g.png" alt="Enabling remote access with the /remote command" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Option B: The --remote flag (at startup)
&lt;/h3&gt;

&lt;p&gt;If you know ahead of time that you want remote access, start your session with the flag:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Remote access details are displayed as soon as the interactive session starts. You can redisplay them at any time by typing &lt;code&gt;/remote&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option C: Always-on configuration
&lt;/h3&gt;

&lt;p&gt;If you always want remote access enabled, add this to your Copilot configuration file (typically &lt;code&gt;~/.copilot/config.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;"remoteSessions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;p&gt;Every interactive session will now start with remote access enabled automatically. To override for a specific session, use:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--no-remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; The command-line options &lt;code&gt;--remote&lt;/code&gt; and &lt;code&gt;--no-remote&lt;/code&gt; always take precedence over the &lt;code&gt;remoteSessions&lt;/code&gt; setting in the configuration file.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Accessing Your Session from GitHub.com
&lt;/h2&gt;

&lt;p&gt;Once remote access is enabled, you have two ways to reach the session on the web.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use the direct link
&lt;/h3&gt;

&lt;p&gt;The CLI displays a URL when remote access is enabled. Open it in any browser and sign in with the same GitHub account that started the session.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use the Copilot sidebar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;hamburger menu&lt;/strong&gt; (top-left corner) on GitHub.com.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Copilot&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Recent agent sessions&lt;/strong&gt;, find and click your CLI session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4nri08zuxlzjpmwqajv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4nri08zuxlzjpmwqajv.png" alt="Accessing a remote CLI session from GitHub.com" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The web interface shows the full session history in real time. You can scroll through output, read Copilot's responses, and interact exactly as you would in the terminal.&lt;/p&gt;


&lt;h2&gt;
  
  
  Accessing Your Session from GitHub Mobile
&lt;/h2&gt;

&lt;p&gt;Remote sessions also appear in the GitHub Mobile app. This is particularly useful for quick check-ins and approving permission requests while you are away from your desk.&lt;/p&gt;
&lt;h3&gt;
  
  
  Finding your session
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open GitHub Mobile.&lt;/li&gt;
&lt;li&gt;Tap the &lt;strong&gt;Copilot&lt;/strong&gt; button in the bottom-right corner.&lt;/li&gt;
&lt;li&gt;Your session appears under &lt;strong&gt;Agent sessions&lt;/strong&gt;. Tap it to open.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Using a QR code for quick access
&lt;/h3&gt;

&lt;p&gt;If you are at your terminal and want to quickly open the session on your phone:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Type &lt;code&gt;/remote&lt;/code&gt; in the CLI to redisplay the session details.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Ctrl+E&lt;/strong&gt; to toggle the QR code display.&lt;/li&gt;
&lt;li&gt;Scan the QR code with your phone's camera.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonyhpkbfdc1a3v3n4fc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonyhpkbfdc1a3v3n4fc7.png" alt="Scanning the QR code to open the session on mobile" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Mobile access is currently only available in the latest beta release of GitHub Mobile. Join via &lt;a href="https://testflight.apple.com/join/NLskzwi5" rel="noopener noreferrer"&gt;Apple TestFlight for iOS&lt;/a&gt; or &lt;a href="https://play.google.com/apps/testing/com.github.android" rel="noopener noreferrer"&gt;Google Play for Android&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What You Can Do Remotely
&lt;/h2&gt;

&lt;p&gt;The remote interface is not a read-only dashboard. It is a full steering wheel. Here is what you can do from GitHub.com or GitHub Mobile:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Respond to permission requests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Approve or deny tool, file path, and URL permission requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Answer questions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Respond when Copilot asks for more information or a decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Approve or reject plans&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Respond to plan approval prompts in plan mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Submit new prompts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Type new questions or instructions, just like in the terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Switch modes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Change between interactive, plan, and autopilot mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cancel work&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;End the agent's current operation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both the local terminal and the remote interface are active simultaneously. You can type in either, and Copilot uses whichever response arrives first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Slash commands such as &lt;code&gt;/allow-all&lt;/code&gt; are not currently available from the remote interface.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Keeping Your Machine Awake with /keep-alive
&lt;/h2&gt;

&lt;p&gt;One of the most practical additions alongside remote access is the &lt;code&gt;/keep-alive&lt;/code&gt; slash command. It prevents your machine from going to sleep while you are steering the session remotely.&lt;/p&gt;
&lt;h3&gt;
  
  
  Usage options
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keep-alive on&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prevents sleep while the CLI session is active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keep-alive off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Allows normal sleep behaviour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keep-alive busy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prevents sleep only while Copilot is actively working. Once the agent completes a task, the machine can sleep normally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keep-alive 30m&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prevents sleep for 30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keep-alive 8h&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prevents sleep for 8 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keep-alive 1d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Prevents sleep for 1 day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/keep-alive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Displays the current keep-alive status&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;busy&lt;/code&gt; option is particularly useful. It keeps the machine awake while Copilot is processing but lets it sleep once Copilot finishes and is waiting for input.&lt;/p&gt;


&lt;h2&gt;
  
  
  Reconnection and Resuming Sessions
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Temporary disconnections
&lt;/h3&gt;

&lt;p&gt;If the network drops temporarily, the remote interface reconnects automatically once connectivity is restored. The local session is completely unaffected by network interruptions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Resuming a closed session
&lt;/h3&gt;

&lt;p&gt;If you close a CLI session that had remote access enabled, the CLI displays a resume command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--resume&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SESSION_ID &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also resume the most recent session with:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--continue&lt;/span&gt; &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you have &lt;code&gt;"remoteSessions": true&lt;/code&gt; in your configuration file, you can omit the &lt;code&gt;--remote&lt;/code&gt; flag when resuming:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;--continue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; When you resume a session, you must re-enable remote access (either via the &lt;code&gt;--remote&lt;/code&gt; flag or the configuration file setting). Remote access does not persist automatically across session restarts.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  A Practical Walkthrough
&lt;/h2&gt;

&lt;p&gt;Here is a real-world scenario that demonstrates how remote access fits into a developer workflow.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Start a session with remote access
&lt;/h3&gt;

&lt;p&gt;You are at your workstation and want to refactor a Terraform module. Start the session with remote access:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/repos/my-infra
copilot &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The CLI displays the session URL and QR code.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Give Copilot the task
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Refactor the networking module to use for_each instead of count for subnet
creation. Update all references in the root module and ensure the plan shows
no destructive changes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot starts analysing the codebase and building a plan.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Leave your desk
&lt;/h3&gt;

&lt;p&gt;You have a meeting in five minutes. Before leaving, type:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/keep-alive busy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This ensures the machine stays awake while Copilot is working.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Monitor from your phone
&lt;/h3&gt;

&lt;p&gt;During the meeting, open GitHub Mobile and tap into your session. You can see Copilot's progress in real time. When it asks for plan approval, tap &lt;strong&gt;Approve&lt;/strong&gt; right from your phone.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: Steer from the browser
&lt;/h3&gt;

&lt;p&gt;Back at your desk (or from any computer), open the session link in a browser. Copilot has finished the refactoring and is asking whether to run &lt;code&gt;terraform plan&lt;/code&gt;. Type your approval in the web interface.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 6: Review the results
&lt;/h3&gt;

&lt;p&gt;Check the output in the web interface or switch back to your terminal. Both show the same session state.&lt;/p&gt;


&lt;h2&gt;
  
  
  Security and Privacy
&lt;/h2&gt;

&lt;p&gt;Remote access has been designed with security in mind. Here are the key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Session-specific URLs.&lt;/strong&gt; Each session gets a unique URL that only works for the authenticated user who started it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No direct machine access.&lt;/strong&gt; Remote access does not grant any access to your machine beyond what the CLI agent can do within the session. All operations run through the Copilot CLI's existing permission model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy controls.&lt;/strong&gt; Organisation and enterprise administrators can disable remote access entirely through the Remote Control policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events streamed, not stored.&lt;/strong&gt; Session events (messages, tool executions, permission requests) are streamed from your machine to GitHub for the remote interface. The CLI continues to run locally.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Tips and Best Practices
&lt;/h2&gt;

&lt;p&gt;Here are some practical tips for getting the most out of remote access.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;/keep-alive busy&lt;/code&gt; as your default.&lt;/strong&gt; It prevents your machine from sleeping while Copilot works, but lets it rest once the agent is idle. This is the best balance between availability and power consumption.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with &lt;code&gt;copilot --remote&lt;/code&gt; rather than adding it mid-session.&lt;/strong&gt; This ensures the session is remotely accessible from the very first prompt, so you never miss a permission request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set &lt;code&gt;remoteSessions: true&lt;/code&gt; in your config if you use this regularly.&lt;/strong&gt; It removes the need to remember the flag, and you can always override with &lt;code&gt;--no-remote&lt;/code&gt; for local-only sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bookmark the Copilot sidebar on GitHub.com.&lt;/strong&gt; Navigate to the Copilot page and bookmark it. This gives you one-click access to all your recent sessions without needing to remember URLs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use the QR code for mobile.&lt;/strong&gt; It is faster than searching for the session in the app, especially when you are in a hurry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be mindful of the 60 MB output limit.&lt;/strong&gt; Very long-running sessions that generate large amounts of output may see reduced performance in the remote interface. The local terminal remains unaffected.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Remote access for Copilot CLI sessions solves a genuine pain point. Long-running tasks no longer tie you to your terminal. You can start a complex refactoring, infrastructure deployment, or code review task, walk away, and continue steering it from your browser or phone.&lt;/p&gt;

&lt;p&gt;The feature is in public preview right now. Give it a try with &lt;code&gt;copilot --remote&lt;/code&gt; and see how it fits into your workflow. If you are an organisation or enterprise user, ask your admin to enable the &lt;strong&gt;Remote Control&lt;/strong&gt; policy so your team can start using it.&lt;/p&gt;

&lt;p&gt;For more details, check the official documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-remote-access" rel="noopener noreferrer"&gt;About remote access to Copilot CLI sessions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-cli/steer-remotely" rel="noopener noreferrer"&gt;Steering a Copilot CLI session from another device&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-04-13-remote-control-cli-sessions-on-web-and-mobile-in-public-preview" rel="noopener noreferrer"&gt;GitHub changelog announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 15-04-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Mastering Code Reviews with GitHub Copilot: The Definitive Guide</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Fri, 13 Mar 2026 09:46:56 +0000</pubDate>
      <link>https://dev.to/pwd9000/mastering-code-reviews-with-github-copilot-the-definitive-guide-3nfp</link>
      <guid>https://dev.to/pwd9000/mastering-code-reviews-with-github-copilot-the-definitive-guide-3nfp</guid>
      <description>&lt;h2&gt;
  
  
  Mastering Code Reviews with GitHub Copilot: The Definitive Guide
&lt;/h2&gt;

&lt;p&gt;Pull requests keep piling up. Your team reviews dozens a week, and each one needs careful attention to security, performance, style, and correctness. Human reviewers catch domain-specific issues that machines miss, but they also miss the mechanical things that machines are brilliant at, such as spotting unhandled edge cases, flagging deprecated API calls, or enforcing naming conventions across hundreds of files.&lt;/p&gt;

&lt;p&gt;What if you could get an AI-powered first pass on every pull request before a human even looks at it? Better still, what if that AI reviewer lived in your editor, your terminal, your GitHub.com workflow, and your custom automation, all at once?&lt;/p&gt;

&lt;p&gt;GitHub Copilot offers not one but &lt;strong&gt;eight distinct surfaces&lt;/strong&gt; for AI-assisted code review. This guide maps every one of them, shows you how to configure each for maximum value, and walks through a real end-to-end review workflow that combines several surfaces together.&lt;/p&gt;

&lt;p&gt;If you have been following the &lt;a href="https://dev.to/pwd9000/series/34048"&gt;GitHub Copilot series&lt;/a&gt;, you have already seen individual pieces of this puzzle across previous posts on &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-instructions-and-prompt-files-2p5e"&gt;custom instructions&lt;/a&gt;, &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-model-context-protocol-mcp-easy-setup-guide-371e"&gt;MCP&lt;/a&gt;, &lt;a href="https://dev.to/pwd9000/using-github-copilot-coding-agent-for-devops-automation-3f43"&gt;the coding agent&lt;/a&gt;, and the &lt;a href="https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l"&gt;customisation guide&lt;/a&gt;. This post brings everything together through the lens of code review.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 8 Surfaces of AI-Assisted Code Review
&lt;/h2&gt;

&lt;p&gt;Before we dive into each method, here is the landscape at a glance. Every surface serves a different context in your workflow.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Where It Runs&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Setup Required&lt;/th&gt;
&lt;th&gt;Automation Level&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GitHub.com Native Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Browser (github.com)&lt;/td&gt;
&lt;td&gt;PR reviews at scale&lt;/td&gt;
&lt;td&gt;Org/repo settings&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;VS Code Review Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Editor (VS Code)&lt;/td&gt;
&lt;td&gt;In-flight code review&lt;/td&gt;
&lt;td&gt;Settings toggle&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Custom Instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code + GitHub.com&lt;/td&gt;
&lt;td&gt;Team review standards&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.github/&lt;/code&gt; config files&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Prompt Files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Repeatable review workflows&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.prompt.md&lt;/code&gt; files&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Specialised review roles&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.agent.md&lt;/code&gt; files&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MCP-Powered PR Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Deep PR analysis with live context&lt;/td&gt;
&lt;td&gt;MCP server config&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Coding Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub Actions&lt;/td&gt;
&lt;td&gt;Fully automated review tasks&lt;/td&gt;
&lt;td&gt;Coding agent enabled&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Copilot CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Pre-commit local checks&lt;/td&gt;
&lt;td&gt;Copilot CLI installed&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rest of this guide walks through each surface in detail, then ties them together in a worked example.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. GitHub.com Native Copilot Code Review
&lt;/h2&gt;

&lt;p&gt;This is the highest-leverage surface for teams. Copilot acts as an automated reviewer directly on your pull requests in the browser, no editor or CLI needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to any pull request on github.com.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Reviewers&lt;/strong&gt; in the sidebar and select &lt;strong&gt;Copilot&lt;/strong&gt; from the reviewer list.&lt;/li&gt;
&lt;li&gt;Copilot analyses the diff and posts inline review comments, just like a human reviewer would.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can also configure Copilot to &lt;strong&gt;automatically review every PR&lt;/strong&gt; when it is opened or updated, so you never have to remember to request it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13fdh7tsphq95di363k7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F13fdh7tsphq95di363k7.png" alt="Selecting Copilot as a reviewer" width="360" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Feedback Looks Like
&lt;/h3&gt;

&lt;p&gt;Copilot's review comments appear inline on the PR diff. Each comment includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A description of the issue found.&lt;/li&gt;
&lt;li&gt;A suggested fix (where applicable) that you can accept with one click.&lt;/li&gt;
&lt;li&gt;Severity context so you can prioritise critical issues over style nits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comments cover categories such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bugs and logic errors&lt;/strong&gt; (off-by-one, null dereferences, race conditions).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security concerns&lt;/strong&gt; (injection risks, hardcoded secrets, missing input validation).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance issues&lt;/strong&gt; (unnecessary allocations, N+1 queries, blocking calls in async code).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best practice violations&lt;/strong&gt; (deprecated APIs, missing error handling, inconsistent patterns).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4oqmwmrdjk9uycppljy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq4oqmwmrdjk9uycppljy.png" alt="Copilot inline review comment with suggested fix" width="678" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Coding Guidelines
&lt;/h3&gt;

&lt;p&gt;By default, Copilot reviews against general best practices. To tailor feedback to your team's standards, create a &lt;strong&gt;coding guidelines file&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;.github/copilot-code-review-instructions.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This file contains natural language descriptions of your team's review standards. For example:&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="gu"&gt;## Security&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; All database queries must use parameterised queries, never string concatenation.
&lt;span class="p"&gt;-&lt;/span&gt; Secrets must be loaded from environment variables or a vault, never hardcoded.
&lt;span class="p"&gt;-&lt;/span&gt; All public endpoints must validate and sanitise input.

&lt;span class="gu"&gt;## Naming&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use PascalCase for public methods, camelCase for private methods.
&lt;span class="p"&gt;-&lt;/span&gt; Infrastructure resources must follow the pattern: {env}-{region}-{service}-{resource}.

&lt;span class="gu"&gt;## Testing&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Every public method must have at least one unit test.
&lt;span class="p"&gt;-&lt;/span&gt; Integration tests must clean up after themselves.

&lt;span class="gu"&gt;## Error Handling&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Never swallow exceptions silently. Log at minimum.
&lt;span class="p"&gt;-&lt;/span&gt; Use typed errors rather than generic Error objects.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When Copilot reviews a PR in your repository, it reads these guidelines and incorporates them into its analysis. This is how you move from generic AI feedback to feedback that matches your team's actual standards.&lt;/p&gt;
&lt;h3&gt;
  
  
  Enabling at Organisation and Repository Level
&lt;/h3&gt;

&lt;p&gt;Repository administrators can configure Copilot code review under &lt;strong&gt;Settings &amp;gt; Copilot &amp;gt; Code review&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enable/disable&lt;/strong&gt; Copilot as an available reviewer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-review&lt;/strong&gt;: Automatically request Copilot review on every new or updated PR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom coding guidelines&lt;/strong&gt;: Point to your &lt;code&gt;.github/copilot-code-review-instructions.md&lt;/code&gt; file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the &lt;strong&gt;organisation level&lt;/strong&gt;, administrators can enable or enforce code review settings across all repositories, ensuring consistent review coverage.&lt;/p&gt;
&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language support&lt;/strong&gt;: Copilot code review works best with widely-used languages (JavaScript, TypeScript, Python, Go, Java, C#, Ruby, etc.). Less common languages may receive less detailed feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context window&lt;/strong&gt;: Very large PRs may exceed the context window. Copilot reviews what it can and notes when it could not review all files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a replacement for human review&lt;/strong&gt;: Copilot catches mechanical issues brilliantly but does not understand your business domain. It is a first pass, not the final word.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; You can work around the language support limitation by pairing Copilot with an advanced reasoning model (such as &lt;code&gt;Claude Opus&lt;/code&gt; or &lt;code&gt;Gemini 3 Pro&lt;/code&gt; in extended thinking mode) or a custom agent that has access to online sources via MCP web tooling or Playwright. For example, create a &lt;code&gt;.agent.md&lt;/code&gt; reviewer that uses a web search tool to look up the latest best practices, idioms, or security advisories for a less common language. The agent can research real time strategies, verify its findings against up to date documentation, and cite the references it used so you can check them yourself. This is especially useful for newer frameworks or niche languages where the model's training data may be limited. See Section 5: Custom Agents and Section 6: MCP-Powered PR Review later in this guide for setup details.&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://docs.github.com/en/copilot/using-github-copilot/code-review/using-copilot-code-review" rel="noopener noreferrer"&gt;GitHub Copilot code review&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  2. VS Code Review Selection
&lt;/h2&gt;

&lt;p&gt;If GitHub.com native review is the "PR-level" surface, VS Code review selection is the "code-level" surface. It lets you review any block of code in the editor, at any time, not just when a PR is open.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to Trigger It
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Select code&lt;/strong&gt; in the editor (a function, a class, a block, whatever you want reviewed).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right-click&lt;/strong&gt; and choose &lt;strong&gt;Copilot &amp;gt; Review and Comment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Alternatively, open the Command Palette (&lt;code&gt;Ctrl+Shift+P&lt;/code&gt;) and run &lt;strong&gt;GitHub Copilot: Review and Comment&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Copilot analyses the selected code and posts its findings directly as editor comments, inline in your code.&lt;/p&gt;

&lt;p&gt;You can also trigger a review of all uncommitted changes directly from the &lt;strong&gt;Source Control&lt;/strong&gt; panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gmadpdv6ta68l35irsz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8gmadpdv6ta68l35irsz.png" alt="VS Code Source Control review button" width="498" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copilot posts its findings as inline comments with suggested changes that you can apply or discard with a single click.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1et1ogixr46a943ll23d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1et1ogixr46a943ll23d.png" alt="VS Code Copilot review comment with suggested change" width="720" height="283"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuring Review Instructions
&lt;/h3&gt;

&lt;p&gt;You can customise what Copilot looks for during VS Code reviews using two settings. These live in your VS Code &lt;code&gt;settings.json&lt;/code&gt; file. To open it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; (or &lt;code&gt;Cmd+Shift+P&lt;/code&gt; on macOS) and run &lt;strong&gt;Preferences: Open Settings (JSON)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For workspace-level settings shared with your team, create &lt;code&gt;.vscode/settings.json&lt;/code&gt; in your repository root.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add or update the following:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c1"&gt;// Enable the review selection feature&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.chat.reviewSelection.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// Define what Copilot should focus on during reviews&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"github.copilot.chat.reviewSelection.instructions"&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;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Check for security vulnerabilities including injection attacks, hardcoded secrets, and missing input validation."&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;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Flag any functions longer than 50 lines and suggest decomposition."&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;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verify error handling covers all failure paths."&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also point to an external file for review instructions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&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;"github.copilot.chat.reviewSelection.instructions"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;".github/review-instructions.md"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This keeps your review criteria version-controlled and consistent across the team.&lt;/p&gt;
&lt;h3&gt;
  
  
  When to Use This Surface
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;During development&lt;/strong&gt;: Review your own code before you even commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pair programming&lt;/strong&gt;: Get an instant second opinion on a tricky function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learning&lt;/strong&gt;: Understand unfamiliar code by asking Copilot to review and explain it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-PR polish&lt;/strong&gt;: Catch issues before they reach the formal review stage.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For a deeper dive into VS Code Copilot settings, see my earlier post: &lt;a href="https://dev.to/pwd9000/tune-github-copilot-settings-in-vs-code-32kp"&gt;Tune GitHub Copilot Settings in VS Code&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  3. Custom Instructions for Code Reviews
&lt;/h2&gt;

&lt;p&gt;Custom instructions shape how Copilot behaves across your workspace. For code review, they let you embed your team's review standards so that every interaction, whether in chat, inline completion, or review, reflects your agreed-upon practices.&lt;/p&gt;
&lt;h3&gt;
  
  
  Where to Define Review Instructions
&lt;/h3&gt;

&lt;p&gt;You have three options, each with a different scope:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Use When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every Copilot interaction&lt;/td&gt;
&lt;td&gt;You want review standards applied everywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.github/instructions/code-review.instructions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pattern-matched files&lt;/td&gt;
&lt;td&gt;You want review rules for specific file types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-agent workflows&lt;/td&gt;
&lt;td&gt;You use multiple AI tools, not just Copilot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Example: A Code Review Instructions File
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/instructions/code-review.instructions.md&lt;/code&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;applyTo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;**/*.{ts,js,py,go,cs}'&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Code Review Standards&lt;/span&gt;

When reviewing code, always check:

&lt;span class="gu"&gt;## Security&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; No hardcoded secrets, tokens, or connection strings.
&lt;span class="p"&gt;-&lt;/span&gt; All user input is validated and sanitised before use.
&lt;span class="p"&gt;-&lt;/span&gt; SQL queries use parameterised statements.
&lt;span class="p"&gt;-&lt;/span&gt; No sensitive data logged at INFO level or above.

&lt;span class="gu"&gt;## Reliability&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; All async operations have proper error handling.
&lt;span class="p"&gt;-&lt;/span&gt; Network calls include timeouts and retry logic.
&lt;span class="p"&gt;-&lt;/span&gt; Resource cleanup is handled in finally blocks or using statements.

&lt;span class="gu"&gt;## Maintainability&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Functions do one thing and are under 40 lines where practical.
&lt;span class="p"&gt;-&lt;/span&gt; Variable names are descriptive and follow project conventions.
&lt;span class="p"&gt;-&lt;/span&gt; No commented-out code left in place. Use version control instead.

&lt;span class="gu"&gt;## Performance&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; No unnecessary allocations in hot paths.
&lt;span class="p"&gt;-&lt;/span&gt; Database queries are indexed and avoid N+1 patterns.
&lt;span class="p"&gt;-&lt;/span&gt; Large collections use streaming or pagination rather than loading everything into memory.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;applyTo&lt;/code&gt; glob ensures these instructions activate whenever Copilot works with source code files, without cluttering interactions with documentation or configuration files.&lt;/p&gt;
&lt;h3&gt;
  
  
  How Instructions Shape Review Output
&lt;/h3&gt;

&lt;p&gt;When you use Copilot to review code, either via VS Code review selection, chat, or GitHub.com, it reads these instructions and adjusts its analysis accordingly. The instructions act as a persistent checklist that Copilot applies without you having to repeat it every time.&lt;/p&gt;

&lt;p&gt;This is the foundation layer. The other surfaces (prompt files, agents, MCP) build on top of it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a full walkthrough, see: &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-instructions-and-prompt-files-2p5e"&gt;Instructions and Prompt Files to supercharge VS Code with GitHub Copilot&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  4. Prompt Files for Structured Reviews
&lt;/h2&gt;

&lt;p&gt;While instructions define standards, prompt files create &lt;strong&gt;repeatable review workflows&lt;/strong&gt; that you invoke on demand. Think of them as named review commands.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating a Review Prompt File
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/prompts/security-review.prompt.md&lt;/code&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;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Run&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;security-focused&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;review&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;selected&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code'&lt;/span&gt;
&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ask'&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;githubRepo'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;codebase'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Perform a thorough security review of the current code. For each issue found, provide:
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Severity**&lt;/span&gt;: Critical / High / Medium / Low
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Location**&lt;/span&gt;: File and line reference
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Issue**&lt;/span&gt;: What the problem is
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Risk**&lt;/span&gt;: What could go wrong if left unfixed
&lt;span class="p"&gt;5.&lt;/span&gt; &lt;span class="gs"&gt;**Fix**&lt;/span&gt;: Specific code change to resolve it

Check for:
&lt;span class="p"&gt;
-&lt;/span&gt; Injection vulnerabilities (SQL, XSS, command injection)
&lt;span class="p"&gt;-&lt;/span&gt; Authentication and authorisation gaps
&lt;span class="p"&gt;-&lt;/span&gt; Hardcoded secrets or credentials
&lt;span class="p"&gt;-&lt;/span&gt; Missing input validation
&lt;span class="p"&gt;-&lt;/span&gt; Insecure cryptographic usage
&lt;span class="p"&gt;-&lt;/span&gt; Sensitive data exposure in logs or error messages
&lt;span class="p"&gt;-&lt;/span&gt; Missing rate limiting on public endpoints

Format output as a table sorted by severity.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Using It
&lt;/h3&gt;

&lt;p&gt;In VS Code chat, type &lt;code&gt;/security-review&lt;/code&gt; and Copilot runs the review following your exact template. The output is structured, consistent, and actionable every time.&lt;/p&gt;
&lt;h3&gt;
  
  
  More Review Prompt Ideas
&lt;/h3&gt;

&lt;p&gt;Here are additional prompt files you might create:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt File&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;performance-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Analyse code for performance bottlenecks, memory leaks, and scaling concerns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test-coverage-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identify untested code paths and suggest test cases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;accessibility-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check UI code for accessibility compliance (WCAG)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iac-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Review Terraform/Bicep for security, cost, and best practices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;api-review.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Review API endpoints for consistency, versioning, and documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each prompt file becomes a slash command in VS Code chat. Your team builds a library of review plays that anyone can run.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For more on prompt files, see: &lt;a href="https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l"&gt;GitHub Copilot Instructions vs Prompts vs Custom Agents vs Skills vs X vs WHY?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  5. Custom Agents for Code Reviews
&lt;/h2&gt;

&lt;p&gt;Custom agents take things further by creating a &lt;strong&gt;dedicated reviewer persona&lt;/strong&gt; with specific tool access and boundaries. Instead of a general-purpose assistant that also reviews code, you build a specialist.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why Use a Custom Agent for Reviews?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role clarity&lt;/strong&gt;: The agent only reviews. It does not generate new code, refactor, or make changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool restrictions&lt;/strong&gt;: You can limit the agent to read-only tools so it cannot accidentally modify files during review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent voice&lt;/strong&gt;: The agent's system prompt defines its review personality, checklist, and output format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team alignment&lt;/strong&gt;: Everyone uses the same reviewer agent, so feedback is consistent regardless of who runs it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Example: Security Review Agent
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/agents/security-reviewer.agent.md&lt;/code&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;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;security-focused&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reviewer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;that&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;analyses&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;vulnerabilities&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;compliance&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues'&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;codebase'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;fetch'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;githubRepo'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You are a senior security engineer performing code review. Your role is strictly read-only. You analyse code but never modify it.

&lt;span class="gu"&gt;## Review Process&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Examine the code provided or referenced in the conversation.
&lt;span class="p"&gt;2.&lt;/span&gt; Check against the OWASP Top 10, CWE Top 25, and project-specific security policies.
&lt;span class="p"&gt;3.&lt;/span&gt; For each finding, provide severity, location, description, risk, and remediation guidance.

&lt;span class="gu"&gt;## Output Format&lt;/span&gt;

Present findings in a structured report:

&lt;span class="gu"&gt;### Summary&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Total issues found: X
&lt;span class="p"&gt;-&lt;/span&gt; Critical: X | High: X | Medium: X | Low: X

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

For each finding:
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**ID**&lt;/span&gt;: SEC-001
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Severity**&lt;/span&gt;: Critical/High/Medium/Low
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Category**&lt;/span&gt;: (e.g., Injection, Auth, Crypto)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Location**&lt;/span&gt;: File and line
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Description**&lt;/span&gt;: What the issue is
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Risk**&lt;/span&gt;: Impact if exploited
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Remediation**&lt;/span&gt;: How to fix it

&lt;span class="gu"&gt;## Rules&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Never suggest "it looks fine" without evidence of thorough checking.
&lt;span class="p"&gt;-&lt;/span&gt; Always check for hardcoded secrets, even in test files.
&lt;span class="p"&gt;-&lt;/span&gt; Flag any use of deprecated cryptographic algorithms.
&lt;span class="p"&gt;-&lt;/span&gt; If you cannot determine security posture from the available context, say so explicitly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Using It
&lt;/h3&gt;

&lt;p&gt;Switch to the &lt;code&gt;security-reviewer&lt;/code&gt; agent in VS Code chat. Everything you ask is filtered through the security reviewer's lens. Ask it to review a file, a diff, or a PR, and you get structured security feedback every time.&lt;/p&gt;

&lt;p&gt;You can create different review agents for different concerns: &lt;code&gt;architecture-reviewer.agent.md&lt;/code&gt;, &lt;code&gt;performance-reviewer.agent.md&lt;/code&gt;, &lt;code&gt;accessibility-reviewer.agent.md&lt;/code&gt;, each with its own checklist and tool set.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a deeper look at custom agents: &lt;a href="https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l"&gt;GitHub Copilot Instructions vs Prompts vs Custom Agents vs Skills vs X vs WHY?&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  6. MCP-Powered PR Reviews
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://docs.github.com/en/copilot/customizing-copilot/using-model-context-protocol" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; lets Copilot connect to external tools and data sources. For code review, the GitHub MCP server is the key enabler. It gives Copilot live access to pull request data: diffs, comments, linked issues, CI status, and more.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting Up the GitHub MCP Server
&lt;/h3&gt;

&lt;p&gt;If you followed my earlier post on &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-model-context-protocol-mcp-easy-setup-guide-371e"&gt;MCP setup&lt;/a&gt;, you already have this configured. The GitHub MCP server provides tools such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_pull_request&lt;/code&gt; to fetch PR metadata and description.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_pull_request_diff&lt;/code&gt; to retrieve the actual code changes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_pull_request_comments&lt;/code&gt; to see existing review feedback.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_issue&lt;/code&gt; to pull in linked issue context.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list_pull_request_files&lt;/code&gt; to see which files changed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_pull_request_review_comment&lt;/code&gt; to post review comments back.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Review Workflow with MCP
&lt;/h3&gt;

&lt;p&gt;Here is how you can run a PR review entirely from VS Code chat using MCP:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Fetch the PR context&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;Look at PR #42 in my repository. Fetch the diff, the PR description, and any linked issues.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot uses the MCP tools to pull all the context it needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Analyse the changes&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;Review the changes in PR #42 for security issues, bug risks, and adherence to our coding standards.
Cross-reference with the linked issue to ensure all requirements are addressed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 3: Post feedback&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;Post your review findings as inline comments on PR #42, grouped by severity.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot can post review comments directly on the PR via MCP, so the feedback appears on github.com where the rest of the team can see it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why MCP Changes the Game
&lt;/h3&gt;

&lt;p&gt;Without MCP, Copilot in VS Code only sees the files open in your editor. With MCP, it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull in the full PR diff, even files you have not opened.&lt;/li&gt;
&lt;li&gt;Read existing review comments so it does not duplicate feedback.&lt;/li&gt;
&lt;li&gt;Check CI status to correlate test failures with code changes.&lt;/li&gt;
&lt;li&gt;Follow linked issues to understand the intent behind the changes.&lt;/li&gt;
&lt;li&gt;Post comments back to the PR so everything stays in one place.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns VS Code chat into a full PR review workstation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For MCP setup details, see: &lt;a href="https://dev.to/pwd9000/supercharge-vscode-github-copilot-using-model-context-protocol-mcp-easy-setup-guide-371e"&gt;Supercharge VSCode GitHub Copilot using MCP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  7. Coding Agent for Automated Reviews
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent" rel="noopener noreferrer"&gt;GitHub Copilot coding agent&lt;/a&gt; is an autonomous AI that runs in a GitHub Actions environment. While it is primarily designed for coding tasks, you can use it for review-adjacent automation.&lt;/p&gt;
&lt;h3&gt;
  
  
  How It Applies to Code Review
&lt;/h3&gt;

&lt;p&gt;The coding agent works through GitHub Issues. You describe a task, assign it to Copilot, and it opens a PR with the result. For review workflows, consider these patterns:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 1: Fix issues found in review&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;Title: Address review feedback on PR #42

Review the comments on PR #42 and implement the requested changes:
- Fix the SQL injection vulnerability in UserService.cs
- Add input validation to the CreateUser endpoint
- Add unit tests for the new validation logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Assign this issue to Copilot, and it will create a new PR addressing the review feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern 2: Review-driven refactoring&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;Title: Refactor authentication module per review guidelines

The authentication module in src/auth/ has accumulated technical debt.
Apply our coding standards from .github/copilot-code-review-instructions.md:
- Extract duplicated validation logic into shared utilities
- Add proper error handling to all OAuth flows
- Ensure all endpoints validate JWT tokens consistently
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pattern 3: Pre-review preparation&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;Title: Add missing tests before review

Before PR #42 is reviewed, ensure:
- All new public methods have unit tests
- Integration tests cover the new API endpoints
- Test coverage for the changed files is above 80%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The coding agent handles the mechanical work so that human reviewers can focus on design decisions and domain logic.&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Considerations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The coding agent cannot approve or merge PRs. It always produces a PR for human review.&lt;/li&gt;
&lt;li&gt;Every PR it creates is scanned by CodeQL and secret scanning.&lt;/li&gt;
&lt;li&gt;It runs in an isolated container, so it cannot affect your production environment.&lt;/li&gt;
&lt;li&gt;One task, one PR. Complex reviews may need to be broken into separate issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For full setup and use cases, see: &lt;a href="https://dev.to/pwd9000/using-github-copilot-coding-agent-for-devops-automation-3f43"&gt;Using GitHub Copilot Coding Agent for DevOps Automation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  8. Copilot CLI for Local Reviews
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt; is a standalone terminal agent that replaces the retired &lt;code&gt;gh copilot&lt;/code&gt; extension. You invoke it with the &lt;code&gt;copilot&lt;/code&gt; command. It can read files, run shell commands, and interact with GitHub, making it ideal for reviewing changes before you commit or push.&lt;/p&gt;
&lt;h3&gt;
  
  
  Quick Local Review
&lt;/h3&gt;

&lt;p&gt;Start an interactive session and ask Copilot to review your staged changes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then type your review prompt:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review my staged changes for bugs, security issues, and style problems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or use the programmatic interface for a one-shot review:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review my staged changes for bugs, security issues, and style problems"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(git)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Targeted Reviews
&lt;/h3&gt;

&lt;p&gt;Review a specific file:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review src/auth/login.ts for security vulnerabilities"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(cat)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Review changes between branches:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review the changes between main and feature/auth-refactor, focusing on authentication security"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(git)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Check the changes in a pull request directly from the terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Check the changes made in PR #42. Report any serious errors you find"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(gh)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use CLI Reviews
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pre-commit check&lt;/strong&gt;: Catch issues before they enter version control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick sanity check&lt;/strong&gt;: Get a fast opinion on a small change without opening an editor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI integration&lt;/strong&gt;: Add a review step to your pipeline that flags issues early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote work&lt;/strong&gt;: Review code on a server where you only have terminal access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CLI is a full agentic experience. It can read your codebase, run shell commands, and even create pull requests. For review purposes, use &lt;code&gt;--allow-tool='shell(git)'&lt;/code&gt; to give it read access to your Git history without granting broader permissions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For CLI setup and more examples, see: &lt;a href="https://dev.to/pwd9000/github-copilot-cli-a-devops-engineers-practical-guide-to-ai-powered-terminal-automation-1jh0"&gt;GitHub Copilot CLI: A DevOps Engineer's Practical Guide&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  The Comparison Cheat Sheet
&lt;/h2&gt;

&lt;p&gt;Use this table to pick the right review surface for your situation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Setup Effort&lt;/th&gt;
&lt;th&gt;Automation&lt;/th&gt;
&lt;th&gt;Team Visibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub.com Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Browser&lt;/td&gt;
&lt;td&gt;PR reviews at scale&lt;/td&gt;
&lt;td&gt;Low (org setting)&lt;/td&gt;
&lt;td&gt;High (auto-review)&lt;/td&gt;
&lt;td&gt;High (comments on PR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VS Code Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Editor&lt;/td&gt;
&lt;td&gt;In-flight code&lt;/td&gt;
&lt;td&gt;Minimal (built-in)&lt;/td&gt;
&lt;td&gt;Manual trigger&lt;/td&gt;
&lt;td&gt;Low (local only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Team standards&lt;/td&gt;
&lt;td&gt;Low (one file)&lt;/td&gt;
&lt;td&gt;Passive (always-on)&lt;/td&gt;
&lt;td&gt;Medium (shared via repo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt Files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Repeatable plays&lt;/td&gt;
&lt;td&gt;Low (per prompt)&lt;/td&gt;
&lt;td&gt;On-demand&lt;/td&gt;
&lt;td&gt;Medium (shared via repo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Specialised roles&lt;/td&gt;
&lt;td&gt;Medium (agent config)&lt;/td&gt;
&lt;td&gt;On-demand&lt;/td&gt;
&lt;td&gt;Medium (shared via repo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP PR Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Deep PR analysis&lt;/td&gt;
&lt;td&gt;Medium (server setup)&lt;/td&gt;
&lt;td&gt;On-demand&lt;/td&gt;
&lt;td&gt;High (can post to PR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coding Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;Automated fixes&lt;/td&gt;
&lt;td&gt;Low (already enabled)&lt;/td&gt;
&lt;td&gt;High (issue-driven)&lt;/td&gt;
&lt;td&gt;High (creates PRs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copilot CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terminal&lt;/td&gt;
&lt;td&gt;Pre-commit checks&lt;/td&gt;
&lt;td&gt;Low (install &lt;code&gt;copilot&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Manual/scriptable&lt;/td&gt;
&lt;td&gt;Low (local only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Choosing Your Starting Point
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Team just getting started?&lt;/strong&gt; Enable GitHub.com native review. It requires no editor changes and covers every PR automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Individual developer wanting better habits?&lt;/strong&gt; Start with VS Code review selection. It is built in and instant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team with established coding standards?&lt;/strong&gt; Add custom instructions. Your standards become Copilot's standards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mature team wanting structured workflows?&lt;/strong&gt; Build prompt files and agents. Create a library of review plays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dealing with complex PRs and cross-references?&lt;/strong&gt; Set up MCP. Live context makes reviews dramatically better.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Worked Example: End-to-End PR Review
&lt;/h2&gt;

&lt;p&gt;Let us walk through a realistic review workflow that combines multiple surfaces. Imagine you have a teammate's PR that adds a new user registration endpoint with database access and email notifications.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Pre-Push Local Check (CLI)
&lt;/h3&gt;

&lt;p&gt;Before the PR even exists, the developer reviews their own changes locally:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;copilot &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Review my staged changes for security issues, particularly around user input handling and database access"&lt;/span&gt; &lt;span class="nt"&gt;--allow-tool&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'shell(git)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot flags that the email field is not validated and the SQL query uses string interpolation. The developer fixes both before pushing.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: PR Created, Copilot Auto-Reviews (GitHub.com)
&lt;/h3&gt;

&lt;p&gt;The developer pushes and creates a PR. Copilot automatically reviews it (auto-review is enabled) and posts inline comments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High&lt;/strong&gt;: Missing rate limiting on the registration endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium&lt;/strong&gt;: The error response leaks internal database column names.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low&lt;/strong&gt;: Variable &lt;code&gt;usr&lt;/code&gt; should be &lt;code&gt;user&lt;/code&gt; per naming conventions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The team's &lt;code&gt;.github/copilot-code-review-instructions.md&lt;/code&gt; includes rate limiting and error handling standards, so Copilot catches these against the team's own rules.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Deep Dive in VS Code (Review Selection + MCP)
&lt;/h3&gt;

&lt;p&gt;You open the PR branch in VS Code. You select the registration handler function and use &lt;strong&gt;Copilot &amp;gt; Review and Comment&lt;/strong&gt; for a focused analysis.&lt;/p&gt;

&lt;p&gt;Then you use MCP to pull in broader context:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fetch PR #87, including the diff, linked issue #156, and any existing review comments.
Review the entire PR for security compliance. Consider the requirements in issue #156
and check that all acceptance criteria are met.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copilot correlates the PR changes with the issue requirements and identifies that one acceptance criterion (email verification flow) is missing from the implementation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Structured Security Review (Prompt File)
&lt;/h3&gt;

&lt;p&gt;You run &lt;code&gt;/security-review&lt;/code&gt; in VS Code chat. The prompt file produces a structured table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;&lt;code&gt;register.ts:45&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No rate limiting&lt;/td&gt;
&lt;td&gt;Add express-rate-limit middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;&lt;code&gt;register.ts:62&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SQL string interpolation&lt;/td&gt;
&lt;td&gt;Use parameterised query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;&lt;code&gt;register.ts:78&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error leaks DB schema&lt;/td&gt;
&lt;td&gt;Return generic error message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;&lt;code&gt;email.ts:12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SMTP credentials in env check&lt;/td&gt;
&lt;td&gt;Add startup validation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Step 5: Automated Fix (Coding Agent)
&lt;/h3&gt;

&lt;p&gt;For the mechanical fixes, you create a GitHub Issue:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Title: Address security review findings on PR #87

Fix the following issues found during code review:
1. Add rate limiting middleware to POST /api/register (max 5 requests per minute per IP)
2. Convert SQL query on line 62 to use parameterised statements
3. Replace detailed error responses with generic messages
4. Add SMTP credential validation at startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The coding agent picks up the issue, implements the fixes, and opens a follow-up PR.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 6: Human Review
&lt;/h3&gt;

&lt;p&gt;With the mechanical issues resolved, the human reviewer focuses on what matters most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the registration flow make business sense?&lt;/li&gt;
&lt;li&gt;Is the email notification content appropriate?&lt;/li&gt;
&lt;li&gt;Does the database schema support future requirements?&lt;/li&gt;
&lt;li&gt;Are the architectural decisions sound?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI handled the mechanical first pass. The human focuses on design, domain, and judgement.&lt;/p&gt;


&lt;h2&gt;
  
  
  Tips and Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Layer your review surfaces.&lt;/strong&gt; No single surface catches everything. Use GitHub.com auto-review as your always-on baseline, prompt files for structured deep dives, and MCP for complex PRs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write clear review instructions.&lt;/strong&gt; Whether in &lt;code&gt;.github/copilot-code-review-instructions.md&lt;/code&gt;, VS Code settings, or agent definitions, specific instructions produce specific feedback. "Check for security issues" is vague. "Ensure all user input is sanitised, all queries are parameterised, and no secrets are hardcoded" is actionable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Treat AI review as a first pass, not the final word.&lt;/strong&gt; Copilot is exceptional at catching mechanical issues (bugs, security patterns, style violations) but does not understand your business domain. Human reviewers should always have the last say on design, architecture, and domain logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep review instructions version-controlled.&lt;/strong&gt; Store them in &lt;code&gt;.github/&lt;/code&gt; so they evolve with your codebase and are reviewed like any other code change.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start small, expand gradually.&lt;/strong&gt; Enable GitHub.com auto-review today. Add custom instructions next week. Build your first prompt file next month. You do not need all eight surfaces on day one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use different agents for different review concerns.&lt;/strong&gt; A security review agent should not worry about variable naming. A style review agent should not flag architectural choices. Specialised agents give focused, high-quality feedback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Combine MCP with prompt files for maximum context.&lt;/strong&gt; A prompt file defines the review structure. MCP provides the live data (PR diff, comments, issues). Together, they produce the most thorough reviews.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Review the reviewer.&lt;/strong&gt; Periodically check Copilot's review output against your team's actual standards. If it is flagging too many false positives or missing real issues, update your instructions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Code review is one of the highest-value activities in software engineering, and also one of the most time-consuming. GitHub Copilot provides eight distinct surfaces for AI-assisted review, each suited to a different moment in your workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub.com&lt;/strong&gt; catches issues at the PR level, automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt; catches issues at the code level, on demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom instructions&lt;/strong&gt; make your team's standards automatic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt files&lt;/strong&gt; turn review workflows into repeatable commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom agents&lt;/strong&gt; create dedicated reviewer personas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; connects reviews to live PR data and project context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The coding agent&lt;/strong&gt; automates fixes for review findings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The CLI&lt;/strong&gt; enables fast local checks before code leaves your machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real power comes from combining them. Start with GitHub.com auto-review as your baseline, layer on custom instructions for your team's standards, and add prompt files and agents as your review workflows mature.&lt;/p&gt;

&lt;p&gt;Your reviewers will thank you. Your codebase will thank you. And the bugs that never make it to production? They will never know what hit them.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 13-03-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Evaluating LLM Models in GitHub Copilot. A Practical Scoring and Assessment Guide</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Fri, 06 Mar 2026 18:12:20 +0000</pubDate>
      <link>https://dev.to/pwd9000/evaluating-llm-models-in-github-copilot-a-practical-scoring-and-assessment-guide-1f23</link>
      <guid>https://dev.to/pwd9000/evaluating-llm-models-in-github-copilot-a-practical-scoring-and-assessment-guide-1f23</guid>
      <description>&lt;h2&gt;
  
  
  Evaluating LLM Models in GitHub Copilot. A Practical Scoring and Assessment Guide
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot gives us access to a fast-moving set of LLMs from multiple providers. That is great for innovation, but it also creates a practical problem for teams. Which model should you use for a specific task, and how do you justify that decision with evidence instead of gut feel?&lt;/p&gt;

&lt;p&gt;This guide is a practical framework you can use with your own network and team. We will cover how model evaluation works, how to build your own scoring approach, and how to run repeatable comparisons so you can choose models with confidence as new releases arrive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Model Evaluation Matters
&lt;/h2&gt;

&lt;p&gt;Choosing a model is no longer a one-time decision.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Models are specialised&lt;/strong&gt;: some are better for fast lightweight tasks, others for deeper reasoning and debugging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost matters&lt;/strong&gt;: different models have different premium request multipliers in Copilot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model catalogues change frequently&lt;/strong&gt;: new models are added, and older ones are retired.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams need consistency&lt;/strong&gt;: shared evaluation criteria helps avoid random model switching and uneven output quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you do not evaluate, you usually optimise for what feels fastest in the moment. That often creates hidden costs later in rework, review cycles, and reliability issues.&lt;/p&gt;




&lt;h2&gt;
  
  
  Models Available in GitHub Copilot Today
&lt;/h2&gt;

&lt;p&gt;GitHub maintains a live reference of supported AI models. The most important point is this. Treat the docs as the source of truth because availability can vary by client, plan, and release cycle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported models: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/supported-models" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/supported-models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Model comparison: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/model-comparison" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/model-comparison&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the time of writing, Copilot includes models from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; (for example GPT family and Codex variants)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic&lt;/strong&gt; (Claude family)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google&lt;/strong&gt; (Gemini family)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;xAI&lt;/strong&gt; (for example Grok Code Fast 1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copilot-tuned options&lt;/strong&gt; in preview&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A practical way to think about model choice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast/simple tasks&lt;/strong&gt;: quick syntax help, small edits, repetitive transformations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General coding/writing&lt;/strong&gt;: day-to-day coding, docs, refactoring support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep reasoning/debugging&lt;/strong&gt;: multi-step investigations, architecture-level decisions, complex defect analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic workflows&lt;/strong&gt;: long-running coding tasks in chat/agent modes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto model selection&lt;/strong&gt; is available in supported IDE chat experiences, and can choose a model automatically.&lt;/li&gt;
&lt;li&gt;You can still &lt;strong&gt;override manually&lt;/strong&gt; when you have evidence from your own evaluation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How LLMs Are Evaluated in Industry
&lt;/h2&gt;

&lt;p&gt;Public benchmark scores are useful signals, but they are not the whole story.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Benchmark Families
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MMLU&lt;/td&gt;
&lt;td&gt;Broad knowledge and reasoning&lt;/td&gt;
&lt;td&gt;General model capability checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval / MBPP&lt;/td&gt;
&lt;td&gt;Code generation correctness&lt;/td&gt;
&lt;td&gt;Coding assistant comparisons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SWE-bench&lt;/td&gt;
&lt;td&gt;Real software issue resolution&lt;/td&gt;
&lt;td&gt;Engineering task realism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM8K / MATH&lt;/td&gt;
&lt;td&gt;Mathematical reasoning&lt;/td&gt;
&lt;td&gt;Structured reasoning quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARC / HellaSwag&lt;/td&gt;
&lt;td&gt;Commonsense and reasoning&lt;/td&gt;
&lt;td&gt;General reasoning robustness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TruthfulQA&lt;/td&gt;
&lt;td&gt;Truthfulness and hallucination tendency&lt;/td&gt;
&lt;td&gt;Reliability risk checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MT-Bench / Arena-style pairwise&lt;/td&gt;
&lt;td&gt;Conversational quality and preference&lt;/td&gt;
&lt;td&gt;Human preference alignment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Useful references:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MMLU paper: &lt;a href="https://arxiv.org/abs/2009.03300" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2009.03300&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;HumanEval repo: &lt;a href="https://github.com/openai/human-eval" rel="noopener noreferrer"&gt;https://github.com/openai/human-eval&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SWE-bench: &lt;a href="https://www.swebench.com/" rel="noopener noreferrer"&gt;https://www.swebench.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chatbot Arena: &lt;a href="https://lmarena.ai/" rel="noopener noreferrer"&gt;https://lmarena.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hugging Face leaderboard: &lt;a href="https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/open-llm-leaderboard/open_llm_leaderboard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Benchmarks Alone Are Not Enough
&lt;/h3&gt;

&lt;p&gt;Benchmarks can miss your local context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your coding standards&lt;/li&gt;
&lt;li&gt;your cloud/platform stack&lt;/li&gt;
&lt;li&gt;your repo structure&lt;/li&gt;
&lt;li&gt;your incident patterns&lt;/li&gt;
&lt;li&gt;your definition of acceptable risk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A model can rank highly and still underperform on your real workloads. That is why self-assessment is essential.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Evaluation Framework You Can Run Yourself
&lt;/h2&gt;

&lt;p&gt;Use a lightweight internal framework you can rerun monthly or quarterly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define Evaluation Scenarios
&lt;/h3&gt;

&lt;p&gt;Create 10 to 20 prompts based on real work. Keep them representative and repeatable.&lt;/p&gt;

&lt;p&gt;Examples for DevOps/platform teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix a failing GitHub Actions workflow from logs&lt;/li&gt;
&lt;li&gt;Refactor a Terraform module and preserve backwards compatibility&lt;/li&gt;
&lt;li&gt;Generate tests for a PowerShell script with edge cases&lt;/li&gt;
&lt;li&gt;Write an incident summary from deployment telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Define a Scoring Rubric
&lt;/h3&gt;

&lt;p&gt;Score each response against the same dimensions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;1 (Poor)&lt;/th&gt;
&lt;th&gt;3 (Acceptable)&lt;/th&gt;
&lt;th&gt;5 (Excellent)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Correctness&lt;/td&gt;
&lt;td&gt;Wrong or unusable output&lt;/td&gt;
&lt;td&gt;Works with fixes&lt;/td&gt;
&lt;td&gt;Works first time, production-ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning quality&lt;/td&gt;
&lt;td&gt;No clear logic&lt;/td&gt;
&lt;td&gt;Basic explanation&lt;/td&gt;
&lt;td&gt;Clear reasoning with trade-offs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instruction adherence&lt;/td&gt;
&lt;td&gt;Misses key constraints&lt;/td&gt;
&lt;td&gt;Follows most constraints&lt;/td&gt;
&lt;td&gt;Follows all constraints precisely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security and safety&lt;/td&gt;
&lt;td&gt;Introduces risky patterns&lt;/td&gt;
&lt;td&gt;Neutral/safe enough&lt;/td&gt;
&lt;td&gt;Proactively applies safer patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintainability&lt;/td&gt;
&lt;td&gt;Hard to read/operate&lt;/td&gt;
&lt;td&gt;Adequate quality&lt;/td&gt;
&lt;td&gt;Clear, testable, maintainable output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency usefulness&lt;/td&gt;
&lt;td&gt;Too slow for value&lt;/td&gt;
&lt;td&gt;Acceptable speed&lt;/td&gt;
&lt;td&gt;Fast with strong quality&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3: Run Blind Comparisons
&lt;/h3&gt;

&lt;p&gt;Do not show model names to reviewers during scoring.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the same prompt set for each model.&lt;/li&gt;
&lt;li&gt;Randomise response order.&lt;/li&gt;
&lt;li&gt;Have at least two reviewers score each output.&lt;/li&gt;
&lt;li&gt;Average the scores to reduce individual bias.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Add Cost-Performance Scoring
&lt;/h3&gt;

&lt;p&gt;Quality alone is not enough to pick a model. A model that scores slightly higher but costs several times more per request may not be worth it for everyday tasks. Adding a cost dimension keeps your evaluation grounded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where to find cost data.&lt;/strong&gt; GitHub publishes premium request multipliers for each model in the Copilot docs. These multipliers tell you how many premium requests a single interaction with that model consumes relative to the baseline. Use this as your cost proxy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Premium request costs: &lt;a href="https://docs.github.com/en/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Calculate a value score.&lt;/strong&gt; Divide your average quality score by the model's premium multiplier:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Value Score = Average Quality Score / Premium Multiplier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worked example.&lt;/strong&gt; Suppose three models score as follows after your blind evaluation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Avg quality (1-5)&lt;/th&gt;
&lt;th&gt;Premium multiplier&lt;/th&gt;
&lt;th&gt;Value score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model A&lt;/td&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;td&gt;1x&lt;/td&gt;
&lt;td&gt;4.4 / 1 = &lt;strong&gt;4.4&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model B&lt;/td&gt;
&lt;td&gt;4.7&lt;/td&gt;
&lt;td&gt;3x&lt;/td&gt;
&lt;td&gt;4.7 / 3 = &lt;strong&gt;1.57&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model C&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;0.33x&lt;/td&gt;
&lt;td&gt;4.1 / 0.33 = &lt;strong&gt;12.42&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Model B scores highest on raw quality, but its value score is the lowest because each request costs three times the baseline. Model C delivers almost the same quality at a fraction of the cost, making it the best value pick for lightweight tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to ignore the value score.&lt;/strong&gt; Cost efficiency matters most for high-volume, routine tasks. For critical debugging or architecture decisions where correctness has outsized impact, pick the highest quality model regardless of cost. Use the value score as a guide, not a rule.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Ways to Run Your Own Evaluation
&lt;/h2&gt;

&lt;p&gt;There are several free approaches you can use depending on your team size and automation needs. Here are two that work well with GitHub Copilot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A: Manual Side-by-Side Comparison in Copilot Chat
&lt;/h3&gt;

&lt;p&gt;The simplest method is to use GitHub Copilot Chat directly. No extra tooling required.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Copilot Chat in VS Code and select your first model.&lt;/li&gt;
&lt;li&gt;Run a prompt from your evaluation set and capture the response.&lt;/li&gt;
&lt;li&gt;Switch to the next model using the model picker and run the same prompt.&lt;/li&gt;
&lt;li&gt;Score each response using your rubric and record the results.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A simple markdown table works well for tracking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Prompt | Model A | Model B | Model C | Notes |
| --- | --- | --- | --- | --- |
| Fix failing workflow | 4 | 5 | 3 | B caught root cause immediately |
| Refactor Terraform | 3 | 4 | 4 | A missed a variable dependency |
| Generate Pester tests | 5 | 4 | 3 | A covered more edge cases |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This approach works best for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individual contributors evaluating models for their own workflow.&lt;/li&gt;
&lt;li&gt;Small teams running a quick monthly check.&lt;/li&gt;
&lt;li&gt;Getting started before investing in automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tips for a fair manual comparison:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the exact same prompt text for each model.&lt;/li&gt;
&lt;li&gt;Do not reveal the model name to the scorer if more than one person is reviewing.&lt;/li&gt;
&lt;li&gt;Record latency (how long you waited) alongside quality scores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Option B: Automated Evaluation with DeepEval
&lt;/h3&gt;

&lt;p&gt;If you want repeatable, scriptable evaluation that integrates with CI/CD, DeepEval is a practical open-source choice. It uses pytest-style test cases and supports custom scoring criteria via an LLM-as-a-judge approach.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://deepeval.com/" rel="noopener noreferrer"&gt;https://deepeval.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/confident-ai/deepeval" rel="noopener noreferrer"&gt;https://github.com/confident-ai/deepeval&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  1. Install
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; deepeval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  2. Create a test file
&lt;/h4&gt;

&lt;p&gt;Create &lt;code&gt;test_copilot_eval.py&lt;/code&gt; with test cases that match your evaluation scenarios:&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;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deepeval&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;assert_test&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deepeval.metrics&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GEval&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;deepeval.test_case&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LLMTestCase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LLMTestCaseParams&lt;/span&gt;


&lt;span class="n"&gt;correctness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GEval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Correctness&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;criteria&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The response must correctly identify the root cause and provide a secure, working fix.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;evaluation_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;LLMTestCaseParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACTUAL_OUTPUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;LLMTestCaseParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EXPECTED_OUTPUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;maintainability&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GEval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Maintainability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;criteria&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The response must produce clear, readable, and well-structured code.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;evaluation_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;LLMTestCaseParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACTUAL_OUTPUT&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_workflow_fix&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;test_case&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LLMTestCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Given this GitHub Actions error: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;OIDC token audience invalid&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, identify root cause and fix.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;actual_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;paste model response here&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;expected_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The OIDC token audience must match the value configured in your identity provider. Update the audience field in your federated identity settings.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;assert_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_case&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;correctness&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_terraform_refactor&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;test_case&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LLMTestCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Refactor this Terraform snippet to reduce duplication while preserving behaviour.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;actual_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;paste model response here&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;assert_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_case&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;maintainability&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  3. Run the evaluation
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deepeval &lt;span class="nb"&gt;test &lt;/span&gt;run test_copilot_eval.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  4. Interpret results
&lt;/h4&gt;

&lt;p&gt;When you run the evaluation, DeepEval produces terminal output similar to the following:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running 2 test(s)...

  test_workflow_fix
    ✅ Correctness (score: 0.82, threshold: 0.5, passed: True)

  test_terraform_refactor
    ✅ Maintainability (score: 0.71, threshold: 0.5, passed: True)

======================= Results =======================
Tests run: 2, Passed: 2, Failed: 0
Overall pass rate: 100.0%

Metric scores:
  Correctness       avg: 0.82   min: 0.82   max: 0.82
  Maintainability   avg: 0.71   min: 0.71   max: 0.71
=======================================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each test case is scored on a 0 to 1 scale against your criteria. A score above the threshold you set counts as a pass. If a test fails, the output shows the reason so you can see where the model response fell short:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  test_workflow_fix
    ❌ Correctness (score: 0.34, threshold: 0.5, passed: False)
       Reason: The response did not identify the OIDC audience
       mismatch as the root cause and suggested unrelated
       permission changes instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To compare models, run the same test file once per model (swapping in each model's responses for &lt;code&gt;actual_output&lt;/code&gt;) and record the results side by side:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test case&lt;/th&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Model A&lt;/th&gt;
&lt;th&gt;Model B&lt;/th&gt;
&lt;th&gt;Model C&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;test_workflow_fix&lt;/td&gt;
&lt;td&gt;Correctness&lt;/td&gt;
&lt;td&gt;0.82&lt;/td&gt;
&lt;td&gt;0.91&lt;/td&gt;
&lt;td&gt;0.64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test_terraform_refactor&lt;/td&gt;
&lt;td&gt;Maintainability&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;0.78&lt;/td&gt;
&lt;td&gt;0.69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overall pass rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This gives you a quantitative basis for model comparison that you can track over time. You can also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add multiple metrics per test (correctness, security, maintainability).&lt;/li&gt;
&lt;li&gt;Integrate tests into your CI/CD pipeline for regression checks when new models are released.&lt;/li&gt;
&lt;li&gt;Export results to JSON for further analysis or dashboard reporting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Define custom &lt;code&gt;GEval&lt;/code&gt; metrics for each dimension in your scoring rubric to get automated scoring that aligns with your team's specific criteria.&lt;/p&gt;
&lt;h3&gt;
  
  
  Other Free Tools Worth Knowing
&lt;/h3&gt;

&lt;p&gt;A few other open-source options are available if you want to explore further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Evals&lt;/strong&gt; (&lt;a href="https://github.com/openai/evals" rel="noopener noreferrer"&gt;https://github.com/openai/evals&lt;/a&gt;): a framework and registry of benchmarks for evaluating LLMs and LLM systems. Good for standardised benchmark testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LM Evaluation Harness&lt;/strong&gt; (&lt;a href="https://github.com/EleutherAI/lm-evaluation-harness" rel="noopener noreferrer"&gt;https://github.com/EleutherAI/lm-evaluation-harness&lt;/a&gt;): the backend behind the Hugging Face Open LLM Leaderboard. Supports 60+ academic benchmarks with API model support. Best suited for formal benchmark comparisons.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Recommended Team Operating Model
&lt;/h2&gt;

&lt;p&gt;Use this cadence so your model decisions stay current:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run a small benchmark set every month.&lt;/li&gt;
&lt;li&gt;Run a fuller evaluation set each quarter.&lt;/li&gt;
&lt;li&gt;Re-run when GitHub adds or retires major models.&lt;/li&gt;
&lt;li&gt;Publish a one-page internal scorecard for your team.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A simple scorecard format:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Avg quality&lt;/th&gt;
&lt;th&gt;Avg latency&lt;/th&gt;
&lt;th&gt;Cost proxy&lt;/th&gt;
&lt;th&gt;Value score&lt;/th&gt;
&lt;th&gt;Best-fit tasks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model A&lt;/td&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;td&gt;1.2s&lt;/td&gt;
&lt;td&gt;1x&lt;/td&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;td&gt;General coding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model B&lt;/td&gt;
&lt;td&gt;4.7&lt;/td&gt;
&lt;td&gt;2.1s&lt;/td&gt;
&lt;td&gt;3x&lt;/td&gt;
&lt;td&gt;1.57&lt;/td&gt;
&lt;td&gt;Deep debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model C&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;0.9s&lt;/td&gt;
&lt;td&gt;0.33x&lt;/td&gt;
&lt;td&gt;12.42&lt;/td&gt;
&lt;td&gt;Fast lightweight edits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This makes model selection transparent and easier to defend in architecture and governance reviews.&lt;/p&gt;


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

&lt;p&gt;The model landscape in GitHub Copilot will keep moving. That is a feature, not a problem, if your team has a repeatable evaluation method.&lt;/p&gt;

&lt;p&gt;Start with a small prompt set, apply a consistent scoring rubric, and review quality, latency, and cost together. Once your network sees the method in action, model choice becomes a practical engineering decision instead of a subjective debate.&lt;/p&gt;
&lt;h3&gt;
  
  
  Additional Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supported AI models in Copilot: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/supported-models" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/supported-models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI model comparison in Copilot: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/model-comparison" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/model-comparison&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Changing model in Copilot Chat: &lt;a href="https://docs.github.com/en/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-chat" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/using-github-copilot/ai-models/changing-the-ai-model-for-copilot-chat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepEval docs: &lt;a href="https://deepeval.com/docs/getting-started" rel="noopener noreferrer"&gt;https://deepeval.com/docs/getting-started&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepEval GitHub: &lt;a href="https://github.com/confident-ai/deepeval" rel="noopener noreferrer"&gt;https://github.com/confident-ai/deepeval&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI Evals: &lt;a href="https://github.com/openai/evals" rel="noopener noreferrer"&gt;https://github.com/openai/evals&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LM Evaluation Harness: &lt;a href="https://github.com/EleutherAI/lm-evaluation-harness" rel="noopener noreferrer"&gt;https://github.com/EleutherAI/lm-evaluation-harness&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 06-03-2026&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>GitHub Copilot Instructions vs Prompts vs Custom Agents vs Skills vs X vs WHY?</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Thu, 26 Feb 2026 09:09:32 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l</link>
      <guid>https://dev.to/pwd9000/github-copilot-instructions-vs-prompts-vs-custom-agents-vs-skills-vs-x-vs-why-339l</guid>
      <description>&lt;h2&gt;
  
  
  GitHub Copilot Instructions vs Prompts vs Custom Agents vs Skills vs X vs WHY?
&lt;/h2&gt;

&lt;p&gt;If you have been following my recent GitHub Copilot posts, you might have noticed a pattern. We have covered instructions, prompt files, skills, MCP, coding agents, and more. Each feature is powerful on its own. The confusing part is deciding which one to use for a specific problem.&lt;/p&gt;

&lt;p&gt;This post is your practical decision guide.&lt;/p&gt;

&lt;p&gt;We will compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Custom Instructions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt Files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP Servers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The 60-Second Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Primitive&lt;/th&gt;
&lt;th&gt;Typical location&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;When not to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.github/copilot-instructions.md&lt;/code&gt;, &lt;code&gt;.github/instructions/*.instructions.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Always-on or pattern-based&lt;/td&gt;
&lt;td&gt;Team standards and default behaviour&lt;/td&gt;
&lt;td&gt;One-off tasks or named workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt Files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/prompts/*.prompt.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manual, on-demand slash command&lt;/td&gt;
&lt;td&gt;Repeatable one-shot tasks&lt;/td&gt;
&lt;td&gt;Multi-step runbooks with assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/agents/*.agent.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selected agent mode/persona&lt;/td&gt;
&lt;td&gt;Specialised role plus tool control&lt;/td&gt;
&lt;td&gt;General coding help or tiny tweaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;On-demand and auto-discovered&lt;/td&gt;
&lt;td&gt;Reusable multi-step workflows with resources&lt;/td&gt;
&lt;td&gt;Simple standards or hard policy enforcement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Servers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.vscode/mcp.json&lt;/code&gt; or user &lt;code&gt;mcp.json&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Tool and data connectivity&lt;/td&gt;
&lt;td&gt;Live access to external systems and APIs&lt;/td&gt;
&lt;td&gt;Static guidance that does not need external context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/hooks/*.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Agent workflow lifecycle events&lt;/td&gt;
&lt;td&gt;Hard policy gates and safety controls&lt;/td&gt;
&lt;td&gt;Soft guidance or stylistic preferences&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you remember one thing, remember this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instructions&lt;/strong&gt; for always-on guidance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt; for named one-off tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt; for reusable workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Agents&lt;/strong&gt; for role and tool boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; for external live context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; for hard stop enforcement.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1) Custom Instructions: "Always apply these rules"
&lt;/h2&gt;

&lt;p&gt;Use custom instructions when you want Copilot to behave consistently without repeating yourself in every chat.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Markdown instructions that are automatically added to context.&lt;/li&gt;
&lt;li&gt;Three flavours:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global&lt;/strong&gt;: &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; applies to every chat request in the workspace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File/task-targeted&lt;/strong&gt;: &lt;code&gt;*.instructions.md&lt;/code&gt; files with an &lt;code&gt;applyTo&lt;/code&gt; glob pattern or task description match. Store them in &lt;code&gt;.github/instructions/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-agent compatible&lt;/strong&gt;: &lt;code&gt;AGENTS.md&lt;/code&gt; in the workspace root is recognised by multiple AI agents (not only Copilot). Supports subfolder-level scoping for monorepos (experimental).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Instructions can also be shared at GitHub &lt;strong&gt;organisation level&lt;/strong&gt;, so every repository in the org inherits a common baseline. (&lt;strong&gt;Note:&lt;/strong&gt; Organisation-level instructions require a Copilot Business or Enterprise plan.)&lt;/li&gt;
&lt;li&gt;Priority order when conflicts occur: personal (user-level) &amp;gt; repository &amp;gt; organisation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want all IaC suggestions to follow your team's naming and tagging conventions, e.g. every resource must include &lt;code&gt;environment&lt;/code&gt; and &lt;code&gt;cost-centre&lt;/code&gt; tags.&lt;/li&gt;
&lt;li&gt;You want consistent code style across the repo, e.g. British English in comments, four-space indentation, or a preferred import order.&lt;/li&gt;
&lt;li&gt;You want secure defaults baked into every suggestion, e.g. private endpoints by default, no public IPs without justification, secrets always pulled from a vault.&lt;/li&gt;
&lt;li&gt;You work with multiple AI agents and want a single &lt;code&gt;AGENTS.md&lt;/code&gt; recognised by all of them, so rules are defined once and shared.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You only need a task once.&lt;/li&gt;
&lt;li&gt;You need a named slash command.&lt;/li&gt;
&lt;li&gt;You need a full runbook that includes extra scripts and templates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quick guide: which instruction type?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;When to reach for it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;copilot-instructions.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Single project, Copilot-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;.instructions.md&lt;/code&gt; + &lt;code&gt;applyTo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Different rules for different file types or frameworks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-agent workflows, or subfolder-level monorepo rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organisation instructions&lt;/td&gt;
&lt;td&gt;Shared baseline across all repos in a GitHub org&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;"For all cloud IaC, always use least privilege, avoid hardcoded secrets, and follow approved resource naming conventions."&lt;/p&gt;

&lt;p&gt;For a deeper walkthrough, see my earlier post: &lt;a href="https://github.com/Pwd9000-ML/blog-devto/blob/main/posts/2025/DevAIOps-Inst-GitHub/DevAIOps-Inst-GitHub.md" rel="noopener noreferrer"&gt;Instructions and Prompt Files to supercharge VS Code with GitHub Copilot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-instructions" rel="noopener noreferrer"&gt;Use custom instructions in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2) Prompt Files: "Run this specific play"
&lt;/h2&gt;

&lt;p&gt;Prompt files are reusable slash commands for recurring tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Markdown prompt files, usually in &lt;code&gt;.github/prompts/*.prompt.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Invoked with &lt;code&gt;/&lt;/code&gt; in chat, just like slash commands.&lt;/li&gt;
&lt;li&gt;YAML frontmatter can define the &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;tools&lt;/code&gt;, &lt;code&gt;model&lt;/code&gt;, and &lt;code&gt;description&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Support built-in variables such as &lt;code&gt;${selection}&lt;/code&gt;, &lt;code&gt;${file}&lt;/code&gt;, and &lt;code&gt;${input:variableName}&lt;/code&gt; for dynamic context.&lt;/li&gt;
&lt;li&gt;Can reference a custom agent via the &lt;code&gt;agent&lt;/code&gt; field, inheriting that agent's tool set.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want a quick &lt;code&gt;/security-review&lt;/code&gt; command that scans the current file for common misconfigurations such as open ports or missing encryption.&lt;/li&gt;
&lt;li&gt;You want &lt;code&gt;/generate-module&lt;/code&gt; to scaffold a new IaC module with consistent structure, inputs, outputs, and documentation every time.&lt;/li&gt;
&lt;li&gt;You want &lt;code&gt;/release-notes&lt;/code&gt; that always follows a fixed changelog format, pulling context from recent commits.&lt;/li&gt;
&lt;li&gt;You want to override the default agent for a specific task by setting &lt;code&gt;agent: plan&lt;/code&gt; in the frontmatter, e.g. a &lt;code&gt;/design-review&lt;/code&gt; prompt that runs inside a planning-only agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need always-on behavioural standards.&lt;/li&gt;
&lt;li&gt;You need automatic discovery of a rich workflow with supporting resources.&lt;/li&gt;
&lt;li&gt;You need deterministic enforcement logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;/pipeline-hardening&lt;/code&gt; that checks secrets handling, approval gates, artifact integrity, and rollback readiness. Use &lt;code&gt;${input:environment}&lt;/code&gt; to let the user specify which environment to review.&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/prompt-files" rel="noopener noreferrer"&gt;Use prompt files in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Custom Agents: "Use this specialist persona and tool set"
&lt;/h2&gt;

&lt;p&gt;Custom Agents were previously known as custom chat modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Agent definition files in &lt;code&gt;.github/agents/*.agent.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Define a specialist persona, instructions, allowed tools, and optional &lt;strong&gt;handoffs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Designed for role-specific flows such as planning, review, or implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handoffs&lt;/strong&gt; let you chain agents into guided workflows. After one agent finishes, a handoff button appears to transition to the next agent with pre-filled context. For example: Plan &amp;gt; Implement &amp;gt; Review.&lt;/li&gt;
&lt;li&gt;Can run as &lt;strong&gt;subagents&lt;/strong&gt; and can also be reused in &lt;strong&gt;background agents&lt;/strong&gt; and &lt;strong&gt;cloud agents&lt;/strong&gt;. (&lt;strong&gt;Note:&lt;/strong&gt; The coding agent requires a Copilot Pro+, Business, or Enterprise plan.)&lt;/li&gt;
&lt;li&gt;Can be shared at &lt;strong&gt;GitHub organisation level&lt;/strong&gt;, so every repo in the org gets the same agent definitions. (&lt;strong&gt;Note:&lt;/strong&gt; Organisation-level agent sharing requires a Copilot Business or Enterprise plan.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want a &lt;strong&gt;Security Reviewer&lt;/strong&gt; agent that can only read code and run linters but never edit files, e.g. a pre-merge review step that flags risks without changing anything.&lt;/li&gt;
&lt;li&gt;You want a &lt;strong&gt;Planner&lt;/strong&gt; agent that outputs a structured implementation plan and then hands off to an &lt;strong&gt;Implementation&lt;/strong&gt; agent, giving the team a review checkpoint before code is written.&lt;/li&gt;
&lt;li&gt;You want strict tool boundaries, e.g. an &lt;strong&gt;Auditor&lt;/strong&gt; agent with access to cloud cost APIs and read-only file tools, but no ability to execute commands or apply changes.&lt;/li&gt;
&lt;li&gt;You need a guided multi-step workflow where each stage has a different persona and tool set, such as Design &amp;gt; Build &amp;gt; Test.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You just need a short reusable prompt.&lt;/li&gt;
&lt;li&gt;You only need default team standards.&lt;/li&gt;
&lt;li&gt;You are trying to solve external data access without MCP.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;cost-optimiser.agent.md&lt;/code&gt; that only has read-only cloud and repo tools, then &lt;strong&gt;hands off&lt;/strong&gt; to a separate implementation agent for approved changes. The handoff button appears automatically after the cost analysis completes.&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/custom-agents" rel="noopener noreferrer"&gt;Custom agents in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4) Skills: "Package a reusable runbook"
&lt;/h2&gt;

&lt;p&gt;Skills are where things get interesting for SRE and DevOps teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Folder-based capability packages with a required &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stored in &lt;code&gt;.github/skills/&amp;lt;skill-name&amp;gt;/&lt;/code&gt; (workspace) or &lt;code&gt;~/.copilot/skills/&lt;/code&gt; (personal, available across all workspaces).&lt;/li&gt;
&lt;li&gt;Can include scripts, templates, references, and examples alongside the instructions.&lt;/li&gt;
&lt;li&gt;Loaded progressively: Copilot reads name and description first, loads full instructions only when relevant, and accesses bundled resources on demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt;: Skills follow the open &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;Agent Skills standard&lt;/a&gt;. The same skill works across VS Code, GitHub Copilot CLI, and the GitHub Copilot coding agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want a repeatable incident triage workflow that walks through impact assessment, timeline capture, and owner assignment using a bundled template.&lt;/li&gt;
&lt;li&gt;You want a postmortem assistant that generates a structured report with root-cause analysis, action items, and SLA impact, pulling from scripts and examples in the skill folder.&lt;/li&gt;
&lt;li&gt;You want a CI/CD troubleshooting playbook the whole team can invoke, e.g. a skill that runs diagnostic scripts against a failed pipeline and suggests fixes.&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;cross-tool portability&lt;/strong&gt; so the same workflow works in VS Code, the CLI, and the coding agent without maintaining separate definitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You only need a global coding rule.&lt;/li&gt;
&lt;li&gt;You only need a tiny slash command with no supporting resources.&lt;/li&gt;
&lt;li&gt;You need hard policy blocking behaviour.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;incident-triage&lt;/code&gt; skill that collects service impact, timeline, likely root causes, next actions, and owner assignments using a consistent template. The same skill can be invoked from the CLI during on-call triage and from VS Code during post-incident review.&lt;/p&gt;

&lt;p&gt;My practical Skills deep dive: &lt;a href="https://github.com/Pwd9000-ML/blog-devto/blob/main/posts/2026/GitHub-Copilot-Skills-DevOps/GitHub-Copilot-Skills-DevOps.md" rel="noopener noreferrer"&gt;GitHub Copilot Skills: Reusable AI Workflows for DevOps and SREs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/agent-skills" rel="noopener noreferrer"&gt;Use Agent Skills in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5) MCP Servers: "Connect Copilot to live systems"
&lt;/h2&gt;

&lt;p&gt;MCP is often the missing piece when people expect Copilot to access live external context.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it is
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MCP (Model Context Protocol) is an open standard for connecting AI models to external tools and services.&lt;/li&gt;
&lt;li&gt;Configured in &lt;code&gt;.vscode/mcp.json&lt;/code&gt; (workspace) or user profile &lt;code&gt;mcp.json&lt;/code&gt;. Can also be installed from the VS Code MCP server gallery.&lt;/li&gt;
&lt;li&gt;MCP servers can provide four categories of capability:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Actions the agent can invoke (e.g. create an issue, query a database).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resources&lt;/strong&gt;: Data the agent can pull into context (e.g. files, API responses, database rows).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt;: Pre-configured prompt templates contributed by the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Apps&lt;/strong&gt;: Interactive UI components such as forms and visualisations rendered directly in chat.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Organisations can centrally manage MCP server access via GitHub policies. (&lt;strong&gt;Note:&lt;/strong&gt; Organisation-level MCP policy management requires a Copilot Business or Enterprise plan.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need live GitHub data inside chat, e.g. listing open issues, checking workflow run status, or creating a PR directly from a conversation.&lt;/li&gt;
&lt;li&gt;You need live cloud metadata, e.g. pulling resource tags, SKU availability, or cost estimates from Azure, AWS, or GCP during an architecture review.&lt;/li&gt;
&lt;li&gt;You need external system context such as querying a database, pulling monitoring dashboards, or fetching ticket details from a service management tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Static instructions are enough.&lt;/li&gt;
&lt;li&gt;The task is purely local code guidance.&lt;/li&gt;
&lt;li&gt;You have not reviewed trust and security implications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;Use GitHub MCP to create issues and inspect workflow runs, then use a cloud-compatible MCP server to pull environment metadata for triage context.&lt;/p&gt;

&lt;p&gt;My earlier MCP setup guide: &lt;a href="https://github.com/Pwd9000-ML/blog-devto/blob/main/posts/2025/DevAIOps-MCP-GitHub/DevAIOps-MCP-GitHub.md" rel="noopener noreferrer"&gt;Supercharge VSCode GitHub Copilot using Model Context Protocol (MCP) - Easy Setup Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://code.visualstudio.com/docs/copilot/customization/mcp-servers" rel="noopener noreferrer"&gt;Add and manage MCP servers in VS Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6) Hooks: "Enforce policy at execution time"
&lt;/h2&gt;

&lt;p&gt;If instructions are advice, hooks are enforcement.&lt;/p&gt;

&lt;h3&gt;
  
  
  What they are
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deterministic shell commands that run at key strategic points in an agent's workflow.&lt;/li&gt;
&lt;li&gt;Configured as JSON files in &lt;code&gt;.github/hooks/*.json&lt;/code&gt; in your repository.&lt;/li&gt;
&lt;li&gt;Available hook types include: &lt;code&gt;sessionStart&lt;/code&gt;, &lt;code&gt;sessionEnd&lt;/code&gt;, &lt;code&gt;userPromptSubmitted&lt;/code&gt;, &lt;code&gt;preToolUse&lt;/code&gt;, &lt;code&gt;postToolUse&lt;/code&gt;, &lt;code&gt;agentStop&lt;/code&gt;, &lt;code&gt;subagentStop&lt;/code&gt;, and &lt;code&gt;errorOccurred&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;preToolUse&lt;/code&gt; hook is the most powerful because it can &lt;strong&gt;approve or deny&lt;/strong&gt; tool executions before they happen.&lt;/li&gt;
&lt;li&gt;Hooks receive detailed JSON input about the agent's actions, enabling context-aware automation.&lt;/li&gt;
&lt;li&gt;Work with both the &lt;strong&gt;Copilot coding agent&lt;/strong&gt; on GitHub and &lt;strong&gt;GitHub Copilot CLI&lt;/strong&gt;. (&lt;strong&gt;Note:&lt;/strong&gt; The coding agent and CLI require a Copilot Pro+, Business, or Enterprise plan.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Suitale Usage Examples
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need a hard control, not a recommendation, e.g. blocking any file edit that adds a public IP to IaC without an approved exception.&lt;/li&gt;
&lt;li&gt;You must block risky operations unless a condition passes, e.g. deny &lt;code&gt;bash&lt;/code&gt; commands that target production databases or delete cloud resource groups.&lt;/li&gt;
&lt;li&gt;You need consistent compliance checks before agent actions proceed, e.g. validating that every new service deployment includes a required cost tag.&lt;/li&gt;
&lt;li&gt;You want immutable audit logging of every tool invocation for regulatory or internal compliance, e.g. recording who ran what command and when.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not use when
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A style guide or prompt convention is enough.&lt;/li&gt;
&lt;li&gt;You do not need strict allow or deny behaviour.&lt;/li&gt;
&lt;li&gt;You only need static behavioural guidance (use instructions instead).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DevOps example
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;preToolUse&lt;/code&gt; hook that runs a security check script before any &lt;code&gt;bash&lt;/code&gt; or &lt;code&gt;edit&lt;/code&gt; tool call, blocking risky infrastructure changes in production unless required checks pass.&lt;/p&gt;

&lt;p&gt;Official docs: &lt;a href="https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-hooks" rel="noopener noreferrer"&gt;About hooks for Copilot coding agent&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  So, Why This Many Primitives?
&lt;/h2&gt;

&lt;p&gt;Because they solve different control layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Behaviour layer&lt;/strong&gt;: Instructions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task invocation layer&lt;/strong&gt;: Prompt files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persona and tool boundary layer&lt;/strong&gt;: Custom agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow packaging layer&lt;/strong&gt;: Skills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External connectivity layer&lt;/strong&gt;: MCP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy enforcement layer&lt;/strong&gt;: Hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not feature overlap. This is a composable system. You can mix and match:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;custom agent&lt;/strong&gt; can reference &lt;strong&gt;instructions files&lt;/strong&gt; via Markdown links so you do not duplicate rules.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;prompt file&lt;/strong&gt; can set &lt;code&gt;agent:&lt;/code&gt; to run inside a specific &lt;strong&gt;custom agent&lt;/strong&gt;, inheriting its tool set.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;skill&lt;/strong&gt; can bundle scripts that a &lt;strong&gt;custom agent&lt;/strong&gt; or &lt;strong&gt;prompt file&lt;/strong&gt; invokes.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;MCP server&lt;/strong&gt; provides tools that any agent, prompt, or skill can call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; sit underneath everything, enforcing policy regardless of which primitive triggered the action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight is that each primitive has a different &lt;strong&gt;lifetime&lt;/strong&gt; and &lt;strong&gt;trigger&lt;/strong&gt;. Instructions are always on. Prompts are invoked manually. Skills are discovered automatically or by slash command. Agents set a persistent persona for a session. MCP provides live external data. Hooks enforce hard gates at execution time.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical "When to Use What" Decision Flow
&lt;/h2&gt;

&lt;p&gt;Walk through these questions in order. Pick the &lt;strong&gt;first&lt;/strong&gt; match:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do you need a rule applied to &lt;strong&gt;every&lt;/strong&gt; chat request without anyone remembering to activate it? &lt;strong&gt;Instructions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Do you need a &lt;strong&gt;named, repeatable&lt;/strong&gt; task that people invoke on demand? &lt;strong&gt;Prompt File&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Do you need a &lt;strong&gt;specialist persona&lt;/strong&gt; with a limited set of tools, or a &lt;strong&gt;multi-step handoff&lt;/strong&gt; workflow? &lt;strong&gt;Custom Agent&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Do you need a &lt;strong&gt;reusable multi-step runbook&lt;/strong&gt; with scripts, templates, or reference files bundled together? &lt;strong&gt;Skill&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Does the task require &lt;strong&gt;live data from an external system&lt;/strong&gt; (GitHub API, cloud metadata, databases)? Add &lt;strong&gt;MCP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Must a policy be &lt;strong&gt;enforced deterministically&lt;/strong&gt; with no chance the model ignores it? Add a &lt;strong&gt;Hook&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice that 1 to 4 are "pick one" decisions, while 5 and 6 are additive layers you stack on top.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Mature DevOps Setup Looks Like
&lt;/h2&gt;

&lt;p&gt;A practical stack for a platform engineering team might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instructions&lt;/strong&gt;: Workspace-level &lt;code&gt;copilot-instructions.md&lt;/code&gt; for coding and security defaults. Scoped &lt;code&gt;*.instructions.md&lt;/code&gt; files for IaC, pipeline YAML, and language-specific conventions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt files&lt;/strong&gt;: 5 to 10 prompt files for common operational tasks such as &lt;code&gt;/security-review&lt;/code&gt;, &lt;code&gt;/release-notes&lt;/code&gt;, &lt;code&gt;/changelog&lt;/code&gt;, and &lt;code&gt;/generate-module&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom agents&lt;/strong&gt;: 2 to 3 agents (planning, implementation, security review) connected via handoffs so the team flows from plan to code to review in one conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt;: 3 to 6 skills for triage, postmortems, runbook generation, and IaC change risk analysis. These work the same in VS Code, the CLI, and the coding agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers&lt;/strong&gt;: GitHub MCP for issue and PR management, plus cloud-context MCP servers for pulling live environment metadata during triage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt;: &lt;code&gt;preToolUse&lt;/code&gt; hooks to block dangerous commands and &lt;code&gt;postToolUse&lt;/code&gt; hooks for audit logging in autonomous coding agent workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This combination gives you speed, consistency, and safety without forcing everything into one mechanism.&lt;/p&gt;




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

&lt;p&gt;If you have ever asked "Should I use instructions, prompts, agents, or skills?", the answer is usually: &lt;strong&gt;use the smallest primitive that solves the actual problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add instructions first for always-on standards.&lt;/li&gt;
&lt;li&gt;Add prompt files when you catch yourself typing the same prompt repeatedly.&lt;/li&gt;
&lt;li&gt;Add skills when a workflow needs bundled scripts and templates.&lt;/li&gt;
&lt;li&gt;Add custom agents when you need role boundaries and handoff workflows.&lt;/li&gt;
&lt;li&gt;Add MCP when the task requires live external data.&lt;/li&gt;
&lt;li&gt;Add hooks where policy must be enforced, not suggested.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the difference between experimenting with Copilot and operationalising Copilot. Each primitive has a clear purpose, and together they form a composable customisation system.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 26-02-2026&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>github</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>GitHub Copilot Skills: Reusable AI Workflows for DevOps and SREs</title>
      <dc:creator>Marcel.Lupo</dc:creator>
      <pubDate>Tue, 24 Feb 2026 16:35:29 +0000</pubDate>
      <link>https://dev.to/pwd9000/github-copilot-skills-reusable-ai-workflows-for-devops-and-sres-caf</link>
      <guid>https://dev.to/pwd9000/github-copilot-skills-reusable-ai-workflows-for-devops-and-sres-caf</guid>
      <description>&lt;h2&gt;
  
  
  GitHub Copilot Skills: Reusable AI Workflows for DevOps and SREs
&lt;/h2&gt;

&lt;p&gt;If you're a DevOps engineer or SRE, you probably have a handful of repeatable tasks that keep coming back: triaging failed pipelines, checking for risky Terraform changes, writing runbooks, and turning messy incident notes into something your team can actually use.&lt;/p&gt;

&lt;p&gt;Until recently, you could get part of the way there with &lt;strong&gt;custom instructions&lt;/strong&gt; and &lt;strong&gt;prompt files&lt;/strong&gt;. They are both great, but they do not fully solve the same problem: packaging a repeatable, multi-step workflow with its own supporting assets.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Agent Skills&lt;/strong&gt; comes in. Agent Skills is an open standard (see &lt;a href="https://agentskills.io/" rel="noopener noreferrer"&gt;agentskills.io&lt;/a&gt;) that works with GitHub Copilot in VS Code, Copilot CLI, and the Copilot coding agent.&lt;/p&gt;

&lt;p&gt;In this post we will cover what Skills are, how to set them up in VS Code, and how to use them from beginner scenarios to more advanced DevOps and SRE use cases.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are GitHub Copilot Skills?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Skill&lt;/strong&gt; is an on-demand, reusable workflow for Copilot. A Skill lives in a folder, has a required &lt;code&gt;SKILL.md&lt;/code&gt;, and can include supporting resources such as scripts, references, and templates.&lt;/p&gt;

&lt;p&gt;At a high level, it is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repeatable workflows&lt;/strong&gt; you want to reuse across a team&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-step procedures&lt;/strong&gt; that benefit from checklists and branching logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundled assets&lt;/strong&gt; such as scripts, templates, and short reference docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key idea is &lt;strong&gt;progressive loading&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copilot first uses the Skill &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;description&lt;/code&gt; for discovery.&lt;/li&gt;
&lt;li&gt;If the request matches, it loads the Skill instructions.&lt;/li&gt;
&lt;li&gt;It only loads extra resources when the Skill references them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This makes Skills a good fit for DevOps because you can keep the default Copilot experience lean, then load a specialised runbook only when you need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skills vs Prompts vs Instructions vs Agents vs Hooks
&lt;/h2&gt;

&lt;p&gt;Skills sit in the same overall customisation system as instructions, prompt files, custom agents, and hooks. They are not a replacement. They are a different primitive.&lt;/p&gt;

&lt;p&gt;Here is a practical DevOps-oriented way to think about them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Primitive&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;DevOps example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Workspace instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Always-on standards&lt;/td&gt;
&lt;td&gt;"Tag every Azure resource with &lt;code&gt;owner&lt;/code&gt; and &lt;code&gt;env&lt;/code&gt;"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File instructions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standards for certain files&lt;/td&gt;
&lt;td&gt;Helm chart defaults for &lt;code&gt;**/values.yaml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt files&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One-shot tasks&lt;/td&gt;
&lt;td&gt;"Summarise this sprint's deployment changelog"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Skills&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reusable workflows with assets&lt;/td&gt;
&lt;td&gt;Kubernetes rollback playbook + kubectl scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Specialised role and tool limits&lt;/td&gt;
&lt;td&gt;Cost-optimisation advisor (read-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deterministic enforcement&lt;/td&gt;
&lt;td&gt;Reject Terraform plans that drop deletion protection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're new to Copilot customisation, my rule of thumb is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;instructions&lt;/strong&gt; when you want Copilot to behave consistently all the time.&lt;/li&gt;
&lt;li&gt;Use a &lt;strong&gt;prompt file&lt;/strong&gt; when you want a reusable one-off command.&lt;/li&gt;
&lt;li&gt;Use a &lt;strong&gt;Skill&lt;/strong&gt; when you want a repeatable workflow that feels like a runbook.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To use Skills effectively, you will want:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt; with GitHub Copilot enabled&lt;/li&gt;
&lt;li&gt;A repo (or workspace) where you can commit the Skill folder so your team can share it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In VS Code chat, type &lt;code&gt;/skills&lt;/code&gt; to open the &lt;strong&gt;Configure Skills&lt;/strong&gt; menu and confirm VS Code can see your workspace Skills.&lt;/p&gt;

&lt;p&gt;Skills can be stored in a few locations. For team usage, the simplest is the repository:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.github/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VS Code also recognises &lt;code&gt;.claude/skills/&lt;/code&gt; and &lt;code&gt;.agents/skills/&lt;/code&gt; as project skill directories. For personal skills that follow you across workspaces, use &lt;code&gt;~/.copilot/skills/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you want to share Skills across multiple repos, VS Code also supports additional search locations via the &lt;code&gt;chat.agentSkillsLocations&lt;/code&gt; setting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your First Skill (Beginner Setup)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Create the folder
&lt;/h3&gt;

&lt;p&gt;Create this structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.github/skills/incident-triage/
└── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2) Add SKILL.md
&lt;/h3&gt;

&lt;p&gt;The front matter must match the folder name.&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;incident-triage&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Triage&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;production&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;incidents&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;deployments.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;when:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;pipeline&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fails,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;alert&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fires,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;you&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;need&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;an&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;incident&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;update&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;stakeholders.'&lt;/span&gt;
&lt;span class="na"&gt;argument-hint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Optional:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;service&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;environment,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;alert&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;link'&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

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

&lt;span class="gu"&gt;## When to Use&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Pipeline failed in &lt;span class="sb"&gt;`prod`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Pager/alert fired and you need a first response
&lt;span class="p"&gt;-&lt;/span&gt; You need a status update for stakeholders

&lt;span class="gu"&gt;## Procedure&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Confirm the affected service, environment, and impact
&lt;span class="p"&gt;2.&lt;/span&gt; Collect signal: alerts, recent deploys, logs, and error budgets
&lt;span class="p"&gt;3.&lt;/span&gt; Identify likely root cause categories (deploy, dependency, infra, config)
&lt;span class="p"&gt;4.&lt;/span&gt; Recommend next actions: rollback, mitigation, escalation
&lt;span class="p"&gt;5.&lt;/span&gt; Write an incident update in a consistent format

&lt;span class="gu"&gt;## Output Format&lt;/span&gt;

Return:
&lt;span class="p"&gt;
-&lt;/span&gt; Impact summary
&lt;span class="p"&gt;-&lt;/span&gt; Timeline
&lt;span class="p"&gt;-&lt;/span&gt; Suspected causes
&lt;span class="p"&gt;-&lt;/span&gt; Next actions
&lt;span class="p"&gt;-&lt;/span&gt; Owner assignments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is enough to get started. The Skill is now discoverable based on the description.&lt;/p&gt;


&lt;h2&gt;
  
  
  Using Skills in Chat
&lt;/h2&gt;

&lt;p&gt;There are two ways Skills help you day-to-day:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Manual invocation&lt;/strong&gt;: you can run the Skill as a slash command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic discovery&lt;/strong&gt;: Copilot can decide to load the Skill when the request matches the description.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To invoke a Skill manually, type &lt;code&gt;/&lt;/code&gt; in the chat input, pick the Skill, and then add any extra context. For example: &lt;code&gt;/incident-triage payments-api prod https://alert-link&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can control this with optional front matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;user-invokable: false&lt;/code&gt; hides it from &lt;code&gt;/&lt;/code&gt; commands&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;disable-model-invocation: true&lt;/code&gt; prevents automatic loading, but keeps slash use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters for teams. Some Skills are safe to auto-load. Others might be better as explicit, opt-in runbooks.&lt;/p&gt;


&lt;h2&gt;
  
  
  DevOps and SRE Use Cases (Practical)
&lt;/h2&gt;

&lt;p&gt;Here are a few Skills that are genuinely useful in real operations.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use Case 1: CI/CD Failure Triage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Standardise how you investigate failures and what you record.&lt;/p&gt;

&lt;p&gt;A Skill can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask for the workflow URL and failing job name&lt;/li&gt;
&lt;li&gt;Require you to record whether it looks transient or deterministic&lt;/li&gt;
&lt;li&gt;Produce a consistent issue template for follow-up&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Use Case 2: Terraform Change Risk Review
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Make IaC reviews consistent across a team.&lt;/p&gt;

&lt;p&gt;A Skill can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Require you to list affected environments&lt;/li&gt;
&lt;li&gt;Check for risky patterns (public exposure, identity changes, state migration)&lt;/li&gt;
&lt;li&gt;Output a simple go/no-go summary and required approvals&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Use Case 3: Runbook Generator
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Turn tribal knowledge into a maintained operational runbook.&lt;/p&gt;

&lt;p&gt;A Skill can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enforce sections (Symptoms, Checks, Rollback, Escalation)&lt;/li&gt;
&lt;li&gt;Add a "Safety" section (blast radius, data loss risk)&lt;/li&gt;
&lt;li&gt;Produce a markdown runbook that matches your house style&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Use Case 4: Postmortem Assistant
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Reduce the time from incident to learning.&lt;/p&gt;

&lt;p&gt;A Skill can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert incident notes into a timeline&lt;/li&gt;
&lt;li&gt;Extract contributing factors and remediation items&lt;/li&gt;
&lt;li&gt;Enforce blameless language and clear action items&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Advanced Patterns (Where Skills Get Interesting)
&lt;/h2&gt;

&lt;p&gt;Once the basics work, Skills shine when you treat them like reusable operational modules.&lt;/p&gt;
&lt;h3&gt;
  
  
  1) Bundle references and templates
&lt;/h3&gt;

&lt;p&gt;Keep &lt;code&gt;SKILL.md&lt;/code&gt; short and link out to extra files in the same folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;references/&lt;/code&gt; for short docs you want to load on demand&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;assets/&lt;/code&gt; for templates (issue templates, runbook templates)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/&lt;/code&gt; for small utilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2) Keep descriptions keyword-rich
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;description&lt;/code&gt; is the discovery surface. If you want the Skill to load for DevOps/SRE workflows, include words like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incident, outage, on-call, pipeline, deployment, rollback&lt;/li&gt;
&lt;li&gt;terraform, kubernetes, azure, aws, gcp&lt;/li&gt;
&lt;li&gt;security review, compliance, audit&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3) Decide which Skills auto-load
&lt;/h3&gt;

&lt;p&gt;For teams, I recommend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-load for safe, low-risk guidance Skills (triage checklists)&lt;/li&gt;
&lt;li&gt;Manual-only for high-impact Skills that might lead to edits or deployments&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Real Examples You Can Explore
&lt;/h2&gt;

&lt;p&gt;This repo already contains a working Skill you can inspect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.github/skills/new-blog-post/SKILL.md&lt;/code&gt; in this repository&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want ready-made public examples to learn from (without relying on GitHub code search), start here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/github/awesome-copilot" rel="noopener noreferrer"&gt;https://github.com/github/awesome-copilot&lt;/a&gt; (community collection)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/anthropics/skills" rel="noopener noreferrer"&gt;https://github.com/anthropics/skills&lt;/a&gt; (reference skills)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copy any skill folder into &lt;code&gt;.github/skills/&lt;/code&gt;, then tweak the wording and guardrails until it matches how your team works.&lt;/p&gt;

&lt;p&gt;If you want to find more public examples on GitHub, search for the folder pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;path:.github/skills SKILL.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that GitHub code search may require you to sign in.&lt;/p&gt;

&lt;p&gt;For the authoritative reference, see the VS Code documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/copilot/customization/agent-skills" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/copilot/customization/agent-skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Tips for Adoption in DevOps Teams
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with one runbook&lt;/strong&gt;: pick a repetitive task (CI triage) and ship one Skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat Skills as code&lt;/strong&gt;: version them, review changes, keep them short and intentional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure outcomes&lt;/strong&gt;: shorter time to triage, fewer repeated mistakes, better incident updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it safe&lt;/strong&gt;: do not turn every Skill into an autonomous actor. Default to guidance and checklists.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot Skills are a practical way to turn the workflows in your head into something your whole team can reuse. For DevOps and SREs, that means more consistent triage, better runbooks, and faster, calmer incident response.&lt;/p&gt;

&lt;p&gt;If you want, I can also turn the example &lt;code&gt;incident-triage&lt;/code&gt; Skill into a full folder with templates and a lightweight script so you can drop it straight into &lt;code&gt;.github/skills/&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;em&gt;Author&lt;/em&gt;
&lt;/h3&gt;


&lt;div class="ltag__user ltag__user__id__620034"&gt;
    &lt;a href="/pwd9000" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F620034%2F93be2c72-3a13-478e-8af1-a4bedc1b2331.jpeg" alt="pwd9000 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pwd9000"&gt;Marcel.Lupo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pwd9000"&gt;Microsoft MVP in DevTech - DevOps | DevOps Architect | Technical speaker focused on Microsoft technologies, Agentic AI, IaC &amp;amp; automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Like, share, follow me on: 🐙 &lt;a href="https://github.com/Pwd9000-ML" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | 🐧 &lt;a href="https://x.com/pwd9000" rel="noopener noreferrer"&gt;X&lt;/a&gt; | 👾 &lt;a href="https://www.linkedin.com/in/marcel-pwd9000/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Date: 24-02-2026&lt;/p&gt;

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