ci(release): write the release page from a template, with an English summary - #196
Merged
Merged
Conversation
fylorn
force-pushed
the
ci/release-notes-template
branch
from
September 25, 2026 05:48
eb4934a to
07f659c
Compare
…summary #191 made the publish job write the release once, with GitHub's generated list of pull requests as its only text and the tag as its title. A release is now titled "ThinkWatch Core <version>", and its text has, in order: - an English summary from release-notes/<version>.md, when that file exists; - a table of the files for each platform; - the commands that install this version on a Linux server and switch an existing installation to it (install.sh --version, twcore upgrade --version --restart); - how to verify a download against its .sha256; - GitHub's generated list of pull requests. scripts/release_notes.py builds the text; the publish job fetches the generated list itself (releases/generate-notes) and hands the finished text to action-gh-release, which no longer generates anything. The "only once" rule from #191 stays: a release that already exists keeps its text. A rehearsal (workflow_dispatch) now writes the text into the run summary, using the version in Cargo.toml. scripts/release_notes_test.py checks that the table links exactly the files in release.yml's FILES list, that the install and upgrade options exist, and that every file in release-notes/ renders; the Linux CI job runs it before compiling. release-notes/0.47.0.md summarizes 0.47.0 from #183-#190; the live v0.47.0 release page now carries it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.48.0 was published before the template landed, so its page holds only GitHub's generated list. release-notes/0.48.0.md summarizes it from #191-#198 so the page can be rewritten from the template: - upgrade notes: CONTROL_API_VERSION 21, so ThinkWatch Lite 2026.9.16 (core 0.47.0, protocol 20) does not connect to it and a server used with that app stays on 0.47.0; the request store's schema 20, which empties the request history on the first start (and again on the way back); the /in-flight shape, RequestStarted.session and the removed ChatgptUsage fields; - session and route on the start event, requests a rule decided without an upstream, the replayable /in-flight snapshot and the new /live fields, and /summary/routes (#197); - per-group unpriced and no-usage counts, and security log totals (#193); - the signed-in account on a ChatGPT account upstream (#195); - releases published from one job, the server guide and the crate metadata (#191), and the test port fix (#192). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eychain Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fylorn
force-pushed
the
ci/release-notes-template
branch
from
September 25, 2026 07:01
ed149e3 to
54c6bd9
Compare
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 Core ", and its text is, in order: an English summary from
release-notes/<version>.mdwhen that file exists, a table of the files for each platform, the commands that install this version on a Linux server and switch an existing installation to it, 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
#191 fixed the list being written four times, but the page still did not say which file is for which platform, how to install
twcoreon a server, or how to check a download, and the tag alone made a poor title next to ThinkWatch Lite's releases.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 with a top-level heading (the workflow sets the title).publishchecks out the repository (before downloading the artifacts, since checkout cleans the workspace), asksreleases/generate-notesfor the list itself, runs the script, and hands the result to action-gh-release asbody_pathwithname: ThinkWatch Core <version>. The action no longer generates anything.body_pathis empty and the action leaves the body alone), and onlyrelease not foundcounts as "does not exist".workflow_dispatch) now also writes the text into the run summary, using the version inCargo.toml, and still publishes nothing.release-notes/0.47.0.mdsummarizes 0.47.0 from Configuration reference, server deployment, and twcore upgrade #183-chore: v0.47.0 #190, andrelease-notes/0.48.0.mdsummarizes 0.48.0 from Publish releases from one job; correct the server docs and crate metadata #191-chore: v0.48.0 #198. v0.48.0 was published before this change, so its page still holds only the generated list; the 0.48.0 summary is there so the page can be rewritten from the template. Its upgrade notes coverCONTROL_API_VERSION21 (ThinkWatch Lite 2026.9.16 includes 0.47.0, protocol 20, and does not connect to 0.48.0), the request store's schema 20 (the request history starts empty on the first start), and the changed/in-flight,RequestStartedandChatgptUsageshapes.FILESis unchanged, sotwcore upgrade's test that readsrelease.ymlis unaffected.How it was verified
python3 scripts/release_notes_test.py: 17 tests, run on Python 3.14 and 3.9 (the Linux CI job has 3.10). They check that the table links exactly the seven files inFILESand that each has a.sha256there, that theinstall.shandtwcore upgradeoptions in the commands exist, the checksum commands, the summary checks, and every file inrelease-notes/. Renaming one file in the table, or adding a Chinese line to a summary, fails them. The Linux CI job runs them before compiling.actionlintwith shellcheck onrelease.ymlandci.yml: clean.generate-notesfor v0.47.0 is byte-identical to the list the v0.47.0 page carried before this change.Cargo.toml(0.47.0) and wrote the text into the run summary; the release step was skipped, so nothing was published. The step's inputs are the committedrelease-notes/0.47.0.mdand thegenerate-noteslist for v0.47.0, so its output is the text now on the live v0.47.0 release, which was rendered locally from the same inputs.mainat v0.48.0. The body for v0.48.0 was rendered locally withscripts/release_notes.py 0.48.0from the committed summary and thegenerate-noteslist for v0.48.0, which is byte-identical to the list on the live v0.48.0 page. All seven files it links exist on the v0.48.0 release, each with its.sha256, and every link answers 200; the three checksum commands name files on the release. The rendered text has no CJK characters and renders through the GitHub Markdown API (one table, every bold label closed).Notes for review
release.yml; everything that reaches the release page is English.🤖 Generated with Claude Code