Repository navigation
Every pull request carries a release note for users, checked by CI - #169
Merged
Merged
Conversation
…escription, or why it has none Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion, or why it has none Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… it delivers, or says why it doesn't Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t it delivers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…view checks it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ne:" are read exactly Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the template's placeholders and a "None:" holding a note Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…quired never stalls the queue Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aracters, the queue's checks include the note Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s or leave a code block open Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… block, which would break the release's groups Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 30, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this pull request do?
Every pull request now carries a release note written for the app's users, separate from the title and body written for reviewers, and CI fails a pull request without one.
Release note
None: changes how pull requests are written and checked; nothing changes in the app.
Current behavior
The release notes are GitHub's generated list of pull request titles ("… by @user in https://github.com/…/pull/156"). Titles are written for reviewers, so What's New and the releases page read like a changelog for developers.
Behavior with this pull request
## Release notesection:### New:,### Improved:or### Fixed:and a title users understand, then a short Markdown description (a picture, table or code only when words aren't enough); orNone:and why users have nothing to read.Nonewithout a reason. Dependabot's pull requests are left out.release-notesskill, give it to the reviewer, and the reviewer checks it as user-facing copy.How it was implemented
readReleaseNote(scripts/build/releaseNote.ts): reads the section line by line, no Markdown package, so Node runs it as it is (.nvmrc's Node strips types). It removes HTML comments first, finds the section outside fenced code (a fence closes only on its own character and length, as in CommonMark), and returns{ kind, title, description },{ kind: 'none', reason }or a problem worded for the author. Run as a command it readsPULL_REQUEST_BODYand exits 1 on a problem..github/workflows/release-note.yml:pull_request(opened,edited,reopened,synchronize), read-only token, the body passed through the environment, never the command line. It is its own workflow so editing the description doesn't rebuild on every OS. It also triggers onmerge_group, where the job skips itself (counted as passing), so it can be made a required check;mergeQueueTrigger.test.tsnow guards that trigger too..claude/skills/release-notes/SKILL.md: who notes are for, how to pick New/Improved/Fixed by what users get (not by the branch name), titles under 80 characters, a description always (fixes say what users saw and what happens now), the app's words only, and a before/after table built from real titles.docs/features/updates.md.Next, in their own pull requests: the Release workflow joins these notes into the release description (
## New,## Improved,## Fixed, a###per note), which GitHub renders on the releases page; and What's New shows them grouped, with a filter, rendering their Markdown, pictures and tables included.Behavior changes
## Release notesection. Once this merges, Release note can be added to main's required checks.Checklist
npm run typecheckandnpm testpass (8,519). What the new tests cover: every kind;None:with and without a reason, with a note or a second paragraph under it, and lookalikes ("None.", "None of the views…"); missing and empty sections; the real template as it is; placeholders; no kind, a lower-case kind, no title, no description, two notes;##lines in code and comments; tilde and backtick fences; CRLF; non-ASCII; the workflow's triggers.npm run e2e: not needed, nothing in the app changes.pinnedActions.test.tscovers the new workflow (same SHAs asci.yml).Noneread too loosely (colon now required, one line, no note under it); fences closing on the wrong character and comments holding##or fences; placeholders left in; the merge-queue trigger unguarded; the reviewer not given the note; test nits; wording. Declined in this pull request: "the skill promises pictures, tables and####headings What's New doesn't show". The What's New pull request, built now, renders them, and lands with this one.docs/says what's now true:docs/features/updates.md"What's New" and "CI".Fixed issues
None.
🤖 Generated with Claude Code