Today I will… manage Git Submodules without leaving the IDE


If you’ve worked with Git submodules for any length of time, you probably have a love-hate relationship with them. They’re genuinely useful for pulling a shared library, an SDK, or common build scripts into your project. But actually working with them usually means tabbing over to a terminal and trying to remember whether it’s git submodule update --init or --init --recursive this time all while a perfectly good IDE sits right in front of you, shrugging.

That’s the part we wanted to fix. Starting in Visual Studio 18.9, Git submodules are a first-class part of the IDE no more bouncing out to the command line just to keep your dependencies in order. It’s been one of the most-requested Git features for a long time, and honestly, it’s about time.

They finally feel like part of Git in the IDE

Submodules aren’t a mystery folder anymore. There’s a dedicated Submodules section in the Git Repository window, they show up properly in Git Changes, and the branch and repository pickers actually understand how your parent repo and its submodules relate.

submodule in git repo image
    [Image: Submodules section in the Git Repository window)    

 

image image

[Image: Submodules in the Git changes window)    

Add, update, and delete without leaving your seat

From that Submodules section, you can add, update, or remove a submodule right there no memorized flags, no terminal detour. Open a solution or folder and Visual Studio discovers and activates your submodules automatically, while keeping them out of the main local repositories list so your repo picker doesn’t turn into a cluttered mess.

Selecting a submodule image

[Image: Selecting a submodule repository in Visual Studio]

Read-only by default

Most of the time you’re just *using* a submodule, not editing it, so Visual Studio treats them as read-only by default. That saves you from accidentally committing changes into a dependency you only meant to reference. When you do want to work *inside* one, it’s a single setting: Tools > Options > Source Control > Git, find Automatically activate multiple repositories, and pick Yes, include submodules.

This is just the start

This is the first milestone, not the finish line. It covers the core of what you need day to day, and there’s more coming in future releases depending on what you tell us.

We’d love to hear from you

This feature exists because so many of you kept asking for it, so keep the feedback coming. Drop your thoughts on the Feature Ticket , and if something breaks, please use the Report a Problem tool in Visual Studio is the fastest way to reach us. You can also find the team on Twitter @VisualStudio, YouTube, and LinkedIn. 

Thanks, as always, for coding with us.



Build Azure Skills Faster with Cloud Academy, a Visual Studio Subscriber Benefit


VS CloudAcademy blog banner v2 image

If you’ve been looking for a practical way to build Azure skills, Cloud Academy (a QA company) gives Visual Studio subscribers hands-on learning that fits into busy schedules. 

Whether you’re new to Azure, expanding your cloud expertise, working towards certifications or preparing for more advanced projects, this benefit helps you learn by doing. 

What you’ll find in Cloud Academy 

The Cloud Academy benefit gives Visual Studio subscribers a flexible learning experience that adapts to different learning styles and schedules, providing: 

  • Hands-on Azure labs that reinforce real-world skills 
  • Certification-focused learning paths 
  • Interactive assessments to validate your understanding 
  • Structured learning paths alongside open sandbox environments for experimentation 
  • AI-powered on-demand guidance and assistance 

With the Cloud Academy benefit, you’re not just consuming content. You’re practicing in environments that help prepare you for the work you’ll be doing every day. 

Prepare for Azure certifications 

If certification is one of your goals, Cloud Academy brings together lessons, hands-on labs, and assessments into a single learning experience. 

One example is the AZ-104 Exam Preparation: Microsoft Azure Administrator course. It’s specifically designed to help you prepare for the AZ-104 Microsoft Azure Administrator certification exam while strengthening the practical Azure administration skills you’ll use on the job. 

Learning resources available through Cloud Academy that will ready you for Azure certifications include: 

  • AI-900: Microsoft Azure AI Fundamentals 
  • AZ-104: Microsoft Azure Administrator  
  • AZ-400: Designing and Implementing Microsoft DevOps Solutions 
  • AZ-305: Designing Microsoft Azure Infrastructure Solutions 

By combining guided instruction with hands-on practice, you can build both the knowledge and confidence to apply these skills in production environments. 

Cloud Academy can also help you focus on real-world Azure scenarios that build skills you can apply immediately. Examples include containerized application deployment and management, Azure Functions and workflow automation, Azure Container Registry, storage cost optimization, Microsoft Entra ID security improvements, Azure AI, prompt engineering, and more. 

As Azure continues to evolve, Cloud Academy helps you stay current while building confidence that carries over to real projects. Whether you’re exploring Azure AI, building cloud-native applications, improving your DevOps skills, or preparing for your next certification, you can make steady progress without stepping away from your day-to-day responsibilities. 

Activate your benefit today 

If you’re an eligible Visual Studio subscriber, don’t overlook this valuable learning resource already included with your Visual Studio Subscription. 

Visit the Visual Studio Subscriptions portal to access your Visual Studio Subscription benefits and activate your Cloud Academy benefit today. 

early results from real developer workflows


July 29, 2026 by Faith Xu

In VS Code, we’re working to help you get more done with AI-assisted coding while making every token count. That means improving the entire experience, from the models we use to the product and infrastructure behind them, so you have options that fit different workflows, performance needs, and budgets.
In The Coding Harness Behind GitHub Copilot in VS Code, we explained how VS Code’s coding harness connects the model, tools, and editor experience to help the model work most effectively.

In this post, we look at how specifically training models for VS Code’s harness can further improve quality and efficiency. The model we focus on is MAI-Code-1-Flash, Microsoft’s lightweight coding model built for the fast, iterative coding tasks developers perform every day in GitHub Copilot. Since the model’s introduction at Build, it has been running in production alongside leading coding models, giving us an early look at how it performs in real developer workflows.

The results show that pairing MAI-Code-1-Flash with the VS Code coding harness delivers strong coding quality with lower token usage, helping developers get more from their usage limits.

Quality and efficiency in production

