Skip to content

Commit 981c612

Browse files
richlanderCopilot
andcommitted
Add VMR-first, whole-product release notes skill
Redesigns the release notes skill with two key principles: 1. VMR-first: Diff dotnet/dotnet release branches to determine what shipped, then trace back to source repo PRs for context. This inherently handles reverts (reverted code doesn't appear in the diff) and ensures only shipped code gets documented. 2. Whole-product: One invocation produces release notes for ALL components (libraries, runtime, ASP.NET Core, SDK, etc.) rather than requiring per-team invocations. Pipeline: VMR branch diff → component classification → source repo PR tracing → enrichment → dedup → authoring → code sample validation → reviewer suggestions. Borrows editorial rules, code sample validation, formatting, and reviewer suggestion patterns from #10282, adapted for multi-component and VMR-first architecture. Team context files provide editorial overrides only, not PR discovery. 16 files: SKILL.md + 15 reference files (1354 total lines). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent edc5864 commit 981c612

17 files changed

Lines changed: 1363 additions & 0 deletions

.github/copilot-instructions.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ git push origin [branch-name]
8181
- `release-notes/releases-index.json` - Master index of all .NET releases
8282
- `CONTRIBUTING.md` - Links to actual contribution guidelines in dotnet/runtime
8383

84+
### Copilot Skills
85+
86+
This repository defines Copilot skills in `/.github/skills/`. Before performing any task, check if a matching skill exists and follow its process. Current skills:
87+
88+
- `release-notes` - Generate .NET release notes for a preview, RC, or GA release (VMR-first, whole-product)
89+
- `api-diff` - Generate API diff between .NET releases
90+
- `update-os-packages` - Update OS package definitions
91+
- `update-supported-os` - Update supported OS matrices
92+
8493
## Common Tasks
8594

8695
### Adding New Release Notes
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
---
2+
name: release-notes
3+
description: Generate .NET release notes for a preview, RC, or GA release. Diffs VMR release branches to determine what shipped, traces changes to source repo PRs, and produces formatted markdown for all components. Use when asked to write, update, or draft release notes, a changelog, or a what's new summary for .NET.
4+
compatibility: Requires GitHub MCP server or gh CLI, SQL tool for structured storage, and access to the dotnet/core repository clone.
5+
disable-model-invocation: true
6+
argument-hint: "[version] [preview]"
7+
---
8+
9+
# .NET Release Notes Generator
10+
11+
Generate release notes for a .NET preview, RC, or GA release. This skill produces release notes for **all components** in a single invocation, using the VMR (`dotnet/dotnet`) as the source of truth for what shipped.
12+
13+
## Design principles
14+
15+
- **VMR is source of truth** — the VMR release branch determines what shipped. If code is not on the release branch, it does not get documented.
16+
- **Reverts are inherently handled** — reverted code does not appear in the VMR branch diff, so it never enters the pipeline.
17+
- **Whole product** — one invocation produces release notes for all components (libraries, runtime, ASP.NET Core, SDK, etc.).
18+
- **Team contexts are editorial** — they define formatting, categorization, and content rules, not PR discovery.
19+
20+
## Execution guidelines
21+
22+
- **Do not write intermediate files to disk.** Use the **SQL tool** for structured storage and querying (see [sql-storage.md](references/sql-storage.md) for schema).
23+
- **Do not run linters, formatters, or validators** on the output.
24+
- **Maximize parallel tool calls.** Fetch multiple PR and issue details in a single response.
25+
- **Follow [GitHub tool guidance](references/github-tools.md)** for all GitHub API interactions.
26+
27+
## Process
28+
29+
### Step 1: Collect inputs
30+
31+
Collect inputs **one at a time** — ask a single question, wait for the answer, then ask the next:
32+
33+
1. **Release name** (e.g., ".NET 11 Preview 3"). Parse the major version, prerelease label, and preview number.
34+
2. **Previous release name** (e.g., ".NET 11 Preview 2"). This determines the base VMR branch for comparison.
35+
3. **Code Complete dates** — start date (previous release's Code Complete) and end date (this release's Code Complete) in ISO 8601. These are used for source repo PR searches as a secondary discovery method.
36+
4. **Output directory** — path for the release notes files. Default: `release-notes/<version>/preview/<preview>/` (e.g., `release-notes/11.0/preview/preview3/`).
37+
38+
After collecting inputs, determine the VMR release branch names using the patterns in [component-mapping.md](references/component-mapping.md).
39+
40+
### Step 2: VMR diff
41+
42+
**[Diff the VMR release branches](references/vmr-diff.md)** — compare the previous and current VMR release branches to identify all code changes that shipped in this release. Group changes by component using the [component mapping](references/component-mapping.md).
43+
44+
This step produces:
45+
- A list of components with changes (and an estimate of change magnitude)
46+
- Components with no meaningful changes (these get minimal stub release notes)
47+
48+
### Step 3: Trace to source repos
49+
50+
**[Trace VMR changes to source repo PRs](references/trace-to-source.md)** — for each component with VMR changes, find the source repo PRs that introduced those changes. Uses both VMR commit analysis and source repo PR searches, but only includes PRs confirmed present in the VMR.
51+
52+
### Step 4: Enrich
53+
54+
**[Fetch PR and issue details](references/enrich-prs.md)** — for each candidate PR, fetch the full body, linked issues, reaction counts, and Copilot summaries. Collect reviewer data for the suggestion step.
55+
56+
### Step 5: Deduplicate
57+
58+
**[Check against prior release notes](references/dedup-previous-releases.md)** — for each component, verify that candidate features are not already covered in an earlier preview's release notes. **Retain prior release notes in context** for theme continuation detection during authoring.
59+
60+
### Step 6: Author
61+
62+
Write release notes for each component that has meaningful changes:
63+
64+
1. **[Categorize entries by impact](references/categorize-entries.md)** — group PRs into impact tiers. Reference prior release notes for theme continuations.
65+
2. **[Apply formatting rules](references/format-template.md)** — follow the standard .NET release notes document structure. Apply team context format overrides when specified.
66+
3. **[Apply editorial rules](references/editorial-rules.md)** — follow attribution, benchmark, naming, and ranking guidelines. Apply team context content rules when specified.
67+
68+
For components with team context files (see table below), load the team context and apply its editorial overrides. Components without team context files use default rules.
69+
70+
| Component | Team context | Notes |
71+
|-----------|-------------|-------|
72+
| Libraries | [team-libraries.md](references/team-libraries.md) | Area-label categorization, API diff review |
73+
| ASP.NET Core | [team-aspnetcore.md](references/team-aspnetcore.md) | Product-area grouping, milestone-based community queries |
74+
| SDK | [team-sdk.md](references/team-sdk.md) | VMR-native changes |
75+
76+
For components with no meaningful changes, produce a minimal stub:
77+
78+
```markdown
79+
# <Component> in .NET <VERSION> <PREVIEW> - Release Notes
80+
81+
There are no new features or improvements in <Component> in this release.
82+
```
83+
84+
### Step 7: Validate code samples
85+
86+
**[Validate code samples](references/validate-samples.md)** — extract every code sample from the authored release notes, scaffold file-based .NET console apps, and verify each compiles and runs. Fix any failing samples with user confirmation.
87+
88+
### Step 8: Suggest reviewers and finalize
89+
90+
**[Suggest reviewers](references/suggest-reviewers.md)** — aggregate PR authors, assignees, mergers, and coauthors into component-grouped reviewer suggestions.
91+
92+
Present the complete draft to the user:
93+
94+
1. List of components with release notes (and components with stubs)
95+
2. Feature list per component with categorization
96+
3. Suggested reviewers grouped by component
97+
4. Any unresolved items (unmatched VMR changes, ambiguous PRs)
98+
99+
Get user confirmation before writing the output files.
100+
101+
## Example usage
102+
103+
**User prompt:**
104+
105+
> Write the release notes for .NET 11 Preview 3.
106+
107+
**Expected output:** Multiple markdown files under `release-notes/11.0/preview/preview3/`:
108+
109+
- `libraries.md` — .NET Libraries features
110+
- `runtime.md` — Runtime improvements
111+
- `aspnetcore.md` — ASP.NET Core features
112+
- `sdk.md` — SDK tooling updates
113+
- `msbuild.md` — MSBuild improvements
114+
- `csharp.md` — C# language features
115+
- (etc. for each component with changes)
116+
- Minimal stubs for components with no changes
117+
118+
Each file follows the format:
119+
120+
```markdown
121+
# <Component> in .NET 11 Preview 3 - Release Notes
122+
123+
.NET 11 Preview 3 includes new <Component> features & enhancements:
124+
125+
- [Feature Name](#anchor)
126+
...
127+
128+
## Feature Name
129+
130+
<description with why + how + code sample> ([owner/repo#NNNNN](https://github.com/owner/repo/pull/NNNNN)).
131+
```
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Categorize Entries by Area, Theme, and Impact
2+
3+
## Feature grouping
4+
5+
Group related features under a **single top-level section** rather than scattering them as separate entries. Features sharing a common initiative, theme, or parent issue appear as subsections (`###`) under one heading (`##`).
6+
7+
**Signals that features should be grouped:**
8+
9+
- They reference the same parent issue or initiative
10+
- They are in the same namespace or closely related namespaces
11+
- One feature is a prerequisite for another
12+
- They would be confusing or redundant as separate TOC entries
13+
14+
## Impact tiers
15+
16+
Group PRs into tiers:
17+
18+
- **Headline features**: New namespaces or types, implementations of new industry trends/algorithms, major new API surfaces
19+
- **Quality**: PRs or groups of PRs that improve quality across an area
20+
- **Performance**: PRs with benchmark data showing measurable improvements
21+
- **Significant API additions**: Notable new API surface that unlocks new scenarios or provides meaningful productivity gains
22+
- **Small improvements**: Single-mapping additions and minor fixes with public API changes. Exclude unless the change is to a widely-used type (e.g., `string`, `Span<T>`, `HttpClient`) or resolves a highly-requested issue (10+ reactions). When in doubt, check whether you can write a meaningful code sample — if the only sample is trivially obvious, the entry likely does not warrant coverage
23+
- **Preview feedback fixes**: Bug fixes or behavior changes responding to community feedback on a previous preview. See [editorial-rules.md](editorial-rules.md#preview-to-preview-feedback-fixes) for inclusion criteria. Rank by community signal strength:
24+
- **50+ combined reactions and comments** → treat as headline-level
25+
- **10–49** → standard entry in preview feedback section
26+
- **Under 10** → brief mention unless behavioral change is significant
27+
28+
Only Headline, Quality, Performance, and significant API additions go into the release notes. Use judgment — a 2-line dictionary entry addition is less noteworthy than a new numeric type.
29+
30+
**Before assigning a tier**, check each candidate against the [partial features and building blocks](editorial-rules.md#partial-features-and-building-blocks) heuristics. Features that are independently useful but part of a larger effort should note that context. Features with no standalone value should be folded into a brief mention or omitted.
31+
32+
Early previews (preview1–preview5) tend to include more features. Later previews (preview6, preview7, rc1) have fewer headline features and more quality improvements. RC2 and GA releases emphasize quality and performance.
33+
34+
## Theme continuations
35+
36+
Reference the previous release notes (loaded during [deduplication](dedup-previous-releases.md)) to identify features building on prior preview work:
37+
38+
- Acknowledge earlier coverage briefly (e.g., "Building on the Zstandard support introduced in Preview 1...")
39+
- Focus on what is **new** in this preview
40+
- Consider a fresh full write-up if the feature has evolved substantially
41+
42+
## Multi-faceted PRs
43+
44+
A single PR may span multiple categories. Do not reduce to a single category — describe the full scope. Read the full PR description, not just benchmark tables.
45+
46+
## Team-specific categorization
47+
48+
If a team context file exists for the component, apply its categorization guidance (specific tiers, groupings, or style references) alongside these common rules.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Component Mapping
2+
3+
Maps VMR (`dotnet/dotnet`) source paths to .NET components, their source repositories, and release notes output files.
4+
5+
## Path-to-component mapping
6+
7+
| VMR Path Prefix | Component | Source Repo | Release Notes File | Team Context |
8+
|----------------|-----------|-------------|-------------------|--------------|
9+
| `src/runtime/src/libraries/` | Libraries | `dotnet/runtime` | `libraries.md` | `team-libraries.md` |
10+
| `src/runtime/src/coreclr/` | Runtime | `dotnet/runtime` | `runtime.md` ||
11+
| `src/runtime/src/mono/` | Runtime | `dotnet/runtime` | `runtime.md` ||
12+
| `src/runtime/src/native/` | Runtime | `dotnet/runtime` | `runtime.md` ||
13+
| `src/aspnetcore/` | ASP.NET Core | `dotnet/aspnetcore` | `aspnetcore.md` | `team-aspnetcore.md` |
14+
| `src/sdk/` | SDK | `dotnet/sdk` | `sdk.md` | `team-sdk.md` |
15+
| `src/msbuild/` | MSBuild | `dotnet/msbuild` | `msbuild.md` ||
16+
| `src/winforms/` | Windows Forms | `dotnet/winforms` | `winforms.md` ||
17+
| `src/wpf/` | WPF | `dotnet/wpf` | `wpf.md` ||
18+
| `src/efcore/` | EF Core | `dotnet/efcore` | `efcore.md` ||
19+
| `src/roslyn/` | C# / Visual Basic | `dotnet/roslyn` | `csharp.md`, `visualbasic.md` ||
20+
| `src/fsharp/` | F# | `dotnet/fsharp` | `fsharp.md` ||
21+
| `src/maui/` | .NET MAUI | `dotnet/maui` | `dotnetmaui.md` ||
22+
23+
### Classification rules
24+
25+
1. **Longest prefix wins** — when classifying a file path, match against the longest matching prefix. For example, `src/runtime/src/libraries/System.Text.Json/...` matches Libraries, not Runtime.
26+
2. **Ignore non-source paths** — skip files under `src/*/eng/`, `src/*/test/`, `src/*/tests/`, `src/*/docs/`, and build infrastructure files (`.proj`, `.targets`, `.props` at the repo root level). These do not represent user-facing changes.
27+
3. **Containers** — container image changes do not come from the VMR diff. The `containers.md` release notes are authored separately based on container image announcements. Produce a stub unless the user provides container update information.
28+
4. **Roslyn split** — the `src/roslyn/` path covers both C# and Visual Basic. When tracing to source repo PRs, check PR labels and titles to determine whether a change is C#-specific, VB-specific, or applies to both. Produce separate `csharp.md` and `visualbasic.md` files.
29+
30+
## VMR release branch naming
31+
32+
The VMR (`dotnet/dotnet`) uses this branch naming pattern:
33+
34+
```
35+
release/<MAJOR>.0.1xx-<prerelease-label>
36+
```
37+
38+
The `1xx` is the SDK feature band (standard for the first SDK release of a major version).
39+
40+
### Examples
41+
42+
| Release | Branch Name |
43+
|---------|-------------|
44+
| .NET 11 Preview 1 | `release/11.0.1xx-preview1` |
45+
| .NET 11 Preview 2 | `release/11.0.1xx-preview2` |
46+
| .NET 11 Preview 7 | `release/11.0.1xx-preview7` |
47+
| .NET 11 RC 1 | `release/11.0.1xx-rc1` |
48+
| .NET 11 RC 2 | `release/11.0.1xx-rc2` |
49+
50+
### Constructing branch names from inputs
51+
52+
Given the release name (e.g., ".NET 11 Preview 3"):
53+
- Extract major version: `11`
54+
- Extract prerelease label: `preview3`
55+
- Construct: `release/11.0.1xx-preview3`
56+
57+
If the expected branch is not found, list branches matching `release/<MAJOR>.0*` and ask the user to select the correct one.
58+
59+
## Source repo PR search patterns
60+
61+
When tracing VMR changes back to source repo PRs, use these repo-specific search strategies:
62+
63+
| Source Repo | Primary Search | Filters |
64+
|------------|----------------|---------|
65+
| `dotnet/runtime` | Area labels (`area-System.*`) + date range | Exclude: `backport`, `servicing`, test-only |
66+
| `dotnet/aspnetcore` | Milestone (`<MAJOR>.0-preview<N>`) | Exclude: `backport`, test-only |
67+
| `dotnet/sdk` | Date range + title/path inspection | Exclude: `backport`, test-only |
68+
| `dotnet/roslyn` | Milestone + labels | Exclude: `backport`, test-only |
69+
| Others | Date range | Exclude: `backport`, `servicing`, test-only |
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Deduplicate Against Previous Release Notes
2+
3+
Before authoring content, check that candidate features are not already covered in an earlier preview's release notes for the same major version. This check runs for **every component** that has candidates.
4+
5+
## Load prior release notes
6+
7+
For each component with candidates, load its release notes file from the immediately preceding release within the same major version. For example, when generating Preview 3, load Preview 2's notes for each component.
8+
9+
When generating **Preview 1** for a new major version, check the prior major version's late-cycle notes (RC1, RC2, GA):
10+
11+
```
12+
release-notes/<prev-major>/preview/rc1/<component>.md
13+
release-notes/<prev-major>/preview/rc2/<component>.md
14+
release-notes/<prev-major>/preview/ga/<component>.md
15+
```
16+
17+
These files are in the local repository clone under `release-notes/`.
18+
19+
**Retain the previous release notes in context** — they are needed in the [authoring step](categorize-entries.md) for identifying theme continuations.
20+
21+
## Check for overlap
22+
23+
For each candidate PR, check whether it (or its feature) already appears in prior release notes:
24+
25+
- **PR number references** — search for `#<number>` or the full PR URL
26+
- **Feature names** — search for the API name, type name, or feature title
27+
28+
Remove any PR whose feature is already covered. A PR merged in a prior date range but not included in those release notes may still be included — only exclude PRs whose features were actually written up.
29+
30+
## Flag earlier PRs surviving dedup
31+
32+
If any PRs were removed during dedup, review remaining candidates merged **before** the previous release's Code Complete date. Present these to the user:
33+
34+
> The following PRs were merged before the previous Code Complete date but were **not** found in prior release notes. Confirm whether to include:
35+
>
36+
> - dotnet/runtime#12345`Add Foo.Bar overload` (merged 2025-11-15)
37+
> - dotnet/runtime#12400`Optimize Baz serialization` (merged 2025-12-03)
38+
39+
If no PRs were removed during dedup, skip this sub-step.
40+
41+
## Handle cross-preview features
42+
43+
Some features span multiple PRs across previews:
44+
45+
- If the new PR is a **substantial extension** (new overloads, new scenarios, significant perf improvement, breaking changes), include it as an update referencing the earlier work. Note the theme continuation for [authoring](categorize-entries.md).
46+
- If the new PR is a **minor follow-up** (bug fix, test addition, doc comment), skip it.

0 commit comments

Comments
 (0)