cmux NEXT: What's New reads as a person reads it
Leo updated to nightly 1.0.0-nightly.3913596493801 and What's New still read badly:
- perf-split, perf-gate, CI and test commits sat under New, Improved and Fixed.
- Titles were cut with "…".
- The name was cased "Cmux NEXT".
- All Changes listed 92 raw commit subjects, with bead ids like "(cx-sya4n)".
This PR fixes the page and the pipeline that writes the notes. The page also fixes notes that are already published, so Leo's own update now reads cleanly.
What changes:
- Internal work stays out of New, Improved and Fixed. Commit subjects and summary lines get the pipeline's rules. A conventional type or scope such as ci, test, refactor or nightly marks a line internal, as does a work-stream label such as perf-*, *-gate or review, or code-like text.
readableChange.tsis a straight port ofsummary_entryinrelease-notes.py, and a test runs both on every subject of Leo's span and compares the results. - Reviewed entries keep their words. A What's New entry or highlight written by a person only loses bead ids and the "cmux NEXT:" label. A title that names macOS or GitHub, or leads with "New shortcut:", stays.
- No title is cut. A long title ends at its first clause, never on a joining word, and the rest of the line becomes the summary, but only when the summary was empty. Otherwise the whole title wraps. A title an older pipeline cut with "…" is made whole from the line it came from. The digest the pipeline writes now carries the rest of the line as the summary, not the line again, so a row never reads "Title Title, so …".
- All Changes lists what a person would notice. Each pull request appears once, read as its human commit, with no bead ids or type prefixes. A change reverted in the same span is left out. Internal commits are folded into one line, "and 64 internal changes", which shows under the list from the start. Leo's span goes from 92 raw subjects to 26 changes.
- Rows wrap. Title and summary run as one wrapping paragraph instead of an ellipsis.
This supersedes #20493. That PR rewrote the notes with an LLM summarizer and has conflicted since October 14. This PR is deterministic, needs no model call in the nightly job, and also fixes notes that are already published.
Not covered here: the native Updated card and update popover (UpdateHighlights.swift) read the notes' digest directly. Notes written by this pipeline are clean, but an update into a build whose notes were published before this PR still shows the old digest there. The next PR adds gallery entries for small, medium and huge spans and a pre-publish render gate on each nightly-next build.
Before and after
Leo's update span, 3911762409401 to 3913596493801: the ten signed notes as published, rendered in the gallery at 1000 px wide.

Full size: before, after. Gallery variant pages.changelog / nightly-3913596493801.
Testing
bun test test/changelog*on Huge Blue: 14 pass. Commit 9b9376d adds the six new tests, which fail on the earlier fix; 51dd4ee makes them pass.scripts/cmux-next/tests/release-notes-items.test.shpasses.vp lintandvp fmt --checkare clean on the changed files.
Changelog
- Fixed: What's New no longer lists internal work, cuts titles short, or shows raw commit subjects under All Changes.
🤖 Generated with Claude Code
Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Fixes What's New so it reads as a person reads it: internal commits, cut titles, and raw commit subjects no longer appear. The page now applies the same rules as the pipeline, so notes already published also read cleanly.
- Internal commits (CI, tests, refactors, perf-split/perf-gate work-streams) stay out of New, Improved and Fixed and fold into one "and N internal changes" row under All Changes.
- No title is cut; a long line ends at its first clause, and the rest becomes the summary only when it was empty. Titles an older pipeline cut with "…" are rebuilt from the line they came from.
- Reviewed entries keep a person's words and only lose bead ids and the "cmux NEXT:" label.
- All Changes lists each pull request once as its human commit, with no bead ids or type prefixes, and drops changes reverted in the same span.
- Rows wrap as one paragraph instead of truncating with an ellipsis.
Not covered: the native Updated card and update popover still show the old digest for builds published before this PR; a follow-up adds gallery variants and a render gate.