Skip to content

cmux NEXT updates: download quietly, then one Restart to Update card; progress in Settings > Updates - #33176

Merged
teamleaderleo merged 6 commits into
feat-cmux-nextfrom
lane/update-card-flow
Nov 3, 2026
Merged

teamleaderleo merged 6 commits into
feat-cmux-nextfrom
lane/update-card-flow

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

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:

    • a download: the bytes line, a bar and Cancel;
    • staged: Restart to Update;
    • a failed check or download, background ones included: the cause and Try Again;
    • idle: the running version and Check Now.

    The state is UpdaterService.settingsStatus / settingsPageJSON (CmuxNextUpdater), read through the host lists as app_update and live through cmux.settings.host.changed. Progress is sent in whole percent, so a download re-sends at most about 100 updates. The buttons go to AppUpdatePageProvider (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-panel and cmux/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:high by 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 existing downloadClicked, cancelDownloadClicked, checkForUpdates and installClicked. The progress bar uses block-size, not height: it is a 4 px bar, not a control on the control-height scale.

Tests

  • UpdateOneStepTests (new):
    • a download the person asked for shows no sidebar card, notice card or ready card;
    • the staged update is one Restart to Update card, and its button installs and relaunches;
    • Settings shows the download's progress, bytes and Cancel, then Restart to Update once staged;
    • a background failure shows in Settings with Try Again and not in the sidebar;
    • the provider's Cancel stops the download, and its Restart refuses a call with no click.
  • Updated to the new flow: UpdateLoadingIndicatorTests (the stage order still covers the download, through Settings), UpdateAsksBeforeInstallTests, UpdateDownloadCancelTests (Cancel now through Settings) and UpdatesCategoryLayoutTests (lead == [.appUpdate]).
  • Web: webviews/src/pages/settings/appUpdateCard.test.tsx:
    • no updater means no card;
    • a download shows its bytes, bar and Cancel;
    • ready shows one Restart to Update and sends install.

Observed / Not run

  • Ran: 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), and bun test on the settings card tests. The new web test's ready and download cases fail locally until the PR autofix regenerates schemas/settings/settings-schema.json, a generated file that carries the new appUpdate lead. Its other cases pass, and webUpdatesCard.test.tsx passes.
  • Not run: the Swift compile and the Swift suites (this host has no fleet client; they run in this PR's CI), and a DEV build with a real download.

Changelog

  • Changed: Updates download quietly with no sidebar card, then one Restart to Update card installs them; download progress, Cancel and a failed update's Try Again are in Settings > Updates.

Agent session: agent session

🤖 Generated with Claude Code


Autofix with [code]smith
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with 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.

  • The sidebar shows no Downloading Update card, whether or not the person asked; the check, the install, and the staged update's one-step Restart to Update card are unchanged.
  • A new App Update card leads Settings > Updates: the running version and Check Now when idle, the download's bytes and progress bar with Cancel, Restart to Update once staged, or the failure cause and Try Again.
  • The buttons call the existing download, cancel, check, and install actions; Restart to Update requires the person's own click since it relaunches the app.
  • A download's progress is rounded to whole percent so the host lists re-send at most about a hundred times.
  • Added UpdateOneStepTests and 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.

View guided diff Turn on auto-fix

@cursor

cursor Bot commented Nov 3, 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.

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

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

Review ae5f94c: 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=pr33176 -f ref=lane/update-card-flow -f platform=macos -f backend_mode=local

Gallery before/after for 7dfd98c: 16 states rendered, 8 images differ, 3208 more touched states not rendered. Images are in the run's artifact, not on this public PR; the independent review of this head reads them on its own, so the PR needs no hand-made screenshots of these states.

gh run download 41615244931 -R manaflow-ai/cmux -n gallery-advisory-33176-7dfd98c1b298d17db10321973beeb62b1ca1f197 (then read gallery-review.json)

States
State Theme Status Diff Picked by
pages.settings/model-picker-placement-inherited Apple System Colors Light unchanged 0% own SectionView.tsx
pages.settings/model-picker-placement-inherited Apple System Colors unchanged 0% own SectionView.tsx
pages.settings/model-picker-placement-symbols Apple System Colors Light unchanged 0% own SectionView.tsx
pages.settings/model-picker-placement-symbols Apple System Colors unchanged 0% own SectionView.tsx
pages.settings/general Apple System Colors Light unchanged 0% own SectionView.tsx
pages.settings/general Apple System Colors unchanged 0% own SectionView.tsx
pages.settings/general-customized Apple System Colors Light unchanged 0% own SectionView.tsx
pages.settings/general-customized Apple System Colors unchanged 0% own SectionView.tsx
pages.settings/general-group-1 Apple System Colors Light unchanged 0% own SectionView.tsx
pages.settings/general-group-1 Apple System Colors unchanged 0% own SectionView.tsx
pages.settings/general-group-2 Apple System Colors Light unchanged 0% own SectionView.tsx
pages.settings/general-group-2 Apple System Colors unchanged 0% own SectionView.tsx
pages.settings/general-group-3 Apple System Colors Light unchanged 0% own SectionView.tsx
pages.settings/general-group-3 Apple System Colors unchanged 0% own SectionView.tsx
pages.settings/general-group-4 Apple System Colors Light unchanged 0% own SectionView.tsx
pages.settings/general-group-4 Apple System Colors unchanged 0% own SectionView.tsx
pages.settings-app-update/idle Apple System Colors Light new 0% own appUpdate.gallery.ts
pages.settings-app-update/idle Apple System Colors new 0% own appUpdate.gallery.ts
pages.settings-app-update/downloading Apple System Colors Light new 0% own appUpdate.gallery.ts
pages.settings-app-update/downloading Apple System Colors new 0% own appUpdate.gallery.ts
pages.settings-app-update/ready Apple System Colors Light new 0% own appUpdate.gallery.ts
pages.settings-app-update/ready Apple System Colors new 0% own appUpdate.gallery.ts
pages.settings-app-update/failed Apple System Colors Light new 0% own appUpdate.gallery.ts
pages.settings-app-update/failed Apple System Colors new 0% own appUpdate.gallery.ts
pages.settings-initials/profiles Apple System Colors Light unchanged 0% imports ops.ts (1 hops)
pages.settings-initials/profiles Apple System Colors unchanged 0% imports ops.ts (1 hops)
pages.settings-initials/machines Apple System Colors Light unchanged 0% imports ops.ts (1 hops)
pages.settings-initials/machines Apple System Colors unchanged 0% imports ops.ts (1 hops)
pages.settings-menus/generated Apple System Colors Light unchanged 0% imports ops.ts (1 hops)
pages.settings-menus/generated Apple System Colors unchanged 0% imports ops.ts (1 hops)
pages.settings-menus/customized Apple System Colors Light unchanged 0% imports ops.ts (1 hops)
pages.settings-menus/customized Apple System Colors unchanged 0% imports ops.ts (1 hops)

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

Probably yours: render.test.tsx fails here but not on main's latest full suite.

CI failed on 7dfd98c1b2 (run 41615245318 attempt 1): 1 code, 1 unknown.

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

Failures:

  • new in this PR render.test.tsx no rule declares a background other than transparent or the two interaction tokens: failed (job)
Matched log lines
web / react-apps-base-check (8): (fail) no rule declares a background other than transparent or the two interaction tokens [1.20ms]

Not re-run automatically: web / react-apps-base-check (8), 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: web / Web status; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules
red: web / react-apps-base-check (8); NEW webview test reds: src/pages/settings/render.test.tsx > no rule declares a background other than transparent or the two interaction tokens; do not merge until green; see lane-rules
red: web / react-apps-check; a job it gathers is red on this change (its line here); do not merge until green; see lane-rules

Shipped in:

@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
@blacksmith-sh

blacksmith-sh Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Found 1 test failure on Blacksmith runners:

Failure

Test View Logs
test_every_compile_job_names_its_warm_sources (main.ThisTree.test_every_compile_job
_names_its_warm_sources)/
test_every_compile_job_names_its_warm_sources (main.ThisTree.test_every_compile_job
_names_its_warm_sources)
View Logs

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol xhigh, router-review): BLOCK at 60c1dec