When evaluating coding models, quality and efficiency matter. A model that uses fewer tokens lowers cost, but those savings are more valuable if developers can still accomplish their tasks effectively. The goal is to strike the right balance: strong coding quality while using tokens efficiently.

To understand how MAI-Code-1-Flash performs in that tradeoff, we analyzed aggregate data from developers who selected each model in VS Code Copilot Chat. We looked at both the quality of the generated code and how efficiently developers reached a durable result. For quality, we measured whether developers accepted generated suggestions and whether that code remained after active editing and at commit. For efficiency, we measured the median number of tokens generated per conversation turn and the median number of turns needed to reach a commit.

The results suggest that MAI-Code-1-Flash strikes an effective balance between quality and efficiency. It outperforms Claude Haiku 4.5 and GPT-5.4 Mini on quality. Larger-sized GPT-5.6 Luna and Kimi K2.7 Code achieve quality advantages, but require 67% to 94% more tokens per turn as well as more turns per commit.

Aggregated quality and efficiency metrics

Model Code survival rate Commit survival rate Accept rate Tokens per turn Turns per commit
MAI-Code-1-Flash Baseline (0%) Baseline (0%) Baseline (0%) Baseline (0%) Baseline (0%)
Claude Haiku 4.5 -2% -8% -10% -10% +28%
GPT 5.4 Mini -3% -8% -7% +7% +17%
GPT 5.6 Luna +3% +3% +4% +67% +17%
Kimi K2.7 Code +4% +6% -6% +94% +11%

Data from users who selected each model in VS Code Copilot Chat between 6/2/26 and 7/24/26.
Metric definitions: Code survival rate = percentage of AI-generated code retained after 10 minutes of active editing. Commit survival rate = percentage of AI-generated code retained at Git commit. Accept rate = percentage of AI-generated suggestions accepted by the user. Tokens per turn = median number of tokens generated by the model per conversation turn (a single request-response exchange). Turns per commit = median number of conversation turns a user completes before reaching a Git commit.

Validating the results with Auto flights

As another way to validate the aggregated usage data, we ran A/B flights through the Auto model experience in VS Code Copilot Chat. Auto assigns models without requiring developers to select one, helping us isolate the model’s impact from differences in who chooses each model or the tasks they use it for. We then looked at engagement and repeat usage as signals of whether developers found the experience useful enough to keep using.

The results reinforced the same story. MAI-Code-1-Flash drove stronger engagement while remaining more token efficient than other lightweight models. Users were 6% more likely to return within two days than with GPT-5.4 Mini and 11% more likely than with Claude Haiku 4.5. Despite higher engagement, median token usage was 13% lower than GPT-5.4 Mini and 11% lower than Claude Haiku 4.5. In other words, people used MAI-Code-1-Flash more, and it still cost less to run.

Comparison User-initiated turns 2-day repeat usage 4-day repeat usage Total tokens
Claude Haiku 4.5 -5% -11% -37% +11%
GPT 5.4 Mini No statistically significant difference -6% -13% +13%

Taken together, the production metrics and Auto flights highlight the role MAI-Code-1-Flash is designed to play: delivering strong results on simple coding tasks while using tokens efficiently. To close, let’s take a closer look at the model and the workflows it was built to support.

Designed for the way developers work

MAI-Code-1-Flash was developed to work closely with the VS Code coding harness and the real-world workflows it supports. It’s particularly well-suited for lightweight, iterative work such as exploring code, making incremental changes, generating or refining tests, and fixing bugs. Its adaptive solution length keeps responses concise for simple requests and goes deeper only when needed. This means it delivers useful output faster, while also improving token efficiency.

The model was trained from scratch using clean, traceable data, without distillation from third-party models. The model will continue to improve over time based on aggregated usage signals from consumer plans, while Copilot Business and Copilot Enterprise customer data is not used for training.

Try it today, help shape what’s next

MAI-Code-1-Flash is available today in GitHub Copilot. Try it alongside your current go-to model, see how it feels in your workflow, and share what works well or what you’d like to see improve in the Community Discussion, where the team is actively listening.

Your feedback also helps shape what’s next. MAI-Code-1-Flash is just the first step in the MAI coding model journey. Larger MAI coding models coming later this year will extend the family to more complex tasks, with greater intelligence, deeper reasoning, and quality designed to compete with the strongest frontier models.

Happy coding! 💙

Visual Studio Code 1.132 (Insiders)


Follow us on LinkedIn, X, Bluesky | Follow Insiders Changelog on X or Bluesky


Last updated: July 29, 2026

Welcome to the 1.132 Insiders release of Visual Studio Code.

These release notes cover the Insiders build of VS Code and continue to evolve as new features are added.

You can still track our progress in the Commit log and our list of Closed issues.

Happy Coding!


July 29, 2026

  • Add support for showing ~ instead of the full home directory path in terminal tab titles that use the ${cwd} variable, reducing visual noise for paths nested under your home directory. #274200
  • Add support for the --enable-proposed-api flag when running code serve-web, so extensions that declare enabledApiProposals in their package.json activate correctly in the browser, matching the existing desktop behavior. #228781
  • Add support for removing only the innermost manual folding range at the cursor position with the Remove Manual Folding Ranges command, instead of removing every manual range that intersects the cursor. #212599

July 28, 2026

  • Add support for customizing Dictation and Voice Mode with dictation.md and voice.md files, stored in your user profile (~/.copilot/dictation.md, ~/.copilot/voice.md) or in a trusted workspace’s .github folder. #327334
  • Add support for copying code blocks in the Markdown preview with a hover-triggered copy button on each fenced code block. #322269

July 27, 2026

  • Add support for combining multiple attachments of the same browser element into a single item, including both its text content and screenshot. #327733
  • Add Save and Save As to the editor tab context menu, so you can save a dirty file directly from its tab without opening the Explorer or File menu. #327504

July 24, 2026

  • Fix an issue where canceling dictation while the speech-to-text model was still downloading or loading had no effect, leaving you stuck waiting for the download to finish. #327292

We really appreciate people trying our new features as soon as they are ready, so check back here often and learn what’s new.

