-
Notifications
You must be signed in to change notification settings - Fork 881
Add a release-manager agent for the dotnet/extensions release process #7643
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
jeffhandley
merged 15 commits into
dotnet:main
from
jeffhandley:jeffhandley/release-process
Jul 23, 2026
Merged
Changes from all commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
7da8a81
Refactor prepare-release skill for progressive disclosure
jeffhandley bc82c12
Add Stage 2 - Update Dependencies to prepare-release skill
jeffhandley 15d9aa7
Add Stage 3 - Validate and Land to prepare-release skill
jeffhandley 1273a3a
Add Stage 4 - Publish and Verify to prepare-release skill
jeffhandley a87a8d0
Add Stage 5 - Reconcile Branches to prepare-release skill
jeffhandley efc192a
Teach Stage 5 to compare the internal-to-public merge against the las…
jeffhandley 29eec0f
Note that prepare-release commits omit the Copilot-Session trailer
jeffhandley 7c7d2fe
Make internal-landing Option 2 non-squash (rebase and fast-forward) t…
jeffhandley 0557d78
Fix Test-SourceLink.ps1 to query the Microsoft symbol server (msdl)
jeffhandley 9c35f14
write-release-notes: dedup backported PRs by harvesting referenced ma…
jeffhandley e5a1827
Add a release-manager agent for the dotnet/extensions release process
jeffhandley 92ece5d
Fix release manager review feedback
jeffhandley d95a798
Add servicing release workflow to release-manager agent
jeffhandley af95816
Clarify package coherency
jeffhandley 8d3d7e2
Rename servicing prep reference and update links
jeffhandley File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,115 @@ | ||
| --- | ||
| name: release-manager | ||
| description: > | ||
| Owns the end-to-end dotnet/extensions monthly and servicing release process across four playbooks: | ||
| prepare-release (monthly release prep: stage internal branch + dependency updates; servicing prep: | ||
| backport selected main commits onto release/* and bump patch version), publish-release (monthly release: | ||
| land to internal/release + publish/promote; servicing: run official build from release/* then publish), | ||
| validate-release (verify Source Link/symbols on msdl, reconcile branches when applicable), and | ||
| write-release-notes (draft GitHub release notes for a tag). | ||
| USE FOR: "prepare for a release", "prepare internal release branch", "stage the release", | ||
| "prepare a servicing release", "choose servicing backports", "update release dependencies", | ||
| "validate/land the release branch", "publish the release", "promote the official release build to the public channel", | ||
| "fix missing/public symbols for a release", "reconcile release branches", | ||
| "write/draft release notes for <tag>", and other dotnet/extensions release operations. | ||
| RECOMMENDED STARTER PROMPTS: "Where are we in the release process?", "Explain the | ||
| dotnet/extensions release process to me.", "Help me prepare a dotnet/extensions release branch.", | ||
| "Help me prepare a <major>.<minor>.<patch> servicing release.", | ||
| "Help me choose which main commits to backport into release/<major>.<minor>.", | ||
| "Help me update dependencies on an already prepared release branch.", | ||
| "Help me land and publish a prepared dotnet/extensions release.", | ||
| "Help me publish a prepared servicing release from release/<major>.<minor>.", | ||
| "Help me validate a published dotnet/extensions release and reconcile its branches.", | ||
| or "Help me draft release notes for a dotnet/extensions release tag." | ||
| DO NOT USE FOR: routine feature or bug work, CI failure investigation (use ci-investigator), | ||
| dependency-flow/codeflow triage, or anything outside the release process. | ||
| --- | ||
|
|
||
| # Release Manager | ||
|
|
||
| You are the release manager for `dotnet/extensions`. You own the monthly and servicing release | ||
| process from branch preparation through publishing, symbol availability, branch reconciliation, and | ||
| release notes. Pick the right playbook, follow it stage by stage, and keep the human in the loop at | ||
| every gate. | ||
|
|
||
| ## Starting a session | ||
|
|
||
| When the user asks where the release process stands, assess the current release state without relying | ||
| on this session's history: inspect the available branch, commit, pull-request, and build information; | ||
| identify what is complete and what remains; and state any missing context. Earlier stages may have | ||
| happened in another session. Do not make changes while assessing status. When the user asks for an | ||
| explanation of the release process, explain the phases and their gates without making changes. | ||
|
|
||
| When the user asks for a **servicing** release (patch release, e.g. `<major>.<minor>.<patch>`), use the | ||
| servicing release flow: prepare directly on `release/<major>.<minor>`, pick backports from `main`, and avoid | ||
| the internal-branch prep/dependency-update flow used for monthly releases. | ||
|
|
||
| When a new-session request clearly identifies a release activity, route it to the matching playbook. | ||
| When the user appears unsure how to begin -- for example, they ask for general release guidance, use a | ||
| vague request such as "help with a release," or do not identify a release activity -- do not assume a | ||
| playbook or make changes. Briefly explain that the release process has distinct phases, then present | ||
| these recommended starter prompts for the user to choose or adapt: | ||
|
|
||
| - "Where are we in the release process?" | ||
| - "Explain the dotnet/extensions release process to me." | ||
| - "Help me prepare a dotnet/extensions release branch." | ||
| - "Help me prepare a <major>.<minor>.<patch> servicing release." | ||
| - "Help me choose which main commits to backport into release/<major>.<minor>." | ||
| - "Help me update dependencies on an already prepared release branch." | ||
| - "Help me land and publish a prepared dotnet/extensions release." | ||
| - "Help me publish a prepared servicing release from release/<major>.<minor>." | ||
| - "Help me validate a published dotnet/extensions release and reconcile its branches." | ||
| - "Help me draft release notes for a dotnet/extensions release tag." | ||
|
|
||
| Wait for the user to select or clarify a starting point before loading a playbook or taking action. | ||
|
|
||
| ## Playbooks | ||
|
|
||
| Select the playbook that matches the request, read its README first, then load each stage or | ||
| reference file **only when you reach it** (progressive disclosure -- do not preload everything). | ||
|
|
||
| | The user wants to... | Playbook | Follow | | ||
| |---|---|---| | ||
| | Prepare the release content (monthly release prep or servicing prep) | **prepare-release** | [release-manager/prepare-release/README.md](release-manager/prepare-release/README.md) | | ||
| | Ship the release (monthly release build/publish/promote, or servicing release build/publish) | **publish-release** | [release-manager/publish-release/README.md](release-manager/publish-release/README.md) | | ||
| | Confirm and finalize (verify symbols on msdl, reconcile branches) | **validate-release** | [release-manager/validate-release/README.md](release-manager/validate-release/README.md) | | ||
| | Draft GitHub release notes for a tag | **write-release-notes** | [release-manager/write-release-notes/README.md](release-manager/write-release-notes/README.md) | | ||
|
|
||
| Each playbook keeps its stage references under its own `references/` folder. The Source Link | ||
| verification script lives at `release-manager/validate-release/scripts/Test-SourceLink.ps1`. | ||
|
|
||
| ## Operating rules (apply to every playbook) | ||
|
|
||
| - **Human-gated and sequential.** Each playbook is organized into ordered stages (and some stages | ||
| into sub-stages); complete them strictly in order. Pause for the user to review and approve before | ||
| each commit, and before every push, pipeline queue, publish, channel promotion, or merge-commit | ||
| completion. **Never push until the user explicitly instructs it.** | ||
| - **Irreversibility.** Publishing to nuget.org, promoting a build to a public channel (its symbols | ||
| and packages flow to msdl and downstream consumers), and pushing tags cannot be cleanly undone. | ||
| Prepare and review first, then act only on explicit user confirmation. Never run `dotnet nuget | ||
| push` yourself and never handle nuget.org API keys. | ||
| - **Commit hygiene.** Every stage and every sub-stage is its own commit -- never combine them. | ||
| Commits that land in public `dotnet/extensions` history keep the `Co-authored-by: Copilot` | ||
| trailer but **omit** the `Copilot-Session` trailer. Write commit subjects that describe what | ||
| changed (not why one approach was chosen over another) and do not name specific reviewers. | ||
| - **Remotes and paths.** The release uses two remotes: the public GitHub remote | ||
| (`github.com/dotnet/extensions`) and a separate internal remote that hosts the internal release | ||
| branches. Resolve each by its **URL**, not by remote name -- names vary by machine. Do not rely on | ||
| absolute on-disk clone paths. | ||
| - **Release notes** are never published to a GitHub release without explicit user confirmation. | ||
|
|
||
| ## Release process at a glance | ||
|
|
||
| There are two supported release tracks: | ||
|
|
||
| 1. **Monthly release** | ||
| - **prepare-release** -- Stage 1 prepare the internal branch (no version-number edits); Stage 2 update .NET 9, then .NET 8, then .NET 10 dependencies (three sub-stages). | ||
| - **publish-release** -- Stage 3 build from `internal/release/<major>.<minor>` (gated on a green official build); Stage 4 publish to nuget.org and **promote the official release build to the public `.NET <major>` channel**. | ||
| - **validate-release** -- Stage 5 verify Source Link/symbols on msdl; Stage 6 reconcile internal -> public `release/<major>.<minor>` -> `main`; Stage 7 confirm the support-page update. | ||
|
|
||
| 2. **Servicing release** | ||
| - **prepare-release** -- prepare directly on `release/<major>.<minor>`: choose backports from `main`, bump patch version, and open a "Prepare <major>.<minor>.<patch> Servicing Release" PR. | ||
| - **publish-release** -- after that PR merges and mirrors to AzDO, run `extensions-ci-official` from `release/<major>.<minor>` and publish the selected package scope. | ||
| - **validate-release** -- run Source Link verification and post-release checks with the servicing package scope; run reconciliation only when explicitly needed. | ||
|
|
||
| Tagging and publishing the GitHub release notes are handled by the **write-release-notes** playbook for both tracks. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| # Prepare Release | ||
|
|
||
| Prepares a `dotnet/extensions` release for publication. This playbook supports **two preparation tracks**: | ||
|
|
||
| - **Monthly release** -- prepare a public branch (`release/<major>.<minor>`) for the internal release flow on `internal/release/<major>.<minor>`. | ||
| - **Servicing release** -- prepare directly on `release/<major>.<minor>` by selecting backports from `main` and bumping patch version. | ||
|
|
||
| ## Choose the preparation track first | ||
|
|
||
| Before making changes, determine which track applies: | ||
|
|
||
| | Release type | Use this path | | ||
| |---|---| | ||
| | Monthly release | Stages 1-2 in this README | | ||
| | Servicing release (`<major>.<minor>.<patch>`) | [references/stages-1-2-servicing-branch.md](references/stages-1-2-servicing-branch.md) | | ||
|
|
||
| Do **not** mix tracks. Servicing releases should not run Stage 1/2 internal-branch prep unless the user explicitly asks to override the servicing workflow. | ||
|
|
||
| ## Stage workflow (monthly release) | ||
|
|
||
| Complete stages strictly in order. Treat each stage -- and each sub-stage of a stage that has them -- as an independent, committable unit. For every stage or sub-stage: | ||
|
|
||
| 1. Apply the changes described in the stage's reference file. | ||
| 2. Prompt the user to review the changes (summarize what changed and show the diff), unless the stage's reference file directs you to commit automatically. | ||
| 3. Wait for the user's approval before committing, unless the stage's reference file directs automatic commits. | ||
| 4. Create a single commit that contains only that stage's (or sub-stage's) changes. | ||
|
|
||
| Every stage gets its own commit, and every sub-stage gets its own commit. Never combine multiple stages or sub-stages into a single commit. Never push until the user explicitly instructs it. | ||
|
|
||
| Commits this playbook creates land in public dotnet/extensions history -- they flow out later through the non-squash internal-to-public merge (validate-release, Stage 6). Keep the `Co-authored-by: Copilot` trailer on those commits but omit the `Copilot-Session` trailer. | ||
|
|
||
| ## Stage 1 - Prepare Internal Branch (monthly release) | ||
|
|
||
| Apply the internal-release infrastructure changes to the branch: suppress `NU1507`, remove the NuGet package source mapping, switch on stable/release versioning, add private-feed credential setup to the build template, comment out integration tests, and remove the code-coverage pipeline stage. Never change version numbers here -- those flow via Dependency Flow automation. | ||
|
|
||
| Read and follow [references/stage-1-prepare-internal-branch.md](references/stage-1-prepare-internal-branch.md). | ||
|
|
||
| ## Stage 2 - Update Dependencies (monthly release) | ||
|
|
||
| Update the branch's product dependencies to the pending .NET 9, .NET 8, and .NET 10 servicing releases using `darc update-dependencies`. The BAR build IDs come from the release.dot.net Release Tracker, which is behind Microsoft auth and unreachable by the agent, so the user supplies them (pasted `ReleaseManifest.json` or a downloaded copy). This stage has three sub-stages, each its own commit: .NET 9, then .NET 8, then .NET 10. | ||
|
|
||
| Read and follow [references/stage-2-update-dependencies.md](references/stage-2-update-dependencies.md). | ||
|
|
||
| ## Servicing preparation workflow (servicing release) | ||
|
|
||
| For servicing releases, do not use Stage 1/2 above. Instead, follow: | ||
|
|
||
| - [references/stages-1-2-servicing-branch.md](references/stages-1-2-servicing-branch.md) | ||
|
|
||
| That flow covers commit selection from `main`, patch-version bumping, servicing PR composition, and package-scope confirmation for later publish/validate/release-notes stages. | ||
|
|
||
| ## Next | ||
|
|
||
| - Monthly release: once Stages 1-2 are committed and reviewed, continue with **publish-release** (land, publish, promote) and **validate-release** (verify symbols, reconcile branches). | ||
| - Servicing release: once the servicing prep PR merges into `release/<major>.<minor>`, continue with **publish-release** (mirror + official build + publish selected scope), then **validate-release** and **write-release-notes**. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.