Repository navigation
cmux NEXT updates: download quietly, then one Restart to Update card; progress in Settings > Updates - #33176
Conversation
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. |
|
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)
Gallery before/after for
States
Pick other states with a Probably yours: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules Shipped in:
|
|
Found 1 test failure on Blacksmith runners: Failure
|
|
Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at 60c1dec BLOCK at 60c1dec Visual verdict: no images; Leo tries the build
|
|
Review (codex gpt-6-astra high, sweep, via the review router; full diff from merge base 91b8977 to this head): BLOCK at 60c1dec [P2] [blocking] UpdaterService+SettingsStatus.swift:21 - Settings exposes “Restart to Update” for a staged build marked pulled, bypassing the existing |
|
Review (codex, router-review): SHIP at 829ce16 Reviewer: codex gpt-6-astra high, fast tier. Follow-ups: 2. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at 829ce16
Swift and Bun were unavailable; validation was source-only. Follow-ups:
|
… progress moves to Settings The sidebar no longer shows a Downloading Update card, whether or not the person asked: the staged update's Restart to Update card is the one step. Settings > Updates gains an App Update card with the download's progress, Cancel, Restart to Update and a failure's Try Again (background ones too). Sidebar-Look: Leo 2026-11-03: "idk chatgpt's seems to be just like a one step "ok it's already downloaded you click this button to accept the button and restart" idk if we wanna follow that too" Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-acfd9ddc1ad753687f7e
…the App lines) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-acfd9ddc1ad753687f7e
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-acfd9ddc1ad753687f7e
Review follow-up (router review at 60c1dec): the bytes line changed between percents, so the host lists re-sent on every progress tick. A measured download now rounds its bytes down to whole percent before it is shown. Regression test: aDownloadReSendsSettingsOnlyWhenItsPercentChanges. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-acfd9ddc1ad753687f7e
…ead: appUpdate) From the PR autofix run 41593689955's pr-autofix-patch artifact (the PR push job leaves repairs as an artifact); only the hunk this PR causes. The defaults hunks in that patch are base drift from files this PR does not touch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-acfd9ddc1ad753687f7e
829ce16 to
ae5f94c
Compare
|
Review (codex, router-review): SHIP at ae5f94c Reviewer: codex gpt-6.1-sol xhigh, fast tier. Follow-ups: 2. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at ae5f94c
Schema/card registration checks passed. Bun and Swift were unavailable here. Follow-ups:
|
A newer verdict blocks 7dfd98c (no independent SHIP at the head).
|
Review (codex gpt-6.1-sol xhigh): SHIP at 7dfd98c Visual verdict: SHIP. Reviewed all 20 after renders; the new card is readable in both themes, and all 12 before/after pairs are identical. The head is cmux-bot's base merge on top of ae5f94c (reviewed SHIP at #33176 (comment)). This verdict is router-review job 6523c7a6ed803361ab4e0706f86d9b26, carried here because its own post is still in the write queue. Follow-ups: [P2] replacement downloads ( |
|
Review (codex, router-review): SHIP at 7dfd98c Reviewer: codex gpt-6.1-sol xhigh, fast tier. Follow-ups: 1. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at 7dfd98c Visual verdict: SHIP. Reviewed all 20 after renders; the new card is readable in both themes, and all 12 before/after pairs are identical.
Swift and Bun were unavailable; their suites were not run. Follow-ups:
|
…Restart to Update ignores a click right after it appears (#34612) * test(next updates): a download the person asked for shows its progress; the Restart button ignores a click right after it appears (red) Leo 2026-11-04: "there's no more updating downloading progress bar for some reason? after i download..." Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d438336588234274cc20 * cmux NEXT updates: a download the person asked for shows its progress again; Restart to Update ignores a click right after it appears #33176 removed the sidebar's download card for every download. A download the person asked for (Download, Update) shows its progress on the notice card again until it is staged; a background download stays quiet. The Restart to Update card's button ignores pointer presses for 1 s after the card takes the slot, so a click meant for the card it replaced does not restart cmux. Leo-ask: ask-8112d98df7 Sidebar-Look: Leo 2026-11-04: "the weird thing is that there's no more updating downloading progress bar for some reason? after i download... it got removed for some reason" Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-d438336588234274cc20 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…+ draws at 12px (#34494) * base red: Settings' progress fill is not a surface; the model menu's + draws at 12px render.test.tsx's 'no rule declares a background other than transparent or the two interaction tokens' failed on .app-update-progress's value fill (var(--text)), added by #33176: a progress bar's value is not a container, so the test now exempts only the progress-value pseudo-elements. check-icon-scale failed on QuickModelColumns.tsx's PlusIcon at 11px (#32980, which landed an hour after the check, #33595). 12 is on the scale, matches its viewBox and the CheckIcon beside it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-dfc0ecf416bf21757d6b * render.test.tsx: formatter layout Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-dfc0ecf416bf21757d6b --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Swift logic follow-up (tip watcher swift-logic row, STATUS 13027 "SWIFT LOGIC CULPRITS"; lead order). This PR raised
plans/cmux-next/layer-ownership.md says Rust owns every state, list and rule and Swift is the platform shell. Please move the new logic of this PR in a follow-up: to Rust (the crate that owns the area; the owner lists in STATUS 12147-12165 name the target per area), or at least out of the app into its package. If a declaration above is platform code (AppKit, Core Animation, OS calls, strings, tokens, DEBUG tooling), reply here and the table gets a PLATFORM row with your reason instead. The swift-logic row is a report, not a gate: nothing blocks on this comment. |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo, 2026-11-03, on the sidebar's Downloading Update card: "will this be themeed properly? also idk chatgpt's seems to be just like a one step "ok it's already downloaded you click this button to accept the button and restart" idk if we wanna follow that too"
The theme half landed in #33103. This PR is the flow half: copy ChatGPT's one step.
What changes
No sidebar card while downloading.
UpdateFlow.card(downloadsAutomatically:)returns nil for a download, whether the person asked or not. Before, a download the person had asked for (Check for Updates, then Update) showed the Downloading Update card with its bar and Cancel. The check and the install still show on the notice card as before.One step when it is ready. The staged update is the existing Update Ready card, with one Restart to Update button that installs and relaunches (
installClicked). The card itself is unchanged: its design, its Hide, its popover and cmux NEXT: the update and notice cards take the theme; the download bar is the accent #33103's theme.Progress moves to Settings > Updates. A new App Update card leads the Updates category (
SettingsPageLayout.Card.appUpdate). It shows what the updater does now, whether or not the person asked:The state is
UpdaterService.settingsStatus/settingsPageJSON(CmuxNextUpdater), read through the host lists asapp_updateand live throughcmux.settings.host.changed. Progress is sent in whole percent, so a download re-sends at most about 100 updates. The buttons go toAppUpdatePageProvider(cmux.settings.app_update.run). Restart to Update there needs the person's own click (userGesture), because it relaunches the app.No failure goes silent. A failed background download used to show nowhere (the notice card shows only what the person asked for). It now shows in Settings with Try Again.
The logic is in CmuxNextUpdater. The App target gets three wiring lines (an import, the host-list entry and the page route). Those are paid for by folding two single-expression closures in
UpdaterService+App.swift, so App lines go down by 1.Variant
The brief asked for 2-3 gallery variants of the ready state (a compact pill, a full-width card, a footer button). I kept the existing full-width Update Ready card instead of building alternatives. It already is the one-step card ChatGPT has: one Restart to Update. It is native, so the web gallery cannot hold it. The rulebook also says not to replace an existing component Leo didn't name. Leo can still ask for a pill. The new Settings card has its own gallery entry,
pages.settings-app-update, with idle, downloading, ready and failed variants.References (cmux-design-references):
cmux/live/status-update-ready-panelandcmux/live/update-ready-card-unstyled-no-changelog-preview, our own one-step ready card. The index has no capture of ChatGPT's update prompt.Design spec: leo-workspace
design/sidebar.md, where the rule goes in a follow-up notes PR.Risk
risk:highby path: this changes updater state. The Sparkle phases, installs and the relaunch gate are unchanged. Only what is shown for a download changed, plus a new read of the same flow and buttons that call the existingdownloadClicked,cancelDownloadClicked,checkForUpdatesandinstallClicked. The progress bar usesblock-size, notheight: it is a 4 px bar, not a control on the control-height scale.Tests
UpdateOneStepTests(new):UpdateLoadingIndicatorTests(the stage order still covers the download, through Settings),UpdateAsksBeforeInstallTests,UpdateDownloadCancelTests(Cancel now through Settings) andUpdatesCategoryLayoutTests(lead == [.appUpdate]).webviews/src/pages/settings/appUpdateCard.test.tsx:install.Observed / Not run
prepush-gate.py(no new violations; app_lines -1),scripts/web-lint.sh(passes; the type-aware lint and type check are left to CI on this host), andbun teston the settings card tests. The new web test's ready and download cases fail locally until the PR autofix regeneratesschemas/settings/settings-schema.json, a generated file that carries the newappUpdatelead. Its other cases pass, andwebUpdatesCard.test.tsxpasses.Changelog
Agent session: agent session
🤖 Generated with Claude Code
Open in [code]smith · Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Updates download quietly with no sidebar card, then a single Restart to Update card installs and relaunches the app. Download progress, Cancel, and Try Again for failed checks or downloads, background ones included, moved to a new App Update card in Settings > Updates.
UpdateOneStepTestsand web tests for the App Update card; existing update flow tests updated to the new flow.Written for commit 7dfd98c. Summary will update on new commits.