Visual Studio Administrator? Join our Private Marketplace Preview!


Organizations are increasingly looking for greater control over extensions within development environments. Driven by security, compliance, and internal governance requirements, teams want more visibility into how developers discover and acquire extensions.

To address these needs, we’re excited to begin previewing Private Marketplace support in Visual Studio.

Private Marketplace for Visual Studio

For organizations familiar with Private Marketplace in VS Code, Private Marketplace in Visual Studio provides a similar curated extension acquisition experience while preserving the familiar Visual Studio workflow.

With Private Marketplace for Visual Studio, organizations can:

  • Host and distribute private extensions within their organization
  • Centrally configure and enforce a Private Marketplace
  • Control which extensions are surfaced through the Visual Studio marketplace experience

Join the Preview

We’re looking for Visual Studio administrators, security teams, and enterprise stakeholders interested in evaluating Private Marketplace and providing feedback as we prepare for broader availability.

Interested in joining?

While our immediate focus is Private Marketplace, we’re also interested in learning more about how organizations manage extensions today, the challenges they face, and the governance capabilities that matter most to them.

Whether you’re interested in Private Marketplace specifically or want to discuss your organization’s extension management and governance needs, we’d love to hear from you.

 

Pick, manage, and get the most from your models


You open the model picker, scroll past a dozen options, and pause. How are these models different? Which one should you actually use? And once you’re a few hundred messages deep, how much capacity is even left before things start dropping off?

We’ve all been there. These are the kinds of questions Visual Studio now makes a little easier to answer. Here’s a closer look at how you can see, compare, and get more from the models you already have.

A model picker that works the way you do

The model picker presents a long list of models you’ve needed to scroll through every single time. Starting in 18.9 Insiders 1, you can better focus on the models you care about most. Pin the models you actually reach for and they stay right at the top. Expand to see the full list, and collapse to hide the ones you never touch to send them out of your way.

What’s left is a short, familiar list that looks like your workflow, not the full catalog. It’s a small change you’ll feel every day.

 updated model picker imageScreenshot of updated model picker with pinning and collapsed models

The full story on every model

But sometimes the model picker isn’t enough. You might want to take a closer look at the model details, and compare specs. Select Manage models and the new language models view opens up with everything laid out side by side: what each model is capable of, how big its context window is, and what the cost level is. No more guessing whether a model supports vision, or which one gives you the most space to work.

Your own models live here too, right alongside the Copilot lineup. Pin them, review their capabilities, or wire up a new provider, all without leaving the view.

The new model management view

See how much capacity you’ve got left

Knowing a model’s context window size is one thing. Knowing how much of it you’ve used is what really matters when a conversation runs long. So as you work, Visual Studio shows you how full your context window is getting, no math required. In 18.6.0 and onward, click the donut chart icon in the upper right corner of your prompt box to see your context window usage for the current thread.

When you’re brushing up against the limit, you’ll see it approach 100% and you can decide when it’s time to summarize the conversation, start a new thread, choose a model with a higher context size, or make any other adjustments.

In 18.9 Insiders 1 onward, you’ll also catch a glimpse of an additional button to open the Copilot Usage window and see your full Copilot plan usage, so nothing sneaks up on you. The Copilot Usage window can also be accessed in earlier versions from the Copilot badge menu dropdown.

Context window indicator

Work with more confidence

Picking a model, checking what it can do, keeping tabs on your context window: none of it should slow you down or leave you guessing. These updates are all about giving you a little more clarity in the moments that matter, so you can spend less time wondering and more time building.

And we’re just getting started, so keep an eye out for more updates coming soon!

Give it a try in the latest Visual Studio Insiders and let us know what you think.

Built-in Agent Skills Bring .NET and Azure Expertise into Visual Studio


Visual Studio now includes built-in Agent Skills, created by experts from the .NET and Azure teams, to help you better customize your agentic workflow and complete development tasks more efficiently, starting with the 18.8 Release. Agent Skills are reusable capabilities that enable your agent to perform structured tasks more reliably (to learn more about what are Agent Skills, see this previous post).

We’ve heard that getting started with skills can feel unclear, especially when deciding which ones to use and how to apply them. To simplify this experience, we’ve introduced a set of built-in skills for common .NET and Azure scenarios, so you can immediately benefit from them in your workflow.

You can find these skills in the Built-in category in the tool picker. Hover over each skill to view its description and path, or use the three-dot menu to open the full skill or its folder location. These skills will only appear when the corresponding .NET and Azure development workloads are installed in Visual Studio.

From tool picker pop up, showing the Skills tab which includes a built-in category of skills. The cursor is hovered over the "azure-ai" skill which displays a tool tip that includes the description and path of this skill.

Currently, built-in skills are off by default, so you can review and enable only the ones that suit your tasks. We are actively evaluating the effectiveness and cost of enabling these skills by default. As we transition into the new usage-based billing model for Copilot, we want to make sure every token you spend is meaningful and are tracking efficacy through a dashboard. We will turn on the skills when we find evidence that these skills would improve your agent performance.

A chart displaying the evaluation result of dotnet-webapi skill.

If you want to learn more about Agent skills and built-in skills in Visual Studio through live demos, please watch our VS Live Toolbox show featuring this topic!

.NET Skills

The dotnet/skills provides skills that help agents be more successful no matter what type of .NET app you are working to develop, taking you from scaffolding new applications to adding new features, to diagnosing issues with existing applications, whether you are working in ASP.NET Core or MAUI or developing AI-based applications.

Included with Visual Studio, we are first providing you with dotnet-webapi and analyzing-dotnet-performance.

1. Get more from your API development

When you are working with ASP.NET Core HTTP APIs, the dotnet-webapi skill guides creation and modification of endpoints with correct HTTP semantics, OpenAPI metadata, and error handling. This helps you get clean, modern .NET code from the agent on the first pass.

Try it: “Add an endpoint to the API to handle moving the entries from current to archived. Include proper error handling.”

