ci(release): write the release page from a template, with an English summary - #200
Merged
Merged
Conversation
…summary The GitHub release text used to be only GitHub's generated list of pull requests, under a title that was just the tag. A release is now titled "ThinkWatch Lite <version>", and its text has, in order: - an English summary from release-notes/<version>.md, when that file exists; - a table of the file for each platform, and the Homebrew and Linux install commands; - how to verify a download against its .sha256; - GitHub's generated list of pull requests. scripts/release_notes.py builds the text. A new release-body job runs it on tags and on rehearse/** pushes, so a rehearsal shows the page in its run summary within a minute, without waiting for the installers. Publish writes the text only when it creates the release: a re-run no longer appends a second generated list, and a page edited after publishing is left as it is. The tag message keeps its role as the notes of latest.json; it is not the release page. The comment that called it the text shown in the app is corrected: since 2026.9.13 the update window shows only the version. scripts/release_notes_test.py checks the file names against release.yml, the install and checksum commands, and every file in release-notes/. CI runs it on every pull request, so a broken summary is caught before a tag is pushed rather than after. release-notes/2026.9.16.md is the English version of the 2026.9.16 tag notes, which the live 2026.9.16 release page now carries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 this changes
Release pages get a title and a fixed layout. A release is titled "ThinkWatch Lite ", and its text is, in order: an English summary from
release-notes/<version>.mdwhen that file exists, a table of the file for each platform with the Homebrew and Linux install commands, how to verify a download against its.sha256, and GitHub's generated list of pull requests. Until now the page was only the generated list, under the bare tag.Why
The release page is where people who download by hand arrive, and it did not say which file is for which machine, how to install from the command line, or how to check a download. The tag message cannot fill that role: it is the Chinese update text that goes into
latest.json.How it works
scripts/release_notes.py <version> <generated list>writes the text. It refuses a malformed version, and a summary that is empty, contains Chinese characters or starts a top-level heading (the workflow sets the title).release-body(ubuntu, runs on tags and onrehearse/**): asksreleases/generate-notesfor the list, runs the script, writes the result to the run summary and uploads it as an artifact.publishnow needs it.publishpassesnameandbody_pathto action-gh-release and no longer setsgenerate_release_notes. It writes the text only when the release does not exist yet (the same rule as ThinkWatch-Core#191), so a re-run neither appends a second list nor overwrites a page edited after publishing.latest.json, and older installs show it.release-notes/2026.9.16.mdis the English version of the 2026.9.16 tag notes.How it was verified
python3 scripts/release_notes_test.py: 17 tests, run on Python 3.14 and 3.9. They check the five file names against the manifest step inrelease.yml, the install and checksum commands, that no winget command appears, the summary checks, and every file inrelease-notes/. Changing one file name inrelease.yml, or adding a Chinese line to a summary, fails them.actionlintwith shellcheck on both workflows: nothing in the new steps (the existing SC2046 in the signing step is untouched). CI runs actionlint without shellcheck, as before.rehearse/release-notes(this commit). Therelease-bodyjob finished in under a minute; its artifact (the same file the job appends to the run summary) is byte-identical to the page rendered locally for 2026.9.16. The five build jobs were cancelled once that was known and then re-run to completion (attempt 2): all passed, andpublishwas skipped, as in every rehearsal.generate-notesfor v2026.9.16 is byte-identical to the list the 2026.9.16 page carried before this change, so a real release gets the same list as before.Notes for review
release.ymlandscripts/; everything that reaches the release page is English.🤖 Generated with Claude Code