{"json_class":"Feedjira::Parser::Atom","@title":"The GitHub Blog","@description":"Updates, ideas, and inspiration from GitHub to help developers build and design software.","@url":"https://github.blog/","@links":["https://github.blog/","https://github.blog/all.atom"],"@feed_url":"https://github.blog/all.atom","@icon":"https://github.blog/wp-content/uploads/2019/01/cropped-github-favicon-512.png?fit=32%2C32","@entries":[{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"How we built an internal data analytics agent","@url":"https://github.blog/ai-and-ml/github-copilot/how-we-built-an-internal-data-analytics-agent/","@links":["https://github.blog/ai-and-ml/github-copilot/how-we-built-an-internal-data-analytics-agent/"],"@entry_id":"https://github.blog/?p=96857","@updated":{"json_class":"Time","s":1781813884,"n":0},"@published":{"json_class":"Time","s":1781884800,"n":0},"@categories":["AI & ML","GitHub Copilot","AI agents","GitHub Copilot CLI"],"@summary":"<p>Qubot, our internal Copilot-powered analytics agent, allows any GitHub employee to ask questions about our data in plain language. Here's what we learned as we built it.</p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/how-we-built-an-internal-data-analytics-agent/\">How we built an internal data analytics agent</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">Large data and analytics organizations often struggle to make access to data and insights truly self-serve. The industry tried to solve this problem, quite unsuccessfully, for decades, but now AI is giving us a credible way to do just that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">At GitHub scale, providing dedicated analytics support to dozens of product teams is challenging, and therefore many teams are left to solve this problem on their own. Though there is a lot of valuable product telemetry that product and engineering teams can use to make decisions, figuring out which data model, which grain, which filter, and then write the query and validate the result has always been difficult without the support of a data analyst.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Enter Qubot, our internal GitHub Copilot-powered analytics agent. Qubot allows any Hubber (that&rsquo;s what we call GitHub employees) to ask questions about any data model in GitHub&rsquo;s data warehouse in plain language and get an answer within seconds.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Qubot is not a reporting tool or a dashboard replacement. Instead, it&rsquo;s intended for exploratory questions like &ldquo;Which cohort of users has the highest retention on this feature?&rdquo; or &ldquo;What product contributed to move this metric the most last week?&rdquo; Qubot has zero cost maintenance and helps teams ramp up quickly on datasets they may be unfamiliar with.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In this blog post, we&rsquo;ll go over how we built Qubot, how it&rsquo;s changed, and what we learned.</p>\n\n\n\n<h2 id=\"h-how-qubot-works\" class=\"wp-block-heading\">How Qubot works</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The architecture has three main components: user interface, context layer, and query engine.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" height=\"753\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/architecture.png?resize=1024%2C753\" alt=\"Diagram showing the architecture of the Qubot analytics agent. Context and users feed into Qubot, which references Trino and Kusto for answers.\" class=\"wp-image-96860\" srcset=\"https://github.blog/wp-content/uploads/2026/06/architecture.png?w=1774 1774w, https://github.blog/wp-content/uploads/2026/06/architecture.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/architecture.png?w=768 768w, https://github.blog/wp-content/uploads/2026/06/architecture.png?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/architecture.png?w=1536 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" /></figure>\n\n\n\n<h3 id=\"h-user-interface\" class=\"wp-block-heading\">User interface</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Qubot is accessible through Slack, VS Code, and the Copilot CLI. The Slack interface doesn&rsquo;t require any configuration, and it is the preferred collaboration tool of Hubbers. When someone posts a question in the Qubot Slack channel, a Qubot instance is spawned as a Copilot Cloud Agent running on github.com. The answer is provided directly in Slack, allowing the user to share the result with others, but also iterate in the thread to evolve or refine the question. All the results are also stored as a markdown report in a pull request that the user can reference to fine tune the query or use it in a dashboard.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Qubot is also available in VS Code and the Copilot CLI, for users that want an experience more integrated with their workflows. Qubot can be installed with one command as a plugin, and it becomes available in any agent session in VS Code or Copilot CLI alongside any other custom agents, skills, and tools configured by the user.</p>\n\n\n\n<h3 id=\"h-context-layer\" class=\"wp-block-heading\">Context layer</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Our data warehouse contains data at different stages of curation: raw events (bronze), conformed facts and dimensions (silver), and curated datasets designed for specific business use cases (gold). The context layer is built in a federated way, with knowledge that is tailored to the type of data.</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>For bronze data, we have telemetry context contributed by product teams, with schema information and metadata.</li>\n\n\n\n<li>For silver data, we have examples of queries, usage guidance, mandatory filters etc, maintained by the data and analytics team.</li>\n\n\n\n<li>For gold data, we have business rules and metric definitions, contributed by teams owning those datasets.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">We also leverage our ETL pipelines to systematically enrich the context layer with additional signals and derived metadata. The context is loaded at runtime via the GitHub MCP Server, fetching it from the context layer.</p>\n\n\n\n<h3 id=\"h-context-agent\" class=\"wp-block-heading\">Context agent</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The context layer is constantly enriched with new knowledge persisted across multiple repositories. At GitHub, we primarily use markdown for documentation, so we don&rsquo;t need to interface with multiple different tools.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We&rsquo;ve streamlined federated context contribution through a context agent. Teams can contribute via a standardized template or by referencing a repository containing relevant context. The agent then ingests, organizes, and normalizes this information into a structured format that has proven effective for Qubot based on our evaluations.</p>\n\n\n\n<h3 id=\"h-evaluation-framework\" class=\"wp-block-heading\">Evaluation framework</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every change to the context layer or agent configuration gets evaluated before it ships. When someone wants to enrich the context layer with new knowledge, they can open a pull request. The new context goes through an offline eval framework that measures accuracy of the response, latency in finding the right answer, and catches regressions before they reach users.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The benchmarking framework for evaluating Qubot across structured test cases has three components:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Test cases</strong>: A curated dataset of prompts with known correct answers, ground-truth SQL, and metadata (domain, difficulty).</li>\n\n\n\n<li><strong>Automated run orchestration</strong>: A script that automates launching each test case as an agent task with the GitHub CLI <code>gh agent-task create</code>, runs multiple parallel trials, polls for completion, and saves detailed JSON results.</li>\n\n\n\n<li><strong>Stats aggregation</strong>: A reporting script that reads the saved results and computes per-test-case metrics: completion rate, accuracy, and duration (avg/min/max).</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">The end-to-end flow is: define test cases &rarr; run Qubot N times per case &rarr; collect results &rarr; aggregate stats &rarr; compare configurations.</p>\n\n\n\n<h3 id=\"h-query-engine\" class=\"wp-block-heading\">Query engine</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Qubot connects to both Kusto and Trino, the two query engines that power most of GitHub&rsquo;s analytics workloads, via a MCP server. We developed a custom implementation of the Trino MCP server, while for Kusto we deployed a local version of the Fabric RTI <a href=\"https://learn.microsoft.com/en-us/fabric/real-time-intelligence/mcp-overview\">MCP Server</a>. Kusto is fast and well-suited to exploratory questions over recent event data. Trino handles complex joins and deeper historical analysis.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Rather than forcing users to know which to use, Qubot defaults to Kusto and switches to Trino automatically when the question requires it.</p>\n\n\n\n<h2 id=\"h-what-changed-and-what-we-learned\" class=\"wp-block-heading\">What changed, and what we learned</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Qubot has been widely adopted at GitHub, with hundreds of enthusiastic users running thousands of queries. The number of questions that Hubbers ask in the data and analytics Slack channels has reduced dramatically, because now they can explore the data with greater autonomy and reach out only for complicated questions. It also allows Hubbers that never dared to dip into the data warehouse to access the data they need to drive their decision making. That is one of the reasons for offering multiple interfaces like Slack, Copilot CLI, and VS Code; Hubbers are very technical, but we wanted to offer an option with no barrier to entry and zero configuration.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We quickly discovered that the context layer is key to enriching the reasoning capabilities of Copilot and to create an expert analytics agent. In our experiments we found that structured and well curated context not only makes Qubot more accurate, but also three times faster at returning the right answer. This has profound implications on the analytics engineering discipline, because it makes this type of artifact a first class citizen in how data is modeled, rather than an afterthought.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Qubot has been a rare example of successful hub-and-spoke execution. It removes strain from the data and analytics team, as product teams own the telemetry for their surfaces and business teams own the definition of their gold data. Qubot acted as a gravitational force to centralize all this distributed knowledge into a single tool that can benefit all GitHub, providing incentives to partner teams to contribute to Qubot, instead of creating multiple tools limited to their own domains.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h3 id=\"h-acknowledgements\" class=\"wp-block-heading\">Acknowledgements </h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Qubot engineering team</strong>: Weijie Tan, Tobias Tschuemperlin, Vamsi Anamaneni</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Special thanks</strong>: Yaswanth Anantharaju</p>\n</body></html>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/how-we-built-an-internal-data-analytics-agent/\">How we built an internal data analytics agent</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"How pull request limits are cutting down the noise","@url":"https://github.blog/open-source/maintainers/how-pull-request-limits-are-cutting-down-the-noise/","@links":["https://github.blog/open-source/maintainers/how-pull-request-limits-are-cutting-down-the-noise/"],"@entry_id":"https://github.blog/?p=96841","@updated":{"json_class":"Time","s":1781734471,"n":0},"@published":{"json_class":"Time","s":1781798400,"n":0},"@categories":["Maintainers","Open Source","maintainers","open source","pull requests"],"@summary":"<p>Learn how pull request limits can help manage contribution volume in your repositories, and see what’s next on the roadmap.</p>\n<p>The post <a href=\"https://github.blog/open-source/maintainers/how-pull-request-limits-are-cutting-down-the-noise/\">How pull request limits are cutting down the noise</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">More people are contributing to open source than ever, most of them trying to help. The challenge is keeping up with the volume. Creating a pull request has never been easier. Reviewing one still takes a human about as long as it ever did. When great contributions and low-quality noise land in the same queue, the ones that deserve attention are harder to find.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That&rsquo;s why we&rsquo;ve introduced pull request limits. It takes on the problem we hear most: too many incoming pull requests, too much low-quality noise, and too few ways to manage the flow.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-it-works\">How it works</h2>\n\n\n\n<p class=\"wp-block-paragraph\">A pull request limit sets the maximum number of pull requests a user without write access can have open at once in your repository. Hit the limit, and you must close or merge one before opening another. Pull requests opened by Copilot or another AI agent will counts toward your limit. Trusted contributors can be placed on a bypass list, where they are exempted from limits, but don&rsquo;t gain full contributor access. Draft pull requests will not count towards your limit.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" height=\"566\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/608690507-ead99df1-2879-43d6-8f5b-f04431eeefcf.jpg?resize=1024%2C566\" alt=\"A screenshot of the 'Moderation options menu' open to the 'Interaction limits' submenu, with 'Pull request limits' at the top. The checkbox 'Limit open pull requests from users without write access' is selected.\" class=\"wp-image-96844\" srcset=\"https://github.blog/wp-content/uploads/2026/06/608690507-ead99df1-2879-43d6-8f5b-f04431eeefcf.jpg?w=2064 2064w, https://github.blog/wp-content/uploads/2026/06/608690507-ead99df1-2879-43d6-8f5b-f04431eeefcf.jpg?w=300 300w, https://github.blog/wp-content/uploads/2026/06/608690507-ead99df1-2879-43d6-8f5b-f04431eeefcf.jpg?w=768 768w, https://github.blog/wp-content/uploads/2026/06/608690507-ead99df1-2879-43d6-8f5b-f04431eeefcf.jpg?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/608690507-ead99df1-2879-43d6-8f5b-f04431eeefcf.jpg?w=1536 1536w, https://github.blog/wp-content/uploads/2026/06/608690507-ead99df1-2879-43d6-8f5b-f04431eeefcf.jpg?w=2048 2048w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub already has interaction limits, but those are temporary cooldowns. These new pull request limits are persistent and configurable&mdash;giving maintainers the control they told us they were missing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A cap also changes how contributors behave. When anyone can open a pull request in seconds, a polished change and a rough draft look the same in the queue. But when only a few pull requests can be open at once, a contributor must be selective and prioritize which contributions they want to be reviewed. That first judgment call happens before the pull request reaches you, and a smaller pool makes good work easier to spot.</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">It&rsquo;s helped us want to review pull requests again. Knowing that someone hasn&rsquo;t just opened 5&ndash;10 pull requests that are slop makes it much easier to want to look. Going forward we expect it to help us manage our backlog and ensure the things people are working on are the things we need.</p>\n<cite>Nicholas Tindle, AutoGPT</cite></blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">This feature is great. We&rsquo;ve had problems on Homebrew for a while with enthusiastic users submitting many pull requests that need near identical review. AI further accelerated it. This allows us to still have outside contribution and maintainers contribute more while gating users to a level of pull requests we can cope with.</p>\n<cite>Mike McQuaid, Homebrew</cite></blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">At OpenClaw we get a huge volume of pull requests from the community and had to build our own bots for fighting spam. We are super glad GitHub has been able to develop out-of-the-box solutions for maintainers now to manage this volume.</p>\n<cite>Vincent Koc, OpenClaw</cite></blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-the-cost-to-create-outran-the-cost-to-review\">The cost to create outran the cost to review</h2>\n\n\n\n<p class=\"wp-block-paragraph\">These limits are especially crucial right now because of a change in the ecosystem. In January 2023, developers merged about 25 million pull requests a month across GitHub. Today that number tops 90 million&mdash;a roughly 3.6x increase. More people are building in the open than at any point in GitHub&rsquo;s history.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Most contributions come in good faith, and even good-faith work can pile up faster than one volunteer can answer. In February, we wrote that open source was hitting its own <a href=\"https://github.blog/open-source/maintainers/welcome-to-the-eternal-september-of-open-source-heres-what-we-plan-to-do-for-maintainers/\">Eternal September</a>. A pull request limit gives maintainers some of that attention back, without closing the door on the next contributor.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-s-coming-next-more-controls-for-managing-contributions\">What&rsquo;s coming next: More controls for managing contributions</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pull request limits are just the first step. The same feedback is pointed straight at what comes after: more flexible, more granular control over how contributions flow in.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Archiving pull requests (shipping soon)</strong>: Repository admins will be able to archive pull requests, hiding low-quality or spammy pull requests out of the main pull request view. Archived pull requests stay accessible to admins, but can be filtered out of the default list. We chose archive over delete on purpose: some organizations can&rsquo;t permanently delete pull requests for legal or compliance reasons, and many maintainers want to keep them for context.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Issue limits (in development)</strong>: The controls you now have on pull requests will be applied to issues: per-repository caps on how many open issues a user without write access can have at once, with a bypass list, plus an option to restrict issue creation to collaborators.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Smarter bypass signals (up next)</strong>: The goal is less manual trust management. Instead of curating a bypass list by hand, you could let contributors clear a limit automatically based on real signals: a previously merged pull request in the repo, account age, or organization membership. That frees maintainers from curating lists by hand and gives them more time to focus on the work itself.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cross-repository controls (exploring)</strong>: A per-repository cap helps with repeated activity in one project, but it does nothing when someone opens pull requests across hundreds of repositories at once. We&rsquo;re exploring ways to catch contributors who spray pull requests across multiple repositories, whether through trust signals, rate limiting, or other cross-repository controls.&#8239;</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-thank-you\">Thank you</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open source runs on the people who show up every day. To everyone who reviews pull requests late at night, mentors a first-time contributor, triages a backlog, files issues, or tells us where our tools fall short: thank you. You shaped this feature, and your input is critical in helping us decide what comes next. We&rsquo;ll keep building with you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Try the pull request limit in your repository settings, and <a href=\"https://github.com/orgs/community/discussions/198851\">tell us where it helps and where it doesn&rsquo;t</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">See you in the pull request queue. &#129505;</p>\n</body></html>\n<p>The post <a href=\"https://github.blog/open-source/maintainers/how-pull-request-limits-are-cutting-down-the-noise/\">How pull request limits are cutting down the noise</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"Getting more from each token: How Copilot improves context handling and model routing","@url":"https://github.blog/ai-and-ml/github-copilot/getting-more-from-each-token-how-copilot-improves-context-handling-and-model-routing/","@links":["https://github.blog/ai-and-ml/github-copilot/getting-more-from-each-token-how-copilot-improves-context-handling-and-model-routing/"],"@entry_id":"https://github.blog/?p=96832","@updated":{"json_class":"Time","s":1781803402,"n":0},"@published":{"json_class":"Time","s":1781725306,"n":0},"@categories":["AI & ML","GitHub Copilot"],"@summary":"<p>How GitHub Copilot is making more of each session go toward useful work, so your credits go further.</p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/getting-more-from-each-token-how-copilot-improves-context-handling-and-model-routing/\">Getting more from each token: How Copilot improves context handling and model routing</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">As Copilot takes on more agentic work, from planning and editing to debugging, reviewing, and calling tools across longer sessions, efficiency means more than using fewer tokens. It means being smarter about how you use them.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Increasing efficiency starts with reducing what Copilot has to repeat from turn to turn, including context, tool definitions, and cached state. It continues with choosing the right model for the job. A quick explanation, a focused edit, and a complex multi-file change should not all be treated the same way.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We are working on both: improving the Copilot harness so more of each session goes toward the task itself, and expanding Auto so Copilot can pick the model that fits the work without asking developers to make that choice every time. This post focuses on harness improvements in GitHub Copilot for VS Code and on ongoing work to expand Auto across Copilot surfaces.</p>\n\n\n\n<h2 id=\"h-increased-prompt-caching-and-deferred-tools\" class=\"wp-block-heading\">Increased prompt caching and deferred tools</h2>\n\n\n\n<p class=\"wp-block-paragraph\">In longer GitHub Copilot sessions in VS Code, the harness prepares a lot of recurring information for the model: instructions, repository context, conversation history, available tools, and the current state of the task. Some of that context is needed. Some of it can be cached, deferred, or loaded only when it becomes relevant.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Two improvements in GitHub Copilot for VS Code are doing most of the work here. Prompt caching helps Copilot reuse model state for repeated prompt prefixes instead of recomputing the same prefix on every request. Tool search lets the model load tool definitions on demand, instead of sending every full tool schema into context on every turn.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That matters more as agents use more tools. A session may need access to MCP tools, terminal commands, file operations, workspace search, and product-specific actions. Loading every full tool definition up front adds fixed cost to each turn, even when only a small number of tools are relevant to the task. With tool search, Copilot can keep the available toolset broad while sending less unnecessary tool schema into the model.</p>\n\n\n\n<p class=\"wp-block-paragraph\">For a deeper technical look at the implementation, including prompt caching, cache-control breakpoints, provider-specific tool search, and how these changes work across long-running agentic sessions, read <a href=\"https://aka.ms/vscode/blog/token-efficiency\">the VS Code technical deep dive</a>.</p>\n\n\n\n<h2 id=\"h-where-github-copilot-auto-model-selection-fits-in\" class=\"wp-block-heading\">Where GitHub Copilot auto model selection fits in</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Auto answers a practical question: which model is the best fit for this task right now?</p>\n\n\n\n<p class=\"wp-block-paragraph\">After your first prompt, Copilot uses task intent and current model health to choose a model that best fits the task. Different kinds of work, like quick explanations, focused edits, or multi-file changes, do not all benefit from the same level of reasoning, so Auto makes that call without requiring you to tune model settings.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In our evaluations, no single model consistently performed best across tasks. In many cases, a more efficient model reached the same outcome, while stronger models mattered most when the task required deeper reasoning. Auto learns where stronger reasoning improves the result. It routes up when the task demands it and stays more efficient when it does not. The goal is not to trade quality for cost, but to use the model that best fits the work.</p>\n\n\n\n<h2 id=\"h-how-auto-selects-the-right-model\" class=\"wp-block-heading\">How Auto selects the right model</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Auto combines two signals: what model is healthy and available right now, and what kind of work Copilot is being asked to do.</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Real-time model health:</strong> a dynamic engine tracks model availability, utilization, speed, error rates, and cost. A model may be capable of handling a task, but that does not mean it is the best choice at that moment. Auto takes current system conditions into account so Copilot can route to a model that is both capable and ready to respond.</li>\n\n\n\n<li><strong>Task-aware routing with <a href=\"https://arxiv.org/pdf/2605.17106\">HyDRA</a>:</strong> a routing model that considers factors like reasoning depth, code complexity, debugging difficulty, and tool orchestration needs. HyDRA identifies models that can meet the quality bar for the task, then chooses the best fit among them.</li>\n</ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" height=\"576\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/608776889-fa214f25-8231-4b9f-a0cc-9eff3cbb1be8.png?resize=1024%2C576\" alt=\"Chart shows HyDRA quality vs cost savings across a 5 model production pool. Three HyDRA operating points illustrate tunability: (peak) exceeds Sonnet at 12.9% savings; (agg.) balances quality for 72.5% savings.&#8239; \" class=\"wp-image-96835\" srcset=\"https://github.blog/wp-content/uploads/2026/06/608776889-fa214f25-8231-4b9f-a0cc-9eff3cbb1be8.png?w=1920 1920w, https://github.blog/wp-content/uploads/2026/06/608776889-fa214f25-8231-4b9f-a0cc-9eff3cbb1be8.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/608776889-fa214f25-8231-4b9f-a0cc-9eff3cbb1be8.png?w=768 768w, https://github.blog/wp-content/uploads/2026/06/608776889-fa214f25-8231-4b9f-a0cc-9eff3cbb1be8.png?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/608776889-fa214f25-8231-4b9f-a0cc-9eff3cbb1be8.png?w=1536 1536w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" /><figcaption class=\"wp-element-caption\">Figure 1: Three HyDRA operating points illustrate tunability: (Peak) exceeds Sonnet at 12.9% savings; (Agg.) balances quality for 72.5% savings.</figcaption></figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" height=\"576\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/608777067-4addfe82-4e15-4bca-ab71-907abbe0579e.png?resize=1024%2C576\" alt=\"Chart showing quality and cost tradeoffs of HyDRA and other published research and commercial routers using SWEBench benchmarks. HyDRA (Cons.) ties OpenRouter Auto on resolution rate (70.8%) at 3.3x the savings. HyDRA (Aggr.) outperforms both Azure Foundry operating modes.&#8239;\" class=\"wp-image-96836\" srcset=\"https://github.blog/wp-content/uploads/2026/06/608777067-4addfe82-4e15-4bca-ab71-907abbe0579e.png?w=1920 1920w, https://github.blog/wp-content/uploads/2026/06/608777067-4addfe82-4e15-4bca-ab71-907abbe0579e.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/608777067-4addfe82-4e15-4bca-ab71-907abbe0579e.png?w=768 768w, https://github.blog/wp-content/uploads/2026/06/608777067-4addfe82-4e15-4bca-ab71-907abbe0579e.png?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/608777067-4addfe82-4e15-4bca-ab71-907abbe0579e.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" /><figcaption class=\"wp-element-caption\">Figure 2: HyDRA (Cons.) ties OpenRouter Auto on resolution rate (70.8%) at 3.3x the savings. HyDRA (Agg.) outperforms both Azure Foundry operating modes.</figcaption></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Taken together, these signals let Auto avoid a one-size-fits-all approach. The point is not to send every task to the biggest model, or every task to the cheapest one. It is to choose the model that fits the work.</p>\n\n\n\n<h2 id=\"h-making-auto-work-in-practice\" class=\"wp-block-heading\">Making Auto work in practice</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Getting routing right in evaluations is only part of the problem. To make Auto useful in real workflows, we also had to account for how developers actually use Copilot: conversations get longer, context builds up, tasks shift, and developers work in many languages.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cache-aware routing.</strong> Switching models on every turn may sound flexible, but it can work against efficiency. When a conversation stays on the same model, the prompt prefix can be cached and reused across turns. Switching models mid-conversation breaks that cache, which can cost more than the routing change saves. Auto avoids that by routing at natural cache boundaries: on the first turn, when there is no cache to lose, and after compaction, when Copilot summarizes older turns and the prompt prefix resets. Between those points, the selected model stays in place so the cache can keep building.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Routing across languages.</strong> Copilot serves developers around the world, so routing has to work in languages other than English. We trained the routing model on conversations across 16 language families, including CJK, European, and others. In evaluations, routing accuracy stayed within four points of the English baseline across language groups, with no statistically significant quality gap.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" height=\"576\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/605338236-0e8f7a05-ba70-4471-806c-65aba753c914.png?resize=1024%2C576\" alt=\"Chart showing the efficacy of high reasoning, low reasoning, and Auto across English, European, CJK, and other script families. Evaluation is based on an evaluation set sampled from production VS Code chat telemetry across 19 languages.\" class=\"wp-image-96837\" srcset=\"https://github.blog/wp-content/uploads/2026/06/605338236-0e8f7a05-ba70-4471-806c-65aba753c914.png?w=1920 1920w, https://github.blog/wp-content/uploads/2026/06/605338236-0e8f7a05-ba70-4471-806c-65aba753c914.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/605338236-0e8f7a05-ba70-4471-806c-65aba753c914.png?w=768 768w, https://github.blog/wp-content/uploads/2026/06/605338236-0e8f7a05-ba70-4471-806c-65aba753c914.png?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/605338236-0e8f7a05-ba70-4471-806c-65aba753c914.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" /><figcaption class=\"wp-element-caption\">Figure 3: Intelligent routing stays within 4 points of English baseline. Model evaluations across English, European, CJK, and other script families, based on a held out evaluation set sampled from production VS Code chat telemetry across 19 languages.</figcaption></figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Learning when escalation matters.</strong> Instead of labeling tasks as simply &ldquo;easy&rdquo; or &ldquo;hard,&rdquo; we trained the router to learn where models actually diverge. For each training query, responses from a less capable model and a more capable model are scored across quality dimensions. The router learns when the stronger model adds value, and when a more efficient model can produce an equally good result. For context-dependent messages in longer agentic sessions, the router is trained on complete multi-turn conversations, including the original user intent, recent assistant responses, and conversation metadata.</p>\n\n\n\n<h2 id=\"h-auto-with-task-intent-is-expanding\" class=\"wp-block-heading\">Auto with task intent is expanding</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Auto with task intent is already live in Visual Studio Code, github.com, and mobile. It gives Copilot more signal about the kind of work you are doing, whether that is coding, debugging, planning, or using tools, so it can make a better model choice for the task.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We are continuing to expand that experience across Copilot. Next, we are bringing Auto with task intent to more surfaces and adding more ways for teams to make Auto the default.</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Auto with task intent is coming to Copilot CLI, GitHub App, and additional IDEs.</li>\n\n\n\n<li>Copilot Free and Student plans will be simplified to leverage Auto as the only model selection option.</li>\n\n\n\n<li>Admin controls will let organizations set Auto as the default or enforce Auto as the only option.</li>\n</ul>\n\n\n\n<h2 id=\"h-getting-more-value-from-your-ai-credits\" class=\"wp-block-heading\">Getting more value from your AI credits</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Copilot is getting more efficient by default, but a few habits can help your credits go further.</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Start with Auto.</strong> Auto is the strong default for many tasks because it chooses a model based on what you are trying to do, without making you pick one manually every time.</li>\n\n\n\n<li><strong>Keep context focused.</strong> Start a new session when you switch tasks, compact long-running sessions when needed, and mention the files you want Copilot to use when you already know where the relevant code lives. Less unnecessary context means more of the session goes toward the actual work.</li>\n\n\n\n<li><strong>Avoid changing models or settings mid-session.</strong> Switching models, reasoning levels, context size, or tool configuration can break cache reuse and make Copilot rebuild context. Set up the session the way you want it, then keep related work together.</li>\n\n\n\n<li><strong>Plan before parallelizing.</strong> For larger tasks, ask Copilot to plan first. Parallel agents can be useful when work can truly be split up, but they also consume credits in parallel, so use them deliberately.</li>\n\n\n\n<li><strong>Use only the tools you need.</strong> Tools and MCP servers are powerful, but broad toolsets can add extra context. Enable what is relevant to the task and turn off what you do not need. Check out <a href=\"https://aka.ms/agent-finder/changelog\">agent finder in GitHub Copilot</a> to help streamline your tool usage.</li>\n\n\n\n<li><strong>Check your usage.</strong> Your AI usage page shows where credits are going across features and models. In Copilot CLI, session-level usage can also help you spot expensive patterns while you work.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">For the full guide, see <a href=\"https://docs.github.com/en/copilot/how-tos/manage-and-track-spending/manage-company-spending\">How to get more out of your AI credits</a>.</p>\n\n\n\n<h2 id=\"h-get-started\" class=\"wp-block-heading\">Get started</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Auto model selection is available today across supported Copilot experiences. To learn more, see the <a href=\"https://docs.github.com/en/copilot/concepts/auto-model-selection\">Auto model selection docs</a>. You can also share feedback in <a href=\"https://github.com/orgs/community/discussions/categories/copilot-conversations\">Copilot discussions</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We are continuing to make Copilot more efficient across the system so more of your credits go toward useful work, without requiring you to tune every model choice yourself.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>This post contains contributions from Nhu Do and Aashna Garg.</em></p>\n\n\n\n<p class=\"wp-block-paragraph\"></p>\n</body></html>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/getting-more-from-each-token-how-copilot-improves-context-handling-and-model-routing/\">Getting more from each token: How Copilot improves context handling and model routing</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"What are git worktrees, and why should I use them?","@url":"https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/","@links":["https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/"],"@entry_id":"https://github.blog/?p=96793","@updated":{"json_class":"Time","s":1781711623,"n":0},"@published":{"json_class":"Time","s":1781643534,"n":0},"@categories":["AI & ML","Git","GitHub Copilot","git worktrees","GitHub Copilot app"],"@summary":"<p>Git worktrees have been around since 2015, but it wasn't until recently they became popular. Learn what they are, how to use them, and why you might.</p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/\">What are git worktrees, and why should I use them?</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">It seems like the latest hotness in git these days is the concept of worktrees. Which&hellip; is kind of funny because they&rsquo;ve been around since 2015.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But, nevertheless, they are cool, and you might be wondering why you&rsquo;d use them, how they differ from branches, and why they are suddenly so popular.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&rsquo;s talk about it!</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-context-switching-with-branches-and-stashing\">Context switching with branches and stashing</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let&rsquo;s say you lived in a worktree-less world, and were working on a ticket, and suddenly an urgent bug came to you and you had to switch contexts.</p>\n\n\n\n<p class=\"wp-block-paragraph\">First, you might stash your work:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>git stash \"wip feature login\" </code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value='git stash \"wip feature login\"' tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">Then you&rsquo;d switch to your main branch and update:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>git checkout main \ngit pull origin main</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"git checkout main \ngit pull origin main\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">Then make a bugfix branch:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>git checkout -b hotfix-bug</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"git checkout -b hotfix-bug\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">Then you&rsquo;d fix everything, commit, and push the branch:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>git add . \ngit commit -m \"fix broken submit button\" \ngit push origin hotfix-bug</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value='git add . \ngit commit -m \"fix broken submit button\" \ngit push origin hotfix-bug' tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">Then after merging a pull request, you might return back to your computer and pull main and remove the bug branch:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>git checkout main \ngit pull origin main \ngit branch -d hotfix-bug </code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"git checkout main \ngit pull origin main \ngit branch -d hotfix-bug\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">And then you could go back to the feature you were working on:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>git checkout feature-login \ngit stash pop</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"git checkout feature-login \ngit stash pop\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">Phew. Where were we?</p>\n\n\n\n<p class=\"wp-block-paragraph\">The mental overhead of switching around, reloading files, reinstalling <code>node_modules</code> based on whatever changed, and so on, is a lot. The context switching burden is heavy.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, this is a basic example, but sometimes developers would work around this kind of chaos with doing some more complicated <code>git stash</code> commands, or even multiple clones of the same repo (I&rsquo;m guilty of that one).</p>\n\n\n\n<p class=\"wp-block-paragraph\">Until&hellip; worktrees!</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-context-switching-with-worktrees\">Context switching with worktrees</h2>\n\n\n\n<p class=\"wp-block-paragraph\">With worktrees, you never leave your branch and you never stash, and your editor context for your original feature stays untouched.</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>git worktree add ../hotfix-workspace -b hotfix-bug main</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"git worktree add ../hotfix-workspace -b hotfix-bug main\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">This instantly creates a sibling folder called <code>hotfix-workspace</code>, and bases it on main, and checks out a new branch called <code>hotfix-bug</code>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now you can open that folder in a new editor window (or <code>cd</code> into it) and fix the bug. Your original editor window stays exactly as you left it.</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>cd ../hotfix-workspace \n# ...fix fix fix... \ngit add . \ngit commit -m \"fix broken submit button\" \ngit push origin hotfix-bug</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value='cd ../hotfix-workspace \n# ...fix fix fix... \ngit add . \ngit commit -m \"fix broken submit button\" \ngit push origin hotfix-bug' tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">You merge the pull request online just like before, and once it&rsquo;s merged, you can simply delete the temporary folder.</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code language-plaintext\"><code>cd ../main-project \ngit worktree remove ../hotfix-workspace</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"cd ../main-project \ngit worktree remove ../hotfix-workspace\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">This is so much smoother! Worktrees can go beyond the git command line, too. For example, <a href=\"https://code.visualstudio.com/docs/sourcecontrol/branches-worktrees#_working-with-git-worktrees\" target=\"_blank\" rel=\"noreferrer noopener\">VS Code has full worktree support built in</a>. You have options! And no matter where you work, worktrees give you zero risk of stash conflicts, there&rsquo;s no editor disruption, and you can truly work in parallel.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-so-why-now\">So&hellip; why now?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">For a really long time, worktrees were relatively unknown. Most developers had never heard of them, because either Git GUIs didn&rsquo;t support them (or treated them as second-class citizens), or because they just usually followed the known pattern of feature branch, then work, then PR, then merge, then repeat.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, our work as developers has changed. AI has made us work in parallel more than we ever have before in the history of software development. Developers run so many sessions in parallel, and &ldquo;code review culture&rdquo; is growing beyond &ldquo;code writing culture.&rdquo;</p>\n\n\n\n<p class=\"wp-block-paragraph\">Agents and humans can do more in parallel with worktrees. It&rsquo;s the default mode for the <a href=\"https://github.com/features/ai/github-app?utm_source=blog-git-worktree&amp;utm_medium=blog&amp;utm_campaign=github-copilot-app-ga-2026\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub Copilot app</a>, and for many other modern tools.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-s-the-catch\">What&rsquo;s the catch?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Worktrees do solve a whole lot of issues, but there&rsquo;s definitely some things to watch out for.</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dependency bloat: each worktree folder requires its own copy of your project dependencies. If you&rsquo;re running <code>npm install</code> or <code>pip install</code> across multiple of them, your computer might get very full, very quickly.</li>\n\n\n\n<li>Folder management: you have to delete the worktree folders, to avoid cluttering your parent directory over time. Apps like the GitHub Copilot app do often handle this for you, but it&rsquo;s still something you might have to do yourself if you&rsquo;re operating in the terminal yourself.</li>\n\n\n\n<li>Global <code>.gitignore</code> requirements: if you create worktree folders inside your main repo directory, you have to manually add them to <code>.gitignore</code> to not accidentally track them. You <em>can</em> make these worktrees outside of your main repo (and many apps do that by default), but it&rsquo;s worth noting.</li>\n\n\n\n<li>One branch limits: Git prevents you from checking out the exact same branch in two different worktrees at the same time to prevent data corruption.</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-do-i-use-worktrees-in-the-github-copilot-app\">How do I use worktrees in the GitHub Copilot app?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Great question! What&rsquo;s awesome is they &ldquo;just work&rdquo; out of the box. When you open the app, there&rsquo;s a dropdown that asks you where you want to run your new session on the home screen. The default is a new worktree.</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"819\" src=\"https://github.blog/wp-content/uploads/2026/06/Screenshot-2026-06-16-at-1.35.20-PM.png?resize=924%2C819\" alt=\"Screenshot of the 'New worktree' dropdown in the GitHub Copilot app. Options are 'New worktree', 'Local repository', or 'Cloud.'\" class=\"wp-image-96798\" srcset=\"https://github.blog/wp-content/uploads/2026/06/Screenshot-2026-06-16-at-1.35.20-PM.png?w=924 924w, https://github.blog/wp-content/uploads/2026/06/Screenshot-2026-06-16-at-1.35.20-PM.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/Screenshot-2026-06-16-at-1.35.20-PM.png?w=768 768w\" sizes=\"auto, (max-width: 924px) 100vw, 924px\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Then, once you kick off a new session, you can click the session name at the top of the app, and you&rsquo;ll see the (fun!) generated name of your worktree, as well as the path where it&rsquo;s located, the project that worktree is for, and details about the changes that you&rsquo;ve made.</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"877\" height=\"331\" src=\"https://github.blog/wp-content/uploads/2026/06/Screenshot-2026-06-16-at-1.36.45-PM.png?resize=877%2C331\" alt=\"Screenshot of the worktree generated in the previous step.\" class=\"wp-image-96799\" srcset=\"https://github.blog/wp-content/uploads/2026/06/Screenshot-2026-06-16-at-1.36.45-PM.png?w=877 877w, https://github.blog/wp-content/uploads/2026/06/Screenshot-2026-06-16-at-1.36.45-PM.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/Screenshot-2026-06-16-at-1.36.45-PM.png?w=768 768w\" sizes=\"auto, (max-width: 877px) 100vw, 877px\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Easy peasy lemon squeezy!</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-should-i-use-worktrees\">Should I use worktrees?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">I will give you the most senior developer answer I can: It depends! You might prefer working in one way or another. You might not do as much work in parallel and like the mental model of branches and stashing. You might only do worktrees from now on. You might want to do both!</p>\n\n\n\n<p class=\"wp-block-paragraph\">The world&rsquo;s your oyster, and you can try them all in the <a href=\"https://github.com/features/ai/github-app?utm_source=blog-git-worktree&amp;utm_medium=blog&amp;utm_campaign=github-copilot-app-ga-2026\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub Copilot app</a> today.</p>\n</body></html>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/\">What are git worktrees, and why should I use them?</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"GitHub Copilot CLI for Beginners: Overview of common slash commands","@url":"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-overview-of-common-slash-commands/","@links":["https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-overview-of-common-slash-commands/"],"@entry_id":"https://github.blog/?p=96773","@updated":{"json_class":"Time","s":1781554534,"n":0},"@published":{"json_class":"Time","s":1781554531,"n":0},"@categories":["AI & ML","GitHub Copilot","GitHub Copilot CLI","GitHub Copilot CLI for Beginners"],"@summary":"<p>GitHub Copilot CLI for Beginners: Learn how to use slash commands to control your terminal AI agent.</p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-overview-of-common-slash-commands/\">GitHub Copilot CLI for Beginners: Overview of common slash commands</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">Welcome back to GitHub Copilot CLI for Beginners! In this series (available in <a href=\"https://www.youtube.com/playlist?list=PL0lo9MOBetEHvO-spzKBAITkkTqv4RvNl\">video</a> and <a href=\"https://github.blog/tag/github-copilot-cli-for-beginners/\">blog</a> format), we&rsquo;ll give you everything you need to get started using <a href=\"https://github.com/features/copilot/cli?utm_source=blog-cli-beginners-ep1-features-cta&amp;utm_medium=blog&amp;utm_campaign=dev-pod-copilot-cli-2026\">GitHub Copilot CLI</a>. So far in this series, we&rsquo;ve covered <a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli/\">how to get started</a> and <a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-interactive-v-non-interactive-mode/\">when to use interactive and non-interactive modes</a>. In this edition, we&rsquo;ll learn what slash commands are, why they matter, and how to use slash commands to control GitHub Copilot efficiently. You can complete tasks like switching models, checking token usage, and resuming past sessions right from your terminal.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&rsquo;s dive in!</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-understanding-slash-commands-in-github-copilot-cli\">Understanding slash commands in GitHub Copilot CLI</h2>\n\n\n\n<p class=\"wp-block-paragraph\">When working in Copilot CLI, one of the most powerful concepts to learn early on is <strong>slash commands.</strong> Slash commands are built-in controls that you can access directly from the command line. Acting as your control surface within Copilot CLI, slash commands allow you to:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Guide Copilot&rsquo;s behavior</li>\n\n\n\n<li>Inspect changes</li>\n\n\n\n<li>Manage context</li>\n\n\n\n<li>Move efficiently across sessions and projects</li>\n\n\n\n<li>Keep permissions tidy</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Slash commands can be thought of as your command center for interacting with Copilot CLI. To look at all of the options available, just type <code>/</code> in the command line for a scrollable list of all currently supported slash commands.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&rsquo;s take a look at some of the most popular ones.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-choosing-the-right-model\">Choosing the right model</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Different models are optimized for different kinds of work. If you want to switch models, type <code>/model</code> into the command line. This will display a list of available models, along with key details like:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Capabilities</strong>: Some are better for quick, lightweight tasks like refactoring, while others more efficiently handle deeper reasoning such as feature planning.</li>\n\n\n\n<li><strong>Availability</strong>: The list may vary depending on your plan or organization&rsquo;s settings.</li>\n\n\n\n<li><strong>Cost</strong>: Numbers shown on the right of each model indicate cost multiplier, helping you choose the right balance between performance and usage in relation to your plan.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Choosing the right model can significantly impact both speed and results.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-managing-context-and-token-usage\">Managing context and token usage</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Copilot CLI operates within a context window, which determines how much information it can &ldquo;remember&rdquo; during a session. If you want to check your current usage, type <code>/context</code> to learn how many tokens you have left, along with system usage and available buffer.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you find that you&rsquo;re running low on space, you can free up space by typing <code>/compact</code> in the command line. This summarizes your current conversation so you can continue without having to start a new session. Copilot CLI will do this automatically when you approach the limit, but you can also do this manually if you want to transition to a new task or clean up context mid-session.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&rsquo;d rather start fresh and completely reset your environment, you can use <code>/clear</code> to clear the session entirely.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-working-across-sessions\">Working across sessions</h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to resume a previous session, you can type <code>/resume</code>. This will bring up a list of previous sessions you&rsquo;ve had, including both local and remote sessions. Entering a previous session will show you your session history, and you can pick up right where you left off.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-inspecting-changes\">Inspecting changes</h2>\n\n\n\n<p class=\"wp-block-paragraph\">As you work with Copilot to make changes to your project, it&rsquo;s important to keep track of what&rsquo;s changed. If you want to see what the changes are, run <code>/diff</code> to see recent updates. This gives you a clear view of what modifications were made during your session, so you can validate changes before moving forward.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-navigating-projects-and-directories\">Navigating projects and directories</h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to work across repositories or directories, you don&rsquo;t have to exit Copilot. You can type <code>/cwd</code> to change your working directory to another repository. This allows you to scope Copilot&rsquo;s work to a specific part of your project and helps you stay efficient while multitasking across codebases.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-managing-tool-permissions\">Managing tool permissions</h2>\n\n\n\n<p class=\"wp-block-paragraph\">In the past, you might have granted Copilot CLI permission to perform actions like editing files. Say you&rsquo;re switching to a repository you want to be more careful in and want to reset those permissions: you can do so by running <code>/reset-allowed-tools</code>.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-take-this-with-you\">Take this with you</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Using these slash commands gives you even better control over Copilot CLI&mdash;and the more familiar you become with them, the more deliberate your workflow becomes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Whether you&rsquo;re switching models, managing context, or navigating across projects, using slash commands in CLI gives you the tools you need to stay in control. And if you haven&rsquo;t already: open up your terminal, type <code>/</code>, and explore! There are many more slash commands to discover.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Happy coding!</p>\n\n\n\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><strong>Looking to try GitHub Copilot CLI?</strong> <a href=\"https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli\">Read the docs</a> and <a href=\"https://github.com/features/copilot/cli?utm_source=blog-cli-beginners-ep1-features-cta&amp;utm_medium=blog&amp;utm_campaign=dev-pod-copilot-cli-2026\">get started</a> today.</p>\n</div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>More resources to explore:</strong></p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://www.youtube.com/playlist?list=PL0lo9MOBetEHvO-spzKBAITkkTqv4RvNl\">GitHub Copilot CLI for Beginners video series</a></li>\n\n\n\n<li><a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-getting-started-with-github-copilot-cli/?utm_source=blog-announcement-cli-tutorial&amp;utm_medium=blog&amp;utm_campaign=universe25post\">GitHub Copilot CLI for Beginners: Getting started with GitHub Copilot CLI</a></li>\n\n\n\n<li><a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-interactive-v-non-interactive-mode/\">GitHub Copilot CLI for Beginners: Interactive v. non-interactive mode</a></li>\n\n\n\n<li><a href=\"https://github.blog/ai-and-ml/github-copilot-cli-101-how-to-use-github-copilot-from-the-command-line/?utm_source=blog-announcement-cli-tutorial&amp;utm_medium=blog&amp;utm_campaign=universe25post\">GitHub Copilot CLI 101: How to use GitHub Copilot from the command line</a></li>\n\n\n\n<li><a href=\"https://docs.github.com/en/copilot/how-tos/copilot-cli/cli-best-practices?utm_campaign=copilot-brand&amp;utm_medium=sem&amp;utm_source=google&amp;ocid=AIDcmmh2h80ugd_SEM__k_CjwKCAjw-dfOBhAjEiwAq0RwI0TIeyL9bjDmXlY26JKPbDvHGzBcaZUa4LR8u8SJuGbIke6e7U2YXRoCzGQQAvD_BwE_k_\">Best practices for GitHub Copilot CLI</a></li>\n</ul>\n</body></html>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/github-copilot-cli-for-beginners-overview-of-common-slash-commands/\">GitHub Copilot CLI for Beginners: Overview of common slash commands</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"Accelerating researchers and developers building multilingual AI with a new open dataset","@url":"https://github.blog/ai-and-ml/llms/accelerating-researchers-and-developers-building-multilingual-ai-with-a-new-open-dataset/","@links":["https://github.blog/ai-and-ml/llms/accelerating-researchers-and-developers-building-multilingual-ai-with-a-new-open-dataset/"],"@entry_id":"https://github.blog/?p=96776","@updated":{"json_class":"Time","s":1781551052,"n":0},"@published":{"json_class":"Time","s":1781551050,"n":0},"@categories":["AI & ML","LLMs"],"@summary":"<p>A new repository-level dataset, published on GitHub under CC0-1.0, helps researchers and developers discover multilingual developer content across READMEs, issues, and pull requests.</p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/llms/accelerating-researchers-and-developers-building-multilingual-ai-with-a-new-open-dataset/\">Accelerating researchers and developers building multilingual AI with a new open dataset</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">Software may be written in programming languages, but human language is at the heart of developer collaboration. Developers explain how projects work in READMEs. They ask for help in issues. They review, debate, and improve code in pull requests. That collaboration often happens in English&mdash;but not always. As AI becomes a bigger part of how developers build software, multilingual developer content matters more than ever.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Today, GitHub is publishing the <strong>GitHub Multilingual Repositories Dataset</strong>, a repository-level metadata dataset designed to help researchers and developers discover public GitHub repositories with evidence of non-English natural-language content. When building the dataset, we found that language distribution differs across READMEs, issues and pull requests: Korean is the most common non-English language in issue text, but only the fifth-most common in READMEs. Portuguese tops the non-English README list with more than 3 million repositories.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The dataset is now available on <a href=\"https://github.com/github/multilingual-repositories\">GitHub</a> under CC0-1.0. It follows through on a commitment we made in 2025, as part of <a href=\"https://blogs.microsoft.com/on-the-issues/2025/07/20/eudigitalunlock/\">Microsoft&rsquo;s European Digital Commitments,</a> to make multilingual data more accessible, including to open source AI developers.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-s-in-the-dataset\">What&rsquo;s in the dataset</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The GitHub Multilingual Repositories Dataset is intentionally not a dump of repository content. Instead, it is a metadata dataset that helps developers and researchers find repositories where multilingual collaboration may be happening. The dataset covers <strong>over 80 million classification rows across more than 40 million repositories</strong>. For each public repository, we provide:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Language classifications of the README, the most-commented issue, and the most-commented pull request, with the first 150 characters of each used as the input sample. We exclude texts under 20 characters.</li>\n\n\n\n<li>Classifications for each text source, from <a href=\"https://fasttext.cc/\">fastText</a>, <a href=\"https://github.com/google/cld3\">gcld3</a>, and <a href=\"https://github.com/pemistahl/lingua-py\">lingua-py</a>, each with a confidence score. The dataset only includes classifications with &gt;0.5 confidence.</li>\n\n\n\n<li>Repository metadata: creation timestamp, disk usage, stars, forks, primary programming language, SPDX license, issue and pull request counts, and the snapshot date.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">We deliberately did not collapse the three classifiers into a single label. Different classifiers have different coverage and confidence calibration, especially for lower-resource languages. By exposing all three, we let you decide how strict you want to be. Want a high-precision Greek subset? Require all three classifiers to agree above some confidence threshold. Want broad recall for an exploratory study of Romance languages? One classifier may be enough.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-you-can-build-with-it\">What you can build with it</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The dataset is designed for the kind of work that&rsquo;s hard to do with general web text:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Discover</strong> repositories likely to contain developer documentation or collaboration in specific languages.</li>\n\n\n\n<li><strong>Study</strong> how non-English developer communities use issues, pull requests, and READMEs.</li>\n\n\n\n<li><strong>Build</strong> evaluation sets for AI coding tools, doc generators, or review assistants that need to behave well across languages.</li>\n\n\n\n<li><strong>Encourage</strong> decision-makers to expand language coverage for new developer tools and AI features using data-backed arguments on the rich multilingual diversity of developers.</li>\n\n\n\n<li><strong>Measure</strong> representation of European and other underrepresented languages in open source.</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-some-caveats\">Some caveats</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Language identification is hard, especially in software repositories. Repository text is often short. It may include badges, templates, installation commands, code snippets, usernames, or mixed-language content. A 150-character sample may not represent the whole repository. Classifiers also vary in coverage and calibration, especially for lower-resource languages.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That is why the dataset should not be treated as a ground-truth benchmark for language identification. Instead, it is designed as a transparent discovery tool. Users can inspect classifications, confidence scores, and sources, then choose the precision and recall tradeoffs that fit their own research or development workflow.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The dataset also should not be used to infer sensitive attributes about repository owners, contributors, or communities. The signals are repository-level metadata, not person-level attributes.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-why-open-multilingual-data-matters\">Why open multilingual data matters</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Today, many European languages remain underrepresented in the online text used to build and evaluate AI systems. That creates a risk that AI tools work well for some developers, languages, and communities, while leaving others behind. Open data can help close that gap. We built this dataset because developer content is different from general web text. READMEs, issues, and pull requests contain the language of software collaboration: installation instructions, bug reports, feature requests, review comments, and community norms. That context can help build AI systems that better understand how developers actually work.</p>\n\n\n\n<p class=\"wp-block-paragraph\">By making multilingual developer-content signals easier to find and analyze, this dataset gives researchers, open source developers, and model builders another tool for studying language representation in software development. It can help identify gaps, support better evaluation, and inform more inclusive AI tools for developers across Europe and beyond. It also reflects a broader principle: Building AI for developers should include the communities, languages, and workflows developers actually use.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-s-next\">What&rsquo;s next</h2>\n\n\n\n<p class=\"wp-block-paragraph\">We&rsquo;ll be discussing the dataset, and the broader importance of open data for multilingual AI, at the <a href=\"https://www.microsoft.com/en-eu/european-policy/events/open-innovation-dialogue-hub/default.aspx\">Open Innovation Dialogue Hub</a> in Strasbourg on June 16. The event is co-organized by the Microsoft Open Innovation Center, the Council of Europe, and GitHub, and will bring together policymakers, researchers, cultural institutions, and open innovation leaders to discuss AI, linguistic diversity, cultural heritage, and open data.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Multilingual AI needs multilingual developer communities. We hope this dataset helps more people study, support, and build for them. By releasing it under CC0-1.0 on GitHub, we&rsquo;re inviting researchers, open source maintainers, and model builders to use it, critique it, extend it, and build evaluation sets and tools on top of it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you do something interesting with it, <a href=\"https://github.com/github/multilingual-repositories/discussions\">we&rsquo;d love to hear about it</a>.</p>\n</body></html>\n<p>The post <a href=\"https://github.blog/ai-and-ml/llms/accelerating-researchers-and-developers-building-multilingual-ai-with-a-new-open-dataset/\">Accelerating researchers and developers building multilingual AI with a new open dataset</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Dylan Birtolo","@title_type":"html","@raw_title":"How we made GitHub Copilot CLI more selective about delegation","@url":"https://github.blog/ai-and-ml/how-we-made-github-copilot-cli-more-selective-about-delegation/","@links":["https://github.blog/ai-and-ml/how-we-made-github-copilot-cli-more-selective-about-delegation/"],"@entry_id":"https://github.blog/?p=96755","@updated":{"json_class":"Time","s":1781303185,"n":0},"@published":{"json_class":"Time","s":1781303183,"n":0},"@categories":["AI & ML","GitHub Copilot","AI agents","coding agent","GitHub Copilot CLI"],"@summary":"<p>Better orchestration, fewer handoffs, faster progress, without a single new knob.</p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/how-we-made-github-copilot-cli-more-selective-about-delegation/\">How we made GitHub Copilot CLI more selective about delegation</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">In agentic systems, more delegation isn&rsquo;t always better. Imagine asking Copilot CLI to make a simple change. Instead of handling it directly, it spins up a helper agent that searches the repository, waits on a result, and stalls. Work that should have taken one step now takes three. While some tasks genuinely benefit from a specialist subagent&mdash;like exploring an unfamiliar repository, checking an independent area of the code, or running a long command while the main agent keeps moving&mdash;delegation isn&rsquo;t free. Every handoff adds coordination overhead, tool calls, and wait time. If an agent delegates too eagerly, the &ldquo;help&rdquo; can become friction.&nbsp;&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">We recently released an improvement to our agentic harness called smarter subagent delegation. This makes Copilot CLI more selective by helping the main agent: &nbsp;</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stay focused when it can move faster on its own.</li>\n\n\n\n<li>Delegate when a specialist creates real leverage.</li>\n\n\n\n<li>Parallelize work when tasks are truly independent.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Smarter subagent delegation has now rolled out to 100% of Copilot CLI production traffic. If you want to get started today, simply update GitHub Copilot CLI by running&#8239;the <code>/update</code> command&#8239;in your terminal to version 1.0.42 or later.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">In a production A/B test, this improvement reduced tool failures per session by <strong>23%</strong>, including a <strong>27% </strong>reduction in search tool failures and an <strong>18%</strong> reduction in edit tool failures. It also improved total user wait time by <strong>5%</strong> at P95 and <strong>3%</strong> at P75, with <strong>no quality regression</strong>. Here, P95 captures wait time near the slowest 5% of sessions, while P75 reflects wait time toward the slower end of typical sessions. This means fewer unnecessary handoffs, fewer repeated searches, fewer failure-prone tool paths, and less waiting during long-running coding tasks.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">In this post, we&rsquo;ll walk through how we identified unnecessary delegation in Copilot CLI, what we changed to make delegation more selective, and how we validated those changes through offline evaluation and production A/B testing. We&rsquo;ll also show why those changes led to fewer failures and less waiting&mdash;and what that looks like for developers using Copilot CLI day to day.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h2 wp-block-paragraph\">The problem: Delegation is powerful, but not free</p>\n\n\n\n<p class=\"wp-block-paragraph\">Subagents are one of the most important capabilities in an agentic CLI. They let Copilot break down complex work, run investigations in parallel, and keep the main agent focused on coordinating the final answer. For large codebases and multi-step engineering tasks, that can be the difference between a slow linear workflow and an efficient parallel one.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">But delegation introduces its own failure modes:&nbsp;</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unnecessary handoffs for simple tasks that the main agent could complete faster on its own.&nbsp;</li>\n\n\n\n<li>Overuse of exploration subagents when the handoff already contains enough context.</li>\n\n\n\n<li>Repeated or overlapping searches across the main agent and subagents.&nbsp;</li>\n\n\n\n<li>Sequential delegation, where the main agent waits for a subagent instead of treating delegation as an opportunity for parallel work.&nbsp;</li>\n\n\n\n<li>Failure-prone subagent paths, including stale file paths, moved files, incorrect relative paths, and workspace mismatches.&nbsp;&nbsp;</li>\n</ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"432\" src=\"https://github.blog/wp-content/uploads/2026/06/fig1-tool-failures.gif?resize=768%2C432\" alt=\"Animated Copilot CLI session showing unnecessary subagent delegation. The main agent idles while multiple subagents repeat searches, use stale or ambiguous file paths, and accumulate tool failures, increasing from 0 to 5.\" class=\"wp-image-96756\"><figcaption class=\"wp-element-caption\"><em>Figure 1. Example: tool call failure by subagents while main agent is idling.</em>&nbsp;</figcaption></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Our goal: help developers use subagents when they create leverage, avoid them when they add overhead, and parallelize work when the task genuinely benefits from independent execution.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h2 wp-block-paragraph\">From problem signals to shipped improvement</p>\n\n\n\n<p class=\"wp-block-paragraph\">The way we identified the problem became the way we solved it. Instead of treating agent trajectory analysis, product changes, evaluation, and rollout as separate activities, we used them as one feedback loop: observe the agent behavior, isolate the orchestration bottleneck, make a targeted change, validate it offline, measure it online, and ship only once the end-to-end workflow improved.&nbsp;</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" height=\"425\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/fig2-slide-4-diagram.png?resize=1024%2C425\" alt=\"Flow diagram of the smarter subagent delegation improvement loop: analyze initial signals from telemetry, A/B experiments, human side-by-side reviews, and agent comparison evals; create offline evals; make a product change; validate offline and online; then release when results are good. Dashed arrows show feedback loops for bad changes and online disagreements.\" class=\"wp-image-96757\" srcset=\"https://github.blog/wp-content/uploads/2026/06/fig2-slide-4-diagram.png?w=3280 3280w, https://github.blog/wp-content/uploads/2026/06/fig2-slide-4-diagram.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/fig2-slide-4-diagram.png?w=768 768w, https://github.blog/wp-content/uploads/2026/06/fig2-slide-4-diagram.png?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/fig2-slide-4-diagram.png?w=1536 1536w, https://github.blog/wp-content/uploads/2026/06/fig2-slide-4-diagram.png?w=2048 2048w, https://github.blog/wp-content/uploads/2026/06/fig2-slide-4-diagram.png?w=3000 3000w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" /><figcaption class=\"wp-element-caption\"><em>Figure 2. The end-to-end improvement loop: analyze, change, validate, and ship.</em></figcaption></figure>\n\n\n\n<p class=\"is-typography-preset-h3 wp-block-paragraph\">1. Analyze: Let LLMs identify the delegation bottleneck</p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of manually reviewing agent sessions, we used LLMs to analyze full trajectories and identify where orchestration was helping versus where it was adding overhead. That analysis surfaced a consistent pattern: subagents were sometimes being invoked for tasks that were already narrow, obvious, or fully described in the handoff.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">In those cases, the subagent could spend time re-searching the repository even though the main agent already had enough context to act directly. That clarified the improvement target: keep simple discovery-and-edit tasks in the main agent, and reserve subagents for work that is broader, cross-cutting, or naturally parallelizable.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h3 wp-block-paragraph\">2. Change: Refine the orchestration policy</p>\n\n\n\n<p class=\"wp-block-paragraph\">After identifying the bottleneck, we used LLMs to help translate that diagnosis into a more selective orchestration policy.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Copilot CLI should handle focused work directly: find a file, read it, make a targeted change, and verify it. Delegation is more useful when the work requires independent context, broad exploration, or parallel execution.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In practice, that means starting with the narrowest effective path, escalating when complexity or uncertainty creates value, and stepping back down when the task becomes focused again. Subagents should be treated as a parallelism tool, not a pause button. When Copilot launches a subagent, the main agent should continue making progress on independent work rather than simply waiting for the result.</p>\n\n\n\n<p class=\"wp-block-paragraph\">When a subagent is used, the handoff should also be specific: what the user asked, what is already known, what the subagent owns, and what kind of result the main agent needs back.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h3 wp-block-paragraph\">3. Validate: Test offline, confirm online, then ship</p>\n\n\n\n<p class=\"wp-block-paragraph\">Before broad rollout, we validated the change with automatically generated regression cases and existing benchmarks. This helped confirm that the new delegation guidance reduced avoidable overhead without breaking cases where subagents genuinely add value.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, we moved through staff and public A/B testing, then analyzed production metrics across reliability, responsiveness, subagent workload, and quality. The gains did not come primarily from making individual LLM calls faster. Instead, it reduced orchestration overhead by avoiding unnecessary subagent paths and lowering subagent workload per user.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">That end-to-end process let us move from problem signal to shipped improvement while keeping the user experience stable: fewer avoidable handoffs, fewer failure-prone tool paths, and no quality regression.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h2 wp-block-paragraph\">Outcomes</p>\n\n\n\n<p class=\"wp-block-paragraph\">After rolling smarter subagent delegation to production traffic, we saw measurable percentage improvements across reliability and responsiveness (Table 1):&nbsp;</p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Dimension</th><th>Metric</th><th>Delta</th></tr></thead><tbody><tr><td>Reliability<strong>&nbsp;</strong></td><td>Tool failures per session&nbsp;</td><td>23% reduction&nbsp;</td></tr><tr><td>Reliability&nbsp;</td><td>Search tool failures</td><td>27% reduction</td></tr><tr><td>Reliability</td><td>Edit tool failures</td><td>18% reduction</td></tr><tr><td>Responsiveness</td><td>Total user wait time at P95</td><td>5% lower</td></tr><tr><td>Responsiveness</td><td>Total user wait time at P75</td><td>3% lower</td></tr><tr><td>Quality</td><td>Quality metrics</td><td>No regression</td></tr></tbody></table><figcaption class=\"wp-element-caption\">Table 1. Production A/B test outcomes</figcaption></figure>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metric</th><th>Delta vs. control</th><th>Interpretation</th></tr></thead><tbody><tr><td>Failed raw subagent search calls</td><td>15% reduction</td><td>Reliability &ndash; fewer failure-prone subagent search paths.</td></tr><tr><td>Average subagent LLM duration per user</td><td>12% lower</td><td>Responsiveness &ndash; reduced orchestration overhead per user.</td></tr><tr><td>P95 subagent LLM duration per user</td><td>18% lower</td><td>Responsiveness &ndash; better worst-case subagent overhead.</td></tr></tbody></table><figcaption class=\"wp-element-caption\">Table 2. Directional agent trajectory analysis behind the A/B test outcome</figcaption></figure>\n\n\n\n<p class=\"wp-block-paragraph\">These results show that better orchestration can improve the developer experience even when the visible feature surface doesn&rsquo;t change. By teaching Copilot CLI when to delegate, when not to delegate, and how to parallelize the right work, we reduced friction in the agent loop itself.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">That is the power of GitHub Copilot as a system: the experience gets better not because developers are given more switches to manage, but because Copilot becomes better at allocating models, tools, and subagents behind the scenes.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h2 wp-block-paragraph\">How this benefits developers today</p>\n\n\n\n<p class=\"wp-block-paragraph\">For developers using Copilot CLI, this should feel like a smoother day-to-day experience. Straightforward tasks are more likely to be handled directly, complex tasks still get specialist help when it adds value, and long-running sessions keep moving with less unnecessary waiting. In practice, Copilot CLI becomes more efficient and less noisy without asking developers to work differently.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">The change is intentionally behind the scenes. Your workflow stays the same, but Copilot CLI is better at coordinating the work: fewer unnecessary handoffs, less repeated search work, fewer failed tool paths, and faster progress on long-running or multi-step tasks.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h2 wp-block-paragraph\">What&rsquo;s next</p>\n\n\n\n<p class=\"wp-block-paragraph\">This work is one step toward our larger goal of improving how Copilot CLI chooses the right model, agent, and tools across your workflow. While having more agents and models available expands what Copilot can do, the value to developers depends on how well Copilot applies them across the work they are already doing, like reading files, running commands, and moving from an issue toward a pull request.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">As tasks become more complex, the quality of that orchestration matters more. The best system is not the one that delegates the most, but the one that knows when to act directly, when to delegate, and how to keep work moving without adding friction.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">The next step is making Copilot CLI more adaptive across models, agents, skills, and tools, so developers don&rsquo;t have to decide whether a task needs a larger model, a specialist subagent, or a procedural skill. Copilot should make that decision based on the task, repository context, policy, and expected outcome.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">We will continue improving how Copilot CLI plans work, coordinates subagents, and measures end-to-end outcomes. That includes better visibility into main-agent and subagent behavior, deeper analysis of failure reasons, and stronger proxy metrics for orchestration quality. The goal is simple: less waiting, fewer avoidable failures, and more useful progress from every agent session.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h2 wp-block-paragraph\">Get started today and share feedback</p>\n\n\n\n<p class=\"wp-block-paragraph\">Update GitHub Copilot CLI by running&#8239;the <code>/update</code> command&#8239;in your terminal to version 1.0.42 or later.&nbsp;&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">Already tried it? We&rsquo;d love to hear what you think. Share feedback with the&#8239;<code>/feedback</code>&#8239;command in a CLI session or open an issue in&#8239;<a href=\"https://github.com/github/copilot-cli?utm_source=changelog-cli-repo&amp;utm_medium=changelog&amp;utm_campaign=msbuild-2026\" target=\"_blank\" rel=\"noreferrer noopener\">our public repository</a>.&nbsp;</p>\n\n\n\n<p class=\"is-typography-preset-h2 wp-block-paragraph\">Acknowledgements</p>\n\n\n\n<p class=\"wp-block-paragraph\">Smarter subagent delegation was made possible by collaboration across Code|AI, Copilot CLI, experimentation, human evaluation, and product teams. Thanks to everyone who helped identify the problem, design the process, validate the outcome, and ship the improvement to production.&nbsp;</p>\n</body></html>\n<p>The post <a href=\"https://github.blog/ai-and-ml/how-we-made-github-copilot-cli-more-selective-about-delegation/\">How we made GitHub Copilot CLI more selective about delegation</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"GitHub availability report: May 2026","@url":"https://github.blog/news-insights/company-news/github-availability-report-may-2026/","@links":["https://github.blog/news-insights/company-news/github-availability-report-may-2026/"],"@entry_id":"https://github.blog/?p=96626","@updated":{"json_class":"Time","s":1781213418,"n":0},"@published":{"json_class":"Time","s":1781213415,"n":0},"@categories":["Company news","News & insights","GitHub Availability Report"],"@summary":"<p>In May, we experienced nine incidents that resulted in degraded performance across GitHub services.</p>\n<p>The post <a href=\"https://github.blog/news-insights/company-news/github-availability-report-may-2026/\">GitHub availability report: May 2026</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"\n<p class=\"wp-block-paragraph\">In&nbsp;<a href=\"https://github.blog/news-insights/company-news/addressing-githubs-recent-availability-issues-2/\" target=\"_blank\" rel=\"noreferrer noopener\">March</a>&nbsp;and&nbsp;<a href=\"https://github.blog/news-insights/company-news/an-update-on-github-availability/\" target=\"_blank\" rel=\"noreferrer noopener\">April</a>&nbsp;we shared updates on GitHub&#8217;s availability and infrastructure investments. As that work continues and we approach some major milestones, we wanted to start sharing more regular updates in our monthly availability reports.&nbsp;&nbsp;So&nbsp;before we dive into incidents from May,&nbsp;here’s&nbsp;how&nbsp;we’re&nbsp;tracking with&nbsp;our ongoing work to make GitHub more reliable.&nbsp;&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Our progress in making GitHub more resilient</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The short version:</strong> GitHub&#8217;s traffic is growing rapidly, driven in large part by AI-assisted and agentic development workflows, and we&#8217;ve been transforming our infrastructure to keep up with it. That means moving to Azure for elastic capacity, breaking our monolith apart into isolated services, and eliminating the shared failure points that have driven past incidents. </p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s where we stand. We&#8217;re now serving <strong>40% of monolith traffic from Azure</strong> (up from 8% in February), with Git traffic at 30% and repository replication at 99%. We&#8217;ve more than doubled our effective capacity in four months. At the same time, we&#8217;re completing the isolation of our primary database cluster: splitting users, authentication, and authorization into independent domains so that a problem in one can no longer cascade across the platform. Our new users service is fully cut over, and handling double the traffic at substantially lower database cost. Stateless authentication tokens are also rolling out, eliminating per-request database lookups that amplified pressure during traffic spikes. </p>\n\n\n\n<p class=\"wp-block-paragraph\">We are making&nbsp;structural changes that permanently remove failure modes.&nbsp;We&nbsp;acknowledge that we&nbsp;have&nbsp;work&nbsp;to do, but&nbsp;we’re&nbsp;committed to getting it done and making GitHub reliable when and where you need it. The principle guiding&nbsp;our&nbsp;decision is simple:&nbsp;<strong>availability, then capacity, then features.</strong>&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">Thanks for your partnership as we keep building GitHub&#8217;s reliability and resilience.&nbsp;</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n\n\n\n<p class=\"wp-block-paragraph\">In May, we experienced nine incidents that resulted in degraded performance across GitHub services.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 04 15:45 UTC (lasting 55 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 4, 2026, between 15:34 and 16:40 UTC, github.com experienced a service disruption that produced elevated latency and an increased rate of request failures across a broad set of customer-facing services. Total customer impact lasted approximately one hour and six minutes. </p>\n\n\n\n<p class=\"wp-block-paragraph\">The most significantly impacted service was pull requests, which was statused <code>Red</code> for the duration of peak impact. Issues, actions, webhooks, and Git operations experienced elevated latency and intermittent errors. A number of dependent services—including Codespaces, Pages, Packages, OAuth and GitHub Apps, Marketplace, and Copilot—also saw varying degrees of degraded performance due to shared data dependencies. At peak, approximately 1.3% of requests returned a 5xx response, averaging around 0.46% across the duration of the incident. </p>\n\n\n\n<p class=\"wp-block-paragraph\">The disruption was triggered by a routine online schema migration running against a large,&nbsp;heavily-accessed&nbsp;database table. The migration had been progressing without issue for several hours, but as traffic&nbsp;ramped up&nbsp;toward the weekly peak, the combined load from the migration and normal production traffic saturated database connection capacity. This produced query contention on a primary database and cascading timeouts across services that depend on it.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">The incident was detected within approximately three minutes of the first signs of impact through a combination of automated monitoring and on-call observation. Once the contributing migration was&nbsp;identified, it was paused, and dependent services recovered shortly thereafter. Time to mitigation was approximately 33 minutes, and full resolution followed approximately 30 minutes later&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">As follow-up, we are implementing several improvements to reduce the likelihood and blast radius of a similar event. Migrations against large, high-traffic tables will be more tightly aligned with low-traffic windows and will use dynamic throttling that adapts to live cluster load. We are adding automated circuit breakers that will pause in-flight migrations when latency or connection utilization on the underlying database crosses safe thresholds, and we are extending our monitoring so that migration-induced pressure (i.e., write rate, lock time, and connection saturation) triggers alerts before customer impact occurs. In parallel, we are reviewing connection-pool capacity to ensure adequate headroom is maintained while migrations are running.  </p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 05 13:37 UTC (lasting 3 hours and 49 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 06 07:19 UTC (lasting 2 hours and 25 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 5 and May 6, GitHub Actions was degraded across two related incidents affecting hosted runners. The two events were connected: remediation work performed after the May 5 incident introduced the configuration&nbsp;issue that triggered the May 6 incident.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 5, 2026, from 13:22 to 17:05 UTC, GitHub Actions hosted runners in the East US region were degraded. Approximately 13.5% of jobs requesting a standard runner failed and ~16% of requested larger runners with private networking pinned to East US failed or were delayed by more than five minutes. Copilot code review requests were also impacted. Approximately 8,500 code review requests timed out during this window. Affected users saw an error comment on their pull requests and were able to retry by rerequesting a review. Most runner requests were picked up by other regions automatically, but a portion of requests still routing to East US were impacted. </p>\n\n\n\n<p class=\"wp-block-paragraph\">This was triggered by a scale-up operation for hosted runner VMs in the East US region. This is a regular operation, but the VM create load hit an internal rate limit when VM creates pull images from storage. Existing backoff logic was not triggered&nbsp;because of&nbsp;the response code&nbsp;returned&nbsp;in this case. The rate limiting and VM creation failures were mitigated by reducing load to allow for recovery and allowing queued work to be processed. By 15:34 UTC, queued and failed job assignments were mostly mitigated, with less than 0.5% of runner assignments&nbsp;impacted&nbsp;between 15:34 and full recovery at 17:05.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 6, 2026, from 06:45 to 09:15 UTC, GitHub Actions Standard Ubuntu hosted runners were&nbsp;again&nbsp;degraded, and approximately 17.1% of jobs requesting a standard runner failed. The issue was caused by unexpected configuration data introduced during remediation work for the previous day’s incident, which blocked new allocations as daily load ramped up. We removed the problematic data at 08:51 UTC, allowing allocations to resume and runner pools to scale back up and recover.&nbsp;&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">We are improving our system&#8217;s throttling behavior when limits occur, improving our controls to&nbsp;more quickly mitigate similar situations&nbsp;in the future, and reviewing all limits end-to-end for similar operations.&nbsp;In addition, we are updating the filter logic for this allocation data to be resilient to abnormal data shapes and improving monitoring to alert when allocations are blocked, allowing the team to respond before customer impact starts.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 06 11:21 UTC (lasting 38 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 6, 2026, between 11:02 and 11:13 UTC, users were unable to start or view Copilot cloud agent or remote sessions. During this time, all requests to the session API returned errors, preventing users from creating new sessions or viewing existing ones. The issue was caused by a configuration change to the service&#8217;s network routing that inadvertently removed the ingress path for the service. The team reverted the change at 11:13 UTC which restored service. The incident remained open until 11:59 UTC while the team verified full recovery. We are taking steps to improve our deployment validation process to prevent similar configuration changes from impacting production traffic in the future. </p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 06 15:25 UTC (lasting 3 hours and 39 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 6, 2026,&nbsp;between 15:12 and 19:02 UTC,&nbsp;creation&nbsp;of new pull request review threads on&nbsp;github.com failed. This included new line comments and file comments on pull requests. Existing&nbsp;pull requests and previously created comments were unaffected.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">This incident was caused by a 32-bit integer key reaching its maximum value in a&nbsp;Vitess&nbsp;lookup table used during&nbsp;pull request&nbsp;thread creation. The primary table&nbsp;was&nbsp;migrated to a 64-bit integer key,&nbsp;but the&nbsp;Vitess&nbsp;lookup table remained 32-bit. Once the values in the primary table passed the available 32-bit ID&nbsp;space&nbsp;attempts&nbsp;to create new review threads began failing, resulting in&nbsp;a&nbsp;near 100% failure rate for new thread creation requests. We mitigated the issue by updating the impacted lookup table definitions across all shards to use 64-bit integer column types, increasing the available ID&nbsp;range,&nbsp;and restoring normal operation. Service was fully restored once the schema changes competed globally.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">To help prevent similar incidents, we are expanding existing monitoring of database columns to include&nbsp;Vitess&nbsp;lookup tables&nbsp;and&nbsp;enabling earlier detection of any tables approaching a column size limit.&nbsp;&nbsp;&nbsp;&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 07 05:02 UTC (lasting 1 hour and 54 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 7, 2026, between 04:12 and 06:13 UTC, Copilot cloud agent and Copilot code review agent sessions for pull requests were delayed or failed to start.   </p>\n\n\n\n<p class=\"wp-block-paragraph\">During the impact window, new Copilot coding agent sessions triggered by pull requests were not created, while review agent sessions dropped by ~50% from the baseline.   </p>\n\n\n\n<p class=\"wp-block-paragraph\">The issue was caused by follow-up recovery work from a separate <a href=\"https://www.githubstatus.com/incidents/f5pb5d5mr9yh\" target=\"_blank\" rel=\"noreferrer noopener\">pull request incident</a>. As part of that recovery, we ran a large database migration, which caused replication delays on several replica hosts. </p>\n\n\n\n<p class=\"wp-block-paragraph\">Although those replicas were not serving user traffic, our safeguards correctly treated the elevated replication lag as a signal to slow down writes to the affected database cluster.&nbsp;As a result, some pull request background processing was temporarily delayed.&nbsp;That processing&nbsp;is responsible for&nbsp;sending the internal events that Copilot agents use to begin work, so affected agents did not start until the database replicas caught up.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">The system recovered once replication lag returned to normal and pull request processing resumed.&nbsp;We are making critical background processing more resilient to replication&nbsp;lag&nbsp;so it degrades gracefully and keeps essential events flowing under strain, reducing the chance of similar secondary impact during future recovery work.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 15 08:13 UTC (lasting 35 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 15, 2026, from 07:43 to 08:48 UTC, GitHub Actions experienced a degradation that caused workflow runs to fail or&nbsp;experience&nbsp;delayed starts for a subset of customers. The incident was triggered by a planned failover of supporting infrastructure used by GitHub Actions. During that operation, an automated service discovery update did not propagate correctly, which caused traffic to be routed incorrectly and increased request timeouts in a core dependency for workflow orchestration.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">At peak impact, 42% of Actions runs failed. Downstream services that depend on&nbsp;Actions&nbsp;workflow execution were also&nbsp;impacted, including GitHub Pages and Copilot cloud services. At 08:12 UTC, responders manually corrected the service discovery routing issue. Timeout and failure rates recovered shortly after, and we continued&nbsp;monitoring&nbsp;until full stabilization was confirmed across all affected services. The incident was marked resolved at 08:48 UTC.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">To&nbsp;prevent recurrence, we are taking several steps. First, we are implementing failover guardrails that&nbsp;validate&nbsp;service discovery state before completing failover operations. Second, we are&nbsp;strengthening verification&nbsp;checks. Finally, we are improving dependency resilience to reduce timeout cascades during infrastructure events.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 26 10:57 UTC (lasting 2 hours and 21 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 26, 2026, between 10:40 and 12:56 UTC, GitHub Actions jobs were degraded. From 10:40 to 12:16 UTC, all newly queued runs&nbsp;failed to&nbsp;start. From 12:16 to 12:56 UTC, runs that required downloading actions for their workflows continued to fail. GitHub Pages, Copilot&nbsp;code&nbsp;review, Copilot coding agent,&nbsp;Octoshift, and GitHub Enterprise Importer were also&nbsp;impacted&nbsp;due to their dependency on&nbsp;GitHub&nbsp;Actions.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">This was caused by our automated account review system incorrectly suspending the service account used by GitHub Actions to authenticate workflow runs and download actions.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">We mitigated by restoring the account at 12:16 UTC, marking it&nbsp;exempt&nbsp;from further automated review at 12:20 UTC, and redeploying a related service at 12:48 UTC to flush cached account state. Full recovery was confirmed at 12:56 UTC.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">During this incident, a small number of&nbsp;issues,&nbsp;pull requests,&nbsp;comments, and&nbsp;discussions were marked as hidden when the service account was disabled. No data was lost. All content hidden because of this incident has been&nbsp;restored&nbsp;and full search index restoration&nbsp;was completed.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">To prevent a recurrence, we have added an allowlist of all service accounts that cannot be suspended by automated systems, and ensuring these protections are enforced consistently across all account management tooling. We are also improving diagnostic tooling for accounts and reducing cache propagation delays to shorten time to mitigate similar incidents in the future.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>May 28 19:01 UTC (lasting 1 hour and 40 minutes)</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">On May 28, 2026, between 18:27 and 20:41 UTC, the GitHub Copilot service was degraded due to an issue with the Responses API of an upstream provider affecting the GPT-5.2, GPT-5.3-Codex, GPT-5.4, and GPT-5.5 models. Requests routed to these models via the Responses API returned elevated error rates, which also affected&nbsp;Copilot coding agent and Copilot code review. No other models were&nbsp;impacted.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">We mitigated the incident by shifting traffic away from the affected models while the upstream provider deployed a fix.&nbsp;</p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub is working to improve automated failover for the affected models and strengthen monitoring to prevent similar incidents in the future. </p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n\n\n\n<p class=\"wp-block-paragraph\">Follow our <a href=\"https://www.githubstatus.com/\">status page</a> for real-time updates on status changes and post-incident recaps. To learn more about what we’re working on, check out the engineering section on the <a href=\"https://github.blog/category/engineering/\">GitHub Blog</a>.</p>\n<p>The post <a href=\"https://github.blog/news-insights/company-news/github-availability-report-may-2026/\">GitHub availability report: May 2026</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"Making secret scanning more trustworthy: Reducing false positives at scale","@url":"https://github.blog/security/making-secret-scanning-more-trustworthy-reducing-false-positives-at-scale/","@links":["https://github.blog/security/making-secret-scanning-more-trustworthy-reducing-false-positives-at-scale/"],"@entry_id":"https://github.blog/?p=96621","@updated":{"json_class":"Time","s":1780703813,"n":0},"@published":{"json_class":"Time","s":1781193600,"n":0},"@categories":["AI & ML","LLMs","Security","Secret Scanning"],"@summary":"<p>Alerts are more trustworthy and actionable when noise is reduced. See how we improved the verification step with context-aware LLM reasoning.</p>\n<p>The post <a href=\"https://github.blog/security/making-secret-scanning-more-trustworthy-reducing-false-positives-at-scale/\">Making secret scanning more trustworthy: Reducing false positives at scale</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">Secret scanning plays a critical role in protecting developers and organizations. It helps catch exposed credentials early and prevents small mistakes from turning into real incidents.</p>\n\n\n\n<p class=\"wp-block-paragraph\">At GitHub&rsquo;s scale, even small inefficiencies create real friction. Too many false positives make alerts harder to trust.</p>\n\n\n\n<p class=\"wp-block-paragraph\">When alerts feel noisy, developers spend more time triaging and less time fixing real issues. Over time, this slows down remediation and reduces confidence in the system.</p>\n\n\n\n<p class=\"wp-block-paragraph\">To address this challenge, GitHub collaborated with Microsoft Security &amp; AI&rsquo;s Agents Offense team to bring more contextual reasoning into GitHub&rsquo;s secret scanning verification. The collaboration applied the verification approach from Agentic Secret Finder, a broader detection and verification system developed to understand potential secrets in context, not just whether they match a secret-like pattern. This helped GitHub explore ways to reduce low-value alerts while preserving the coverage you expect from secret scanning.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-secret-scanning-at-github-today\">Secret scanning at GitHub today</h2>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub secret scanning combines pattern-based detection with AI-based detection to identify potential secrets. Pattern-based detection catches known secret formats, such as partner patterns for tokens and API keys. AI-powered generic secret detection expands coverage to unstructured secrets like passwords that don&rsquo;t match a known provider pattern.</p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub already has industry-leading precision for provider-pattern secret detection at massive scale, processing billions of pushes and protecting tens of millions of developers across millions of repositories.</p>\n\n\n\n<p class=\"wp-block-paragraph\">As GitHub expanded into AI-powered secret detection, the next challenge was bringing the precision of AI-detected secrets closer to the same high standard as provider-pattern detections. This collaboration focused on combining GitHub&rsquo;s large-scale detection pipeline with LLM-based contextual verification to improve alert quality and developer trust.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-our-approach-make-secret-scanning-alerts-trustworthy\">Our approach: Make secret scanning alerts trustworthy</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Secret scanning is most useful when you can quickly tell which alerts need action.</p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub already has safeguards to reduce noise, but some secret-like values need more context to determine whether they represent a real exposure. To make those alerts easier to trust, we added more reasoning to the verification step.</p>\n\n\n\n<p class=\"wp-block-paragraph\">By looking at how a detected value appears in code, the system can better separate real exposures from values that only look sensitive. This helps you spend less time investigating low-value alerts and more time fixing the issues that matter.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" height=\"576\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/blog-post-1.png?resize=1024%2C576\" alt=\"Flow chart showing GitHub's existing verification step is enhanced with context-aware reasoning to improve precision changing detection. The flow is AI based detection &gt; Candidate Secrets &gt; Verification LLM reasoning &gt; High-confidence alerts.\" class=\"wp-image-96622\" srcset=\"https://github.blog/wp-content/uploads/2026/06/blog-post-1.png?w=1820 1820w, https://github.blog/wp-content/uploads/2026/06/blog-post-1.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/blog-post-1.png?w=768 768w, https://github.blog/wp-content/uploads/2026/06/blog-post-1.png?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/blog-post-1.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" /></figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-where-this-fits-in-the-pipeline\">Where this fits in the pipeline</h2>\n\n\n\n<p class=\"wp-block-paragraph\">This approach builds directly on the existing system. Detection continues to generate candidates, and the verification step evaluates them. More context-awareness makes this system better at distinguishing real secrets from noise.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The result is higher precision without changing upstream detection logic or reducing coverage.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-it-works\">How it works</h2>\n\n\n\n<p class=\"wp-block-paragraph\">A key challenge in verification is deciding what context to provide.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A small snippet of code is often not enough to determine whether something is a real secret. At the same time, passing entire files or repositories introduces too much noise and increases cost and latency.</p>\n\n\n\n<p class=\"purple-text text-gradient-purple-coral wp-block-paragraph\" style=\"margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40)\">Instead of giving more context, we&rsquo;re giving better context.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Rather than send large amounts of code, we extract a small set of high-signal information that helps explain how the value is used. For example, we look for cases where a value is assigned to a variable and later passed into an API request, authentication header, database client, or cloud SDK call. Pattern matching can tell us that a value looks like a secret, but it can&rsquo;t tell us whether the value is actually being used as one. The surrounding usage context helps the model distinguish real exposures from false alarms, such as random UUIDs or opaque strings, without reviewing the full file or repository.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" height=\"576\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/blog-post-2.png?resize=1024%2C576\" alt=\"A table showing 'More context' such as entire file/repository, high noise, is not preferred to 'Better context' of usage signals, execution paths. This provides a focused input.\" class=\"wp-image-96623\" srcset=\"https://github.blog/wp-content/uploads/2026/06/blog-post-2.png?w=1820 1820w, https://github.blog/wp-content/uploads/2026/06/blog-post-2.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/blog-post-2.png?w=768 768w, https://github.blog/wp-content/uploads/2026/06/blog-post-2.png?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/blog-post-2.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" /></figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-focused-context-not-more-data\">Focused context, not more data</h2>\n\n\n\n<p class=\"wp-block-paragraph\">It&rsquo;s natural to assume that improving accuracy requires analyzing more of the codebase. But the opposite is true.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Most false positives can be resolved with focused, file-level context. What matters is not how much code the model sees, but whether it has the right signals.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In many cases, you can determine whether a value is a real secret by looking at how it is used within a single file. Values that resemble placeholders, test data, or unused configuration can often be filtered out without deeper analysis.</p>\n\n\n\n<p class=\"wp-block-paragraph\">This keeps the system both effective and practical: high accuracy, low latency, and the ability to scale across large codebases.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-results-reducing-false-positives-in-practice\">Results: reducing false positives in practice</h2>\n\n\n\n<p class=\"wp-block-paragraph\">We evaluated this approach on hundreds of customer-confirmed false positive alerts.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Our target was a 65% reduction. The result was 75.76%, exceeding that goal while maintaining strong detection performance.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In practice, this means significantly less noise and a higher proportion of alerts that require action.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" height=\"576\" width=\"1024\" src=\"https://github.blog/wp-content/uploads/2026/06/blog-post-3.png?resize=1024%2C576\" alt=\"False positive reduction based on 1,500 customer-confirmed false positive alerts reached 75.76%.\" class=\"wp-image-96624\" srcset=\"https://github.blog/wp-content/uploads/2026/06/blog-post-3.png?w=1820 1820w, https://github.blog/wp-content/uploads/2026/06/blog-post-3.png?w=300 300w, https://github.blog/wp-content/uploads/2026/06/blog-post-3.png?w=768 768w, https://github.blog/wp-content/uploads/2026/06/blog-post-3.png?w=1024 1024w, https://github.blog/wp-content/uploads/2026/06/blog-post-3.png?w=1536 1536w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" /><figcaption class=\"wp-element-caption\">False positive reduction results based on hundreds of customer-confirmed false positive alerts.</figcaption></figure>\n\n\n\n<p class=\"wp-block-paragraph\">This improvement shows up directly in the developer experience. With fewer irrelevant alerts, it becomes easier to trust what you see. Less time is spent triaging noise, and real issues can be prioritized and fixed faster.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-s-next\">What&rsquo;s next</h2>\n\n\n\n<p class=\"wp-block-paragraph\">We&rsquo;re continuing to evaluate this approach on larger datasets and live traffic, while improving how context is extracted and used for verification.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Reducing false positives has been a consistent need at scale. This work focuses on improving signal quality where it matters most, making alerts easier to trust and act on.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The goal is simple: fewer distractions, clearer signals, and faster action on real risks.</p>\n\n\n\n<div class=\"wp-block-group post-content-cta has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><strong>Get started</strong> by <a href=\"https://github.com/get_started?with=risk-assessment&amp;ref_product=code-scanning&amp;ref_type=engagement&amp;ref_style=button\">running the risk assessment for your organization</a> today, or <a href=\"https://docs.github.com/en/code-security/concepts/secret-security/about-secret-scanning\">learn more about secret scanning</a>.</p>\n</div>\n</body></html>\n<p>The post <a href=\"https://github.blog/security/making-secret-scanning-more-trustworthy-reducing-false-positives-at-scale/\">Making secret scanning more trustworthy: Reducing false positives at scale</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"},{"json_class":"Feedjira::Parser::AtomEntry","@author":"Natalie Guevara","@title_type":"html","@raw_title":"Give GitHub Copilot CLI real code intelligence with language servers","@url":"https://github.blog/ai-and-ml/github-copilot/give-github-copilot-cli-real-code-intelligence-with-language-servers/","@links":["https://github.blog/ai-and-ml/github-copilot/give-github-copilot-cli-real-code-intelligence-with-language-servers/"],"@entry_id":"https://github.blog/?p=96610","@updated":{"json_class":"Time","s":1780702410,"n":0},"@published":{"json_class":"Time","s":1781107200,"n":0},"@categories":["AI & ML","GitHub Copilot","GitHub Copilot CLI"],"@summary":"<p>Install and configure LSP servers for GitHub Copilot CLI, replacing brute-force grep/decompile with real code intelligence. </p>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/give-github-copilot-cli-real-code-intelligence-with-language-servers/\">Give GitHub Copilot CLI real code intelligence with language servers</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n","@content":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body><p class=\"wp-block-paragraph\">Ever watched GitHub Copilot CLI extract a JAR file to a temporary directory, grep through <code>.class</code> files, and piece together an API signature from raw bytecode? The agent is resourceful, but without a language server, that&rsquo;s the best it can do.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The Language Server Protocol (LSP) is the standard that powers go to definition, find references, and type resolution in editors like VS Code. It works just as well in the terminal. The <strong>LSP Setup</strong> skill automates the installation and configuration of LSP servers for Copilot CLI, so the agent gets precise, structured answers about your code instead of relying on text search heuristics.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In this post, you&rsquo;ll learn how the skill works under the hood, see the configuration format it generates, and get set up for any of the 14 languages it supports today.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-the-problem-heuristic-code-understanding\">The problem: heuristic code understanding</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Without an LSP server, the agent in GitHub Copilot CLI reverse-engineers API information through text search and binary extraction. For a Java project, that might look like:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code\"><code># Find the dependency JAR \nfind ~/.m2/repository -name \"*httpclient*.jar\" \n \n# Extract it to a temp directory \nmkdir /tmp/httpclient &amp;&amp; cd /tmp/httpclient \njar xf ~/.m2/repository/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar \n \n# Search extracted class files for a method \ngrep -r \"execute\" --include=\"*.class\" .</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value='# Find the dependency JAR \nfind ~/.m2/repository -name \"*httpclient*.jar\" \n \n# Extract it to a temp directory \nmkdir /tmp/httpclient &amp;&amp; cd /tmp/httpclient \njar xf ~/.m2/repository/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar \n \n# Search extracted class files for a method \ngrep -r \"execute\" --include=\"*.class\" .' tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">For Python, the agent might <code>cat</code> files inside <code>site-packages</code>. For TypeScript, it walks <code>node_modules</code>. These text-based approaches work for simple cases, but they&rsquo;re doing pattern-matching over raw text rather than true semantic analysis, so they miss generics, overloads, and transitive types, and can&rsquo;t see compiled bytecode at all. That&rsquo;s exactly the gap a language server close.</p>\n\n\n\n<p class=\"wp-block-paragraph\">An LSP server solves this structurally. When the agent sends a <code>textDocument/definition</code> request for a symbol, the language server returns the exact source location, fully resolved type, and signature.</p>\n\n\n\n<aside data-color-mode=\"light\" data-dark-theme=\"dark\" data-light-theme=\"light_dimmed\" class=\"wp-block-group post-aside--large p-4 p-md-6 is-style-light-dimmed has-global-padding is-layout-constrained wp-block-group-is-layout-constrained is-style-light-dimmed--1\" style=\"border-top-width:4px\">\n<h2 class=\"wp-block-heading h5-mktg gh-aside-title is-typography-preset-h5\" id=\"h-what-is-an-agent-skill\" style=\"margin-top:0\">What is an agent skill?</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://agentskills.io/\">Agent skill</a> is a reusable instruction set that extends what an AI coding agent can do. Skills are defined in Markdown files with YAML frontmatter and follow a standard structure: trigger descriptions, step-by-step workflows, reference data, and behavioral constraints.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The LSP Setup skill uses this structure to guide the agent through a multi-step installation process, detecting the operating system, choosing the right package manager, writing valid configuration, and verifying the result.</p>\n</aside>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"how-the-lsp-setup-skill-works\">How the LSP Setup skill works</h2>\n\n\n\n<p class=\"wp-block-paragraph\">When triggered, the skill executes a seven-step workflow:</p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-language-selection\">1. Language selection</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The agent uses <code>ask_user</code> with a set of choices to determine which language the user needs LSP support for. This drives all subsequent steps.</p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2-operating-system-detection\">2. Operating system detection</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The agent runs <code>uname -s</code> (or checks <code>$env:OS</code> / <code>%OS%</code> on Windows) to determine the target platform. Install commands vary by operating system. For example, <code>brew install jdtls</code> on macOS versus downloading from eclipse.org on Linux.</p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-lsp-server-lookup\">3. LSP server lookup</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The skill includes a reference file (<code>references/lsp-servers.md</code>) with curated data for 14 languages: install commands per operating system, binary names, and ready-to-use config snippets. The agent reads this file and selects the matching entry.</p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-configuration-scope\">4. Configuration scope</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The agent asks whether the config should be:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>User-level</strong>: <code>~/.copilot/lsp-config.json</code>&mdash;applies to all repositories</li>\n\n\n\n<li><strong>Repository-level</strong>: <code>lsp.json</code> at the repository root or <code>.github/lsp.json</code>&mdash;scoped to a single project</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Repository-level configuration takes precedence when both exist.</p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-installation\">5. Installation</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The agent runs the appropriate install command. For example:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code\"><code># TypeScript on any OS \nnpm install -g typescript typescript-language-server \n \n# Java on macOS \nbrew install jdtls \n \n# Rust on any OS \nrustup component add rust-analyzer</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"# TypeScript on any OS \nnpm install -g typescript typescript-language-server \n \n# Java on macOS \nbrew install jdtls \n \n# Rust on any OS \nrustup component add rust-analyzer\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<h3 class=\"wp-block-heading\" id=\"6-configuration\">6. Configuration</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The agent writes or merges an entry into the chosen config file. The format uses a <code>lspServers</code> object where each key is a server identifier:</p>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code\"><code>{ \n  \"lspServers\": { \n    \"java\": { \n      \"command\": \"jdtls\", \n      \"args\": [], \n      \"fileExtensions\": { \n        \".java\": \"java\" \n      } \n    } \n  } \n} </code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value='{ \n  \"lspServers\": { \n    \"java\": { \n      \"command\": \"jdtls\", \n      \"args\": [], \n      \"fileExtensions\": { \n        \".java\": \"java\" \n      } \n    } \n  } \n}' tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<p class=\"wp-block-paragraph\">Key rules the skill enforces:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>command</code> must be on <code>$PATH</code> or an absolute path</li>\n\n\n\n<li><code>args</code> typically includes <code>\"--stdio\"</code> for standard I/O transport (some servers like <code>jdtls</code> handle this internally)</li>\n\n\n\n<li><code>fileExtensions</code> maps each extension (with leading dot) to a <a href=\"https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers\">language identifier</a></li>\n\n\n\n<li>Existing entries in the config file are preserved &mdash; the agent merges, never overwrites</li>\n</ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"7-verification\">7. Verification</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The agent runs <code>which &lt;binary&gt;</code> (or <code>where.exe</code> on Windows) to confirm the server is accessible, then validates the config file is well-formed JSON.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"supported-languages\">Supported languages</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The skill comes with a <a href=\"https://github.com/github/awesome-copilot/blob/main/skills/lsp-setup/references/lsp-servers.md\">set of predefined language servers</a> for several programming languages. If the coding agent faces one that it is not mapped out already, it will search for an appropriate server and walk you through manual configuration.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-changes-after-setup\">What changes after setup</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once an LSP server is configured, the CLI agent can:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Resolve types across dependencies</strong> &mdash; no more grepping through JAR files or <code>node_modules</code></li>\n\n\n\n<li><strong>Jump to definitions</strong> in third-party libraries, even when source isn&rsquo;t checked into the repository</li>\n\n\n\n<li><strong>Find all references</strong> to a symbol across the project</li>\n\n\n\n<li><strong>Read hover documentation</strong> for any function, class, or type</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">This means the agent spends less time on tool calls and produces more accurate code on the first pass. For you, that&rsquo;s less time waiting while the agent decompiles a JAR file or greps through node_modules to answer a question your IDE already knows, and fewer wrong turns built on a misread signature. The agent reasons about your code with the same structured understanding you get from go-to-definition in your editor, so you can hand it bigger, gnarlier tasks and trust the result.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"get-started\">Get started</h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Download the skill</strong>: visit the <a href=\"https://awesome-copilot.github.com/skills/#file=skills%2Flsp-setup%2FSKILL.md\">Awesome Copilot LSP Setup skill page</a> and click the <strong>Download</strong> button to get a ZIP file.</li>\n\n\n\n<li><strong>Extract the ZIP</strong> to <code>~/.copilot/skills/</code> by running:</li>\n</ol>\n\n\n<div class=\"wp-block-code-wrapper\">\n<pre class=\"wp-block-code\"><code>unzip lsp-setup.zip -d ~/.copilot/skills/</code></pre>\n<clipboard-copy aria-label=\"Copy\" class=\"code-copy-btn\" data-copy-feedback=\"Copied!\" value=\"unzip lsp-setup.zip -d ~/.copilot/skills/\" tabindex=\"0\" role=\"button\"><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-copy js-clipboard-copy-icon\"><path d=\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z\"></path><path d=\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z\"></path></svg><svg aria-hidden=\"true\" height=\"16\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" class=\"octicon octicon-check js-clipboard-check-icon\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"></path></svg></clipboard-copy></div>\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Restart GitHub Copilot CLI</strong>: if Copilot CLI is already running, type <code>/exit</code> first. Then relaunch <code>copilot</code> so it picks up the new skill.</li>\n\n\n\n<li><strong>Ask the agent</strong> to set up a language server: for example, <em>&ldquo;set up LSP for Java&rdquo;</em> or <em>&ldquo;enable code intelligence for Python&rdquo;</em>.</li>\n\n\n\n<li><strong>Verify</strong>: after the skill installs and configures the LSP server, restart Copilot CLI one more time (<code>/exit</code>, then relaunch), run <code>/lsp</code> to check the server status, and try go-to-definition on a symbol from one of your dependencies.</li>\n</ol>\n\n\n\n<p class=\"wp-block-paragraph\">The skill is part of the <a href=\"https://awesome-copilot.github.com/\">Awesome Copilot</a> project. It&rsquo;s open source, so contributions and feedback are welcome!</p>\n</body></html>\n<p>The post <a href=\"https://github.blog/ai-and-ml/github-copilot/give-github-copilot-cli-real-code-intelligence-with-language-servers/\">Give GitHub Copilot CLI real code intelligence with language servers</a> appeared first on <a href=\"https://github.blog\">The GitHub Blog</a>.</p>\n"}]}