2. Review the performance of your application

For every .NET developer, performance of the application you’re building is extremely important. With the analyziing-dotnet-performance skill, agents can more easily scan .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I/O with tiered severity classification.

Try it: “Review this application for performance optimization opportunities and provide me with the top 3 changes I should make for the biggest improvement.”

Azure Skills to Try First

The Azure skills covers the whole journey of getting an app onto Azure—from scaffolding infrastructure to securing, analyzing, and extending it with AI. If you’re not sure where to start, here are a few built-in skills that fit naturally into a Visual Studio developer’s workflow. Each one packages real Azure expertise—workflows, decision trees, and guardrails—so your agent does genuine Azure work instead of handing back generic cloud advice.

1. Go from app to deployed: azure-prepare → azure-validate → azure-deploy

These three skills form one deployment chain that hands off automatically:

  • azure-prepare generates the infrastructure your app needs—Bicep or Terraform, azure.yaml, Dockerfiles, and managed identity.
  • azure-validate runs preflight checks before anything deploys—configuration, Bicep/Terraform, RBAC and managed identity permissions, and a what-if/build verification—so problems surface before they hit Azure.
  • azure-deploy executes the deployment (azd up, azd deploy, Bicep, or terraform apply) with built-in error recovery instead of leaving you stuck on a cryptic message.

The result: a single path from “it builds locally” to “it’s running in the cloud.”

Try it: “Deploy my ASP.NET Core app to Azure Container Apps with managed identity.”

2. Analyze logs and telemetry with azure-kusto

Once your app is live, query its data in Azure Data Explorer (Kusto/ADX) with KQL for log analytics, telemetry, and time-series analysis. Describe what you want in plain language and let the agent write and run the query—the fast way to answer “what happened, when, and how often.”

Try it: “Query my logs for the error rate per endpoint over the last 24 hours and show the spikes.”

3. Build and ship AI features with microsoft-foundry

Adding AI to your app? This skill takes you end-to-end with Microsoft Foundry: discover and deploy models, create and invoke agents, run evaluations, and fine-tune—removing the guesswork around which model fits, how to deploy it, and how to wire up an agent.

Try it: “Deploy my hosted agent to Foundry.”

We hope these built-in skills could further improve your agentic workflow. Please give them a try, and let us know if they were helpful for your workflow. Also let us know what additional built-in skills you would like to see, or how we can future support your agentic workflow in Visual Studio!

The Visual Studio Dev/Test Benefit: Freedom to Build, Test, and Experiment in Azure


DevTest blog tile 800x200 v2 image

One of the best parts of a Visual Studio Subscription is discovering benefits that can make your day-to-day development work easier and more cost effective. One benefit that deserves more attention is Azure Dev/Test pricing. In fact, it’s one of the most valuable benefits included with a Visual Studio Subscription. 

If you’re building cloud applications, testing new ideas, or maintaining multiple development environments, cloud costs can sometimes influence how often you experiment or how closely your development environment matches production. Azure Dev/Test pricing helps remove that barrier by giving eligible Visual Studio subscribers access to discounted Azure pricing for non-production workloads. 

Whether you’re an individual developer exploring a new idea or part of a team building complex cloud applications, this benefit gives you the flexibility to experiment, validate, and iterate without letting cloud costs slow you down. 

Why developers should care 

Developers thrive when they have the freedom to experiment. 

Whether you’re evaluating a new architecture, validating performance, testing deployment pipelines, or exploring AI and cloud services, you shouldn’t have to second guess spinning up the resources you need. Azure Dev/Test pricing makes it easier to create, test, and tear down environments without worrying about unnecessary development costs. 

Imagine your team is preparing a major feature release. Instead of sharing a single test environment or delaying validation because of cloud costs, developers can quickly provision a dedicated Azure environment, run performance and integration tests, gather feedback, and remove the resources when testing is complete. That faster feedback cycle helps teams identify issues earlier and move confidently toward production. 

This flexibility helps teams iterate faster, shorten feedback loops, and support agile DevOps practices while keeping non-production environments cost effective. 

Build and test with production-like Azure services 

One of the biggest advantages of Azure Dev/Test pricing is that you’re working with the same Azure services you’ll use in production, rather than a limited sandbox environment. 

That means you can: 

  • Test application performance and behavior in environments that closely resemble production. 
  • Create temporary environments for feature development, testing, and validation. 
  • Shut down idle resources when they’re no longer needed and avoid overprovisioning. 
  • Experiment with new Azure capabilities without unnecessary cost concerns. 
  • Support continuous integration and delivery workflows with realistic testing environments. 

This is where the benefit really stands out. You’re not just reducing costs. You’re giving your team the flexibility to learn, experiment, and build with greater confidence before deploying to production. 

It’s important to note that Azure Dev/Test pricing is designed specifically for development and testing workloads, not production environments. Using separate environments both helps organizations take advantage of Dev/Test pricing and supports sound engineering practices for more predictable deployments. 

Choose the Dev/Test option that’s right for your organization    

Visual Studio subscribers can take advantage of Azure Dev/Test pricing through three purchasing options, depending on how their organization purchases Azure. 

Enterprise Dev/Test 

Designed for organizations using an Enterprise Agreement (EA), this option provides centralized billing and comprehensive management capabilities for teams running multiple non-production environments. 

Azure Plan for Dev/Test 

Available for organizations using a Microsoft Customer Agreement (MCA), Azure Plan for Dev/Test offers modern billing flexibility as customers transition from legacy purchasing agreements. 

Pay-As-You-Go Dev/Test 

Ideal for individual developers and smaller teams with Visual Studio Professional or Enterprise Subscriptions who are not covered by an Enterprise Agreement, this option provides an easy way to access Dev/Test pricing while maintaining billing flexibility. 

Start using Azure Dev/Test pricing today 

If you’re a Visual Studio Professional or Enterprise subscriber, sign in to my.visualstudio.com to learn more about Azure Dev/Test pricing and choose the option that best fits your organization. 

