Skip to content

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

Closed
teamleaderleo wants to merge 35 commits into
feat-cmux-nextfrom
leo/whats-new-gallery-gate
Closed

teamleaderleo wants to merge 35 commits into
feat-cmux-nextfrom
leo/whats-new-gallery-gate

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

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-small range-internal-only range-medium

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 readableUpdateItems too) 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:

  • 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 7551ffe, fix eefc2fd).
  • 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 1fef20f, fix 52db65c).
  • 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 (a3072c2).
  • Coverage. The new nightly step is listed in .github/nightly-step-coverage.json, and the fixture uses neutral host names (bbb9b39).
  • 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 (1332461).

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

Observed / Not run

  • Observed: CI at 1332461 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 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.
  • 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.

Written for commit a3072c2. Summary will update on new commits.

View guided diff Turn on auto-fix

teamleaderleo and others added 5 commits October 19, 2026 07:07
…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>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-pfiim created for this PR by the cmux coordinator.

…tes check; a multi-line highlight body is not an echo

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@greptile-apps

greptile-apps Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] The PR appears safe to merge, with one non-blocking gap remaining in the cut-title check.

Findings

  1. P2 Cut titles pass unnoticed ▶

Summary

Adds gallery examples for five update ranges and checks nightly notes before upload.

  • Nightly notes now pass a display check before they publish.
  • What's New and update cards hide cut titles and internal work.
  • The gallery now shows real nightly ranges from one build to 49.

Previous thread decisions:

  • teamleaderleo accepted gaps in legacy update cards because Swift sends only three items and changing that contract is outside this PR. Greptile agreed.
  • teamleaderleo accepted a narrower check during feed outages so missing older notes do not block new notes. The job now names missing builds and reports the actual range.

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]
Loading

Reviews (9) · Last reviewed commit: "ci(nightly): the release-notes check run..." · Reviewed by Greptile

Comment thread webviews/src/pages/changelog/model.ts Resolved
Comment thread .github/workflows/nightly.yml Resolved
…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>
@blacksmith-sh

blacksmith-sh Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Found 36 test failures on Blacksmith runners:

Failures

Test View Logs
test/agent-pane-background-tasks.test.ts/agent-pane-background-tasks.test View Logs
test/agent-pane-background-tasks.test.ts/agent-pane-background-tasks.test View Logs
test/agent-pane-hairline-focus.test.ts/agent-pane-hairline-focus.test View Logs
test/agent-pane-hairline-focus.test.ts/agent-pane-hairline-focus.test View Logs
test/agent-pane-no-capsules.test.ts/agent-pane-no-capsules.test View Logs
test/agent-pane-no-capsules.test.ts/agent-pane-no-capsules.test View Logs
test/agent-pane-queue-scroll-bottom.test.ts/agent-pane-queue-scroll-bottom.test View Logs
test/agent-pane-queue-scroll-bottom.test.ts/agent-pane-queue-scroll-bottom.test View Logs
test/agent-pane-stream-jitter.test.ts/agent-pane-stream-jitter.test View Logs
test/agent-pane-stream-jitter.test.ts/agent-pane-stream-jitter.test View Logs

...and 26 more test failures. View all on Blacksmith: run 40258596452, run 40258596445

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

@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 5b42a68: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr22099 -f ref=leo/whats-new-gallery-gate -f platform=macos -f backend_mode=local

Probably yours: accent-glass-invariants.test.ts fails here but not on main's latest full suite. Seen on other PRs too (likely flaky): agent-pane-background-tasks.test.ts, agent-pane-hairline-focus.test.ts, agent-pane-hairline-focus.test.ts and 12 more.

CI failed on 5b42a68fbb (run 40258596452 attempt 1): 2 code, 1 unknown.

Job Verdict Why
web / react-apps-base-check (4) code a web test failed
web / react-apps-base-check (3) code a web test failed
web / react-apps-check unknown no known signature; failed step: Check webview test shards

Failures:

  • seen on other PRs agent-pane-background-tasks.test.ts the summary card lists the chat's background tasks: running ones first, the finished folded: failed (job)
  • seen on other PRs agent-pane-hairline-focus.test.ts composer at 1x: focus is the resting hairline a step brighter, no ring: failed (job)
  • seen on other PRs agent-pane-hairline-focus.test.ts newtab at 1x: focus is the resting hairline a step brighter, no ring: failed (job)
  • seen on other PRs agent-pane-hairline-focus.test.ts composer at 2x: focus is the resting hairline a step brighter, no ring: failed (job)
  • seen on other PRs agent-pane-hairline-focus.test.ts newtab at 2x: focus is the resting hairline a step brighter, no ring: failed (job)
  • seen on other PRs agent-pane-hairline-focus.test.ts under Increase Contrast a focused edge keeps the resting edge, never a dimmer one: failed (job)
  • seen on other PRs agent-pane-hairline-focus.test.ts keyboard focus changes what a solid Send, Stop, the prompt editor's Send and a plain button paint; s...: failed (job)
  • seen on other PRs agent-pane-no-capsules.test.ts agent pane page > rounds its controls as small-radius rects, not capsules: failed (job)
  • seen on other PRs claimPaint.test.tsx a pooled Settings page claimed by the host reports its paint once its first screen is in: failed (job)
  • seen on other PRs claimPaint.test.tsx a Settings page loaded fresh reports its first paint once its first screen is in: failed (job)
  • ... 6 more in the job logs
