cmux NEXT: What's New gallery ranges and a pre-publish check of each nightly's notes

Closed
TE
10d ago
+8662-38

Finishes the What's New work after #21650, #21684 and #21873: gallery entries for every range size, and a check on each nightly-next build's notes before they publish.

Gallery

changelog.gallery.ts gets five variants built from a real fixture of the 50 nightlies the nightly-next notes index listed on 2026-10-19 (fixtures/nightly-next-50.json, each file as signed and published):

  • range-small: one nightly with three changes (two internal, folded).
  • range-medium: ten nightlies, 92 changes.
  • range-huge: 49 nightlies, about 1,600 commits. Each section shows five rows and the rest behind Show more, All Changes is folded, and internal work is one line.
  • range-internal-only: a nightly with nothing a person would notice ("Maintenance and fixes").
  • range-summary-only: a nightly with summary lines only.

The existing empty variant covers the empty state. I rendered the huge range on Huge Blue with the gallery dev server and Playwright, and it reads cleanly. Two leaks it surfaced are fixed in readableChange.ts and release-notes.py: "(hq#1957)" and "(review)" references now come off titles, and "base reds", "feat-cmux-next" and "compile fixes" count as internal work.

The update card and popup now read items the way the page does (readableUpdateItems). Notes published before #21873 had cut digest titles and titles repeated as descriptions, and the card still showed them.

Pre-publish check

A new nightly.yml job, check-release-notes, runs after sign-release-notes and before publish-release-notes (scripts/cmux-next/check-release-notes.ts → webviews/src/pages/changelog/notesCheck.ts). It reads the build's notes three ways:

  • the notes' own lines;
  • the What's New page for an update of 1 nightly and of 10 (the nine before it come from the artifact or the public feed);
  • the update card and popup.

It fails with one error annotation per defect: a title shown twice or as its own description, a title cut with "…", a bead id, or internal work in New/Improved/Fixed. On the 10-nightly page it counts only this build's defects, so a problem in an older nightly never blocks the next one. When the check fails, the notes are not uploaded and report-nightly-failure names the job. The next build's notes span then starts at the last published notes, so nothing is lost. The job uses no secrets, and feeds, signing, identities and holds are unchanged.

Run against the live feed on 2026-10-19, the newest build (3930148023001) passes. Builds from before #21873 fail on their cut titles, as expected.

Testing

  • webviews/test/changelog-notes-check.test.ts, the new changelog-readable cases and the update-ready-popover case: committed failing first (f4dea16), then fixed.
  • tests/test_nightly_next_recovery.py: notes that fail the check are not published and are reported (9ee94c8 red, then 560691b).
  • On Huge Blue: bun test passed for the four changelog test files (24 pass), test_nightly_next_recovery.py passed (51 OK), vp check was clean on the changed files, and the check ran from a sparse checkout like the job's.
  • ci-guards' release-notary group now also runs scripts/cmux-next/tests/release-notes-items.test.sh.

Changelog

  • What's New and the update card no longer show titles cut with "…", tracker references, or internal work, even for older notes.

Proof

Gallery advisory run 39357964011 at 81af7a3 (Linux Chromium, dark, 560 px; fonts fall back). Small range, medium range (10 nightlies, cropped by the page length) and an internal-only nightly:

range-smallrange-internal-onlyrange-medium

No cmux-design-references entry exists for the What's New page.

