A process guide for managing the monthly MSBuild release lifecycle and its integration into Visual Studio.
Install
mkdir -p .claude/skills/release-dotnet && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16649" && unzip -o skill.zip -d .claude/skills/release-dotnet && rm skill.zipInstalls to .claude/skills/release-dotnet
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Orchestrate an MSBuild release: create the tracking issue, branch, configure DARC channels and subscriptions, bump version in main, final-brand the release branch, insert into VS, and publish post-GA. Covers the full monthly release lifecycle aligned with VS shipping cadence.Key capabilities
- →Create MSBuild tracking issues
- →Branch for MSBuild releases
- →Configure DARC channels and subscriptions
- →Bump version in main branch
- →Final-brand the release branch
- →Insert MSBuild into Visual Studio
How it works
The skill orchestrates the MSBuild release process through timeline-gated phases, guiding the agent to create branches, bump versions, configure DARC, and insert into Visual Studio.
Inputs & outputs
When to use release
- →Perform MSBuild release phase
- →Update DARC channels
- →Configure release branch branding
- →Insert MSBuild into Visual Studio
About this skill
MSBuild Release Orchestration
This skill guides an agent through the MSBuild release process defined in documentation/release-checklist.md. The checklist is the single source of truth — this skill provides context on how to execute it.
Overview
MSBuild is a component that gets inserted into Visual Studio. VS ships monthly; MSBuild must branch and prepare its bits before VS is ready to take them. See the release process doc for the full timeline diagram.
The insertion pipeline routes MSBuild branches to VS branches:
main→ VSmain(daily canary)vs*release branch → VSmain(replacesmain→mainafter branch snap)
VS handles the progression from main → rel/insiders → rel/stable on its own schedule. MSBuild's responsibility is to have final-branded bits in VS main before the insiders snap date.
Each monthly VS release produces:
- A new
vs*branch frommain - Final branding on that branch
- A version bump in
main - DARC channel/subscription updates
- A VS insertion
- Post-GA publishing to nuget.org and docs
The process is organized into 6 timeline-gated phases (0–5), each with an explicit trigger.
Execution model: This skill is designed for an interactive Copilot session. The agent walks through each phase step-by-step, but every command that modifies state (git push, DARC writes, pipeline changes, PR creation) requires user approval before execution. Read-only queries (DARC get-*, git log, etc.) can run without approval.
Required Inputs
Before starting any phase, ensure you have these values (the user must provide them — version increments are irregular and cannot be computed):
| Input | Example | How to determine |
|---|---|---|
PREVIOUS_RELEASE_VERSION | 18.9 | Previous entry in the merge-flow chain |
PREVIOUS_RELEASE_EXACT_VERSION | 18.9.6 | The version the previous release actually shipped as. From the previous release's tracking issue, or git tag --list 'v18.9.*'. Used by Phase 5.3a. |
THIS_RELEASE_VERSION | 18.10 | Current VersionPrefix in eng/Versions.props (drop .0) |
NEXT_VERSION | 18.11 | User-provided — not computable from current version |
BRANCH_SNAP_DATE | YYYY-MM-DD | From VS-Dates wiki — when MSBuild branches vs* from main, insertion targets VS main |
INSIDERS_SNAP_DATE | YYYY-MM-DD | From VS-Dates wiki — when VS snaps main → rel/insiders; final-branded bits must be in VS main before this |
STABLE_SNAP_DATE | YYYY-MM-DD | From VS-Dates wiki — when VS promotes rel/insiders → rel/stable |
VS_SHIP_DATE | YYYY-MM-DD | When VS ships publicly (GA) — triggers post-release tasks |
PACKAGE_VALIDATION_BASELINE_VERSION | 18.9.0-preview-26330-01 | See How to determine PACKAGE_VALIDATION_BASELINE_VERSION below — non-trivial: most "obvious" picks are wrong. |
Version examples above track the current cycle (
eng/Versions.propsVersionPrefixis18.10.0). Dates are intentionally shown as a format only — always read the real ones from the VS-Dates wiki.
How to determine PACKAGE_VALIDATION_BASELINE_VERSION
The value is the latest {{THIS_RELEASE_VERSION}}.0-preview-NNNNN-NN MSBuild package that is both:
- Published on the public dotnet-tools feed — this is the feed the official build publishes to and that ApiCompat restores baselines from. If the version isn't here, ApiCompat fails with
NU1102. - Produced from a commit reachable from
vs{{THIS_RELEASE_VERSION}}— i.e. a commit onvs{{THIS_RELEASE_VERSION}}, or themaincommitvs{{THIS_RELEASE_VERSION}}was branched from.
Two tempting wrong answers — and why they're wrong:
| Wrong pick | Why it fails |
|---|---|
❌ The release-versioned {{THIS_RELEASE_VERSION}}.X package that ships in VS / on nuget.org | Since #14277 release branches build and insert prerelease versions, exactly like main; the release-versioned variants are produced by NuGetRepack at manual publish time. They never exist on the public CI feed, so ApiCompat cannot restore them. |
❌ Blindly the most recent {{THIS_RELEASE_VERSION}}.0-preview-* on dotnet-tools | After vs{{THIS_RELEASE_VERSION}} branches, main keeps producing {{THIS_RELEASE_VERSION}}.0-preview-* until this main-bump PR merges — so the most recent feed entries may be {{NEXT_VERSION}}-content builds wearing {{THIS_RELEASE_VERSION}} branding. Picking one drifts the API baseline forward and silently hides real compat breaks. |
Procedure: run the helper — it does the whole resolution mechanically (requires az login with devdiv access):
pwsh ./scripts/Get-PackageValidationBaseline.ps1 -ThisReleaseVersion {{THIS_RELEASE_VERSION}}
# -> prints e.g. 18.9.0-preview-26330-01
It computes git merge-base origin/main origin/vs{{THIS_RELEASE_VERSION}}, finds the matching successful build in pipeline 9434, derives the package version from the OfficialBuildId, and verifies it on the dotnet-tools feed. If it fails, read the script's own .DESCRIPTION header for the manual equivalent rather than reproducing it here.
Prerequisites
- gh cli
- az cli
- darc cli — Arcade enforces a minimum version; if
darcrefuses with a "below the minimum required version" error, run.\eng\common\darc-init.ps1
Phase Summary
| Phase | Trigger | Key Actions |
|---|---|---|
| 0: Instantiate | User-initiated | Validate inputs, create GitHub tracking issue |
| 1: Branch & Prepare | BRANCH_SNAP_DATE | Create vs* branch, DARC channel setup (batched PR), merge-flow config, VisualStudio.ChannelName |
| 2: DARC Subscription Updates | Phase 1 branch exists (vs* created) | Retarget main-targeting subs + VMR backflow to next channel, retired-branch cleanup (batched PR), Arcade verify |
| 3: Bump Main | Phase 2 merged | Branding PR in main (VersionPrefix → next, ApiCompat baseline, refresh OptProf baseline) |
| 4: Final Branding | 7 days before INSIDERS_SNAP_DATE | Public API promotion, OptProf bootstrap (usually a no-op), M2/QB approval only if behind schedule, babysit the VS insertion into VS main before insiders snap |
| 5: Post-GA | VS shipped (VS_SHIP_DATE) | Resolve the exact shipped version (SDK-coupled? SDK wins over VS rel/stable), nuget.org publish, docs, GitHub release, Change Waves Learn sync, retro |
DARC Batching
DARC write commands push to the maestro-configuration repo. Batch related changes into one PR:
- Choose a branch name like
release/msbuild-{{THIS_RELEASE_VERSION}} - Add
--configuration-branch <name> --no-prto every write command except the last - Last command: use
--configuration-branch <name>without--no-prto create the PR - Get the PR reviewed and merged
Read-only commands (get-default-channels, get-subscriptions, get-channel) don't need these flags.
Non-interactive (-q). darc add-default-channel / add-subscription prompt y/n when the target branch does not exist yet (e.g. pre-creating the vs{{NEXT_VERSION}} mapping in Phase 1.2c, or adding the new vs{{THIS_RELEASE_VERSION}} backflow in Phase 2). Console input is redirected in an agent session, so the prompt fails the command — always pass -q for these "branch doesn't exist yet" writes.
Phase 2 — what moves vs. what stays. When rotating main to the next channel, retarget only the subscriptions whose target branch is main (dotnet/dotnet @ main, dotnet/fsharp @ main). Never retarget a subscription that targets a VMR servicing/release branch (dotnet/dotnet @ release/*) — that includes the SDK band paired with the new vs{{THIS_RELEASE_VERSION}} branch and any .NET-next preview band (release/*-preview*). Those stay on VS {{THIS_RELEASE_VERSION}} so the new release branch owns their downstream flow; moving them steals it. (This bit the 18.9 release: the band and preview subs were moved and had to be reverted.)
Phase 2 — VMR backflow rotation (easy to miss). Backflow (dotnet/dotnet → msbuild, source-enabled) must rotate too when the new vs{{THIS_RELEASE_VERSION}} is paired with an SDK band (skip for a VS-only release): repoint the → main backflow to the next SDK band channel (.NET <NEXT_BAND> SDK, the channel dotnet/dotnet @ main publishes to), and add a backflow from the outgoing band channel into the new vs{{THIS_RELEASE_VERSION}} branch (mirror the prior release branch's backflow, e.g. vs18.0 ← .NET 10.0.1xx SDK). See checklist steps 2.2b / 2.3f / 2.3g.
Executing a Phase
When asked to execute a specific phase:
- Read the full phase from
documentation/release-checklist.md - Verify the trigger condition is met (previous phases completed)
- Execute steps in order — respect sequential/parallel annotations
- For DARC commands: batch writes into one configuration PR per phase
- Record all output URLs in the tracking issue's artifact table
- Mark checkboxes as completed in the tracking issue
- In Phase 4 (step 4.7): if
documentation/wiki/ChangeWaves.mdis changed for this release, update the public Learn page at https://learn.microsoft.com/visualstudio/msbuild/change-waves. Sync the Change Waves Learn page fromdocumentation/wiki/ChangeWaves.mdon thevsXX.Ybranch that is live in VS Insiders / the latest preview SDK. PR goes
Content truncated.
When not to use it
- →When the release is not for MSBuild
- →When the task is not part of the monthly release lifecycle
- →When the execution model is not an interactive Copilot session requiring user approval
Limitations
- →The skill orchestrates an MSBuild release
- →The skill covers the full monthly release lifecycle aligned with VS shipping cadence
- →The skill is designed for an interactive Copilot session
How it compares
This skill provides a phase-based orchestration for MSBuild releases, aligning with VS shipping cadence and requiring user approval for state-modifying commands, unlike a fully automated release process.
Compared to similar skills
release side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| release (this skill) | 0 | 1mo | No flags | Advanced |
| deployment-pipeline-design | 6 | 2mo | Review | Advanced |
| cloudflare-deploy | 3 | 6mo | Review | Intermediate |
| artifactory-module-architecture | 4 | 3mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by dotnet
View all by dotnet →You might also like
deployment-pipeline-design
wshobson
Design multi-stage CI/CD pipelines with approval gates, security checks, and deployment orchestration. Use when architecting deployment workflows, setting up continuous delivery, or implementing GitOps practices.
cloudflare-deploy
davila7
Deploy applications and infrastructure to Cloudflare using Workers, Pages, and related platform services. Use when the user asks to deploy, host, publish, or set up a project on Cloudflare.
artifactory-module-architecture
TencentBlueKing
Artifactory 制品库模块架构指南,涵盖制品上传下载、存储后端适配、制品元数据、清理策略、权限控制。当用户开发制品库功能、处理制品存储、配置清理策略或实现制品管理时使用。
deployment-engineer
sickn33
Expert deployment engineer specializing in modern CI/CD pipelines, GitOps workflows, and advanced deployment automation. Masters GitHub Actions, ArgoCD/Flux, progressive delivery, container security, and platform engineering. Handles zero-downtime deployments, security scanning, and developer experience optimization. Use PROACTIVELY for CI/CD design, GitOps implementation, or deployment automation.
genkit-infra-expert
jeremylongshore
Execute use when deploying Genkit applications to production with Terraform. Trigger with phrases like "deploy genkit terraform", "provision genkit infrastructure", "firebase functions terraform", "cloud run deployment", or "genkit production infrastructure". Provisions Firebase Functions, Cloud Run services, GKE clusters, monitoring dashboards, and CI/CD for AI workflows.
managing-deployment-rollbacks
jeremylongshore
Deploy use when you need to work with deployment and CI/CD. This skill provides deployment automation and orchestration with comprehensive guidance and automation. Trigger with phrases like "deploy application", "create pipeline", or "automate deployment".