It’s an easy way to reduce development cost friction, accelerate your projects, and get even more value from your Visual Studio Subscription. 

Learn More

How Prompt Tuning Improved GPT-5.5 in VS Code


July 6, 2026 by VS Code Team, @code

In our previous post, we introduced the VS Code coding harness, the layer that connects the model to tools, context, instructions, and the agent loop, giving the model the ability to perform coding tasks.

Each model responds to tool calls and instructions differently, and the harness can adapt to improve results. This post walks through a two-week experiment we ran in partnership with OpenAI to tune the GPT-5.5 system prompt in VS Code. The question was simple: if we nudge the agent to explore less and validate sooner, can it get faster and cheaper without getting worse? With OpenAI’s model expertise and our harness data, we tested two small prompt changes, measured them against a control on live traffic, and shipped the winner.

This matters more with usage-based billing in place. Token efficiency isn’t only an infrastructure metric: every token the agent spends wandering is a token you pay for and wait on. An agent that reaches a grounded edit sooner is both a better experience and a smaller bill.

The hypothesis: explore less, validate sooner

Following the launch of GPT-5.5, we looked at how the model spent tokens inside the VS Code agent harness, as part of the work described in Improving token efficiency in GitHub Copilot. Two patterns stood out: where the model spent tokens, and where it over-explored before acting. Agents can spend a lot of effort searching, rereading, and comparing nearby paths before making a useful edit.

That pointed to a single, testable idea: the agent should spend less effort wandering and more effort moving through a deliberate loop of evidence, action, and validation.

Diagram contrasting an agent that over-explores with many scattered search and read steps before its first edit, versus a Treatment B agent that moves through a deliberate anchor, gather minimal context, edit, and validate loop.

After testing different hypotheses and running offline evaluations, we turned that idea into two variants of the GPT-5.5 system prompt, both were promising in offline evals, and we tested them against the current default on live traffic.

Inside the experiment

We ran the experiment in VS Code over a two-week window, splitting GPT-5.5 agent traffic across two treatment groups and one control group with a 25/25/25 split. Both treatments test the same hypothesis but differ in how much structure they add to the prompt.

Group Variant name Description Traffic allocation
Control PRPT_CTRL Current default prompt 25%
Treatment A PRPT_SRCH Economical search and edit: single, compact reminder to limit exploration before acting 25%
Treatment B PRPT_LRG Large prompt sections: broader restructure covering the full edit-and-validate loop 25%

Note: The allocations add up to 75% because the experiment scorecard compares evenly sized groups. The remaining GPT-5.5 traffic continued to use the default prompt outside this scorecard slice, so we could compare the treatments and control across the same kind of user traffic.

Treatment A: economical search and edit

Treatment A makes a small, focused change: a single, compact reminder that nudges the model to reduce unnecessary exploration.

The <economical_search_and_edit> section in the prompt instructs the agent to start from a concrete anchor, gather only enough local context, avoid broad exploration, act once there is a cheap discriminating check, and avoid rereading unchanged context.

You can find the complete implementation details in gpt55BasePrompt.tsx:

{economicalSearchAndEditEnabled && <Tag name='economical_search_and_edit'>
    - Start from the most concrete available anchor: a file, symbol, failing behavior, failing command, or nearby implementation surface.<br />
    - Gather only enough nearby context to choose one plausible local hypothesis and one cheap check that could disconfirm it.<br />
    - Prefer one targeted search or nearby read over broad repo exploration.<br />
    - Once the cheapest discriminating check is known, act.<br />
    - Do not re-read unchanged context unless a new result makes it relevant.<br />
</Tag>}

Treatment B: large prompt sections

Treatment B tested a broader version of the same idea of limiting exploration. Instead of adding a single, compact reminder about economical search, it reorganizes the agent workflow into explicit <Before_the_first_edit> and <After_the_first_edit> sections. Unlike Treatment A, these additions make the system prompt itself larger, so a key question was whether the added structure would still improve efficiency, not just agent behavior.

The goal was to solve the full loop and not only the search step: form a local hypothesis before editing, avoid broad exploration, make a grounded first edit, and validate immediately after the first substantive edit.

You can find the complete implementation details in gpt55BasePrompt.tsx:

{largePromptSectionsEnabled && <>
    <Tag name='Before_the_first_edit'>
        - Start from the most concrete anchor available: a file, symbol, failing behavior, failing command, test, or nearby implementation surface. If the request does not name one explicitly, use the first targeted search or nearby read to identify that anchor, then continue locally from there.<br />
        - Before the first edit, gather only enough nearby evidence to state one falsifiable local hypothesis about how the requested behavior should work or why it is failing, and one cheap check that could disconfirm it.<br />
        [...]
        - Once you can state one falsifiable local hypothesis, the nearby code path it depends on, one cheap check that could disconfirm it, and one small edit that would test it, the next action must be a grounded edit.<br />
        - If confidence is incomplete, the first edit may be a small reversible probe that exposes missing types, behavior mismatches, control-flow gaps, or validation failures.<br />
        - If you find yourself still searching after that local-routing budget, treat that as drift. Recover by choosing the best current hypothesis and the best available nearby check, then make the smallest plausible edit that will let that check discriminate.<br />
    </Tag>
    <Tag name='After_the_first_edit'>
        - Prefer this order for that first validation action:<br />
        - the cheapest behavior-scoped or failing check that can falsify the current hypothesis<br />
        - a narrow test for the touched slice<br />
        - a narrow compile, lint, or typecheck command for the touched slice<br />
        [...]
        - Finish with at least one post-edit executable validation step whenever the environment provides one. Only fall back to diff-only validation when no focused command exists or commands are unavailable.<br />
    </Tag>
</>}

What the two-week scorecard showed

We tracked the treatments across three dimensions: quality (does the code stick), latency (how fast the first edit lands), and efficiency (tokens and tool calls). Each treatment is compared with the control group in the table below.