BLOCK at 60c1dec

Visual verdict: no images; Leo tries the build

  1. [P1] [blocking] SettingsPageLayout.swift:199: Land the regenerated settings-schema.json. React reads its layout from that committed export, which this diff leaves unchanged. Consequently, the new card never mounts, download progress and Cancel disappear, and the new web tests fail. A future autofix commit is needed before this head can ship.

  2. [P2] [follow-up] UpdaterService+SettingsStatus.swift:49: Throttle the complete download snapshot. Although progress is rounded, detail contains changing byte counts. Those changes still trigger full host-list publications between percentage changes, defeating the claimed limit.

  3. [P2] [follow-up] appUpdate.gallery.ts:26: Supply the four state captures when the gallery lane is available; no images were provided for visual review.

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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 stagedPulledHeld guard; clicking presents an invalid update or replacement flow - suppress pulled staged builds here and revalidate before install.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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
Visual verdict: no images; Leo tries the build

  1. [P2] [follow-up] Packages/macOS/CmuxNext/Sources/CmuxNextUpdater/UpdaterService+SettingsStatus.swift:14: newestCard bypasses the download projection. When replacing a stale staged build or a pulled running build, Settings gets .gettingNewest, which offers no Cancel; UpdaterService.card also still shows sidebar progress. Apply the quiet-download flow and Settings Cancel to this path, and cover it in tests.

  2. [P2] [follow-up] webviews/src/pages/settings/components/AppUpdateCard.tsx:23: No after screenshots were supplied. Capture the new card’s states in light and dark themes for visual review.

Swift and Bun were unavailable; validation was source-only.

Follow-ups:

  • Handle replacement downloads consistently in the sidebar and Settings.
  • Supply themed screenshots of the new card.

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026

@cmux-bot cmux-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

