Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guide for testing bug reproductions against locally-built MSBuild. Use this when you have a repro project and want to verify a fix works before submitting a PR.
.claude/skills/dotnet-use-bootstrap-msbuild/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | -25% | 0% |
| case-01 | ✗→✓ | ▲ Improved | -37% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -37% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -39% | 0% |
This skill guides you through testing a bug reproduction project against your locally-built MSBuild to verify a fix.
After making changes to MSBuild, you need to test them against a repro project. The "bootstrap" is a self-contained MSBuild installation built from your local changes. It includes all dependencies needed to build real projects.
Build MSBuild to create the bootstrap directory:
powershell# Windows .\build.cmd # Unix/macOS ./build.sh
This creates the bootstrap at artifacts\bin\bootstrap\ with your changes.
Rerun this after making any code change. If run in the default mode, there may be some errors on subsequent builds about locked files (due to MSBuild worker node processes lingering). If so, run ./artifacts/bin/bootstrap/core/dotnet build-server shutdown.
Use the bootstrap dotnet CLI directly (preferred):
powershell# Windows artifacts\bin\bootstrap\core\dotnet.exe build <path-to-repro.csproj>
bash# Unix/macOS ./artifacts/bin/bootstrap/core/dotnet build <path-to-repro.csproj>
All of the usual command line arguments should work, including -bl to create binlogs.
If the problem is specific to the .NET Framework MSBuild.exe that is used in Visual Studio, and you're running on Windows, you can use the bootstrap MSBuild.exe directly:
powershellartifacts\bin\bootstrap\net472\MSBuild\Current\Bin\MSBuild.exe <path-to-repro.csproj>
Note: The .NET Framework bootstrap output will only be complete when built on Windows using MSBuild.exe.
artifacts\bin\bootstrap\core\sdk\*\MSBuild.dll timestamppowershell ./artifacts/bin/bootstrap/core/dotnet build-server shutdown # Or use the helper function after sourcing msbuild-build-env.ps1 killdotnet
Your fix is working! The repro uses your local changes while the installed MSBuild has the bug.
| Scenario | Command | |----------|---------| | Build bootstrap | .\build.cmd | | .NET Core repro | artifacts\bin\bootstrap\core\dotnet.exe build <project> | | .NET Framework repro | artifacts\bin\bootstrap\net472\MSBuild\Current\Bin\MSBuild.exe <project> |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-06 | fail→pass | 9,153 | 2,296 | -75% | 1 | 1 | 0% | 1,545 | 1,160 | -25% | 0 | 0 | — |
case-01 | fail→pass | 17,134 | 10,973 | -36% | 1 | 1 | 0% | 2,832 | 1,797 | -37% | 0 | 0 | — |
case-07 | fail→fail | 14,185 | 9,342 | -34% | 1 | 1 | 0% | 2,323 | 2,061 | -11% | 0 | 0 | — |
case-02 | fail→pass | 12,595 | 3,610 | -71% | 1 | 1 | 0% | 2,158 | 1,364 | -37% | 0 | 0 | — |
case-03 | fail→pass | 11,668 | 7,795 | -33% | 1 | 1 | 0% | 1,947 | 2,170 | +11% | 0 | 0 | — |
case-04 | fail→pass | 17,480 | 4,530 | -74% | 1 | 1 | 0% | 2,387 | 1,457 | -39% | 0 | 0 | — |
case-05 | fail→pass | 10,443 | 4,413 | -58% | 1 | 1 | 0% | 1,556 | 1,567 | +1% | 0 | 0 | — |
case-20 | pass→pass | 12,169 | 12,128 | -0% | 1 | 1 | 0% | 2,274 | 3,035 | +33% | 0 | 0 | — |
case-08 | pass→pass | 17,526 | 1,679 | -90% | 1 | 1 | 0% | 3,162 | 960 | -70% | 0 | 0 | — |
case-09 | fail→pass | 24,363 | 3,565 | -85% | 1 | 1 | 0% | 1,535 | 1,185 | -23% | 0 | 0 | — |
case-10 | fail→pass | 10,687 | 2,638 | -75% | 1 | 1 | 0% | 1,826 | 1,132 | -38% | 0 | 0 | — |
case-11 | fail→pass | 16,271 | 3,670 | -77% | 1 | 1 | 0% | 2,348 | 1,386 | -41% | 0 | 0 | — |
case-12 | pass→pass | 9,516 | 1,691 | -82% | 1 | 1 | 0% | 1,645 | 989 | -40% | 0 | 0 | — |
case-13 | pass→pass | 7,310 | 2,292 | -69% | 1 | 1 | 0% | 1,047 | 941 | -10% | 0 | 0 | — |
case-14 | fail→pass | 10,883 | 2,031 | -81% | 1 | 1 | 0% | 2,059 | 1,083 | -47% | 0 | 0 | — |
case-15 | fail→pass | 10,824 | 1,540 | -86% | 1 | 1 | 0% | 1,811 | 907 | -50% | 0 | 0 | — |
case-21 | pass→pass | 7,274 | 5,589 | -23% | 1 | 1 | 0% | 1,013 | 1,685 | +66% | 0 | 0 | — |
case-16 | fail→fail | 12,900 | 5,857 | -55% | 1 | 1 | 0% | 2,274 | 1,742 | -23% | 0 | 0 | — |
case-17 | fail→pass | 7,671 | 7,479 | -3% | 1 | 1 | 0% | 1,184 | 941 | -21% | 0 | 0 | — |
case-18 | fail→pass | 13,818 | 2,024 | -85% | 1 | 1 | 0% | 2,249 | 1,036 | -54% | 0 | 0 | — |
case-19 | pass→pass | 9,422 | 4,340 | -54% | 1 | 1 | 0% | 1,660 | 1,510 | -9% | 0 | 0 | — |
case-22 | pass→pass | 11,554 | 5,857 | -49% | 1 | 1 | 0% | 1,921 | 1,686 | -12% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.