What each metric measures
  • 10-minute survival rate (by user): Of the code the model wrote, how much is still in the file 10 minutes later (not deleted or rewritten). It’s our proxy for “did the AI’s code actually stick.” Measured as surviving characters ÷ total characters written, as a %. E.g. ~90% — roughly 9 of every 10 characters the model added are kept.
  • Commit survival rate (by user): Narrower and stricter: of the AI-written code, how much survives all the way into a git commit. This is “did it make it into real, saved work.” Same character-ratio calculation, but only counting code present at commit time. E.g. ~87%.
  • p50 Time to First Edit (by turn): For a typical request, how long from hitting enter until the first actual change lands in your code — not just the model talking, but real work appearing. Measured in seconds. E.g. ~74s for the median turn.
  • p95 Time to First Edit (by turn): The same clock, but for the worst 5% of requests — the “why is this taking so long?” cases. A key tail-latency guardrail. E.g. ~6.4 min (383K ms), where hard tasks or lots of exploration delay the first edit.
  • p50 total tokens (by user): How much the model reads + writes for a typical user across their day — a proxy for cost and context load per person. Sum of tokens per user, median across users. E.g. ~12.9M tokens/user/day.
  • p95 total tokens (by turn): The token weight of the heaviest 5% of individual turns — the big, sprawling requests that drive cost spikes and hit context limits. E.g. a single turn running into the millions of tokens, vs a ~500K–900K median.
  • Average tool calls (by turn): How many actions (read file, search, run terminal, edit…) the agent takes per request to get the job done. Lower can mean more efficient; too low can mean less thorough. Mean tool calls per turn. E.g. ~24 per turn.

Signal legend: ● favorable and highly significant (p < 0.001), ○ favorable and statistically significant (p < 0.05), ● unfavorable and highly significant, ○ unfavorable and statistically significant, - not statistically significant.

Metric Treatment A (PRPT_SRCH) impact P-value Signal Treatment B (PRPT_LRG) impact P-value Signal
10-minute survival rate (by user) -0.40% (-0.37 pp) 0.0707 – -0.44% (-0.41 pp) 0.0493 ○
Commit survival rate (by user) -0.48% (-0.41 pp) 0.3200 – +0.68% (+0.57 pp) 0.1533 –
p50 Time to First Edit (by turn) -2.88% (2.0s faster) 0.0271 ○ -5.68% (3.9s faster) 2e-5 ●
p95 Time to First Edit (by turn) -1.93% (8.0s faster) 0.1928 – -9.30% (38.8s faster) 1e-10 ●
p50 total tokens (by user) -2.54% (0.2M fewer tokens) 0.3429 – -3.25% (0.3M fewer tokens) 0.2094 –
p95 total tokens (by turn) -5.19% (0.3M fewer tokens) 0.0157 ○ -7.64% (0.5M fewer tokens) 0.0003 ●
Average tool calls (by turn) -3.19% (0.77 fewer tool calls) 0.0091 ○ -8.54% (2.04 fewer tool calls) 1e-12 ●

Grouped bar chart comparing the percentage impact of Treatment A and Treatment B against the control baseline across seven metrics, showing that Treatment B produces the largest reductions in latency, token usage, and tool calls.

  • Quality: the guardrail metrics stayed mostly healthy. Commit survival rate moved slightly up for Treatment B (+0.68%) and slightly down for Treatment A (-0.48%), neither statistically significant. The 10-minute survival rate moved slightly down for both treatments: -0.44% for Treatment B and -0.40% for Treatment A. Only the Treatment B movement crossed the statistical significance threshold, and just barely (p=0.0493), unlike the highly significant efficiency wins. We treated that as a real tradeoff to weigh, but the movement was small and the other quality guardrail did not regress.

  • Latency: Treatment B delivered the strongest edit-latency wins, and both were highly statistically significant: p50 Time to First Edit improved -5.68% (3.9s faster, p=2e-5), and p95 Time to First Edit improved -9.30% (38.8s faster, p=1e-10). Treatment A moved in the right direction, but the edit-latency effects were weaker: p50 Time to First Edit -2.88% (2.0s faster, p=0.0271), and p95 Time to First Edit -1.93% (not significant).

  • Token efficiency: both treatments reduced median total tokens per user, but those p50 movements were not statistically significant: -3.25% for Treatment B and -2.54% for Treatment A. At the upper tail, Treatment B reduced p95 total tokens by -7.64%, highly statistically significant (p=0.0003). Treatment A also reduced p95 total tokens by -5.19%, statistically significant (p=0.0157). Both variants reduced average tool calls per turn: -8.54% (2.04 fewer tool calls) for Treatment B, highly statistically significant (p=1e-12), and -3.19% (0.77 fewer tool calls) for Treatment A, statistically significant (p=0.0091).

Treatment B had the strongest overall profile: clear latency wins, significant upper-tail token reductions, fewer tool calls, and mostly stable quality guardrails. The one movement worth watching, the small drop in 10-minute survival, was only lightly significant (p=0.0493), while the latency, token, and tool-call gains were larger and far more robust. Treatment A moved several metrics in the right direction, but Treatment B was more consistent across the measures that matter most for VS Code.

So we shipped it: Treatment B, LargePromptSections, is now the default GPT-5.5 system prompt.

The takeaway isn’t only that the numbers moved. The movement was tied to a specific, testable harness hypothesis from provider feedback, validated offline first and then confirmed online over a two-week production window. That’s the loop we want to keep running.

Continuous optimization

This experiment is one example of how we work with model providers beyond launch day. A model release is not the end of the tuning loop. It is another chance to look at real VS Code behavior, test focused improvements, and find new ways to make the experience faster, more reliable, and more efficient.

We’ll keep looking for those improvements across models, prompts, tools, and the VS Code coding harness, so more of each agent’s budget goes to the work that matters instead of unnecessary exploration.

Try agents in VS Code, switch between models, and compare how different models approach the same task. Share your feedback in our GitHub repo. It helps us keep improving the experience.

Happy coding! 💙

Iterating faster with TypeScript 7