Matched log lines
web / react-apps-base-check (4): (fail) the summary card lists the chat's background tasks: running ones first, the finished folded [955.50ms]
web / react-apps-base-check (3): (fail) a pooled Settings page claimed by the host reports its paint once its first screen is in [255.16ms]

Not re-run automatically: web / react-apps-base-check (4), web / react-apps-base-check (3), web / react-apps-check are not machine failures.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

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
red: web / Web status; NEW: green on the base 7b17b7e; do not merge until green; see lane-rules
red: web / react-apps-base-check (3); no finished base run on 7b17b7e to compare; do not merge until green; see lane-rules
red: web / react-apps-base-check (4); no finished base run on 7b17b7e to compare; do not merge until green; see lane-rules
red: web / react-apps-check; no finished base run on 7b17b7e to compare; do not merge until green; see lane-rules

CI fast guards passes on cb6db8b0bc (run). This covers only the fast guards, not CI: CI's result is ci-status.

Gallery before/after for 5b42a68: 16 states rendered, 10 images differ, 26 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 40258596431 -R manaflow-ai/cmux -n gallery-advisory-22099-5b42a68fbbd027f9b0dca4bcec356c6eb908b9b4 (then read gallery-review.json)

States
State Theme Status Diff Picked by
pages.changelog/range-small Apple System Colors Light new 0% own changelog.gallery.ts
pages.changelog/range-small Apple System Colors new 0% own changelog.gallery.ts
pages.changelog/range-medium Apple System Colors Light new 0% own changelog.gallery.ts
pages.changelog/range-medium Apple System Colors new 0% own changelog.gallery.ts
pages.changelog/range-huge Apple System Colors Light new 0% own changelog.gallery.ts
pages.changelog/range-huge Apple System Colors new 0% own changelog.gallery.ts
pages.changelog/range-internal-only Apple System Colors Light new 0% own changelog.gallery.ts
pages.changelog/range-internal-only Apple System Colors new 0% own changelog.gallery.ts
pages.changelog/range-summary-only Apple System Colors Light new 0% own changelog.gallery.ts
pages.changelog/range-summary-only Apple System Colors new 0% own changelog.gallery.ts
pages.changelog/nightly-3913596493801 Apple System Colors Light unchanged 0% own changelog.gallery.ts
pages.changelog/nightly-3913596493801 Apple System Colors unchanged 0% own changelog.gallery.ts
pages.changelog/nightly-update Apple System Colors Light unchanged 0% own changelog.gallery.ts
pages.changelog/nightly-update Apple System Colors unchanged 0% own changelog.gallery.ts
pages.changelog/nightly-unpublished Apple System Colors Light unchanged 0% own changelog.gallery.ts
pages.changelog/nightly-unpublished Apple System Colors unchanged 0% own changelog.gallery.ts
pages.changelog.update-surfaces/card Apple System Colors Light unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card Apple System Colors unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-span Apple System Colors Light unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-span Apple System Colors unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-span-wallpaper Apple System Colors Light unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-span-wallpaper Apple System Colors unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-maintenance Apple System Colors Light unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-maintenance Apple System Colors unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-wallpaper Apple System Colors Light unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-wallpaper Apple System Colors unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-one-change Apple System Colors Light unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-one-change Apple System Colors unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-no-highlights Apple System Colors Light unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-no-highlights Apple System Colors unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-no-highlights-wallpaper Apple System Colors Light unchanged 0% own UpdateSurfaces.tsx
pages.changelog.update-surfaces/card-no-highlights-wallpaper Apple System Colors unchanged 0% own UpdateSurfaces.tsx

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

teamleaderleo and others added 5 commits October 19, 2026 19:59
…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>
@cursor

cursor Bot commented Oct 19, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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/;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Useful changes get hidden

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.