Review: SHIP at cfbba2f7f6f2 (cmux-review subagent for leoli-63, correctness first; comment of 2026-10-19 22:06Z). Later commits: 47e4b136 merges feat-cmux-next c700b6a (conflicts in UpdateSurfaces.tsx and update-ready-popover.test.tsx: the base's compact list now reads readableUpdateItems too) and 81af7a35 closes the merged test; both re-read by the rescue lane.
Runtime test: changelog-notes-check.test.ts "the command fails with one annotation per defect, and passes clean notes" (runs scripts/cmux-next/check-release-notes.ts) and tests/test_nightly_next_recovery.py, at 81af7a35 on Huge Blue (28 pass, 0 fail; recovery OK) and in this head's CI.

Review and later fixes

An independent Codex review (xhigh, read-only) went over the whole PR after the 2026-10-21 base update (ef927393). It blocked on real defects, each fixed with its test committed red first:

  • The card and popup read only the first items. Every change after the first three (rest) skipped the readable rules, so internal lines and cut titles reached the popup and the card's summary. readableUpdate now reads items and rest together and drops repeats of a change already shown (red 7551ffe6, fix eefc2fd6).
  • The footer counted hidden changes. An update of internal work alone said "See all" for an empty list. It now offers the release notes (red 1fef20f4, fix 52db65c1).
  • A narrowed comparison could pass. When the feed didn't serve an earlier nightly, the check warned and compared fewer builds, which can hide a repeat across nightlies. It now fails (a3072c2b).
  • Coverage. The new nightly step is listed in .github/nightly-step-coverage.json, and the fixture uses neutral host names (bbb9b39d).
  • The guard step could be skipped. The ci-guards step that validates the release notes items now runs with !cancelled(), like the group's other steps (1332461e).

The full review said SHIP at a3072c2b, and a delta review of the last commit said SHIP at 1332461e.

Observed / Not run

  • Observed: CI at 1332461e runs the webviews tests (react-apps-check), the nightly-guards release-notary group and the compile.
  • Not run locally: the new popover tests and the guard-structure test. cosmic-gray runs no bun tests, and PyYAML isn't installed here, so CI is their first run.

Base reds on 81af7a3 (not this PR's)

cmux-next checks (capability-text.test.sh, check-concurrency in CmuxNextBrowser, type scale in HomeSidebarView.swift) defaults-snapshot (stale settings exports) and react-apps-check (agent-pane, composer, chat-find, markdown-wide-width, popup-escape and tooltip-rules tests; no changelog test); the same reds show on #21185, and neither touches files this PR changes.

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Finishes the What's New work after #21650, #21684, and #21873: gallery entries for every range size and a pre-publish job that blocks a nightly's notes from uploading when they'd render badly.

Gallery

  • Five new variants, built from a fixture of the 50 nightlies the notes index listed on 2026-10-19 (nightly-next-50.json), cover updates of one nightly (3 changes), ten (92), 49 (~1,600 commits), a nightly with internal work only, and one with summary lines only.
  • Rendering the huge range surfaced leaks, fixed so the page and pipeline read alike: "(hq#1957)" and "(review)" come off titles; base reds, branch names, compile fixes, a three-part hyphenated tool name, a bare PR number (#N or ≥3 digits) and a squash repair count as internal work without hiding joined feature names, modifier keys, small numbers, or "squash commits"; a title starting with a brand keeps its casing; and the digest dedupes titles two long lines share a first clause for.

Pre-publish check

  • A new check-release-notes job runs between signing and publishing: it reads the build's notes as the What's New page (updates of 1 and 10 nightlies) and as the update card and popup, failing with one error annotation per cut title, bead id, or repeated title. Internal work among the machine-made lines only warns, and a menu ellipsis like "Rename Workspace…" doesn't count as cut.
  • Only this build's defects count; on failure the notes aren't uploaded and report-nightly-failure names the job. Build commits from before the check landed are skipped with a warning, and the check fails when the feed doesn't serve one of the nine nightlies it compares with, since a narrowed set could pass a duplicate across nightlies. It uses no secrets; the check runs on a GitHub-hosted runner.
  • The update card, popup, and their footer now read items and every change after them (rest) through the page's readable rules, so notes published before #21873 display clean: internal lines, cut titles, and repeats of a change already shown never reach the popup's list or the card's area summary (#22810), and the footer counts only what it shows, so an update of internal work alone offers the release notes.
  • ci-guards' release-notary group now also runs the release-notes items test, which no workflow ran before; the check is covered by the webviews tests in ci-web.