June 26, 2026 by VS Code Team, @code

VS Code and TypeScript practically grew up together. We made a bet early on to write VS Code in TypeScript, and we have always worked closely with the TypeScript team to provide great built-in TypeScript and JavaScript language support in VS Code. This post is about the next step of that journey: TypeScript 7, and how collaborating on adopting TypeScript 7 sped up our builds, improved the day-to-day editing loop for both developers and agents, and helped the TypeScript team ship a more tested release.

TypeScript 7 is a complete port of the TypeScript compiler and language tooling in Go. That means it’s fast, more than 10x faster in many cases. VS Code had a lot to gain from those speedups, so we were naturally eager to adopt TypeScript 7 as soon as we could.

However, we also knew that this would take time. When we started this process in the summer of 2025, TypeScript 7 was actually already shockingly far along for a complete rewrite, but it still had type checking inconsistencies and lacked many features we needed. Even so, we wanted to start testing and providing feedback right away. Adopting TypeScript 7 while it was still being built may sound a little crazy, but it turned out to be a great decision for both VS Code and TypeScript.

An incremental migration

The VS Code team has never been afraid to take on large engineering efforts, whether that’s enabling strict null checking in our codebase, adding remote development support, or addressing and preventing dangerous code patterns across thousands of files. A common theme across these efforts is that we try to take an incremental approach. This means breaking big, complex problems down into small steps. Those steps happen in the main codebase (no forks or long-lived branches), and each one usually brings a small improvement as it lands. Take enough little steps, and eventually you can look back and realize that you’ve quietly conquered that once seemingly insurmountable challenge.

We wanted to take the same approach to adopting TypeScript 7. For us, that meant gradually introducing TypeScript 7 into different parts of our workflows and codebases, starting with lower-impact, lower-risk areas before eventually moving on to the main areas of VS Code. There are many benefits to working incrementally, but two were especially important for this effort:

  • Reduced risk. Each step of the adoption was relatively small, so if something went wrong, it was easy to identify the cause and revert.

  • Early feedback. We wanted to start testing and providing high-quality feedback to the TS team early in TS 7’s development. That meant getting as much usage of TypeScript 7 as possible, but without negatively impacting developer productivity on the VS Code team.

    This testing helped us find bugs and limitations that they could then prioritize fixing. And as we adopted TS 7 in more parts of our codebase, those areas also became informal regression tests for each new TypeScript 7 nightly release.

In practice, that incremental philosophy unfolded as a series of phases over about six months. Each phase increased our use and testing of TypeScript 7 a little more, moving in step with TypeScript 7’s own progress and helping shape it along the way. Here’s how it played out:

Exploration (summer and early fall 2025)

TypeScript 7 was publicly announced in March 2025. By the summer, it was ready for initial testing, although at this point it still had known bugs and limitations.

Type checking was farther along than emit (the process of generating JavaScript output files), so most of our early testing focused on manually running the @typescript/native-preview npm package on some of our smaller extensions with --noEmit. We reported issues as we found them, and because the native-preview package was updated daily, we could test new changes and fixes quickly.

As part of TypeScript 7, the TypeScript team was also building up the new language server that would power VS Code’s in-editor TypeScript and JavaScript support. This was shipped using the TypeScript native preview VS Code extension, which replaces VS Code’s built-in JavaScript and TypeScript IntelliSense with the new TypeScript 7 language server. We worked with the TypeScript team to make it easy to switch back and forth between the two TypeScript versions. That flexibility mattered because TypeScript 7 was still missing a number of basic language features at this point. We wanted developers to feel that they could try it out with as little effort and risk as possible.

We also made it easy to report TypeScript 7 issues directly from VS Code. Making reporting easy meant that developers would not think twice about filing even small annoyances. Those reports fed a steady stream of real world feedback for the TypeScript team.

At this stage, most testing was done by a small number of motivated VS Code team members who were interested in alpha testing and were OK working around some annoyances.

The TS 6 bridge (fall 2025)

Meanwhile the TypeScript team was thinking through how to ease the transition to TypeScript 7 instead of leaving users to make one big jump. Now it being 2025, this thinking was inexplicably accompanied by a bewildering hand gesture, with the result being the aptly named TypeScript 6.0:

TypeScript 6.0 acts as the bridge between TypeScript 5.9 and 7. As such, most changes in TypeScript 6.0 are meant to help align and prepare for adopting TypeScript 7

— https://devblogs.microsoft.com/typescript/announcing-typescript-6-0/

Such a bridge was necessary because TypeScript 7 gave the team a chance to fix and modernize certain long-standing annoyances in TypeScript tooling. For example, older TypeScript releases defaulted to targeting ES5. That made sense in 2014, when ES6 (aka ECMAScript 2015) had not been finalized yet, but it felt wildly anachronistic in 2025. It was also a footgun for new developers who would end up accidentally generating larger, less efficient JavaScript files simply because they forgot to set target. Similarly, TypeScript 5 did not enable strict null checks by default, so many users were missing out on this truly game-changing feature just because they did not know they needed to enable it.

For us on the VS Code team, switching to TypeScript 6 was a small, low-risk step compared to the prospect of adopting an entirely rewritten TypeScript 7. It required only a few minor code changes. Still, this small step made us more confident that our codebase was in a good state and that once TypeScript 7 was ready, we’d be able to switch to it without many issues.

TS 6 and 7 in parallel (fall 2025)

Next it was time to start using TypeScript 7 in earnest. We started with the lowest-risk area: using TypeScript 7 to type check our built-in extensions. During this phase, we continued to run TypeScript 6 for full type checking and JavaScript generation (emit). We set up our continuous integration so that both TypeScript 6 and 7 builds needed to pass. Generally, the type checking between TypeScript 6 and 7 matched, but running both did help catch a few differences that we reported.