teamleaderleo and others added 3 commits October 19, 2026 22:04
… 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>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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.

  1. Repeated digest titles (release-notes.py summary_whats_new_digest, notesCheck.ts). short_title cut two long lines down to the same first clause, so the digest showed one title twice and the gate rejected it. Fixed: the generator now adds each digest title only once. Test: test_digest_titles_are_unique_when_long_lines_share_a_first_clause.
  2. Unicode vs ASCII parity (readableChange.ts vs release-notes.py). Python \b/\w matched Unicode and JS did not, so "a naïve-mode-switch" passed in Python and failed on the page. Fixed: the Python INTERNAL_WORDS, CODE_LIKE and the new rules now use re.A, and the new rules anchor on whitespace ((?<!\S)). The parity test now also runs the review's strings through both readers.
  3. Rules too broad (they would hide real changes). Fixed:
    • A tool name needs three or more hyphenated parts, and none of the parts can be a joining word, a number word, a modifier key or a single character. The rule anchors on whitespace, so it no longer starts in the middle of a word.
    • A PR number is #N or three or more digits.
    • "Squash" counts only as squash(ed) merge/commit or at the end of a line.
    • Test fixtures that stay user-facing: two-finger-swipe, cmd-shift-t, do-not-disturb, pop-up-menu, follow-up-question, per-tab-zoom, utf-8-encoded, "Fix find focus and align search overlay #1 crash", "tabs Fix find focus and align search overlay #1 to Add sidebar blur effect with withinWindow blending #9", "squash commits from the review pane", end-to-end-encrypted, right-to-left-text, side-by-side-diff, naïve-mode-switch.
  4. Menu ellipsis read as a cut (notesCheck.ts CUT). The check failed "Rename Workspace…" as a cut title. Fixed: an ellipsis right after a capitalized word is now read as a menu command, which matches how the generator writes it. Known limit: a sentence that was cut right after a capitalized word now passes.
  5. Classifier gaps found in the 49-nightly gallery render. These real published lines were showing under Improved or Fixed: "Export-backdrop-art reads each entry's subject box…", "Tour uploads stop naming the PR as #N", "Restore perf(cmux-next): avoid duplicate older-history loads #21369 and perf(cmux-next): gate find highlight repaints by transcript changes #21384, undone by the Chief Dock squash" and "Restore the URL chip hover card styles lost in the Chief Dock squash". Fixed:
    • All four are now internal in both classifiers.
    • The gate fails a build whose summary lines carry one of them.
    • The page now judges a cut digest title by the whole line it restores. The URL-chip title had been cut before the word "squash", so it had slipped past.
    • A new test checks that none of these lines reach New, Improved or Fixed for any of the 50 published nightlies, either one at a time or together.
  6. Nits, left as they are: Swift UpdateHighlights parity has no test; there is a source-snippet assert at test_nightly_next_recovery.py:468; the ci-guards step at ci-guards.yml:1235 is unrelated; and the UpdatedCard "N more" count. None of them affects publishing.

Tests run on huge-blue:

  • bun test test/changelog test/update-ready-popover: 34 pass.
  • tests/test_cmux_next_release_notes.py, tests/test_nightly_next_release_notes_fetch.py and tests/test_nightly_next_recovery.py: OK.
  • vp fmt --check on the changed files: clean.

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;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Cut titles pass unnoticed

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.

@cursor

cursor Bot commented Oct 20, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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>
@cursor

cursor Bot commented Oct 20, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@teamleaderleo teamleaderleo removed the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 21, 2026
…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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Orphaned: no activity for 12 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged feat-cmux-next in at cb6db8b. A later pass queues it for the merge hub if it is reviewed, small and red only on base reds.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / cmux-next localization debt ratchet is red on 15 of 16 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol): BLOCK at cb6db8b

Blocking findings:

  • webviews/src/pages/changelog/UpdateSurfaces.tsx:128-172: UpdateHighlights.rest contains every item after the first three (the host constructs it with Array(all.dropFirst(3))), but the new readableUpdateItems call sanitizes only data.items; the rest list renders data.rest verbatim. With the checked-in five-entry fixture build 3917061587901, the fourth item is summary-3 “Tour uploads stop naming the PR as #N” and the fifth is the cut/internal “Terminals show background art through the glass, like the…”. Hovering the ready update therefore exposes internal work and a truncated title. The offline/older-host UpdatedCard fallback also passes the raw rest into summarizeHighlights, so the same data can leak into the card. Sanitize/filter the full list (including rest) and add coverage for it.

Non-blocking findings: none.

Checked: the exact base/head diff and commit history, the nightly workflow dependency and feed paths, the Swift UpdateHighlights producer, the changelog model and surfaces, the release-notes fixture/tests, and git diff --check; no app build or test suite was run.

teamleaderleo and others added 3 commits October 22, 2026 20:11
…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
@teamleaderleo teamleaderleo added the risk:high Risk tier (docs/ci/risk-tiers.md) label Oct 23, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / nightly-guards / workflow-guard-tests / release-notary is red on 17 of 18 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

teamleaderleo and others added 4 commits October 22, 2026 20:19
…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
…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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › Checks job structure is red on 12 of 13 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next / cmux-next checks (god files, concurrency, crash safety, l10n) › No new SwiftUI (macOS UI is AppKit) is red on 12 of 13 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@cursor

cursor Bot commented Oct 23, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

teamleaderleo added a commit that referenced this pull request Oct 26, 2026
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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

This stale lane has been recut onto current feat-cmux-next as #25518, which owns the notes checker, readable filtering, update-card coverage, and fixture-driven tests.

Per the live pr-overlap ownership snapshot, the replacement leaves the overlapping workflow files and recovery test with the nightly/CI owners already changing them, and leaves changelog.gallery.ts with #24121. Those owners should wire scripts/cmux-next/check-release-notes.ts between signing and publishing while preserving existing path routing. Closing this superseded stale PR after the replacement is ready.

Agent session: agent session

teamleaderleo added a commit that referenced this pull request Oct 26, 2026
* 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:high Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant