Nine engineers, 1,211 code updates in a day: Lessons from building Copilot Cowork A nine-engineer Microsoft team merged 1,211 pull requests into the Copilot Cowork backend main branch on October 21, after taking the agentic execution layer from an empty repo to worldwide general availability in about four and a half months, with agents writing most of the code. Merged PRs per month rose from 257 in January to 2,754 in May, and the team moved the live runtime from Python to Rust while the product was in production. The team's six practices include requiring a markdown spec before any code, running narrow agents in isolated repo copies, and restricting agents to proposing changes while engineers decide what is allowed. In January of this year, a small team at Microsoft set out to build Copilot Cowork , an agentic execution layer that performs multi-step workflows on a user’s behalf. That result brings the powerful AI-assisted tools and capabilities developers have today to everyday knowledge workers, all with Work IQ , Microsoft 365 security and governance, cloud execution, and Microsoft’s multi-model architecture. This is the story of how the team took Copilot Cowork from an empty repo to worldwide GA in about four and a half months, then moved its runtime from Python to Rust while it was live. Agents wrote most of the code. Ways of working changed along the way, and the practices other teams can adapt to build like a frontier development team: moving fast while keeping reliability, security, and cost in view. On October 21, nine engineers merged 1,211 pull requests into the main branch of the Copilot Cowork https://www.microsoft.com/en-us/copilot/features/cowork backend. That number would have sounded absurd to the team in January, when a handful of us made the first commit to an empty repo. Agents wrote most of the code, but engineers remained responsible for defining the work and judging the results. Our small team wrote clearer specs, set architecture and security boundaries, and focused its review on higher-risk changes, production impact, and cases where checks or reviewers disagreed. Automated checks and agent reviewers examined every change. Agents could propose changes, but they could not decide what was allowed to happen. We didn’t plan on working this way. But every few weeks, the agents got better, part of our process stopped working, and we adapted. Six practices emerged from those changes. They cover how we specify work, run agents within clear boundaries, test our checks, preserve what the team learns, shape the codebase for parallel work, and set limits on automated loops. They aren’t a recipe for matching our PR count. They are lessons other teams can adapt to build like a frontier development team while keeping reliability, security, and cost in view. We’ll end with the project that puts those practices to the test together: moving the live runtime from Python to Rust. Lesson 1: Write the spec before the code The first commit was made on January 13. From the start, agents wrote the code. In the first weeks, we learned that the agent was rarely what slowed us down. The bottleneck was not knowing exactly what we wanted. A vague request got us code that looked reasonable, survived a quick read, and then did the wrong thing. Fixing it took longer than writing a proper request would have in the first place. So we adopted a rule that still stands today: no code without a markdown spec written first. The spec covers three things: - What the change does - How we’ll know it works - What it must not break A good spec saves far more time than it costs upfront. But a weak one leads to rework a few days later. The faster agents became at implementation, the more important it became for us to be precise about intent, requirements, and what good looked like. Many of our specs start out spoken. Someone talks through a feature, and an agent turns that into a first draft of the spec, which the human then edits. I think this did more for our speed than any single model upgrade. We launched Copilot Cowork to our first enterprise customers in the Frontier program https://www.microsoft.com/en-us/copilot/resources/frontier-program on March 30. Lesson 2: Run narrow agents inside clear boundaries The next step was running more than one agent at a time. Each works in its own copy of the repo, on one task, from one spec. One agent became five, and five became dozens. Merged PRs per month went from 257 in January to 2,754 in May. Our busiest week before GA had 783. Parallel work went better than we expected for two reasons: - Narrow tasks: An agent with one well-defined task makes fewer mistakes than one asked to do a lot at once. - Picking the model per task: We treated model choice as a quality-and-cost tradeoff, not a race to use the cheapest model. Some tasks warranted stronger reasoning; for others, a faster, less expensive model gave us the right balance. In Copilot Cowork, the model runs in a container without user credentials. A trusted host outside the container handles identity, policy, approvals, and tools, and every Microsoft 365 operation goes through the host. We didn’t want to limit what the agent could attempt, because a heavily restricted agent isn’t very useful