By this point, thanks to steady work from the TypeScript team, the language server in TypeScript 7 was also further along, so we added the TypeScript 7 extension as a dependency in the VS Code repo so that our developers could easily switch to it. Our goal was to gradually improve our editor support so that developers could spend more and more time using TypeScript 7. We prioritized anything that caused developers to switch back to TypeScript 6, whether that was a bug or missing functionality.

One of the most common initial reasons developers switched back to TypeScript 6 may be a bit surprising: code formatting. You can generally live with suggestions not being perfect and even with Go to Definition behaving inconsistently, but formatting differences between TypeScript 6 and 7 would cause our PR pre-commit checks and continuous integration formatting checks to fail. That gave even little formatting inconsistencies—such as extra whitespace—outsized priority. Over time, those formatting issues were ironed out and developers had to switch back to TypeScript 6 less and less.

Adopting TypeScript 7 for most extensions (January and February 2026)

By early 2026, TypeScript 7 had everything we needed to start using it fully. The TypeScript team had done truly amazing work making type checking trustworthy, finishing up emit, and improving the language tooling in the editor. It was time to start switching over to TypeScript 7 fully.

As always, we wanted to move carefully and incrementally, so we started migrating our built-in extensions one by one. These built-in extensions are fundamentally quite similar to a VS Code extension you can create using yo code. Before the switch, those extensions used the following build tools:

  • tsc (TypeScript 6) for type checking and development builds.
  • webpack for production and web bundles.
  • esbuild for fast emit.

As part of the TypeScript 7 migration, we decided to simplify our builds by switching our bundling to use esbuild instead of webpack. This simplified our build tooling and significantly reduced the time it took to generate bundles.

Our new built setup was simpler:

  • tsgo (TypeScript 7) for type checking and development builds.
  • esbuild for production and web bundles.

We migrated the extensions in small groups to minimize the impact of any regressions. This also let us start with the simplest extensions, building up our knowledge and confidence before moving on to more complex extensions. This process generally went smoothly, which shouldn’t be a huge surprise given that we had already been building this code using TypeScript 7.

Adopting TypeScript 7 as the default (February 2026)

The final move was to switch to TypeScript 7 for our normal development. By then, the TypeScript team’s fixes had removed the blockers we had been working around, and because the incremental steps had already done most of the work, the code change for this was actually pretty minor. Here’s the change that switches our normal watch task to use TypeScript 7, for example.

We also made TypeScript 7 the default version used in the editor for the VS Code repo. We still support switching back to the older TypeScript as an escape hatch, but it has rarely been needed in practice. Most developers are happy to stay on TypeScript 7 because of its significantly better performance.

The numbers

So, was it all worth it? The answer is a clear and resounding yes.

Here’s a before-and-after comparison for type checking the main VS Code source code:

# TS 6.0
tsc --noEmit -p src/tsconfig.json
36 seconds

# TS 7
tsgo --noEmit -p src/tsconfig.json
5 seconds

TypeScript 7 is more than seven times faster! That’s especially impressive when you consider that these two tasks are doing the same work: they type check the same files with the same level of thoroughness and report the same errors. Just by switching from TypeScript 6 to TypeScript 7, we sped up our type checking by 7x.

With TypeScript 7, we can also now type check almost all of our built-in extensions in well under a second. The only exception is our larger Copilot extension, and that still only takes 2.5 seconds.

The results get even more impressive when we look at compiling and type checking all of VS Code, i.e. both our main source code and our roughly fifty built-in extension tsconfig projects. This is what the npm run watch command does, and it is also the command that developers working on VS Code typically run.

With TypeScript 6, npm run watch takes around 80 seconds to complete. After migrating to TypeScript 7, we dropped this time to just over 20 seconds: roughly four times faster. That’s a whole minute saved in normal development and agent-assisted iteration every time a build needs to be restarted (re-checks after the initial watch completes are around a second at most).

Those improvements also translate into better language tooling performance in the editor. For TypeScript language features in the editor, we need to load the whole tsconfig project before we can provide proper errors and complex features like auto imports. For the main VS Code project, that used to take close to a minute. Now it’s around 10 seconds. That’s roughly 50 seconds saved. With VS Code developers often reloading their editor windows multiple times per day, those saved seconds really add up. No more quick coffee runs while the editor tools are loading.

Seeing these numbers really puts the scale of the improvements in perspective. It was easy to lose track of the total impact because our incremental approach meant that many improvements arrived gradually instead of in one big PR. Early steps might only have saved a second here or a few hundred milliseconds there. By the end, however, those small wins had added up into something significant. It’s amazing to see how the TypeScript team delivered on their initial promise too: it’s full TypeScript, just way faster.

Better through collaboration

Adopting TypeScript 7 has been a big win for developers working on VS Code, but there’s another result of this effort that is less tangible and perhaps even more impactful. VS Code’s large, complex codebase turned out to be an excellent way to find real-world bugs in TypeScript 7 and polish its editor tooling.

The developers on the VS Code team also were not afraid to provide feedback about missing features or when something just did not feel right. Every time a developer hit a rough edge and switched back to TypeScript 6, it was a signal for the TypeScript team to decide what to fix next. The result is a more tested and polished version of TypeScript 7, one that we know works well beyond the VS Code codebase.

Although we’ve focused on the VS Code side of the story in this post, the TypeScript team really deserves almost all of the credit. They were the ones building TypeScript 7 after all, while also responding to all the feedback from those pesky VS Code devs. From myself and the rest of the VS Code team, thank you!

TypeScript 7 is an exciting step forward for the language. Whether you’re editing code in VS Code, kicking off compiles on the command line, or asking an agent to iterate on a project, the performance improvements are significant and noticeable. Thanks to the work of the TypeScript team and the testing and feedback process outlined here, switching to TypeScript 7 should be a relatively smooth process and an easy win for many codebases.

More than anything though, I hope this post shows the value of working incrementally, testing early and often, and building tight feedback loops for close collaboration. These are values VS Code has always held, and they continued to serve us well again on this effort. I hope that this story motivates you to think differently about how you can tackle large engineering efforts in your own projects and ultimately ship better code.

Happy coding! 💙