Emulate, then own: ten years of Microsoft leaving its own compatibility layers
How Microsoft built, operated and then replaced three of its own compatibility layers between 2016 and 2026 (a virtual filesystem for Git, a Linux system-call translator, and a compiler hosted on a JavaScript runtime), reconstructed from the public repository record: READMEs, design documents, release notes, issue threads and commit history.
Three unrelated parts of Microsoft's developer platform ran the same experiment in public and ended the same way: ship a clever layer that imitates another system, operate it at scale, then replace it with the real implementation behind one narrow bridge. The guide gives an architect the shape every such layer takes, six decisions with the condition that flips each, eight defect and regression threads grouped into four failure classes with transferable rules, the numbers that exist and the four that do not, and a six-rung ladder for measuring a shim's tail before committing to it.
None of the three replacements removed the cost; each moved it to a narrower boundary and made it measurable, and in two cases Microsoft still recommends or still ships the superseded layer, because it remains the better answer for one specific workload.
What you get out of it
- The argument for hosting the real thing is cadence, not throughput: Microsoft's own documentation justifies WSL 2 on the grounds that kernel updates arrive without waiting for the WSL team.
- Every efficient shim invents a protocol, and the protocol outlives the shim: the GVFS protocol is why microsoft/git is still cutting releases against upstream Git 2.55 years after Scalar entered core Git.
- You cannot leave a compatibility layer while still promising everything it promised; the native TypeScript compiler shipped a written ledger of the behaviour it deliberately drops, and that file is what made the port bounded.
- Pushing your optimisation upstream transfers your rollout risk to everyone: the sparse index produced three separate defects in Git 2.34 alone, including index corruption and silent index expansion.
- The new boundary generates its own permanent defects: the two WSL 2 boundary issues, cross-OS file throughput and unreturned guest memory, have both been open since June 2019.
Scope
Why this, now. The decade closed inside twelve months: WSL's source was published in May 2025, the native TypeScript compiler shipped as TypeScript 7 and its staging repository was archived in September 2026, and Mono's stewardship passed to WineHQ.
What it does not cover. Azure's internal infrastructure, Windows itself, Microsoft 365 and the AI serving stack, none of which have a comparable public repository record; and every Microsoft engineering blog post, conference talk, paper and release announcement, because this session's network policy reached github.com and no other host.
Other field guides
Maintenance mode: a decade of Netflix retiring code that runs in other people's processes
Reconstructs a decade of Netflix platform retirement from package-registry timestamps, README status blocks, archive banners, unmerged pull requests …
29 sources · 6 organisations · 4 postmortemsDeciding what to stop building: ten years of Spotify, read from its own archive notices
Reconstructs a decade of platform decisions at Spotify from 289 public repositories and the dated notices attached to them, the package registries th…
36 sources · 10 organisations · 5 postmortemsTen years of changing a runtime you are not allowed to break
A hosted runtime cannot ask its tenants to upgrade, so Cloudflare pins semantics to a date per deployment and releases the runtime every day. This gu…
24 sources · 5 organisations · 2 postmortems