cmux-bot approves 829ce16: an independent review passed this exact head (router-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

teamleaderleo and others added 5 commits November 3, 2026 08:29
… 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
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
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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
Visual verdict: no images; Leo tries the build

  1. [P2] [follow-up] UpdaterService+SettingsStatus.swift:64: Quantize .gettingNewest transfers too. When Restart replaces a stale staged build, settingsStatus returns newestCard, bypassing this guard. Its bytes line changes between percentage changes, so the full host lists emit substantially more than the promised approximately 100 updates. Add coverage for this replacement path.

  2. [P2] [follow-up] appUpdate.gallery.ts:26: Supply screenshots of the four card states at this head for visual review.

Schema/card registration checks passed. Bun and Swift were unavailable here.

Follow-ups:

  • Quantize replacement-download byte counts.
  • Capture idle, downloading, ready, and failed screenshots.

@teamleaderleo teamleaderleo removed the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
@github-actions github-actions Bot added the risk:high Risk tier (docs/ci/risk-tiers.md) label Nov 3, 2026
cmux-bot[bot]
cmux-bot Bot previously approved these changes Nov 3, 2026

@cmux-bot cmux-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

cmux-bot approves ae5f94c: an independent review passed this exact head (router-review receipt by teamleaderleo). A push needs a new review; a later BLOCK at this head dismisses this approval.

@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 3, 2026 09:57 Inactive
@cmux-bot
cmux-bot Bot temporarily deployed to ci-routing-agent November 3, 2026 09:57 Inactive
@cmux-bot
cmux-bot Bot dismissed their stale review November 3, 2026 09:59

A newer verdict blocks 7dfd98c (no independent SHIP at the head).

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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 (newestCard / .gettingNewest) need Cancel and whole-percent progress, with regression coverage: #33371. Gallery captures: #33245.

@cmux-bot cmux-bot Bot removed the stack-blocker label Nov 3, 2026
@teamleaderleo
teamleaderleo merged commit 41142f9 into feat-cmux-next Nov 3, 2026
288 of 311 checks passed
@teamleaderleo
teamleaderleo deleted the lane/update-card-flow branch November 3, 2026 11:01
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

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.

  1. [P2] [follow-up] UpdaterService+SettingsStatus.swift:14: Replacement downloads bypass Cancel and progress quantization. When an install click discovers a newer build, or the running build was pulled, newestCard returns .gettingNewest. That presentation has no Cancel action, and settingsQuantized leaves its bytes untouched, so Settings cannot cancel these downloads and can resend the host lists between percentage changes. Apply the normal download handling to these transfers too.

Swift and Bun were unavailable; their suites were not run.

Follow-ups:

  • [P2] [follow-up] Add Cancel and quantization for replacement downloads, with regression coverage.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol high, sweep, via the review router; full diff from merge base 622edef to this head): SHIP at 7dfd98c

No P1/P2 findings.

teamleaderleo added a commit that referenced this pull request Nov 4, 2026
…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>
teamleaderleo added a commit that referenced this pull request Nov 4, 2026
…+ 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>
@lawrencecchen

Copy link
Copy Markdown
Contributor

Swift logic follow-up (tip watcher swift-logic row, STATUS 13027 "SWIFT LOGIC CULPRITS"; lead order).

This PR raised swift_logic_lines by +150 at its merge commit 41142f9: scripts/cmux-next/swift-logic-lines.py before and after the merge, with the same table (the tip's, c6be943). The largest declarations of the rise:

  • extension UpdaterService in Packages/macOS/CmuxNext/Sources/CmuxNextUpdater/UpdaterService+SettingsStatus.swift: +80 lines counted as Swift logic (no row in plans/cmux-next/swift-logic-classes.tsv)
  • enum SettingsUpdateAction in Packages/macOS/CmuxNext/Sources/CmuxNextUpdater/UpdaterService+SettingsStatus.swift: +30 lines counted as Swift logic (no row in plans/cmux-next/swift-logic-classes.tsv)
  • class AppUpdatePageProvider in Packages/macOS/CmuxNext/Sources/CmuxNextUpdater/UpdaterService+SettingsStatus.swift: +22 lines counted as Swift logic (no row in plans/cmux-next/swift-logic-classes.tsv)
  • enum SettingsUpdateStatus in Packages/macOS/CmuxNext/Sources/CmuxNextUpdater/UpdaterService+SettingsStatus.swift: +14 lines counted as Swift logic (no row in plans/cmux-next/swift-logic-classes.tsv)

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.

This branch was previously deployed

3 inactive deployments
artifacts — 7dfd98c1 Deployed Nov 3, 2026 by cmux-bot[bot] via publish tree-addressed cmux-tui #105346
sentry-dsyms — 7dfd98c1 Deployed Nov 3, 2026 by cmux-bot[bot] via upload cmux-tui dSYMs to Sentry #105346
ci-routing-agent — 7dfd98c1 Deployed Nov 3, 2026 by cmux-bot[bot] via cmux-tui tree preflight #105346
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.

2 participants