You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/skills/editorial-scoring/SKILL.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -61,6 +61,7 @@ This is how foundational but initially niche work can still earn a good score.
61
61
- Build or infrastructure churn
62
62
- Refactoring with no user-visible effect
63
63
- VMR sync noise, dependency updates, or repo automation
64
+
- Product-boundary mismatch — repo-adjacent IDE/editor/design-time tooling work when the notes are for a different product surface
64
65
- Highly specialized implementation details that read like internal jargon
65
66
- Features that only matter after several stacked conditions are true (for example: uses single-file publish **and** cares deeply about startup **and** is willing to do extra training/tuning)
66
67
- PRs with very thin descriptions where the only concrete signal is an internal runtime/tooling term like cDAC
"\"This reverts https://github.com/dotnet/<repo>/pull/<number>\" OR \"revert <number>\" OR \"back out <number>\"" \
88
+
--json number,title,mergedAt,url
89
+
```
90
+
91
+
When a revert is found:
92
+
93
+
- annotate the original entry with `reverted_by`
94
+
- annotate the revert entry with `reverts`, when both are present in the file
95
+
- set the original score to `0` unless you can verify the shipped build still contains the feature
96
+
97
+
Do **not** promote an item to section-worthy status until this pass is complete.
98
+
99
+
### 3. Score what shipped
69
100
70
101
Look for signals such as:
71
102
@@ -85,14 +116,30 @@ Down-rank or exclude:
85
116
- infra and dependency churn
86
117
- test-only changes
87
118
- internal refactors with no user-facing impact
119
+
- items that violate the product-boundary rule in `editorial-rules.md`
88
120
- reverts and partial work that did not survive into the build
89
121
- items that mostly require insider knowledge to understand why they matter
90
122
91
-
### 3. Use API evidence to refine the score
123
+
### 4. Use API evidence to refine the score
92
124
93
125
If a change depends on public APIs, use `api-diff` / `dotnet-inspect` to confirm the API exists in the actual build. Missing or reverted APIs should be scored down or excluded.
94
126
95
-
### 4. Write `features.json`
127
+
### 5. Merge incrementally when `features.json` already exists
128
+
129
+
If the milestone branch already has a `features.json`, do **not** throw that
130
+
work away just because `changes.json` was regenerated. For the full rerun
Copy file name to clipboardExpand all lines: .github/skills/release-notes/SKILL.md
+17-7Lines changed: 17 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
---
2
2
name: release-notes
3
-
description: Generate and maintain .NET release notes from `features.json`. Uses `generate-changes` for authoritative shipped-change data, `generate-features` for scoring/triage, `editorial-scoring` for the shared rubric, `api-diff`/`dotnet-inspect` for API verification, and a multi-model `review-release-notes` pass for final editorial QA.
4
-
compatibility: Requires GitHub MCP server or gh CLI for cross-repo queries. Pairs with the generate-changes, generate-features, editorial-scoring, api-diff, and review-release-notes skills. Claude Opus 4.6 is the default workflow model; the preferred final reviewer pair is Claude Opus 4.6 + GPT-5.4 for broader editorial feedback.
3
+
description: Generate and maintain .NET release notes from `features.json`. Uses `generate-changes` for authoritative shipped-change data, `generate-features` for scoring/triage, `update-existing-branch` for incremental reruns on populated branches, `editorial-scoring` for the shared rubric, `api-diff`/`dotnet-inspect` for API verification, and a multi-model `review-release-notes` pass for final editorial QA.
4
+
compatibility: Requires GitHub MCP server or gh CLI for cross-repo queries. Pairs with the generate-changes, generate-features, update-existing-branch, editorial-scoring, api-diff, and review-release-notes skills. Claude Opus 4.6 is the default workflow model; the preferred final reviewer pair is Claude Opus 4.6 + GPT-5.4 for broader editorial feedback.
5
5
---
6
6
7
7
# .NET Release Notes
@@ -13,16 +13,26 @@ This skill is the **editorial writing stage** of the pipeline. It turns a scored
13
13
## How it works
14
14
15
15
1.`generate-changes` diffs `source-manifest.json` between VMR refs to produce `changes.json`
16
-
2.`generate-features` reads `changes.json` and emits `features.json` with optional scores using the shared `editorial-scoring` rubric
17
-
3.`api-diff` / `dotnet-inspect` verifies public APIs and catches missed reverts
18
-
4.`release-notes` writes curated markdown using the higher-value entries from `features.json`
19
-
5.`review-release-notes` runs a final multi-model editorial QA pass against the scoring rubric and examples
20
-
6. Output is one PR per release milestone in dotnet/core, maintained incrementally
16
+
2.`generate-features` reads `changes.json`, resolves revert/backout relationships, and emits `features.json` with optional scores using the shared `editorial-scoring` rubric
17
+
3.`update-existing-branch` handles incremental reruns when a milestone branch already exists, merging deltas instead of restarting from scratch
18
+
4.`api-diff` / `dotnet-inspect` verifies public APIs and confirms suspect features still exist in the shipped build
19
+
5.`release-notes` writes curated markdown using the higher-value entries from `features.json`
20
+
6.`review-release-notes` runs a final multi-model editorial QA pass against the scoring rubric and examples
21
+
7. Output is one PR per release milestone in dotnet/core, maintained incrementally
22
+
23
+
## Existing-branch reruns
24
+
25
+
When the milestone branch already exists and contains drafted markdown, invoke
26
+
[`update-existing-branch`](../update-existing-branch/SKILL.md). That shared
27
+
skill is the canonical playbook for refreshing `changes.json`, merging the delta
28
+
into `features.json`, integrating new material into existing sections, and
29
+
handling review comments without clobbering human edits.
21
30
22
31
## Reference documents
23
32
24
33
-[quality-bar.md](references/quality-bar.md) — what good release notes look like
@@ -122,7 +122,7 @@ If `dotnet-inspect` can't find a type:
122
122
123
123
1.**Check your package version first** — are you querying a Preview N-1 package while writing Preview N notes? Find the correct version (see above).
124
124
2.**Named differently** — search with a broader pattern (`find "*Zstd*"` instead of the exact name).
125
-
3.**Reverted** — check `changes.json` for a revert PR. If the API was added and then reverted in the same preview, it didn't ship. Don't document it.
125
+
3.**Reverted or backed out** — first scan `changes.json` for revert titles, then search GitHub for a later merged PR that references reverting the original PR number or URL. The revert may live in the next preview and therefore be absent from the current `changes.json`. If the API or behavior is gone in the final build, don't document the original feature.
126
126
4.**Internal** — the type may not be public. Don't document internal types in release notes.
127
127
5.**Read the PR tests** — the PR's test files are ground truth. Tests compile and run against the actual API surface. Derive code samples from test assertions rather than guessing type names.
Copy file name to clipboardExpand all lines: .github/skills/release-notes/references/changes-schema.md
+13-2Lines changed: 13 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Shared Schema for `changes.json` and `features.json`
2
2
3
-
Reference for the `changes.json` file produced by `release-notes-gen generate changes`, and for the derived `features.json` file used by downstream editorial skills. One file per release milestone.
3
+
Reference for the `changes.json` file produced by `release-notes generate changes`, and for the derived `features.json` file used by downstream editorial skills. One file per release milestone.
4
4
5
5
## Overview
6
6
@@ -83,6 +83,8 @@ writing stage to keep long-running features consistent across the release.
83
83
-`score_reason` (`string`) — optional short explanation for the score
-`breaking_changes` (`bool`) — optional flag for changes users may need to react to, even if they are not headline features
86
+
-`reverted_by` (`array<string>`) — optional list of PR URLs or refs that later reverted or backed out this change
87
+
-`reverts` (`array<string>`) — optional list of change IDs or PR URLs this entry reverts or partially reverts
86
88
87
89
The `product` field is derived from the repo-level [component mapping](component-mapping.md). Infra repos like `arcade` and `symreader` have no `product` field. The `repo` field always matches the VMR manifest path.
88
90
@@ -100,7 +102,7 @@ The `commit` field is the VMR codeflow commit in `dotnet/dotnet` that synced thi
100
102
101
103
## Conventions
102
104
103
-
-**No nulls** — required fields are always present. Optional fields (`product`, `labels`, `local_repo_commit`, `score`, `score_reason`, `score_breakdown`, `breaking_changes`) may be absent. Use `""` for missing strings, `0` for missing integers.
105
+
-**No nulls** — required fields are always present. Optional fields (`product`, `labels`, `local_repo_commit`, `score`, `score_reason`, `score_breakdown`, `breaking_changes`, `reverted_by`, `reverts`) may be absent. Use `""` for missing strings, `0` for missing integers.
104
106
-**Naming** — `snake_case_lower` for JSON fields, `kebab-case-lower` for file names and repo slugs.
105
107
-**Public URLs only** — every URL must resolve publicly.
106
108
-**Commit URLs use `.diff` form** — for machine consumption.
@@ -119,6 +121,15 @@ That means a change can be:
119
121
120
122
In practice, a `score` around `0-4` with `breaking_changes: true` usually means **one line in a "Breaking changes" section**, not a full feature writeup.
121
123
124
+
## Revert annotations
125
+
126
+
`changes.json` is the raw shipped-change manifest. During editorial triage,
127
+
`features.json` may add `reverted_by` and `reverts` when the agent finds that a
128
+
candidate feature was later backed out or partially reverted.
129
+
130
+
These annotations exist so downstream skills can suppress the original headline
131
+
without losing the provenance that explains why the item was cut.
Copy file name to clipboardExpand all lines: .github/skills/release-notes/references/component-mapping.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -36,6 +36,7 @@ The `runtime` manifest entry covers both Libraries and Runtime. When writing mar
36
36
-**Razor → ASP.NET Core** — `dotnet/razor` PRs go in `aspnetcore.md`
37
37
-**Templating → SDK** — `dotnet/templating` PRs go in `sdk.md`
38
38
-**Roslyn** — covers both C# and Visual Basic. Check PR labels/titles to determine language. Produce `csharp.md` (and `visualbasic.md` if VB-specific features exist).
39
+
-**Apply the product-boundary rule** — Razor editor code actions, language-server behavior, and other IDE-only experiences are usually tooling stories, not ASP.NET Core product notes. See `editorial-rules.md`.
39
40
40
41
### Infrastructure components (skip for release notes)
Copy file name to clipboardExpand all lines: .github/skills/release-notes/references/editorial-rules.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -64,6 +64,7 @@ Tone, attribution, and content guidelines for .NET release notes.
64
64
-**Shared audience filter** — apply the 80/20 rule from `editorial-scoring`; don't redefine a competing threshold here. Keep narrower items only when the broader audience can still see why they matter.
65
65
-**The two-sentence test** — if you can only write two sentences about a feature, it's probably an engineering fix, not a feature. Cut it. A community contribution or breaking change can lift a borderline entry, but "fixed an internal bug that happened to be visible" is not a feature.
66
66
-**Headlines should convey value** — a heading like "GC regions on macOS" doesn't tell the reader whether this is good or bad. Prefer headings that hint at the benefit: "GC regions enabled on macOS" or "Server GC memory model now available on macOS."
67
+
-**Product-boundary rule** — exclude higher-level IDE, editor, or design-time tooling features from product notes unless the release is specifically about that tooling surface. For example, a Razor editor code action should not be presented as an ASP.NET Core feature just because it is adjacent to the web stack.
67
68
-**TODO for borderline entries** — when a feature might deserve inclusion but you lack data to justify it (benchmark numbers, real-world impact, user demand), keep the entry but add an HTML `<!-- TODO -->` comment asking for the missing information. This is better than silently including a vague claim or silently cutting something that might matter. The TODO should state what's needed and link to the PR where the data might live.
68
69
-**Breaking changes are separate from hype** — a breaking change can be important even when it is not exciting. Keep the score honest; use `breaking_changes: true` to preserve a short callout instead of inflating the item into a headline feature.
69
70
-**Clusters can be stronger than the parts** — several related low-score items can justify one section when together they tell a clear story. Keep the individual scores honest, then merge them into one writeup instead of emitting several weak mini-features. Good examples include a group of "Unsafe evolution" changes or multiple runtime entries prefixed with `[browser]`.
@@ -90,7 +91,7 @@ Thank you [@username](https://github.com/username) for this contribution!
90
91
91
92
### Community contributors section
92
93
93
-
At the bottom of each component's notes, list ALL external contributors — not just those with documented features. Use the `community-contribution` label to identify them.
94
+
At the bottom of each component's notes, list ALL external contributors — not just those with documented features. Any community contributor with **one or more merged PRs** in the milestone should get a mention exactly once in the **Community contributors** section, even if none of their work was promoted into a feature writeup. Use the `community-contribution` label as a strong signal, but do not rely on it exclusively if the merged PR history shows a clear external contribution.
94
95
95
96
**Vet the list** — the `community-contribution` label is sometimes wrong. Exclude usernames containing `-msft`, `-microsoft`, or other Microsoft suffixes. When in doubt about whether someone is a Microsoft employee, leave them out of the community list.
Copy file name to clipboardExpand all lines: .github/skills/release-notes/references/feature-scoring.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,6 +25,7 @@ matter during .NET release-note triage.
25
25
- Test-only or infra-only work
26
26
- Mechanical refactors with no user-facing impact
27
27
- Churn in dependencies or tooling internals
28
+
-**Product-boundary mismatch** — apply the product-boundary rule from `editorial-rules.md`; score these to cut-level unless the release is explicitly about that tooling surface
28
29
- Reverts, partial implementations, or APIs that do not appear in the actual build
29
30
- Changes too small or obscure to justify external attention
30
31
-**Stacked audience gates** — if the reader has to care about A, then B, then be willing to do C, the addressable audience shrinks at each step and the score should usually drop hard
0 commit comments