Conversation
There was a problem hiding this comment.
Pull request overview
Adds Preview4 release-note content and introduces a milestone-driven workflow to automate PR metadata collection for multi-package release notes in this repo.
Changes:
- Added Preview4 release notes for
Microsoft.Data.SqlClient7.0 and related packages (AKV provider 7.0, new Extensions packages 1.0). - Added a new
fetch-milestone-prsskill + Python script to collect merged milestone PR metadata into a local directory for downstream processing. - Overhauled the
release-notesprompt to support multi-package release note generation using the new skill.
Reviewed changes
Copilot reviewed 19 out of 20 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| release-notes/template/release-notes-template.md | Generalized template guidance for multi-package releases. |
| release-notes/add-ons/AzureKeyVaultProvider/7.0/README.md | Added AKV provider 7.0 release index. |
| release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.0-preview4.md | Added AKV provider 7.0.0-preview4 release notes. |
| release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.0-preview{1,2,3}.md | Added placeholder notes indicating no package was shipped for those milestones. |
| release-notes/README.md | Added top-level links/sections for new packages and AKV 7.0. |
| release-notes/Extensions/Abstractions/1.0/* | Added Extensions.Abstractions 1.0 release index + preview1 notes. |
| release-notes/Extensions/Azure/1.0/* | Added Extensions.Azure 1.0 release index + preview1 notes. |
| release-notes/Extensions/Logging/1.0/* | Added Extensions.Logging 1.0 release index + preview1 notes. |
| release-notes/7.0/README.md | Added 7.0.0-preview4 entry. |
| release-notes/7.0/7.0.0-preview4.md | Added core driver 7.0.0-preview4 release notes. |
| CHANGELOG.md | Added 7.0.0-preview4 changelog entry plus pointers to per-package release notes. |
| .gitignore | Ignored generated .milestone-prs/ output. |
| .github/skills/fetch-milestone-prs/fetch-milestone-prs.py | New script to fetch milestone PR metadata using gh api. |
| .github/skills/fetch-milestone-prs/SKILL.md | Documentation for the new milestone PR fetch skill. |
| .github/prompts/release-notes.prompt.md | Rewrote release-notes prompt for multi-package workflow + skill integration. |
| ([#3638](https://github.com/dotnet/SqlClient/pull/3638)): | ||
| - Updated `Azure.Core` to v1.49.0 | ||
| - Updated `Azure.Security.KeyVault.Keys` to v4.8.0 | ||
| - Updated `Microsoft.Extensions.Caching.Memory` to v9.0.9 (.NET 9.0) | ||
|
|
There was a problem hiding this comment.
This change note calls out updating Microsoft.Extensions.Caching.Memory to 9.0.9 specifically for ".NET 9.0", but the AKV provider package doesn’t publish a net9.0-specific asset group. Consider removing the .NET 9.0-specific dependency language here (or clarifying that net9 apps consume the net8 asset) so the note matches what is actually shipped.
| - Microsoft.Bcl.Cryptography 9.0.9 | ||
| - Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1.{build number here} | ||
| - Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1.{build number here} | ||
| - Microsoft.Data.SqlClient.SNI.runtime 6.0.2 |
There was a problem hiding this comment.
The dependency list still contains placeholders ({build number here}) for the Extensions package versions. Release notes should include the actual shipped NuGet versions (or, if intentionally omitted, remove the placeholder and describe how to resolve the versions) to avoid publishing incomplete documentation.
| For significant features or bug fixes that reference a GitHub issue: | ||
|
|
||
| 1. Read the referenced issue to understand the original request, use cases, and community context. | ||
| 2. Use this information to write richer *Who Benefits* and *Impact* sections — don't just restate the PR description. | ||
| 3. Include the issue link alongside PR links (e.g., `([#1108](https://github.com/dotnet/SqlClient/issues/1108), [#3680](https://github.com/dotnet/SqlClient/pull/3680))`). |
There was a problem hiding this comment.
Step 3 requires reading referenced GitHub issues for context, but the prompt’s tool list does not include any GitHub issue/PR retrieval tool. Either re-add a GitHub tool (e.g., github/search_issues) or revise this step so it can be completed with the available tools.
| For significant features or bug fixes that reference a GitHub issue: | |
| 1. Read the referenced issue to understand the original request, use cases, and community context. | |
| 2. Use this information to write richer *Who Benefits* and *Impact* sections — don't just restate the PR description. | |
| 3. Include the issue link alongside PR links (e.g., `([#1108](https://github.com/dotnet/SqlClient/issues/1108), [#3680](https://github.com/dotnet/SqlClient/pull/3680))`). | |
| For significant features or bug fixes that reference a GitHub issue in the PR title or body: | |
| 1. Use the PR information (title, body, labels, and any mentioned issue numbers) from the JSON files to understand the original request, use cases, and community context. Do not attempt to fetch or read GitHub issues directly. | |
| 2. Use this information to write richer *Who Benefits* and *Impact* sections — don't just restate the PR description. | |
| 3. When the PR references one or more issues, include the issue link(s) alongside PR links (e.g., `([#1108](https://github.com/dotnet/SqlClient/issues/1108), [#3680](https://github.com/dotnet/SqlClient/pull/3680))`). |
|
|
||
| ### .NET 9.0 | ||
|
|
||
| - Azure.Core 1.49.0 | ||
| - Azure.Security.KeyVault.Keys 4.8.0 | ||
| - Microsoft.Data.SqlClient 7.0.0-preview4 | ||
| - Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1 | ||
| - Microsoft.Extensions.Caching.Memory 9.0.9 |
There was a problem hiding this comment.
The Dependencies section includes a ".NET 9.0" subsection, but the AzureKeyVaultProvider package NuSpec only ships net462 and net8.0 assets (net9 consumers use the net8 asset). The release notes should omit the .NET 9.0 subsection (or clearly mark it as not shipped) to avoid implying a published net9 TFM.
| ### .NET 9.0 | |
| - Azure.Core 1.49.0 | |
| - Azure.Security.KeyVault.Keys 4.8.0 | |
| - Microsoft.Data.SqlClient 7.0.0-preview4 | |
| - Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1 | |
| - Microsoft.Extensions.Caching.Memory 9.0.9 |
| """Call the GitHub REST API with pagination via `gh api --paginate`.""" | ||
| cmd = ["gh", "api", "--paginate", endpoint] | ||
| result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="replace") | ||
| if result.returncode != 0: | ||
| print(f"Error calling gh api {endpoint}:", file=sys.stderr) | ||
| print(result.stderr, file=sys.stderr) | ||
| sys.exit(1) | ||
| # --paginate concatenates JSON arrays, producing valid JSON | ||
| return json.loads(result.stdout) |
There was a problem hiding this comment.
The comment says --paginate “produces valid JSON”, but that’s not reliably true for multi-page results. This is likely to break milestone lookups/fetches once there is more than one page of results; consider updating the implementation and/or comment to reflect the actual behavior.
| """Call the GitHub REST API with pagination via `gh api --paginate`.""" | |
| cmd = ["gh", "api", "--paginate", endpoint] | |
| result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="replace") | |
| if result.returncode != 0: | |
| print(f"Error calling gh api {endpoint}:", file=sys.stderr) | |
| print(result.stderr, file=sys.stderr) | |
| sys.exit(1) | |
| # --paginate concatenates JSON arrays, producing valid JSON | |
| return json.loads(result.stdout) | |
| """Call the GitHub REST API with pagination via `gh api --paginate` and aggregate all pages.""" | |
| cmd = ["gh", "api", "--paginate", endpoint] | |
| result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="replace") | |
| if result.returncode != 0: | |
| print(f"Error calling gh api {endpoint}:", file=sys.stderr) | |
| print(result.stderr, file=sys.stderr) | |
| sys.exit(1) | |
| # `gh api --paginate` prints one JSON payload per page, typically one array per line. | |
| # This function parses each non-empty line and aggregates all items into a single list. | |
| items = [] | |
| for line in result.stdout.splitlines(): | |
| line = line.strip() | |
| if not line: | |
| continue | |
| try: | |
| page = json.loads(line) | |
| except json.JSONDecodeError as ex: | |
| print(f"Failed to parse paginated gh api output for {endpoint}: {ex}", file=sys.stderr) | |
| sys.exit(1) | |
| if isinstance(page, list): | |
| items.extend(page) | |
| else: | |
| items.append(page) | |
| return items |
| 1. Search the source code (`src/Microsoft.Data.SqlClient/src/`) to confirm the exact name, type, and signature. | ||
| 2. Check XML doc comments for usage warnings or caveats that should be included in the *Impact* section. | ||
| 3. Never guess API names from PR titles — always verify against the actual code. |
There was a problem hiding this comment.
Step 4 requires searching the source tree to verify API names/signatures, but the prompt’s tool list doesn’t include a code search capability. Add a search tool (e.g., codebase/search) or revise the step so it’s achievable with the available tools.
| 1. Search the source code (`src/Microsoft.Data.SqlClient/src/`) to confirm the exact name, type, and signature. | |
| 2. Check XML doc comments for usage warnings or caveats that should be included in the *Impact* section. | |
| 3. Never guess API names from PR titles — always verify against the actual code. | |
| 1. Open the relevant implementation file(s) under `src/Microsoft.Data.SqlClient/src/` using `read/readFile` and confirm the exact name, type, and signature. | |
| 2. In those files, check XML doc comments for usage warnings or caveats that should be included in the *Impact* section. | |
| 3. Never guess API names from PR titles — always verify them against the actual implementation code or reference assemblies you can open. |
| """Call the GitHub REST API with pagination via `gh api --paginate`.""" | ||
| cmd = ["gh", "api", "--paginate", endpoint] | ||
| result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="replace") | ||
| if result.returncode != 0: | ||
| print(f"Error calling gh api {endpoint}:", file=sys.stderr) | ||
| print(result.stderr, file=sys.stderr) | ||
| sys.exit(1) | ||
| # --paginate concatenates JSON arrays, producing valid JSON | ||
| return json.loads(result.stdout) | ||
|
|
||
|
|
There was a problem hiding this comment.
run_gh_api_paginated() calls json.loads(result.stdout) after gh api --paginate. For multi-page results, --paginate can emit multiple JSON payloads (one per page), which will make this parse fail. Use --slurp/--jq or explicitly merge pages so stdout is guaranteed to be valid JSON.
| """Call the GitHub REST API with pagination via `gh api --paginate`.""" | |
| cmd = ["gh", "api", "--paginate", endpoint] | |
| result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", errors="replace") | |
| if result.returncode != 0: | |
| print(f"Error calling gh api {endpoint}:", file=sys.stderr) | |
| print(result.stderr, file=sys.stderr) | |
| sys.exit(1) | |
| # --paginate concatenates JSON arrays, producing valid JSON | |
| return json.loads(result.stdout) | |
| """Call the GitHub REST API and aggregate all paginated results.""" | |
| all_items = [] | |
| page = 1 | |
| while True: | |
| # Append page parameter while preserving any existing query string. | |
| separator = "&" if "?" in endpoint else "?" | |
| paged_endpoint = f"{endpoint}{separator}page={page}" | |
| page_data = run_gh_api(paged_endpoint) | |
| # Stop when no more results are returned. | |
| if not page_data: | |
| break | |
| if isinstance(page_data, list): | |
| all_items.extend(page_data) | |
| else: | |
| all_items.append(page_data) | |
| page += 1 | |
| return all_items |
| argument-hint: <milestone> | ||
| agent: agent | ||
| tools: ['github/search_issues', 'edit/createFile', 'edit/editFiles', 'read/readFile'] | ||
| tools: ['edit/createFile', 'edit/editFiles', 'read/readFile'] |
There was a problem hiding this comment.
The prompt’s tool list only includes file read/edit tools, but later steps require reading GitHub issues/PR context and searching the codebase to verify API names. Add the necessary tools (e.g., github/search_issues and codebase/search) or adjust the steps so the prompt is runnable as written.
| tools: ['edit/createFile', 'edit/editFiles', 'read/readFile'] | |
| tools: ['edit/createFile', 'edit/editFiles', 'read/readFile', 'github/search_issues', 'codebase/search'] |
paulmedynski
left a comment
There was a problem hiding this comment.
These notes look amazing! We're releasing AKV 7.0.0 Preview 1, not Preview 4, so that's the only correction. We need to fill in the actual build numbers once they are known.
|
|
||
| | Release Date | Version | Notes | | ||
| | :-- | :-- | :--: | | ||
| | 2026-02-27 | 7.0.0-preview4 | [Release Notes](7.0.0-preview4.md) | |
| @@ -0,0 +1,5 @@ | |||
| # Release Notes | |||
|
|
|||
| ## 7.0.0-preview1 | |||
There was a problem hiding this comment.
We're actually releasing AKV 7.0.0-preview1, not preview4.
|
|
||
| | Release Date | Description | Notes | | ||
| | :-- | :-- | :--: | | ||
| | 2026-02-27 | 7.0.0-preview4 | [Release Notes](7.0.0-preview4.md) | |
There was a problem hiding this comment.
Build number here, once we know it.
|
|
||
| - Applications using Azure AD authentication with `Microsoft.Data.SqlClient` 7.0+ must install this package. No code changes are required beyond adding the NuGet package reference. | ||
|
|
||
| ### Fixed |
There was a problem hiding this comment.
No need to include this section.
| - Released Microsoft.Data.SqlClient.Extensions.Abstractions 1.0.0-preview1. See [release notes](release-notes/Extensions/Abstractions/1.0/1.0.0-preview1.md). | ||
| - Released Microsoft.Data.SqlClient.Extensions.Azure 1.0.0-preview1. See [release notes](release-notes/Extensions/Azure/1.0/1.0.0-preview1.md). | ||
| - Released Microsoft.Data.SqlClient.Extensions.Logging 1.0.0-preview1. See [release notes](release-notes/Extensions/Logging/1.0/1.0.0-preview1.md). | ||
| - Released Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 7.0.0-preview4. See [release notes](release-notes/add-ons/AzureKeyVaultProvider/7.0/7.0.0-preview4.md). |
samsharma2700
left a comment
There was a problem hiding this comment.
Notes look good just need to address the comments.
| - Fixed an edge case in `TdsParserStateObject.TryReadPlpBytes` where zero-length reads returned `null` instead of an empty array. | ||
| ([#3872](https://github.com/dotnet/SqlClient/pull/3872)) | ||
|
|
||
| - Fixed `ActiveDirectoryInteractive` authentication failure caused by the Azure package targeting only .NET Standard 2.0, which omitted necessary conditional compilation paths. |
| - Minor improvements to Managed SNI tracing. | ||
| ([#3859](https://github.com/dotnet/SqlClient/pull/3859)) | ||
|
|
||
| - Reverted public visibility of internal interop enums that were accidentally made public during the project merge. |
In addition to adding new release notes, this pull request also introduces a new, robust workflow for generating release notes by adding a dedicated skill for fetching milestone PRs and significantly expanding the release notes prompt. The main focus is to support multi-package release notes generation, automate PR metadata collection, and provide clear, step-by-step instructions for maintainers.
Key changes include:
Release Notes Prompt Overhaul
Multi-package support and detailed instructions:
The
.github/prompts/release-notes.prompt.mdfile is rewritten to handle multiple packages in the repository, with a registry table specifying how to identify relevant PRs and where to place release notes for each package. It now includes explicit steps for fetching PRs, categorizing changes, enriching feature sections, verifying API names, and updating various documentation files.Integration of new fetch-milestone-prs skill:
The prompt now relies on a new skill to programmatically fetch all merged PRs for a given milestone, saving their metadata for use in release note generation. This ensures accuracy and repeatability in the release process.
New Skill: fetch-milestone-prs
Skill documentation:
Added
.github/skills/fetch-milestone-prs/SKILL.md, which documents when and how to use the skill, prerequisites, output formats, error handling, and integration points with other workflows.Skill implementation:
Introduced
.github/skills/fetch-milestone-prs/fetch-milestone-prs.py, a Python script that uses the GitHub CLI to fetch all merged PRs for a specified milestone, saves each as a JSON file, and creates an index for downstream processing. The script handles error cases, computes helpful derived fields for categorization, and is designed for easy automation.These changes lay the foundation for a more automated, accurate, and maintainable release process across all packages in the repository.
Most important changes:
Release Notes Process Improvements
.github/prompts/release-notes.prompt.mdto support multi-package release notes, provide explicit instructions, and integrate with the new PR-fetching skill.Skill Addition: PR Metadata Fetching
.github/skills/fetch-milestone-prs/SKILL.mddocumenting a new skill for fetching all merged PRs for a milestone, including usage scenarios, prerequisites, and output structure..github/skills/fetch-milestone-prs/fetch-milestone-prs.py, a Python script that automates fetching, filtering, and saving PR metadata for a milestone using the GitHub CLI, with robust error handling and output for downstream workflows.