From 7f1141750fc652578de00985e2651d4c7a5d8d00 Mon Sep 17 00:00:00 2001 From: James Montemagno Date: Tue, 17 Feb 2026 15:52:15 -0800 Subject: [PATCH 1/6] Add libraries.md for .NET 11 Preview 2 --- release-notes/11.0/preview/preview2/libraries.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 release-notes/11.0/preview/preview2/libraries.md diff --git a/release-notes/11.0/preview/preview2/libraries.md b/release-notes/11.0/preview/preview2/libraries.md new file mode 100644 index 00000000000..573d7c3a86b --- /dev/null +++ b/release-notes/11.0/preview/preview2/libraries.md @@ -0,0 +1,9 @@ +# .NET Libraries in .NET 11 Preview 2 - Release Notes + +Here's a summary of what's new in .NET Libraries in this Preview 2 release: + +- [Feature](#feature) + +## Feature + +Feature summary From 97465cc02bd68820e4911e6de2d5ca326b514291 Mon Sep 17 00:00:00 2001 From: Jeff Handley Date: Fri, 20 Feb 2026 02:24:05 -0800 Subject: [PATCH 2/6] Improve libraries-release-notes skill and copilot instructions - Add reviewer suggestion step (Step 5) that gathers PR authors, assignees, mergers, and coauthors to suggest release notes reviewers grouped by area - Add feature grouping guidance to categorize related PRs under single sections - Add positive tone guidelines to editorial rules - Add issue/PR reference format rules: {org}/{repo}#{number} with markdown links - Add copilot-instructions.md entry so future sessions discover the skill - Update data collection and enrichment steps to populate reviewers table - Exclude bots and Copilot from all reviewer suggestions including coauthors Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 6 ++ .../skills/libraries-release-notes/SKILL.md | 3 +- .../references/author-1-entries.md | 12 +++ .../references/author-2-format.md | 13 ++- .../references/author-3-editorial.md | 7 ++ .../references/data-2-collect-prs.md | 12 +++ .../references/data-3-enrich.md | 12 +++ .../references/suggest-reviewers.md | 84 +++++++++++++++++++ 8 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 .github/skills/libraries-release-notes/references/suggest-reviewers.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index d0262c28f9a..8c941a1b068 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -81,6 +81,12 @@ git push origin [branch-name] - `release-notes/releases-index.json` - Master index of all .NET releases - `CONTRIBUTING.md` - Links to actual contribution guidelines in dotnet/runtime +### Copilot Skills + +This repository defines Copilot skills in `/.github/skills/`. Before performing any task, check if a matching skill exists and follow its process. Current skills: + +- `libraries-release-notes` - Generate .NET Libraries release notes for a preview release + ## Common Tasks ### Adding New Release Notes diff --git a/.github/skills/libraries-release-notes/SKILL.md b/.github/skills/libraries-release-notes/SKILL.md index 94f76ca3852..25a1f2f7926 100644 --- a/.github/skills/libraries-release-notes/SKILL.md +++ b/.github/skills/libraries-release-notes/SKILL.md @@ -29,4 +29,5 @@ Generate .NET Libraries release notes for a given release. 1. [Categorize entries by area, theme, and impact](references/author-1-entries.md) 2. [Apply formatting rules](references/author-2-format.md) 3. [Apply editorial rules](references/author-3-editorial.md) -5. Confirm feature list with the user before finalizing. +5. **[Suggest reviewers](references/suggest-reviewers.md)** — gather authors, coauthors, assignees, and mergers from candidate PRs and present suggested reviewers grouped by area. +6. Confirm feature list and suggested reviewers with the user before finalizing. diff --git a/.github/skills/libraries-release-notes/references/author-1-entries.md b/.github/skills/libraries-release-notes/references/author-1-entries.md index c2a74047316..8845c815bd7 100644 --- a/.github/skills/libraries-release-notes/references/author-1-entries.md +++ b/.github/skills/libraries-release-notes/references/author-1-entries.md @@ -1,5 +1,17 @@ # Author: Categorize by Area, Theme, and Impact +## Feature Grouping + +Group related features under a **single top-level section** rather than scattering them as separate entries. Features that share a common initiative, theme, or parent issue should appear as subsections (`###`) under one heading (`##`). + +For example, if a release includes `ProcessExitStatus`, `PosixSignal.SIGKILL`, `File.OpenNullHandle`, and `Console.OpenStandardInputHandle` — all part of the new process APIs initiative — they belong under one `## New Process APIs` section with subsections for each, not as four separate top-level features. + +**Signals that features should be grouped:** +- They reference the same parent issue or initiative (e.g. `dotnet/runtime #123959`) +- They are in the same namespace or closely related namespaces +- One feature is a prerequisite for another (e.g. `SIGKILL` enables `SendSignal`) +- They would be confusing or redundant as separate TOC entries + Group PRs into tiers: - **Headline features**: New namespaces or types, implementations of new industry trends/algorithms, major new API surfaces - **Quality**: PRs or groups of PRs that improve quality across an area (recognizing `area-*` labels on the PRs and issues) diff --git a/.github/skills/libraries-release-notes/references/author-2-format.md b/.github/skills/libraries-release-notes/references/author-2-format.md index b826724e1f4..c83f5d1ceae 100644 --- a/.github/skills/libraries-release-notes/references/author-2-format.md +++ b/.github/skills/libraries-release-notes/references/author-2-format.md @@ -19,14 +19,21 @@ The release notes must mirror the style of the official .NET Preview release not ## Feature Name -[/ #NNNNN](https://github.com///pull/NNNNN) . +[/#NNNNN](https://github.com///pull/NNNNN) . ```csharp // Code example or API signature ``` ``` -## Section Rules +## Issue and PR References + +Use the format `{org}/{repo}#{number}` — no space before the `#` character. Always wrap references in markdown links that expand to the full `github.com` URL, since the release notes are published to a non-GitHub website where auto-linking is not available. + +- ✅ `[dotnet/runtime#124264](https://github.com/dotnet/runtime/pull/124264)` +- ✅ `[dotnet/runtime#118468](https://github.com/dotnet/runtime/issues/118468)` +- ❌ `[dotnet/runtime #124264](https://github.com/dotnet/runtime/pull/124264)` (space before `#`) +- ❌ `dotnet/runtime#124264` (bare reference without markdown link) 1. **TOC at top** — Every feature gets a linked entry in the table of contents. 2. **PR link first** — Each section opens with a link to the PR. @@ -40,7 +47,7 @@ The release notes must mirror the style of the official .NET Preview release not ```markdown ## Finding Certificates By Thumbprints Other Than SHA-1 -[/ #NNNNN](https://github.com///pull/NNNNN) introduces a new method +[/#NNNNN](https://github.com///pull/NNNNN) introduces a new method that accepts the name of the hash algorithm to use for matching, since SHA-2-256 and SHA-3-256 have the same lengths and making the Find method match any vaguely matching thumbprint was not ideal. diff --git a/.github/skills/libraries-release-notes/references/author-3-editorial.md b/.github/skills/libraries-release-notes/references/author-3-editorial.md index e176e026f6f..a4ec79b8cd6 100644 --- a/.github/skills/libraries-release-notes/references/author-3-editorial.md +++ b/.github/skills/libraries-release-notes/references/author-3-editorial.md @@ -1,5 +1,12 @@ # Editorial Rules +## Tone + +- Maintain a **positive tone** — highlight what new features enable rather than criticizing existing APIs or expressing prior shortcomings. + - ✅ `ProcessExitStatus provides a unified representation of how a process terminated.` + - ✅ `The new overloads extend TarFile.CreateFromDirectory to support all four tar formats.` +- When context about the prior state is needed, keep it brief and factual — one clause, not a paragraph — then pivot immediately to the new capability. + ## Benchmarks - Use **exact data** from PR descriptions — never round, approximate, or paraphrase performance numbers. diff --git a/.github/skills/libraries-release-notes/references/data-2-collect-prs.md b/.github/skills/libraries-release-notes/references/data-2-collect-prs.md index 9cb21d6fa7e..af57f972fff 100644 --- a/.github/skills/libraries-release-notes/references/data-2-collect-prs.md +++ b/.github/skills/libraries-release-notes/references/data-2-collect-prs.md @@ -101,6 +101,18 @@ CREATE TABLE issues ( Additional PRs can be added to the candidate list manually by number. Use [Enrich](data-3-enrich.md) to fetch their details. +While enriching PR details, also collect contributor information for the [reviewer suggestion step](suggest-reviewers.md). Store authors, assignees, merged-by, and requested reviewers in the `reviewers` table: + +```sql +CREATE TABLE reviewers ( + github_login TEXT NOT NULL, + role TEXT NOT NULL, -- 'author', 'assignee', 'merged_by', 'coauthor' + pr_number INTEGER NOT NULL, + area_labels TEXT, -- comma-separated area labels from the PR + PRIMARY KEY (github_login, role, pr_number) +); +``` + ## Filter to Library PRs Since the search queries above are already scoped to library area labels, most results will be relevant. Apply these additional filters before marking PRs as candidates: diff --git a/.github/skills/libraries-release-notes/references/data-3-enrich.md b/.github/skills/libraries-release-notes/references/data-3-enrich.md index 17caeee4e19..e3d772f45f4 100644 --- a/.github/skills/libraries-release-notes/references/data-3-enrich.md +++ b/.github/skills/libraries-release-notes/references/data-3-enrich.md @@ -124,3 +124,15 @@ gh search issues --repo "$REPO" --state closed "linked:pr `. + +## SQL schema + +Store reviewer data in a new SQL table: + +```sql +CREATE TABLE reviewers ( + github_login TEXT NOT NULL, + role TEXT NOT NULL, -- 'author', 'assignee', 'merged_by', 'coauthor' + pr_number INTEGER NOT NULL, + area_labels TEXT, -- comma-separated area labels from the PR + PRIMARY KEY (github_login, role, pr_number) +); +``` + +Insert one row per contributor-role-PR combination. A single person may appear multiple times across different roles and PRs. + +## Filtering + +Exclude bot accounts and Copilot from the reviewer list. This applies to all roles including coauthors: +- `Copilot`, `copilot-swe-agent[bot]`, `copilot[bot]` +- `dependabot[bot]`, `dotnet-maestro[bot]`, `github-actions[bot]` +- Any account whose login ends with `[bot]` + +## Aggregation + +Query the reviewers table to produce a summary grouped by area: + +```sql +SELECT + area_labels, + github_login, + COUNT(DISTINCT pr_number) AS pr_count, + GROUP_CONCAT(DISTINCT role) AS roles +FROM reviewers +WHERE github_login NOT LIKE '%[bot]%' + AND github_login != 'Copilot' +GROUP BY area_labels, github_login +ORDER BY area_labels, pr_count DESC, github_login; +``` + +## Presentation + +Present the suggested reviewers to the user as part of the confirmation step (Step 6). Format as a table or grouped list: + +``` +## Suggested Reviewers + +Based on the PRs included in these release notes, the following people are most +familiar with the changes and well-suited to review specific sections: + +### Process APIs (System.Diagnostics.Process) +- @person1 — authored #124264, merged #124256 (2 PRs) +- @person2 — assigned on #124264 (1 PR) + +### Tar Archive (System.Formats.Tar) +- @person3 — authored #123407 +- @person4 — assigned on #123407, merged #123407 + +### System.Text.Json +- @person5 — authored #123940 +- @person6 — reviewed and merged #123940 +``` + +**Ranking within each area:** List contributors by the number of PRs they touched (descending), then alphabetically. People who appear in multiple roles (e.g. both author and reviewer) for the same area are stronger candidates. + +**Cross-area contributors:** If someone appears across 3+ areas, call them out separately as a potential overall reviewer: + +``` +### Overall Reviewers +- @person7 — involved in 4 PRs across Process APIs, System.Text.Json, and System.IO +``` From 0d7f5e1d49465407c4effefc68f8c632108f8f1d Mon Sep 17 00:00:00 2001 From: Jeff Handley Date: Fri, 20 Feb 2026 02:24:38 -0800 Subject: [PATCH 3/6] Add .NET 11 Preview 2 Libraries release notes New features: ProcessExitStatus, PosixSignal.SIGKILL, TarFile format selection, and JsonSerializerOptions.GetTypeInfo(). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- release-notes/11.0/preview/preview2/README.md | 3 +- .../11.0/preview/preview2/libraries.md | 70 +++++++++++++++++-- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/release-notes/11.0/preview/preview2/README.md b/release-notes/11.0/preview/preview2/README.md index bfa717c8226..884792996a0 100644 --- a/release-notes/11.0/preview/preview2/README.md +++ b/release-notes/11.0/preview/preview2/README.md @@ -3,5 +3,4 @@ .NET 11 Preview 2 release notes. Find more information on new features released in .NET 11 Preview 2 by browsing through the release notes below: - [Main release notes](./11.0.0-preview.2.md) - -Component and framework-specific release notes pages will be added later. +- [Libraries](./libraries.md) diff --git a/release-notes/11.0/preview/preview2/libraries.md b/release-notes/11.0/preview/preview2/libraries.md index 573d7c3a86b..494619e472a 100644 --- a/release-notes/11.0/preview/preview2/libraries.md +++ b/release-notes/11.0/preview/preview2/libraries.md @@ -1,9 +1,71 @@ # .NET Libraries in .NET 11 Preview 2 - Release Notes -Here's a summary of what's new in .NET Libraries in this Preview 2 release: +.NET 11 Preview 2 includes new .NET Libraries features & enhancements: -- [Feature](#feature) +- [New Process APIs](#new-process-apis) +- [Tar archive format selection](#tar-archive-format-selection) +- [Generic GetTypeInfo for System.Text.Json](#generic-gettypeinfo-for-systemtextjson) -## Feature +.NET Libraries updates in .NET 11: -Feature summary +- [What's new in .NET 11](https://learn.microsoft.com/dotnet/core/whats-new/dotnet-11/overview) documentation + +## New Process APIs + +.NET 11 introduces a new set of process execution APIs designed for simplicity, reliability, and efficiency. This is part of a broader initiative ([dotnet/runtime#123959](https://github.com/dotnet/runtime/issues/123959)) to provide a `ChildProcess` API with built-in support for safe output capture, automatic child process lifetime management, and clean timeout and cancellation handling. Preview 2 includes the first foundational types for this effort. + +### ProcessExitStatus + +[dotnet/runtime#124264](https://github.com/dotnet/runtime/pull/124264) adds the `ProcessExitStatus` class, which provides a unified representation of how a process terminated — combining the exit code, cancellation status, and termination signal into a single type. + +```csharp +namespace System.Diagnostics; + +public sealed class ProcessExitStatus +{ + public ProcessExitStatus(int exitCode, bool canceled, PosixSignal? signal = null); + + public int ExitCode { get; } + public bool Canceled { get; } + public PosixSignal? Signal { get; } +} +``` + +### PosixSignal.SIGKILL + +[dotnet/runtime#124256](https://github.com/dotnet/runtime/pull/124256) adds `PosixSignal.SIGKILL` to the `PosixSignal` enum, enabling the new process APIs to send and represent SIGKILL signals. SIGKILL cannot be caught or ignored per POSIX semantics — the OS enforces this naturally, throwing appropriate exceptions if registration is attempted. This supports `SafeChildProcessHandle.SendSignal` and `Kill` methods in the upcoming `ChildProcess` API ([dotnet/runtime#123380](https://github.com/dotnet/runtime/issues/123380)). + +## Tar Archive Format Selection + +[dotnet/runtime#123407](https://github.com/dotnet/runtime/pull/123407), contributed by community member @kasperk81, adds new overloads to `TarFile.CreateFromDirectory` that accept a `TarEntryFormat` parameter. The new overloads support all four tar formats (Pax, Ustar, GNU, V7), giving you direct control over the archive format for compatibility with specific tools and environments. + +```csharp +// Create a GNU format tar archive for Linux compatibility +TarFile.CreateFromDirectory("/source/dir", "/dest/archive.tar", + includeBaseDirectory: true, TarEntryFormat.Gnu); + +// Create a Ustar format archive for broader compatibility +TarFile.CreateFromDirectory("/source/dir", outputStream, + includeBaseDirectory: false, TarEntryFormat.Ustar); + +// Async version +await TarFile.CreateFromDirectoryAsync("/source/dir", "/dest/archive.tar", + includeBaseDirectory: true, TarEntryFormat.Pax, cancellationToken); +``` + +## Generic GetTypeInfo for System.Text.Json + +[dotnet/runtime#123940](https://github.com/dotnet/runtime/pull/123940) adds generic `GetTypeInfo()` and `TryGetTypeInfo()` methods to `JsonSerializerOptions`, providing direct access to strongly-typed `JsonTypeInfo` without manual downcasting. + +```csharp +// Generic method returns the right type directly +JsonTypeInfo info = options.GetTypeInfo(); + +// TryGetTypeInfo variant for cases where the type may not be supported +if (options.TryGetTypeInfo(out JsonTypeInfo? typeInfo)) +{ + // Use typeInfo +} +``` + +This is particularly useful when working with source generation, NativeAOT, and polymorphic serialization scenarios where type metadata access is common. From c5d0a2a78fd95334f6b6e65a0c4092e02e342537 Mon Sep 17 00:00:00 2001 From: Jeff Handley Date: Wed, 4 Mar 2026 01:43:58 -0800 Subject: [PATCH 4/6] Address feedback and augment .NET Libraries Preview 2 release notes. Author release notes for .NET Libraries in .NET 11 Preview 2 covering the 2026-01-26..2026-02-11 date range. Includes: - Generic GetTypeInfo for System.Text.Json - Tar archive format selection - Matrix4x4.GetDeterminant ~15% faster - Bug fix summary across 9 areas - Community contributors section Process APIs (ProcessExitStatus, PosixSignal.SIGKILL) excluded per instructions as the feature is incomplete. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../11.0/preview/preview2/libraries.md | 76 +++++++++++-------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/release-notes/11.0/preview/preview2/libraries.md b/release-notes/11.0/preview/preview2/libraries.md index 494619e472a..d77f19fafcd 100644 --- a/release-notes/11.0/preview/preview2/libraries.md +++ b/release-notes/11.0/preview/preview2/libraries.md @@ -2,42 +2,37 @@ .NET 11 Preview 2 includes new .NET Libraries features & enhancements: -- [New Process APIs](#new-process-apis) -- [Tar archive format selection](#tar-archive-format-selection) - [Generic GetTypeInfo for System.Text.Json](#generic-gettypeinfo-for-systemtextjson) +- [Tar archive format selection](#tar-archive-format-selection) +- [Matrix4x4.GetDeterminant ~15% faster](#matrix4x4getdeterminant-15-faster) .NET Libraries updates in .NET 11: - [What's new in .NET 11](https://learn.microsoft.com/dotnet/core/whats-new/dotnet-11/overview) documentation -## New Process APIs - -.NET 11 introduces a new set of process execution APIs designed for simplicity, reliability, and efficiency. This is part of a broader initiative ([dotnet/runtime#123959](https://github.com/dotnet/runtime/issues/123959)) to provide a `ChildProcess` API with built-in support for safe output capture, automatic child process lifetime management, and clean timeout and cancellation handling. Preview 2 includes the first foundational types for this effort. - -### ProcessExitStatus +## Generic GetTypeInfo for System.Text.Json -[dotnet/runtime#124264](https://github.com/dotnet/runtime/pull/124264) adds the `ProcessExitStatus` class, which provides a unified representation of how a process terminated — combining the exit code, cancellation status, and termination signal into a single type. +A common pattern when working with `System.Text.Json` type metadata is to retrieve a `JsonTypeInfo` from `JsonSerializerOptions`, which previously required a manual downcast from the non-generic `GetTypeInfo(Type)` method ([dotnet/runtime#118468](https://github.com/dotnet/runtime/issues/118468)). New generic `GetTypeInfo()` and `TryGetTypeInfo()` methods on `JsonSerializerOptions` eliminate this cast and return strongly-typed metadata directly ([dotnet/runtime#123940](https://github.com/dotnet/runtime/pull/123940)). ```csharp -namespace System.Diagnostics; +// Before: manual downcast required +JsonTypeInfo info = (JsonTypeInfo)options.GetTypeInfo(typeof(MyType)); -public sealed class ProcessExitStatus -{ - public ProcessExitStatus(int exitCode, bool canceled, PosixSignal? signal = null); +// After: generic method returns the right type directly +JsonTypeInfo info = options.GetTypeInfo(); - public int ExitCode { get; } - public bool Canceled { get; } - public PosixSignal? Signal { get; } +// TryGetTypeInfo variant for cases where the type may not be registered +if (options.TryGetTypeInfo(out JsonTypeInfo? typeInfo)) +{ + // Use typeInfo } ``` -### PosixSignal.SIGKILL - -[dotnet/runtime#124256](https://github.com/dotnet/runtime/pull/124256) adds `PosixSignal.SIGKILL` to the `PosixSignal` enum, enabling the new process APIs to send and represent SIGKILL signals. SIGKILL cannot be caught or ignored per POSIX semantics — the OS enforces this naturally, throwing appropriate exceptions if registration is attempted. This supports `SafeChildProcessHandle.SendSignal` and `Kill` methods in the upcoming `ChildProcess` API ([dotnet/runtime#123380](https://github.com/dotnet/runtime/issues/123380)). +This is particularly useful when working with source generation, NativeAOT, and polymorphic serialization scenarios where type metadata access is common. ## Tar Archive Format Selection -[dotnet/runtime#123407](https://github.com/dotnet/runtime/pull/123407), contributed by community member @kasperk81, adds new overloads to `TarFile.CreateFromDirectory` that accept a `TarEntryFormat` parameter. The new overloads support all four tar formats (Pax, Ustar, GNU, V7), giving you direct control over the archive format for compatibility with specific tools and environments. +New overloads on `TarFile.CreateFromDirectory` accept a `TarEntryFormat` parameter, giving you direct control over the archive format ([dotnet/runtime#123407](https://github.com/dotnet/runtime/pull/123407)). Previously, `CreateFromDirectory` always produced Pax archives. The new overloads support all four tar formats — Pax, Ustar, GNU, and V7 — for compatibility with specific tools and environments ([dotnet/runtime#121819](https://github.com/dotnet/runtime/issues/121819)). ```csharp // Create a GNU format tar archive for Linux compatibility @@ -53,19 +48,38 @@ await TarFile.CreateFromDirectoryAsync("/source/dir", "/dest/archive.tar", includeBaseDirectory: true, TarEntryFormat.Pax, cancellationToken); ``` -## Generic GetTypeInfo for System.Text.Json +Thank you [@kasperk81](https://github.com/kasperk81) for this contribution! -[dotnet/runtime#123940](https://github.com/dotnet/runtime/pull/123940) adds generic `GetTypeInfo()` and `TryGetTypeInfo()` methods to `JsonSerializerOptions`, providing direct access to strongly-typed `JsonTypeInfo` without manual downcasting. +## Matrix4x4.GetDeterminant ~15% Faster -```csharp -// Generic method returns the right type directly -JsonTypeInfo info = options.GetTypeInfo(); +`Matrix4x4.GetDeterminant` now uses an SSE-vectorized implementation, improving performance by approximately 15% ([dotnet/runtime#123954](https://github.com/dotnet/runtime/pull/123954)). -// TryGetTypeInfo variant for cases where the type may not be supported -if (options.TryGetTypeInfo(out JsonTypeInfo? typeInfo)) -{ - // Use typeInfo -} -``` +| Scenario | Before | After | Improvement | +| --- | --- | --- | --- | +| `GetDeterminantBenchmark` | 3.487 ns | 2.971 ns | ~15% faster | -This is particularly useful when working with source generation, NativeAOT, and polymorphic serialization scenarios where type metadata access is common. +Thank you [@alexcovington](https://github.com/alexcovington) for this contribution! + +## Bug fixes + +This release includes bug fixes and quality improvements across several areas: + +- **System.Collections** — Fixed integer overflow in `ImmutableArray` range validation ([dotnet/runtime#124042](https://github.com/dotnet/runtime/pull/124042)) +- **System.IO.Compression** — Fixed `ZipArchiveEntry.ExtractToFile` preserving files on extraction failure with `overwrite: true` ([dotnet/runtime#123991](https://github.com/dotnet/runtime/pull/123991)) +- **System.Linq** — Fixed `Append`/`Prepend` `GetCount` overflow to correctly throw `OverflowException` ([dotnet/runtime#123821](https://github.com/dotnet/runtime/pull/123821)) +- **System.Net.Http** — Fixed authenticated proxy credential handling for proxies that require proactive `Proxy-Authorization` headers ([dotnet/runtime#123328](https://github.com/dotnet/runtime/pull/123328), reported by [@ptarjan](https://github.com/ptarjan)) +- **System.Net.Http** — Fixed edge-case non-ASCII host handling in HTTP logic ([dotnet/runtime#123934](https://github.com/dotnet/runtime/pull/123934)) +- **System.Numerics** — Fixed `Vector2`/`Vector3` `EqualsAny` and related methods returning incorrect results due to hidden padding elements ([dotnet/runtime#123594](https://github.com/dotnet/runtime/pull/123594), [dotnet/runtime#123586](https://github.com/dotnet/runtime/issues/123586)) +- **System.Numerics** — Fixed missing early returns in `TensorPrimitives.Round` causing double-rounding ([dotnet/runtime#124280](https://github.com/dotnet/runtime/pull/124280)) +- **System.Reflection** — Fixed `MetadataLoadContext` returning internal array types instead of `Type[]` from several methods ([dotnet/runtime#124251](https://github.com/dotnet/runtime/pull/124251), reported by [@smdn](https://github.com/smdn)) +- **System.Runtime** — Fixed vectorization of `Ascii.Equals` for input lengths 8–15 ([dotnet/runtime#123115](https://github.com/dotnet/runtime/pull/123115)) + +## Community contributors + +Thank you contributors! ❤️ + +- [@alexcovington](https://github.com/dotnet/runtime/pulls?q=is%3Apr+is%3Amerged+merged%3A2026-01-26..2026-02-11+author%3Aalexcovington) +- [@am11](https://github.com/dotnet/runtime/pulls?q=is%3Apr+is%3Amerged+merged%3A2026-01-26..2026-02-11+author%3Aam11) +- [@kasperk81](https://github.com/dotnet/runtime/pulls?q=is%3Apr+is%3Amerged+merged%3A2026-01-26..2026-02-11+author%3Akasperk81) +- [@pentp](https://github.com/dotnet/runtime/pulls?q=is%3Apr+is%3Amerged+merged%3A2026-01-26..2026-02-11+author%3Apentp) +- [@ptarjan](https://github.com/dotnet/runtime/pulls?q=is%3Apr+is%3Amerged+merged%3A2026-01-26..2026-02-11+author%3Aptarjan) From 77f78d12b01b65bfbfb098f3e2dbb0cbfd7f093d Mon Sep 17 00:00:00 2001 From: Jeff Handley Date: Wed, 4 Mar 2026 01:50:11 -0800 Subject: [PATCH 5/6] Delete libraries-release-notes skill. Use the release-notes skill from #10282 instead. --- .github/copilot-instructions.md | 6 - .../skills/libraries-release-notes/SKILL.md | 33 ---- .../references/author-1-entries.md | 32 ---- .../references/author-2-format.md | 59 ------- .../references/author-3-editorial.md | 68 -------- .../references/data-1-apidiff-review.md | 28 --- .../references/data-2-collect-prs.md | 159 ------------------ .../references/data-3-enrich.md | 138 --------------- .../references/process-inputs.md | 29 ---- .../references/suggest-reviewers.md | 84 --------- .../references/verify-1-dedupe.md | 44 ----- .../references/verify-2-release.md | 58 ------- 12 files changed, 738 deletions(-) delete mode 100644 .github/skills/libraries-release-notes/SKILL.md delete mode 100644 .github/skills/libraries-release-notes/references/author-1-entries.md delete mode 100644 .github/skills/libraries-release-notes/references/author-2-format.md delete mode 100644 .github/skills/libraries-release-notes/references/author-3-editorial.md delete mode 100644 .github/skills/libraries-release-notes/references/data-1-apidiff-review.md delete mode 100644 .github/skills/libraries-release-notes/references/data-2-collect-prs.md delete mode 100644 .github/skills/libraries-release-notes/references/data-3-enrich.md delete mode 100644 .github/skills/libraries-release-notes/references/process-inputs.md delete mode 100644 .github/skills/libraries-release-notes/references/suggest-reviewers.md delete mode 100644 .github/skills/libraries-release-notes/references/verify-1-dedupe.md delete mode 100644 .github/skills/libraries-release-notes/references/verify-2-release.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 8c941a1b068..d0262c28f9a 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -81,12 +81,6 @@ git push origin [branch-name] - `release-notes/releases-index.json` - Master index of all .NET releases - `CONTRIBUTING.md` - Links to actual contribution guidelines in dotnet/runtime -### Copilot Skills - -This repository defines Copilot skills in `/.github/skills/`. Before performing any task, check if a matching skill exists and follow its process. Current skills: - -- `libraries-release-notes` - Generate .NET Libraries release notes for a preview release - ## Common Tasks ### Adding New Release Notes diff --git a/.github/skills/libraries-release-notes/SKILL.md b/.github/skills/libraries-release-notes/SKILL.md deleted file mode 100644 index 25a1f2f7926..00000000000 --- a/.github/skills/libraries-release-notes/SKILL.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -name: libraries-release-notes -description: Generate .NET Libraries release notes by evaluating the release's API diff, fetching merged PRs from a GitHub repository, categorizing by area or theme, and producing formatted markdown with exact benchmark data and code examples. -disable-model-invocation: true -argument-hint: "[owner/repo]" ---- - -# Release Notes Generator - -Generate .NET Libraries release notes for a given release. - -## Execution guidelines - -- **Do not write intermediate files to disk.** Use the **SQL tool** for structured storage and querying (see [data-2-collect-prs.md](references/data-2-collect-prs.md) for schema). -- **Do not run linters, formatters, or validators.** Do not run markdownlint, prettier, link checkers, or any other validation tool on the output. The only output of this skill is the release notes markdown file itself. -- **Maximize parallel tool calls.** Fetch multiple PR and issue details in a single response to minimize round trips. - -## Process - -1. **[Process Inputs and Validate Readiness](references/process-inputs.md)** — collect inputs and verify API diffs are available. -2. **Data pipeline** — gather the changes included in the release: - 1. [Analyze the API diff](references/data-1-apidiff-review.md) - 2. [Collect and filter PRs](references/data-2-collect-prs.md) - 3. [Enrich — fetch PR and issue details](references/data-3-enrich.md) -3. **Verify scope** — validate the candidate list: - 1. [Deduplicate from previous release notes](references/verify-1-dedupe.md) - 2. [Confirm inclusion in release branch](references/verify-2-release.md) -4. **Author content** — write the release notes: - 1. [Categorize entries by area, theme, and impact](references/author-1-entries.md) - 2. [Apply formatting rules](references/author-2-format.md) - 3. [Apply editorial rules](references/author-3-editorial.md) -5. **[Suggest reviewers](references/suggest-reviewers.md)** — gather authors, coauthors, assignees, and mergers from candidate PRs and present suggested reviewers grouped by area. -6. Confirm feature list and suggested reviewers with the user before finalizing. diff --git a/.github/skills/libraries-release-notes/references/author-1-entries.md b/.github/skills/libraries-release-notes/references/author-1-entries.md deleted file mode 100644 index 8845c815bd7..00000000000 --- a/.github/skills/libraries-release-notes/references/author-1-entries.md +++ /dev/null @@ -1,32 +0,0 @@ -# Author: Categorize by Area, Theme, and Impact - -## Feature Grouping - -Group related features under a **single top-level section** rather than scattering them as separate entries. Features that share a common initiative, theme, or parent issue should appear as subsections (`###`) under one heading (`##`). - -For example, if a release includes `ProcessExitStatus`, `PosixSignal.SIGKILL`, `File.OpenNullHandle`, and `Console.OpenStandardInputHandle` — all part of the new process APIs initiative — they belong under one `## New Process APIs` section with subsections for each, not as four separate top-level features. - -**Signals that features should be grouped:** -- They reference the same parent issue or initiative (e.g. `dotnet/runtime #123959`) -- They are in the same namespace or closely related namespaces -- One feature is a prerequisite for another (e.g. `SIGKILL` enables `SendSignal`) -- They would be confusing or redundant as separate TOC entries - -Group PRs into tiers: -- **Headline features**: New namespaces or types, implementations of new industry trends/algorithms, major new API surfaces -- **Quality**: PRs or groups of PRs that improve quality across an area (recognizing `area-*` labels on the PRs and issues) -- **Performance**: PRs with benchmark data showing measurable improvements -- **API additions**: New methods/overloads on existing types -- **Small improvements**: Single-mapping additions, minor fixes with public API changes -- **Community contributions**: Large PRs labeled as `community-contribution` or collections of such PRs by the same author - -**Multi-faceted PRs.** A single PR may span multiple categories — for example, a PR that rewrites an implementation may improve correctness, fix bugs, simplify the codebase, *and* deliver performance gains. Do not reduce such PRs to a single category. When writing the release notes entry, describe the full scope of the improvement. A PR that fixes correctness bugs and improves performance should lead with the quality/reliability story and include performance data as supporting evidence — not be categorized as "Performance" alone. Read the full PR description, not just benchmark tables. - -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. The early previews (preview1 through preview5) tend to include more features, and the later previews (preview6, preview7, and rc1) tend to have fewer headline features and more quality improvements and small additions. The RC2 and GA releases typically have fewer changes so quality and performance improvements can be emphasized more. - -For community contributions, if a community contributor has provided valuable features or quality improvements for popular libraries, give those entries more consideration for mentioning in the release notes. - -Some example sets of release notes to use for reference and inspiration: -* `release-notes/11.0/preview/preview1/libraries.md` -* `release-notes/10.0/preview/preview1/libraries.md` -* `release-notes/9.0/preview/rc1/libraries.md` diff --git a/.github/skills/libraries-release-notes/references/author-2-format.md b/.github/skills/libraries-release-notes/references/author-2-format.md deleted file mode 100644 index c83f5d1ceae..00000000000 --- a/.github/skills/libraries-release-notes/references/author-2-format.md +++ /dev/null @@ -1,59 +0,0 @@ -# Release Notes Format Template - -The release notes must mirror the style of the official .NET Preview release notes (e.g. `.NET 10 Preview 1`). - -## Document Structure - -```markdown -# .NET Libraries in .NET - Release Notes - -.NET includes new .NET Libraries features & enhancements: - -- [Feature Name](#anchor) -- [Feature Name](#anchor) -... - -.NET Libraries updates in .NET : - -- [What's new in .NET ](https://learn.microsoft.com/dotnet/core/whats-new/dotnet-/overview) documentation - -## Feature Name - -[/#NNNNN](https://github.com///pull/NNNNN) . - -```csharp -// Code example or API signature -``` -``` - -## Issue and PR References - -Use the format `{org}/{repo}#{number}` — no space before the `#` character. Always wrap references in markdown links that expand to the full `github.com` URL, since the release notes are published to a non-GitHub website where auto-linking is not available. - -- ✅ `[dotnet/runtime#124264](https://github.com/dotnet/runtime/pull/124264)` -- ✅ `[dotnet/runtime#118468](https://github.com/dotnet/runtime/issues/118468)` -- ❌ `[dotnet/runtime #124264](https://github.com/dotnet/runtime/pull/124264)` (space before `#`) -- ❌ `dotnet/runtime#124264` (bare reference without markdown link) - -1. **TOC at top** — Every feature gets a linked entry in the table of contents. -2. **PR link first** — Each section opens with a link to the PR. -3. **One paragraph of context** — What the feature does and why it matters. -4. **API signature** — Show the new public API surface in a `csharp` code block. -5. **Usage example** — A short, runnable code snippet showing the feature in action. -6. **Benchmark summary** (if applicable) — State what was measured and the speedup range. Do NOT embed full BenchmarkDotNet tables. - -## Example Section - -```markdown -## Finding Certificates By Thumbprints Other Than SHA-1 - -[/#NNNNN](https://github.com///pull/NNNNN) introduces a new method -that accepts the name of the hash algorithm to use for matching, since SHA-2-256 and SHA-3-256 -have the same lengths and making the Find method match any vaguely matching thumbprint was not ideal. - -\```csharp -X509Certificate2Collection coll = store.Certificates.FindByThumbprint( - HashAlgorithmName.SHA256, thumbprint); -return coll.SingleOrDefault(); -\``` -``` diff --git a/.github/skills/libraries-release-notes/references/author-3-editorial.md b/.github/skills/libraries-release-notes/references/author-3-editorial.md deleted file mode 100644 index a4ec79b8cd6..00000000000 --- a/.github/skills/libraries-release-notes/references/author-3-editorial.md +++ /dev/null @@ -1,68 +0,0 @@ -# Editorial Rules - -## Tone - -- Maintain a **positive tone** — highlight what new features enable rather than criticizing existing APIs or expressing prior shortcomings. - - ✅ `ProcessExitStatus provides a unified representation of how a process terminated.` - - ✅ `The new overloads extend TarFile.CreateFromDirectory to support all four tar formats.` -- When context about the prior state is needed, keep it brief and factual — one clause, not a paragraph — then pivot immediately to the new capability. - -## Benchmarks - -- Use **exact data** from PR descriptions — never round, approximate, or paraphrase performance numbers. -- State the benchmark scenarios (what was measured, what hardware, what workloads). -- Report speedup ranges (e.g. "2.4–3.9x faster on Windows, 1.6–4.7x on Linux"). -- Include specific before/after measurements when they tell a compelling story (e.g. "dropped from 48.0 ns to 12.2 ns"). -- Do **not** embed full BenchmarkDotNet tables in the release notes — summarize in prose. -- If the user asks for exact tables, pull them verbatim from the PR body. Never reconstruct or approximate. - -## Attribution - -- **Community contributors**: If the PR author is not a Microsoft employee or a bot, cite them: `contributed by community member @handle`. -- **Copilot-authored PRs**: The PR author will be `Copilot` (bot). Do not credit Copilot. Cite the assignee who merged it if attribution is needed. -- **Microsoft employees**: No special attribution needed — they are implied. -- When in doubt, check the PR author's GitHub profile or the `author_association` field (`MEMBER` = Microsoft, `CONTRIBUTOR`/`NONE` = community). - -## Entry Naming - -- Prefer a **brief description** of what the feature does over simply stating the API name. The heading should help a reader understand the value at a glance. - - ✅ `## Support for Zstandard compression` - - ✅ `## Faster time zone conversions` - - ✅ `## Dictionary expression support for immutable and frozen collections` - - ❌ `## ZstandardStream` - - ❌ `## TimeZoneInfo performance` - - ❌ `## ImmutableDictionary.CreateRange` -- Keep headings concise — aim for 3–8 words. -- Include the API or type name in the body text, not necessarily in the heading. - -## Feature Ranking - -Order features by **customer impact**, using both qualitative "wow" factor and quantitative popularity signals. Promote entries that affect popular, widely-used libraries; move niche or specialized scenarios lower. - -**Primary ordering criteria** (biggest impact first): -1. Major new capabilities for popular libraries (new types, new compression algorithms, new protocol support) — especially those with high reaction counts on the backing issue or PR -2. Performance improvements with dramatic numbers in widely-used APIs (e.g. `DateTime.Now`, `HttpClient`, `JsonSerializer`) -3. New API surfaces on popular existing types, prioritized by combined PR + issue reaction count -4. Improvements to less-common or specialized libraries (e.g. `System.Reflection.Emit`, `System.Formats.Tar`) -5. Small additions and fixes - -**Popularity signals** (gathered in Step 5): -- **Reaction counts**: PRs and issues with many 👍, ❤️, or 🚀 reactions indicate strong community demand. Use the combined reaction count across the PR and its linked issues as a tiebreaker within each tier. -- **Linked issue upvotes**: An `api-approved` issue with 50+ reactions is a stronger signal than one with 2. -- **Library popularity**: Changes to `System.Text.Json`, `System.Net.Http`, `System.Collections`, `System.IO`, and `System.Threading` affect more users than changes to narrower namespaces. When two entries are otherwise similar in impact, prefer the one in the more widely-used library. - -## Inclusion Criteria - -Include a feature if it meets ANY of: -- Introduces a new public type or namespace -- Adds significant new API surface (3+ new methods) to an existing type -- Has benchmark data showing ≥20% improvement in a common scenario -- Enables a scenario that was previously impossible or required workarounds -- Was a highly-requested community feature (check linked issues for upvote counts) - -Exclude: -- Internal refactoring with no public API change -- Test-only changes -- Build/infrastructure changes -- Backports from servicing branches -- Single-line fixes unless they unblock a major scenario diff --git a/.github/skills/libraries-release-notes/references/data-1-apidiff-review.md b/.github/skills/libraries-release-notes/references/data-1-apidiff-review.md deleted file mode 100644 index fe594a59c00..00000000000 --- a/.github/skills/libraries-release-notes/references/data-1-apidiff-review.md +++ /dev/null @@ -1,28 +0,0 @@ -# Step 1: Analyze API Diff - -> **Note:** The [early API diff check](../SKILL.md#early-api-diff-check) in SKILL.md verifies that both the current and previous release API diffs exist *before* the data pipeline starts. By the time this step executes, the user has already been warned about any missing diffs and has chosen to proceed. If a diff is missing, skip the corresponding load step below but continue with the rest of the pipeline. - -## Locate the API diff - -Locate and load the `Microsoft.NETCore.App` API diff for the target release. The API diff provides context about which APIs were added or changed and significantly improves the quality of the generated release notes. - -The API diff lives under the `release-notes` folder within an `api-diff` subfolder for the target release. For example: -* .NET 10 RC 2: `release-notes/10.0/preview/rc2/api-diff/Microsoft.NETCore.App/10.0-RC2.md` -* .NET 10 GA: `release-notes/10.0/preview/ga/api-diff/Microsoft.NETCore.App/10.0-ga.md` -* .NET 11 Preview 1: `release-notes/11.0/preview/preview1/api-diff/Microsoft.NETCore.App/11.0-preview1.md` - -## Load the API diff - -Once the `api-diff` folder is located, load all of the API difference files under the `Microsoft.NETCore.App` subfolder: - -``` -api-diff/Microsoft.NETCore.App/ -``` - -For example: - -``` -release-notes/11.0/preview/preview1/api-diff/Microsoft.NETCore.App/ -``` - -Read every diff file in this folder to understand the full set of APIs that have been added or changed in the release. This information is used later to cross-reference with merged PRs and ensure the release notes accurately cover all API surface changes. diff --git a/.github/skills/libraries-release-notes/references/data-2-collect-prs.md b/.github/skills/libraries-release-notes/references/data-2-collect-prs.md deleted file mode 100644 index af57f972fff..00000000000 --- a/.github/skills/libraries-release-notes/references/data-2-collect-prs.md +++ /dev/null @@ -1,159 +0,0 @@ -# Step 2: Collect and Filter PRs - -## MCP response size - -GitHub MCP search tools that return large payloads get saved to temporary files on disk — reading those files back requires PowerShell commands that trigger approval prompts. Prevent this by keeping individual search result sets small: - -- Use **label-scoped searches** (e.g. `label:area-System.Text.Json`) instead of fetching all merged PRs at once. -- Use `perPage: 30` or less for search queries. Only use `perPage: 100` for targeted queries that are expected to return few results. -- If a search response is saved to a temp file anyway, use the `view` tool (with `view_range` for large files) to read it — **never** use PowerShell/shell commands to read or parse these files. - -## Fetch Merged PRs - -Pull merged PRs in the date range from the specified repository, filtered to library areas. The primary method is the **GitHub MCP server** tools; fall back to the **GitHub CLI (`gh`)** if the MCP server is unavailable. - -### Primary — GitHub MCP server - -Use `search_pull_requests` with **label-scoped queries** to keep result sets small and avoid large responses being saved to temp files on disk (which then require shell commands to read — triggering approval prompts). - -Search for merged PRs one area label at a time. The most common library area labels are listed below, but also search with the broader `label:area-System.` prefix to catch less-common areas: - -``` -# Search per area label — one query per label, small result sets -search_pull_requests( - owner: "dotnet", - repo: "runtime", - query: "is:merged merged:2026-01-26..2026-02-11 label:area-System.Text.Json", - perPage: 30 -) -``` - -**Recommended area labels to search** (run these in parallel batches): - -- `area-System.Text.Json`, `area-System.Net.Http`, `area-System.Collections` -- `area-System.IO`, `area-System.IO.Compression`, `area-System.Threading` -- `area-System.Numerics`, `area-System.Runtime`, `area-System.Memory` -- `area-System.Security`, `area-System.Diagnostics`, `area-System.Globalization` -- `area-System.Linq`, `area-System.Reflection`, `area-System.Reflection.Emit` -- `area-System.Formats.*`, `area-System.Net.*`, `area-System.Text.*` -- `area-Microsoft.Extensions.*`, `area-Extensions-*` - -After the label-scoped searches, do a **catch-all search** for any remaining library PRs that may use uncommon area labels. Use a broad query but keep `perPage` small: - -``` -search_pull_requests( - owner: "dotnet", - repo: "runtime", - query: "is:merged merged:2026-01-26..2026-02-11 label:area-System", - perPage: 30 -) -``` - -Page through results (incrementing `page`) until all PRs for each query are collected. Deduplicate by PR number across all queries before inserting into the database. - -**PRs without area labels.** Some PRs lack an `area-*` label altogether. To catch these, also run a search without label filters but restricted to a short date range and `perPage: 30`. Check the title and description of unlabeled PRs for library-relevant content. If a PR references a library issue (via "Fixes #..." links), fetch the issue to check for `area-*` labels. - -### Fallback — GitHub CLI - -If the GitHub MCP server is not available, use the `gh` CLI instead. Verify availability with `gh --version` first. - -```bash -REPO="dotnet/runtime" # Set from user input - -# First batch (newer half of range) -gh pr list --repo "$REPO" --state merged \ - --search "merged:2025-12-01..2026-02-01" \ - --limit 1000 --json number,title,labels,author,mergedAt,url - -# Second batch (older half of range) -gh pr list --repo "$REPO" --state merged \ - --search "merged:2025-10-01..2025-12-01" \ - --limit 1000 --json number,title,labels,author,mergedAt,url -``` - -### Data storage - -Store all fetched PR data using the **SQL tool**. Do **not** write cache files to disk — disk I/O triggers approval prompts. Insert each PR into the `prs` table and use SQL queries for all subsequent filtering. - -```sql -CREATE TABLE prs ( - number INTEGER PRIMARY KEY, - title TEXT, - author TEXT, - author_association TEXT, - labels TEXT, -- comma-separated label names - merged_at TEXT, - body TEXT, - reactions INTEGER DEFAULT 0, - is_library INTEGER DEFAULT 0, - is_candidate INTEGER DEFAULT 0 -); - -CREATE TABLE issues ( - number INTEGER PRIMARY KEY, - title TEXT, - body TEXT, - labels TEXT, - reactions INTEGER DEFAULT 0, - pr_number INTEGER -- the PR that references this issue -); -``` - -Additional PRs can be added to the candidate list manually by number. Use [Enrich](data-3-enrich.md) to fetch their details. - -While enriching PR details, also collect contributor information for the [reviewer suggestion step](suggest-reviewers.md). Store authors, assignees, merged-by, and requested reviewers in the `reviewers` table: - -```sql -CREATE TABLE reviewers ( - github_login TEXT NOT NULL, - role TEXT NOT NULL, -- 'author', 'assignee', 'merged_by', 'coauthor' - pr_number INTEGER NOT NULL, - area_labels TEXT, -- comma-separated area labels from the PR - PRIMARY KEY (github_login, role, pr_number) -); -``` - -## Filter to Library PRs - -Since the search queries above are already scoped to library area labels, most results will be relevant. Apply these additional filters before marking PRs as candidates: - -### Exclusion filters -- Labels: `backport`, `servicing`, `NO-MERGE` -- PRs whose title starts with `[release/` or contains `backport` -- PRs that are purely test, CI, or documentation changes (no `src` changes) - -### Cross-reference with API diff - -If the API diff was loaded in [Step 1](data-1-apidiff-review.md), cross-reference the candidate PRs against the new APIs. For each new API or namespace in the diff, verify that at least one candidate PR covers it. If an API in the diff has **no matching PR**, search for the implementing PR explicitly: - -``` -search_pull_requests( - owner: "dotnet", - repo: "runtime", - query: "is:merged " -) -``` - -This catches PRs that were missed by the date range (merged slightly after the Code Complete date but before the release branch was cut) or that lacked a recognized area label. Add any discovered PRs to the candidate list. - -Also use the API diff to discover **issues** that drove new APIs. Many approved APIs originate from `api-approved` issues that may reference a broader feature story. Use `search_issues` to find related issues: - -``` -search_issues( - owner: "dotnet", - repo: "runtime", - query: "label:api-approved " -) -``` - -If such issues exist, trace them to their implementing PRs and ensure those PRs are in the candidate list. - -**Unmatched API surface area.** After cross-referencing, if any substantial new APIs in the diff still cannot be correlated to a PR or issue, include a placeholder section in the release notes for each unmatched API group. Use a `**TODO**` marker so the author can manually resolve it later. For example: - -```markdown -## - -**TODO:** The API diff shows new surface area for `` but the implementing PR/issue could not be found. Investigate and fill in this section. -``` - -Mark matching PRs as candidates in the SQL `prs` table (`is_candidate = 1`). diff --git a/.github/skills/libraries-release-notes/references/data-3-enrich.md b/.github/skills/libraries-release-notes/references/data-3-enrich.md deleted file mode 100644 index e3d772f45f4..00000000000 --- a/.github/skills/libraries-release-notes/references/data-3-enrich.md +++ /dev/null @@ -1,138 +0,0 @@ -# Step 4: Enrich — Fetch PR and Issue Details - -For each library PR, fetch the full body (description) which contains benchmark data, API signatures, and motivation. Building on the PR data, fetch the details for issues referenced by or linked to the pull request — especially any issues resolved by the PR. Issues labeled `api-approved` represent new APIs being added and should be represented in the API diff if it was loaded. The issue often has a more detailed description than the PR, including API usage examples and a statement of impact/value. The final API shape (and usage example) might be somewhat out of date compared to what was approved and merged in the pull request, so usage examples may need to be revised. - -## MCP response size - -GitHub MCP search tools that return large payloads get saved to temporary files on disk — reading those files back requires PowerShell commands that trigger approval prompts. Prevent this by keeping individual search result sets small: - -- Use **label-scoped searches** (e.g. `label:area-System.Text.Json`) instead of fetching all merged PRs at once. -- Use `perPage: 30` or less for search queries. Only use `perPage: 100` for targeted queries that are expected to return few results. -- If a search response is saved to a temp file anyway, use the `view` tool (with `view_range` for large files) to read it — **never** use PowerShell/shell commands to read or parse these files. - -## Fetch PR details — GitHub MCP server (primary) - -Use `pull_request_read` with method `get` to fetch each PR's full details: - -``` -pull_request_read( - method: "get", - owner: "dotnet", - repo: "runtime", - pullNumber: -) -``` - -Multiple independent PR reads can be issued in parallel for efficiency. The PR response includes a `reactions` object with counts for each reaction type (e.g. `+1`, `heart`, `rocket`). Record the **total reaction count** for each PR as a popularity signal — PRs with high reaction counts indicate strong community interest. - -After fetching PR details, also fetch the PR's comments to look for **Copilot-generated summaries**. Copilot often posts a comment on PRs that summarizes the changes, intent, and impact — this can provide a concise understanding of the PR that complements the (sometimes lengthy or template-heavy) PR description. - -``` -pull_request_read( - method: "get_comments", - owner: "dotnet", - repo: "runtime", - pullNumber: -) -``` - -Look for comments authored by `copilot[bot]` or `github-actions[bot]` that contain a summary of the PR. These summaries are especially useful for large PRs where the description is auto-generated or sparse. Use this information to better understand the PR's purpose, but always cross-reference with the actual code changes and PR description for accuracy. - -## Discover related issues from the PR - -There are two complementary ways to find issues that a PR resolves or references. Use both to build a complete picture. - -### Parse the PR description for issue links - -Scan the PR body text for issue references. Common patterns include: - -- **Closing keywords**: `Fixes #1234`, `Closes #1234`, `Resolves #1234` (GitHub auto-links these) -- **Full URL links**: `https://github.com/dotnet/runtime/issues/1234` -- **Cross-repo references**: `dotnet/runtime#1234` -- **Bare hash references**: `#1234` (relative to the PR's repository) - -Extract all unique issue numbers from these patterns. For Copilot-authored PRs, also look in the `
` / `Original prompt` collapsed section, which typically contains the original issue title, description, and a `Fixes` link at the bottom of the PR body. - -### Use the GitHub MCP server to find linked issues - -Use `search_issues` to find issues that reference the PR or that the PR resolves: - -``` -search_issues( - owner: "dotnet", - repo: "runtime", - query: "is:closed linked:pr reason:completed " -) -``` - -This can surface issues that were closed by the PR even if the PR description does not contain an explicit `Fixes` reference (e.g. when the link was added via the GitHub sidebar rather than the PR body). - -You can also search by API name or type to find the backing issue directly: - -``` -search_issues( - owner: "dotnet", - repo: "runtime", - query: "is:closed " -) -``` - -If any discovered issue carries the `api-approved` label, pay extra attention to both that issue and its associated PR. The `api-approved` issue typically contains the approved API shape, usage examples, motivation, and discussion from the API review — all of which are valuable background for writing compelling release notes. - -## Fetch issue details - -For each discovered issue number, use `issue_read` with method `get`: - -``` -issue_read( - method: "get", - owner: "dotnet", - repo: "runtime", - issue_number: -) -``` - -Multiple independent issue reads can be issued in parallel for efficiency. The issue response includes a `reactions` object — record the **total reaction count** for each issue. Combine the PR and issue reaction counts to form an overall **popularity score** for each feature (sum of all `+1`, `heart`, `rocket`, and other positive reactions across the PR and its linked issues). Prioritize fetching issues that are: - -- Referenced by a `Fixes`/`Closes`/`Resolves` keyword (these are the resolved issues) -- Labeled `api-approved` (these contain the approved API shape and usage examples) -- Labeled `enhancement` with high reaction counts (these indicate community demand) - -The issue body often contains richer context than the PR, including: -- **API proposals** with `### API Proposal` and `### API Usage` sections -- **Motivation** explaining why the feature was requested -- **Upvote counts** (via reactions) that indicate community demand -- **Discussion comments** that may contain approved API shapes from API review - -## Fallback — GitHub CLI - -If the GitHub MCP server is not available, use the `gh` CLI: - -```bash -gh pr view --repo "$REPO" \ - --json number,title,body,labels,author,assignees,mergedAt,url - -gh issue view --repo "$REPO" \ - --json number,title,body,labels,author,assignees,url -``` - -To find issues closed by a PR via the CLI: - -```bash -# Search for closed issues linked to the PR -gh search issues --repo "$REPO" --state closed "linked:pr " -``` - -Store all fetched details using the **SQL tool** (update `body` and `reactions` columns in the `prs` table; insert into the `issues` table). Do **not** write intermediate files to disk. - -## Collect reviewer data - -While fetching PR details, also populate the `reviewers` table (see [suggest-reviewers.md](suggest-reviewers.md)) with contributor data from each candidate PR. For each PR, insert rows for: - -- **author** — `user.login` -- **assignees** — each entry in the `assignees` array -- **merged_by** — the `merged_by.login` field - -Include the PR's area labels (`area-*` labels from the `labels` field) in each row so reviewers can be grouped by area later. - -Coauthor extraction from commit trailers is handled separately in Step 5 ([suggest-reviewers.md](suggest-reviewers.md)). diff --git a/.github/skills/libraries-release-notes/references/process-inputs.md b/.github/skills/libraries-release-notes/references/process-inputs.md deleted file mode 100644 index 9ef520200e6..00000000000 --- a/.github/skills/libraries-release-notes/references/process-inputs.md +++ /dev/null @@ -1,29 +0,0 @@ -# Process Inputs and Validate Readiness - -Collect all required inputs from the user and verify that prerequisite data is available before starting the data pipeline. - -## Inputs - -If `$ARGUMENTS` is provided, use `$0` as the repository. Otherwise ask the user for the **repository** (`owner/repo`, e.g. `dotnet/runtime`). - -Collect inputs **one at a time** — ask a single question, wait for the answer, then ask the next. After each response, acknowledge what has been collected so far and ask for the next missing input: - -1. **Preview name** (e.g. ".NET 11 Preview 2") -2. **Start date** — ask: *"What was the Code Complete date for the previous release, ``?"* (ISO 8601). For **Preview 1**, this is the prior major version's RC1 Code Complete date (the vNext fork point); anything already covered in RC1/RC2/GA release notes will be de-duplicated in the [verify scope](verify-1-dedupe.md) step. -3. **End date** — ask: *"What was the Code Complete date for ``? (If it hasn't occurred yet, provide the expected date.)"* (ISO 8601) -4. **Output file** — path for the release notes markdown (default: `release-notes//preview//libraries.md`) - -## Early API Diff Check - -Before starting the data pipeline, verify that the required API diffs are present in the local repository clone. Check for both: - -1. **Current release API diff** — e.g. `release-notes//preview//api-diff/Microsoft.NETCore.App/` -2. **Previous release API diff** — e.g. `release-notes//preview//api-diff/Microsoft.NETCore.App/` (used during [deduplication](verify-1-dedupe.md) and cross-referencing) - -If **either** API diff directory is missing or empty: - -- **Warn the user immediately**, specifying which diff is missing and the expected path. -- Explain that the API diff significantly improves the quality of the release notes by enabling accurate cross-referencing of new APIs with implementing PRs. -- Ask whether to proceed without it or wait until the API diff is available. - -Do not defer this check to the data pipeline — surface the warning as soon as inputs are collected so the user can decide early whether to generate the API diff first. diff --git a/.github/skills/libraries-release-notes/references/suggest-reviewers.md b/.github/skills/libraries-release-notes/references/suggest-reviewers.md deleted file mode 100644 index 4b9d50bff4e..00000000000 --- a/.github/skills/libraries-release-notes/references/suggest-reviewers.md +++ /dev/null @@ -1,84 +0,0 @@ -# Suggest Reviewers - -After authoring the release notes, compile a list of suggested reviewers by analyzing the authors, coauthors, and reviewers of the candidate PRs that were included in the release notes. This helps the release notes author identify the right people to tag for reviewing specific sections. - -## Data sources - -For each candidate PR (those with `is_candidate = 1` in the `prs` table), gather contributor information from: - -1. **PR author** — the `user.login` field from the PR details (already fetched during [enrichment](data-3-enrich.md)). -2. **PR assignees** — the `assignees` array from the PR details. Assignees are typically the area owner or tech lead who shepherded the PR. -3. **PR merged-by** — the `merged_by` field. The person who merged the PR is familiar with the changes. -4. **Coauthors from commits** — fetch the PR's merge commit (or the commits in the PR) and look for `Co-authored-by:` trailers in commit messages. Use `get_commit` with the PR's merge commit SHA, or `list_commits` on the PR's head branch, and parse trailer lines matching `Co-authored-by: Name `. - -## SQL schema - -Store reviewer data in a new SQL table: - -```sql -CREATE TABLE reviewers ( - github_login TEXT NOT NULL, - role TEXT NOT NULL, -- 'author', 'assignee', 'merged_by', 'coauthor' - pr_number INTEGER NOT NULL, - area_labels TEXT, -- comma-separated area labels from the PR - PRIMARY KEY (github_login, role, pr_number) -); -``` - -Insert one row per contributor-role-PR combination. A single person may appear multiple times across different roles and PRs. - -## Filtering - -Exclude bot accounts and Copilot from the reviewer list. This applies to all roles including coauthors: -- `Copilot`, `copilot-swe-agent[bot]`, `copilot[bot]` -- `dependabot[bot]`, `dotnet-maestro[bot]`, `github-actions[bot]` -- Any account whose login ends with `[bot]` - -## Aggregation - -Query the reviewers table to produce a summary grouped by area: - -```sql -SELECT - area_labels, - github_login, - COUNT(DISTINCT pr_number) AS pr_count, - GROUP_CONCAT(DISTINCT role) AS roles -FROM reviewers -WHERE github_login NOT LIKE '%[bot]%' - AND github_login != 'Copilot' -GROUP BY area_labels, github_login -ORDER BY area_labels, pr_count DESC, github_login; -``` - -## Presentation - -Present the suggested reviewers to the user as part of the confirmation step (Step 6). Format as a table or grouped list: - -``` -## Suggested Reviewers - -Based on the PRs included in these release notes, the following people are most -familiar with the changes and well-suited to review specific sections: - -### Process APIs (System.Diagnostics.Process) -- @person1 — authored #124264, merged #124256 (2 PRs) -- @person2 — assigned on #124264 (1 PR) - -### Tar Archive (System.Formats.Tar) -- @person3 — authored #123407 -- @person4 — assigned on #123407, merged #123407 - -### System.Text.Json -- @person5 — authored #123940 -- @person6 — reviewed and merged #123940 -``` - -**Ranking within each area:** List contributors by the number of PRs they touched (descending), then alphabetically. People who appear in multiple roles (e.g. both author and reviewer) for the same area are stronger candidates. - -**Cross-area contributors:** If someone appears across 3+ areas, call them out separately as a potential overall reviewer: - -``` -### Overall Reviewers -- @person7 — involved in 4 PRs across Process APIs, System.Text.Json, and System.IO -``` diff --git a/.github/skills/libraries-release-notes/references/verify-1-dedupe.md b/.github/skills/libraries-release-notes/references/verify-1-dedupe.md deleted file mode 100644 index ce713645f89..00000000000 --- a/.github/skills/libraries-release-notes/references/verify-1-dedupe.md +++ /dev/null @@ -1,44 +0,0 @@ -# Verify: Deduplicate Against Previous Release Notes - -Before authoring content, check that candidate features have not already been covered in an earlier preview's release notes for the same major version. - -## Load prior release notes - -Load the `libraries.md` file from the immediately preceding release within the same major version. For example, when generating Preview 3, load Preview 2's notes; when generating RC1, load Preview 7's notes. - -When generating **Preview 1** release notes for a new major version, there are no prior previews to check. Instead, look back at the prior major version's late-cycle release notes — specifically RC1, RC2, and GA — since features that landed late in the previous release cycle may overlap with early work in the new version. For example, when generating .NET 12 Preview 1 notes, check: - -``` -release-notes/11.0/preview/rc1/libraries.md -release-notes/11.0/preview/rc2/libraries.md -release-notes/11.0/preview/ga/libraries.md -``` - -These files are in the local repository clone under `release-notes//preview/`. - -## Check for overlap - -For each candidate PR, check whether it (or its feature) already appears in a prior release's notes by looking for: - -- **PR number references** — search for `#` or the full PR URL in prior files -- **Feature names** — search for the API name, type name, or feature title (e.g. `IdnMapping`, `File.OpenNullHandle`, `Zstandard`) - -Remove any PR from the candidate list whose feature is already covered. A PR that was merged in the date range of a prior preview but was not included in that preview's release notes may still be included — only exclude PRs whose features were actually written up. - -## Flag earlier PRs that survived dedup - -If any PRs were removed during dedup, review the remaining candidate PRs that were merged **before** the previous release's Code Complete date (i.e. PRs whose merge date falls in the earlier portion of the date range). These PRs were not found in the prior release notes but their merge dates suggest they *could* have been covered elsewhere. Present these PRs to the user and ask whether each should be included or excluded. For example: - -> The following PRs were merged before the .NET 11 Preview 1 Code Complete date but were **not** found in any prior release notes. They may have been intentionally omitted or covered in a different document. Please confirm whether to include them: -> -> - #12345 — `Add Foo.Bar overload` (merged 2025-11-15) -> - #12400 — `Optimize Baz serialization` (merged 2025-12-03) - -If no PRs were removed during dedup (i.e. nothing overlapped with prior notes), skip this sub-step — the earlier merge dates are expected given the date range and do not need user confirmation. - -## Handle cross-preview features - -Some features span multiple PRs across previews (e.g. a Preview 1 PR adds the core API and a Preview 2 PR extends it). In these cases: - -- If the Preview 2 PR is a **substantial extension** (new overloads, new scenarios, significant perf improvement on top of the original, or breaking changes to the API shape), include it as an update referencing the earlier work. -- If the Preview 2 PR is a **minor follow-up** (bug fix, test addition, doc comment), skip it. diff --git a/.github/skills/libraries-release-notes/references/verify-2-release.md b/.github/skills/libraries-release-notes/references/verify-2-release.md deleted file mode 100644 index d2bd8f5a600..00000000000 --- a/.github/skills/libraries-release-notes/references/verify-2-release.md +++ /dev/null @@ -1,58 +0,0 @@ -# Verify: Confirm Inclusion in Release Branch - -After collecting and enriching candidates (including any manually added PRs), verify that candidate changes actually shipped in the target release by checking the `dotnet/dotnet` Virtual Monolithic Repository (VMR). The VMR contains all .NET source code — including `dotnet/runtime` under `src/runtime/` — and its release branches represent what ships in each preview. - -## Determine the release branch name - -The expected branch name pattern is: - -``` -release/.0.1xx- -``` - -For example: -- .NET 11 Preview 1 → `release/11.0.1xx-preview1` -- .NET 11 Preview 2 → `release/11.0.1xx-preview2` -- .NET 11 RC 1 → `release/11.0.1xx-rc1` - -Use the GitHub MCP server (or CLI fallback) to verify the branch exists: - -``` -list_branches( - owner: "dotnet", - repo: "dotnet" -) -``` - -If the expected branch is **not found**, search for branches matching `release/.0*` and present the user with the matching branch names so they can select the correct one. - -## Spot-check that the newest changes are included - -Start from the most recently merged PRs in the candidate list and work backward. For each PR, verify its changes are present in the VMR release branch by either: - -1. **Searching for code** introduced by the PR in the `dotnet/dotnet` repo: - - ``` - search_code( - query: "repo:dotnet/dotnet path:src/runtime " - ) - ``` - -2. **Checking commit history** on the release branch for runtime source code updates that post-date the PR merge: - - ``` - list_commits( - owner: "dotnet", - repo: "dotnet", - sha: "release/.0.1xx-", - perPage: 30 - ) - ``` - - Look for commits with messages like `"Source code updates from dotnet/runtime"` dated after the PR's merge date. The dotnet-maestro bot regularly syncs changes from `dotnet/runtime` into the VMR. - -Stop checking after **2 consecutive PRs are confirmed present** — if the two newest changes made it into the release branch, older changes are also included. - -If any change is **not found** in the release branch, inform the user that the feature may not have been included in this preview release. Suggest either: -- Moving that feature to the **next preview's** release notes -- Confirming with the release team whether a late sync occurred From d6393d0c641c4e59d407d56d5e50128e2de90a6d Mon Sep 17 00:00:00 2001 From: Jeff Handley Date: Wed, 4 Mar 2026 22:47:36 -0800 Subject: [PATCH 6/6] Reformat bug fixes section to use grouped sub-bullet style Update the Libraries Preview 2 release notes bug fixes section to use nested sub-bullets grouped by area, matching the revised formatting guidelines. Multi-fix areas (System.Net.Http, System.Numerics) are now consolidated under their area heading, and single-fix areas also use sub-bullets for consistency. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../11.0/preview/preview2/libraries.md | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/release-notes/11.0/preview/preview2/libraries.md b/release-notes/11.0/preview/preview2/libraries.md index d77f19fafcd..c9060563962 100644 --- a/release-notes/11.0/preview/preview2/libraries.md +++ b/release-notes/11.0/preview/preview2/libraries.md @@ -64,15 +64,22 @@ Thank you [@alexcovington](https://github.com/alexcovington) for this contributi This release includes bug fixes and quality improvements across several areas: -- **System.Collections** — Fixed integer overflow in `ImmutableArray` range validation ([dotnet/runtime#124042](https://github.com/dotnet/runtime/pull/124042)) -- **System.IO.Compression** — Fixed `ZipArchiveEntry.ExtractToFile` preserving files on extraction failure with `overwrite: true` ([dotnet/runtime#123991](https://github.com/dotnet/runtime/pull/123991)) -- **System.Linq** — Fixed `Append`/`Prepend` `GetCount` overflow to correctly throw `OverflowException` ([dotnet/runtime#123821](https://github.com/dotnet/runtime/pull/123821)) -- **System.Net.Http** — Fixed authenticated proxy credential handling for proxies that require proactive `Proxy-Authorization` headers ([dotnet/runtime#123328](https://github.com/dotnet/runtime/pull/123328), reported by [@ptarjan](https://github.com/ptarjan)) -- **System.Net.Http** — Fixed edge-case non-ASCII host handling in HTTP logic ([dotnet/runtime#123934](https://github.com/dotnet/runtime/pull/123934)) -- **System.Numerics** — Fixed `Vector2`/`Vector3` `EqualsAny` and related methods returning incorrect results due to hidden padding elements ([dotnet/runtime#123594](https://github.com/dotnet/runtime/pull/123594), [dotnet/runtime#123586](https://github.com/dotnet/runtime/issues/123586)) -- **System.Numerics** — Fixed missing early returns in `TensorPrimitives.Round` causing double-rounding ([dotnet/runtime#124280](https://github.com/dotnet/runtime/pull/124280)) -- **System.Reflection** — Fixed `MetadataLoadContext` returning internal array types instead of `Type[]` from several methods ([dotnet/runtime#124251](https://github.com/dotnet/runtime/pull/124251), reported by [@smdn](https://github.com/smdn)) -- **System.Runtime** — Fixed vectorization of `Ascii.Equals` for input lengths 8–15 ([dotnet/runtime#123115](https://github.com/dotnet/runtime/pull/123115)) +- **System.Collections** + - Fixed integer overflow in `ImmutableArray` range validation ([dotnet/runtime#124042](https://github.com/dotnet/runtime/pull/124042)) +- **System.IO.Compression** + - Fixed `ZipArchiveEntry.ExtractToFile` preserving files on extraction failure with `overwrite: true` ([dotnet/runtime#123991](https://github.com/dotnet/runtime/pull/123991)) +- **System.Linq** + - Fixed `Append`/`Prepend` `GetCount` overflow to correctly throw `OverflowException` ([dotnet/runtime#123821](https://github.com/dotnet/runtime/pull/123821)) +- **System.Net.Http** + - Fixed authenticated proxy credential handling for proxies that require proactive `Proxy-Authorization` headers ([dotnet/runtime#123328](https://github.com/dotnet/runtime/pull/123328), reported by [@ptarjan](https://github.com/ptarjan)) + - Fixed edge-case non-ASCII host handling in HTTP logic ([dotnet/runtime#123934](https://github.com/dotnet/runtime/pull/123934)) +- **System.Numerics** + - Fixed `Vector2`/`Vector3` `EqualsAny` and related methods returning incorrect results due to hidden padding elements ([dotnet/runtime#123594](https://github.com/dotnet/runtime/pull/123594), [dotnet/runtime#123586](https://github.com/dotnet/runtime/issues/123586)) + - Fixed missing early returns in `TensorPrimitives.Round` causing double-rounding ([dotnet/runtime#124280](https://github.com/dotnet/runtime/pull/124280)) +- **System.Reflection** + - Fixed `MetadataLoadContext` returning internal array types instead of `Type[]` from several methods ([dotnet/runtime#124251](https://github.com/dotnet/runtime/pull/124251), reported by [@smdn](https://github.com/smdn)) +- **System.Runtime** + - Fixed vectorization of `Ascii.Equals` for input lengths 8–15 ([dotnet/runtime#123115](https://github.com/dotnet/runtime/pull/123115)) ## Community contributors