Repository navigation
cmux NEXT: What's New gallery ranges and a pre-publish check of each nightly's notes - #22099
teamleaderleo wants to merge 35 commits into
Conversation
…notes check Gallery entries for an update of 1 nightly (3 changes), 10 (92), 49 (about 1,600 commits), one with only internal work and one with summary lines only, all from the 50 nightlies the nightly-next notes index lists today. Failing tests for what those ranges showed and for the gate: - "(hq#1957)" and "(review)" stay in titles; base reds and compile fixes read as changes a person would notice; the page and the pipeline read hq# references differently. - The update card and popup show a cut digest title, a work-stream line and a title repeated as its description from notes published before #21873. - checkNightlyNotes (stub) finds nothing; the command passes everything. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ld notes read clean on the card - checkNightlyNotes (webviews/src/pages/changelog/notesCheck.ts) reads a nightly's notes as people will see them: its own lines, the What's New page for an update of 1 and of 10 nightlies, and the update card and popup. A title cut with "…", a bead id, a title shown twice or as its own description, or internal work among the machine-made lines is a defect. Only this build's defects count: the 10-nightly page is compared with the same page without it, so a defect an older nightly already published never blocks the notes after it. scripts/cmux-next/check-release-notes.ts runs it and prints one error annotation per defect. 19 of the 50 published nightlies would have failed; the current pipeline, rerun over the last 40 spans, passes all. - The update card and popup read their items as the page does (readableUpdateItems): notes published before #21873 no longer show a digest title cut with "…", a work-stream line or a title repeated as its description. - "(hq#1957)" and "(review)" come off titles on the page as they already did in the pipeline; base reds, feat-cmux-next, compile fixes and a bead id in a sentence are internal work in both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hed and report Fails: nightly.yml has no check-release-notes job yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
check-release-notes runs after sign-release-notes and before publish-release-notes: bun scripts/cmux-next/check-release-notes.ts reads this build's signed notes with the nine nightlies listed before it (the artifact's copy, else the published file) and fails on a title cut with "…", a bead id, a title shown twice or as its own description, or internal work in New, Improved or Fixed. publish-release-notes waits for it, and report-nightly-failure names it. No secrets in the job. ci-guards runs release-notes-items.test.sh, which no workflow ran. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Bead |
…tes check; a multi-line highlight body is not an echo Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
[Medium impact] The PR appears safe to merge, with one non-blocking gap remaining in the cut-title check. Findings
SummaryAdds gallery examples for five update ranges and checks nightly notes before upload.
Previous thread decisions:
Diagram%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[Sign notes] --> B[Check notes]
B --> C{Notes pass?}
C -->|Yes| D[Upload notes]
C -->|No| E[Report nightly failure]
Reviews (9) · Last reviewed commit: "ci(nightly): the release-notes check run..." · Reviewed by Greptile |
…k; the check reads multi-line descriptions as the page does; the job skips a build commit without the check and fails on a bad index Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Found 36 test failures on Blacksmith runners: Failures
...and 26 more test failures. View all on Blacksmith: run 40258596452, run 40258596445
|
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Probably yours: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 7b17b7e to compare; do not merge until green; see lane-rules
Gallery before/after for
States
Pick other states with a |
…n older nightly, and names the span it read Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… lines are internal work (failing) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ine internal The 49-nightly gallery range showed export-backdrop-art, "#N", "#21369 and #21384" and two Chief Dock squash repairs under Improved and Fixed. readableChange and release-notes.py now read a three-part hyphenated tool name (not up-to-date or drag-and-drop), a bare PR number and squash as internal, so the page folds them, the pipeline leaves them out of summary lines, and the pre-publish check fails a build whose notes still carry one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
… names, #1, squash commits, a menu ellipsis, repeated digest titles (failing) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| ("export-backdrop-art"; "up-to-date" and "drag-and-drop" join with a short word and stay). */ | ||
| const CODE_LIKE = | ||
| /`|\b[A-Za-z_]\w*\.[A-Za-z_]\w*\b|\w_\w|\w-v\d\b|\[cx-|\b[a-z]+[A-Z]\w*|\b[A-Z][a-z]+[A-Z]\w*|\b[A-Z]{2,}(?:-[A-Z]+)+\b|\{\w+\}/; | ||
| /`|\b[A-Za-z_]\w*\.[A-Za-z_]\w*\b|\w_\w|\w-v\d\b|\[cx-|\bcx-[a-z0-9]{3,}|\b[a-z]+[A-Z]\w*|\b[A-Z][a-z]+[A-Z]\w*|\b[A-Z]{2,}(?:-[A-Z]+)+\b|\{\w+\}|(?:^|\s)#(?:\d+|N)\b|\b(?![\w-]*-(?:to|by|of|and|in|the|a|an|on|for|or|at|with)(?:-|\b))[A-Za-z][a-z0-9]*(?:-[a-z0-9]+){2,}\b/; |
There was a problem hiding this comment.
The new CODE_LIKE check can match inside a phrase that its short-word exception should preserve. drag-and-drop-support matches and-drop-support, and end-to-end-encrypted matches to-end-encrypted. A subject such as “Add drag-and-drop-support for files” is therefore marked internal and disappears from the generated notes and the page.
Match whole hyphenated words before applying the exception in both this file and scripts/cmux-next/release-notes.py. Add four-part examples to the tests; the current preserved examples have only three parts.
… sides, keep a menu ellipsis and dedupe digest titles Review of #22099: the hyphen rule hid two-finger-swipe, cmd-shift-t and per-tab-zoom; "#1" and "squash commits" read as internal; Python matched Unicode word characters the page did not; a menu command ellipsis failed as a cut title; and two long lines with one first clause gave the digest one title twice, which the pre-publish check rejects. A tool name now needs three parts none of which is a joining word, number word, modifier key or single character; a PR number is #N or three or more digits; a squash repair is "squash merge/commit" or a line ending in squash. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es the page groups (failing) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ternal on the whole line "Restore the URL chip hover card styles lost in the Chief…" lost the word that marks it internal when the digest cut it; the page now judges the line it makes the title whole from. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Correctness review, with resolutions (PR #22099. Owner: teamleaderleo. Agent: Claude subagent for coordinator leoli-63. Reviewed head 135feed; fixes are in head cfbba2f, based on feat-cmux-next a827da1) The review found no blockers. Each finding below could have held back the notes of every later nightly, so all of them are fixed in this PR. Each fix has a failing test committed before it: 29c94bd before 135feed, 0fbda72 before 2843226, and e219e63 before cfbba2f.
Tests run on huge-blue:
|
| const BEAD = /\bcx-[a-z0-9]{3,}(?:\.\d+)*\b/i; | ||
| /** A sentence cut with "…" or "..."; a menu command keeps its ellipsis ("Rename Workspace…"), as | ||
| release-notes.py writes it. */ | ||
| const CUT = /(?<![A-Z][\w-]*)(?:…|\.\.\.)$/u; |
There was a problem hiding this comment.
The new CUT exception accepts any capitalized ending, not just a menu command. For example, Tabs reopen in Workspace… now passes because of Workspace. Titles cut after macOS or GitHub also escape the check.
This leaves a non-blocking gap in the pre-publish check: unfinished titles can pass. Keep the menu-command exception narrower.
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
…he base's compact list Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
…t block the notes (failing) Review of #22099: the page re-reads release-notes.py's readable summary lines, and a few read as internal the second time ("Merge the green pull request…", "Onboarding: …"). The page folds them, so no internal work reaches people, but the check failed and would withhold every later nightly. Agent-Session: 01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f
…f withholding the notes The page and the card fold a machine line that reads as internal, so none reaches people; the check now annotates it as a warning and fails only on a cut title, a bead id or a title shown twice. Agent-Session: 01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f
…mmaries ci-guards now runs release-notes-items.test.sh (this PR); it had been failing unrun since base's digest started ending a summary with a full stop. Same failure at base 26e79e1. Agent-Session: 01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f
|
Orphaned: no activity for 12 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged |
|
|
|
Review (codex gpt-6.1-sol): BLOCK at cb6db8b Blocking findings:
Non-blocking findings: none. Checked: the exact base/head diff and commit history, the nightly workflow dependency and feed paths, the Swift |
…ew-gallery-gate # Conflicts: # scripts/cmux-next/release-notes.py # webviews/src/pages/changelog/changelog.gallery.ts # webviews/src/pages/changelog/readableChange.ts
… on the popup and the card Red at this commit: the popover renders UpdateHighlights.rest verbatim, so an internal line, a cut title and a repeat reach it (review of #22099 at cb6db8b). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f&host=cosmic-gray
…ough the readable rules readableUpdate() cleans items and rest together, dropping internal lines, restoring cut titles and dropping repeats of a change already shown; UpdateReadyHighlights and UpdatedCard's offline fallback both use it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f&host=cosmic-gray
|
|
…the 50-nightly fixture names no fleet host check-release-notes runs notesCheck.ts, which webviews/test/changelog-notes-check.test.ts covers in ci-web.yml's Test webviews. The fixture's quoted titles said Huge Blue and cmux-lawrence-2; they now say build-box and studio-mac (check-fixture-host-names.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f&host=cosmic-gray
…otes Red at this commit: the footer counts the raw items, so it says See all changes over an empty popup (review of #22099 at eefc2fd). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f&host=cosmic-gray
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f&host=cosmic-gray
…the notes check The check compares this build with the nine before it; a narrowed set could pass a duplicate across nightlies, so it holds the notes like a bad index does (review of #22099). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f&host=cosmic-gray
|
|
|
|
…rd (!cancelled()) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15ba2-c7ad-7850-9e71-5b51f1c9ed9f&host=cosmic-gray
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
Review of #22099: add failing coverage for readable digest titles, update surfaces, and the pre-publish notes check. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b
|
This stale lane has been recut onto current Per the live Agent session: agent session |
* test(changelog): cover nightly notes before they publish Review of #22099: add failing coverage for readable digest titles, update surfaces, and the pre-publish notes check. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * fix(changelog): validate nightly notes before publication The checker reads the notes, page ranges, and update card through the same readable rules, and emits annotations for defects before publication. The nightly workflow wiring remains with its existing workflow owners. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * test(changelog): reject repeated release headlines A curated headline and entry can render the same title twice in the journal; keep that regression red until notes duplicate tracking spans all note rows. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * fix(changelog): track duplicate titles across note rows Use one duplicate set for entries, the curated headline, summaries, and highlights so the pre-publish check catches titles rendered twice. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * test(changelog): cover agent reference parity The release-notes pipeline strips agent and Unicode tracker references; keep the web readable model red until it does the same. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * fix(changelog): strip agent references like the pipeline Keep readableChange.ts in parity with release-notes.py for agent ids and Unicode tracker refs so the pre-publish checker cannot let those implementation details through. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * fix(changelog): scope headline duplicate checks to curated notes Generated summary entries and summary lines intentionally repeat the same machine change. Keep that valid overlap while checking a curated headline against its visible entries. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * test(changelog): catch headline repeats across the page range A current release heading can repeat an older same-day entry in the ten-nightly journal span; keep the page-heading regression red until the checker inspects it. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * fix(changelog): include journal release headings in notes checks Compare curated release headings with grouped entries across the one- and ten-nightly views so a current heading cannot repeat an older same-day title. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b * style(changelog): format notes checker changes Match the webview formatter required by the fast-gates web lint. Agent-Session: https://cmux.com/deeplink/agent?id=aid-4777d4f75452817a742b
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
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.tsgets 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
emptyvariant 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 inreadableChange.tsandrelease-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 aftersign-release-notesand beforepublish-release-notes(scripts/cmux-next/check-release-notes.ts→webviews/src/pages/changelog/notesCheck.ts). It reads the build's notes three ways: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-failurenames 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 newchangelog-readablecases and theupdate-ready-popovercase: 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).test_nightly_next_recovery.pypassed (51 OK),vp checkwas clean on the changed files, and the check ran from a sparse checkout like the job's.scripts/cmux-next/tests/release-notes-items.test.sh.Changelog
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:
No cmux-design-references entry exists for the What's New page.
Review: SHIP at cfbba2f (cmux-review subagent for leoli-63, correctness first; comment of 2026-10-19 22:06Z). Later commits: 47e4b13 merges feat-cmux-next c700b6a (conflicts in UpdateSurfaces.tsx and update-ready-popover.test.tsx: the base's compact list now reads
readableUpdateItemstoo) and 81af7a3 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 81af7a3 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 (ef92739). It blocked on real defects, each fixed with its test committed red first:
rest) skipped the readable rules, so internal lines and cut titles reached the popup and the card's summary.readableUpdatenow readsitemsandresttogether and drops repeats of a change already shown (red 7551ffe, fix eefc2fd)..github/nightly-step-coverage.json, and the fixture uses neutral host names (bbb9b39).!cancelled(), like the group's other steps (1332461).The full review said SHIP at a3072c2, and a delta review of the last commit said SHIP at 1332461.
Observed / Not 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) andreact-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
Need help on this PR? Tag
@codesmith-botwith 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
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.Pre-publish check
check-release-notesjob 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.report-nightly-failurenames 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.rest) through the page's readable rules, so notes published before cmux NEXT: What's New reads as a person reads it #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 (cmux NEXT updates: the Updated card sums up the whole update by area #22810), and the footer counts only what it shows, so an update of internal work alone offers the release notes.Written for commit a3072c2. Summary will update on new commits.