Skip to content

carry of #28037: show Cloud machine transitions and failed changes - #28407

Merged
cmux-bot[bot] merged 48 commits into
feat-cmux-nextfrom
lane/carry-28037-cloud-transitions
Oct 31, 2026
Merged

cmux-bot[bot] merged 48 commits into
feat-cmux-nextfrom
lane/carry-28037-cloud-transitions

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Carry of #28037, preserving its commits and authorship.

Leo: "let's just get the cloud and its respective ui up to snuff".

Cloud machines retain Pausing…, Resuming… and Deleting… until the operation settles, gate conflicting power actions, and show the server's failure reason. The carry merges current feat-cmux-next, preserves the API client's extracted create retries and current sidebar status rendering, and maps all three transition states to the existing working spinner.

Risk: contained sidebar status behavior and transition-only Cloud list refreshes. Reads continue until the server confirms a settled state; failures back off to a 30-second cap. Settled lists, service stop, policy disable, and account teardown cancel the loop. Pending mutations survive stale status/list reads; app-server decimal revisions identify superseding operations, and stale provider failures cannot roll back a newer operation. Broker credentials remain until confirmed destruction; list omissions retain failed cleanup.

The base merge retains the existing native lifecycle and fixes the Classic Cloud page's transition mapping. A reviewed, scoped architecture exception covers 264 native integration lines through 2026-11-07; mutation tracking and revision comparison reside in CmuxNextCloud. The large string-catalog diff preserves the original localized copy.

Observed / Not run

Independent gpt-6.1-sol review: SHIP at 7f3e4802dcc2fe330345e580d1a7faa497300309. Pre-push checks passed. Catalog structure, Swift localization defaults and feature-flag checks passed; the changed catalogs add no enforced localization errors against base. The workspace package-group mismatch is unchanged from base.

All 10 focused Cloud suites passed (120 tests) at 4c10632, as did Mac Release compilation for arm64 and x86_64. The bot then merged base into 7f3e480; the PR patch is identical, the independent review was carried to that exact head, and a fresh Linux app/Rust compile passed there. The three release-notary failures match the named tests and errors on a real base run; see comparison. Regression coverage includes optimistic Classic page status, app-server revision supersession, and stale provider rollback reads. Swift is unavailable locally; no local compile or runtime tests were run.

Before/after gallery from the original PR (stubbed status, real SidebarListView):
Before: pausing read Paused
After: Pausing

No capture: no new live images are attached for this repair batch. The DEBUG fixture now accepts transition statuses; earlier fleet transition captures were viewed privately. Failed-provider paths are covered by the Cloud transition tests.

Viewed after image: yes.
Visual verdict: The after gallery shows Pausing…, Resuming… and Deleting… using the existing compact status treatment and spinner, with no layout regression.

Agent session: agent session

teamleaderleo and others added 4 commits October 30, 2026 09:44
…selves

The cmux-next backend answers Pause, Resume and Kill at once and runs the
provider call after, so a machine record reads pausing, starting or deleting
meanwhile. The app mapped pausing to Paused (offering Resume), starting to
provisioning and deleting to gone, read pauseReason where the wire sends
pause_reason, and never read the record's error when the provider call failed.

Now each in-between state is its own CloudMachine.Status with its own stage
and sidebar header status (Pausing..., Resuming..., Deleting...), shown from
the click and put back when the call fails; Pause and Resume wait while a
change is on its way (Kill only while deleting); the list is read again every
3 s, at most 40 times, while a listed machine is changing; and the record's
error shows on the machine header's tooltip.

Sidebar-Look: Leo, 2026-10-29: "let's just get the cloud and its respective ui up to snuff"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…28037-cloud-transitions

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService.swift
#	Packages/macOS/CmuxNext/Sources/CmuxNextSidebar/Views/SectionHeaderRowView.swift
Sidebar-Look: retain the current working spinner for in-progress machine transitions
Agent-Session: https://cmux.com/deeplink/agent?id=aid-78d0322a04112d80addf
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

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

Review dc1bab6: 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=pr28407 -f ref=lane/carry-28037-cloud-transitions -f platform=macos -f backend_mode=local

Not verified: macOS jobs did not run: compile and app tests were skipped on dc1bab66ce; ci-status is green without them.

CI passes on dc1bab66ce (run 41232528319 attempt 1).
macOS jobs did not run: compile and app tests were skipped: Fast static checks skipped (the macos job needs both to succeed). Re-run CI once they pass, before merging.

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.

Default changes

This pull request changes 13 defaults at dc1bab66ce4f (what everyone gets without configuring anything):

  • tunable-source.CmuxNextApp/Cloud/CloudMachineStage.swift:gatePowerActions: (none) -> "a25835f79b69901a8dcf3f34dd28aab2c8c0c7ab5a433875ed381fd89b7f29ed"
  • tunable-source.CmuxNextApp/Cloud/CloudMachineStage.swift:powerActions: (none) -> "bd793730eb6caaa14cc8d7c05f395a2ab468b1576bc98680865f47524851cc60"
  • tunable-source.CmuxNextApp/Cloud/CloudStrings+Progress.swift:machineChanging: (none) -> "5d39969058a6599d2eba51f0088843a279f215d6b18b06fd93bb5c7463cf94c4"
  • tunable-source.CmuxNextApp/Cloud/CloudStrings+Progress.swift:text: (none) -> "37c6a6349632421d93a3182ceb796a61dcf825bd101ec818b447fc7db1b0e329"
  • tunable-source.CmuxNextApp/Control/DebugCloudMachineFixture.swift:fixture: "6c142d4fff018e0db08dc2d6f15247a28a96b424f8162bc815b5991ae434a645" -> "39a08a56158ffac84a1f69569ff9626192558f44e1d1d1b1b4b01f4d8770e0ff"
  • tunable-source.CmuxNextApp/Control/DebugCloudMachineFixture.swift:parseStatus: (none) -> "9e617fdb88db8f6cd8bbaa479f60c11f85df78a5c04642fa456c686733852fac"
  • tunable-source.CmuxNextApp/Control/DebugCloudMachineFixture.swift:show: "a048feb87f7a8294bd1b2e0a01d83555d2e0a7bc5cf9fb674acf376d59671d90" -> "c1ac553cf6ce0662c9a96f729adec697b22f9656279a95f5e1dd31e1ef75d4bb"
  • tunable-source.CmuxNextApp/Handlers/CloudHandlers.swift:bind: "6328d670da4c1fc9c0598bbc49cc60d3ff8d0143d3da2b0a03cba976e9770f0d" -> "3f68e9edb9c96fe9145818c37957eb80cb243e73089d93e8016314b648b2555a"
  • tunable-source.CmuxNextSidebar/Logic/WorkspaceHoverCardContent.swift:connectionTone: "92ed995019c44415f3dc72d27fadd9dca182989783e8e2f40af17225efcefe9c" -> "588b158647d0b5be357a892dcf2eacafef8fc21e78943ed84f98da104a17438a"
  • tunable-source.CmuxNextSidebar/Strings.swift:attentionStatus: "00b4998ba1c93cde28a0f2ed88c5f1faae6ce00af79aa432e83e2ad02ae1210b" -> "07ebb41f8198d50d1a40f097ca2e38448c98055eac844838abd179faec3ff680"
  • tunable-source.CmuxNextSidebar/Strings.swift:statusDeleting: (none) -> "edb13708f1fa076635b38d699e1be50f0f8c4c013fd33a183e8b4271a1f27b71"
  • tunable-source.CmuxNextSidebar/Strings.swift:statusPausing: (none) -> "f47fefe5132225f137f35b107ab762ac4ccd825007f8d3c262e551265418458c"
  • tunable-source.CmuxNextSidebar/Strings.swift:statusResuming: (none) -> "41a1e8497cd0d103bd954bb855d767d75522d579e1fd48cb41c1ca49b6492596"

Signed off on this commit by review (codex gpt-6.1-sol high).

Merge receipt: merged as f1c4971aed66 with these defaults changed, signed off by review (codex gpt-6.1-sol high).

Regenerate the snapshot with python3 scripts/ci/defaults_guard.py snapshot.

Shipped in:

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

blacksmith-sh Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Found 3 test failures on Blacksmith runners:

Failures

Test View Logs
tab: tabGroup.addTab is not a top-level row/tab: tabGroup.addTab is not a top-level row View Logs
tab: tabGroup.create is not a top-level row/tab: tabGroup.create is not a top-level row View Logs
tab: tabGroup.removeTab is not a top-level row/
tab: tabGroup.removeTab is not a top-level row
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 (independent Codex gpt-6.1-sol, high, via the review router; full diff from merge base 1ec00c1 to this head): BLOCK at 672ee72.

[P2] Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService.swift:624 - An accepted delete permanently disconnects the retained session. If the asynchronous provider deletion fails and the record returns to running, reconciliation and Retry cannot reconnect: disconnect() permanently sets disconnected = true. Previously, removing the session allowed refresh to create a fresh connection. - Use reversible suspend() while deletion is pending; call disconnect() upon confirmed removal.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (independent Codex gpt-6.1-sol, high, via the review router; full diff from merge base 1ec00c1 to this head): SHIP at eac0b8e.

No P1/P2 findings.

…28037-cloud-transitions

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudAppOps.swift
#	plans/cmux-next/sidebar-owner.md
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (independent Codex gpt-6.1-sol, high, via the review router; full diff from merge base 73be4cc to this head): BLOCK at 4103800.

[P2] Packages/macOS/CmuxNext/Sources/CmuxNextCloud/API/CloudMachineChanges.swift:20 - polling stops after 120 seconds or one failed refresh even while the backend transition can still be pending, leaving the UI and action gates stale - continue polling through the operation deadline with retry/backoff and recover after read failures.
[P2] Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService.swift:627 - machineWasDeleted discards Codex broker state as soon as deletion is acknowledged, before the asynchronous delete is confirmed; a failed delete leaves the retained machine without recoverable broker state - defer cleanup until the list confirms removal/tombstone.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (independent Codex gpt-6.1-sol, high, via the review router; full diff from merge base 73be4cc to this head): BLOCK at 6413948.

[P2] Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService.swift:637 - Codex access is revoked before deletion succeeds; a failed delete leaves the VM present but unregisters its broker target and may remove its credentials. Move revocation after successful deletion acknowledgement or restore the broker on failure.
[P2] Packages/macOS/CmuxNext/Sources/CmuxNextApp/Cloud/CloudService.swift:495 - .starting is now considered live, so a failed connection during resume is not retried when the record transitions from starting to running because both states are live. Reconnect on that transition when the session has no active link.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol high): SHIP at 2ed0215

Focused delta review of the latest feat-cmux-next merge. Transition files CloudStartChat+Machine, CloudMachineChanges, CloudMove, and CloudMachineSession are byte-identical to the reviewed head. CloudService changes are base networkAccess additions; CloudMachine shownName and CloudClassicPageOps naming serialization are unrelated and compatible with transition status mapping. CloudPageProvider account watcher is unrelated. arch-ratchet.json parses, retains #28407’s +264 allowance and base +3 allowance; diff check is clean. No integration blocker.

Visual verdict: no new visual changes in this merge.
Follow-ups: none.

…28037-cloud-transitions

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextApp/CloudCreationRows.swift
#	plans/cmux-next/arch-ratchet.json
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol high): SHIP at 884d172

The exact delta removes the duplicate compatibility argument that caused the merge parse error and supplies the required updates: DaemonUpdateBoard() at all five affected CloudMachineChangeStateTests call sites. All production callers already pass machines.updates; the public DaemonUpdateBoard initializer is available. No code blocker found; diff check is clean.

Visual verdict: no new visual changes in this merge.
Follow-ups: none.

Infrastructure note: exact-head compile job a28ba395b7fd1154caf2abe2 failed immediately without diagnostics, so compilation is infrastructure-unverified rather than a code failure.

…28037-cloud-transitions

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextApp/Handlers/CloudHandlers.swift
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6.1-sol high): SHIP at dc1bab6

Exact-head delta review: CloudHandlers.swift conflict is correctly resolved, retaining base bindSignInRecovery(into:cloud:), carry bindMove, and CloudMachineStage.gatePowerActions exactly once. CloudMachineStage imports and action gating remain correct, including existing target reasons and fallback behavior. Transition tests cover backend statuses, stage mapping, pending action gating, and bound actions. Diff check is clean; no blocking issue found.

Visual verdict: no new visual changes in this merge.
Follow-ups: none.

Compile remains unavailable due to the prior immediate infrastructure failure.

This branch was previously deployed

1 inactive deployment
ci-routing-agent — dc1bab66 Deployed Oct 31, 2026 by teamleaderleo via wait for same-key tree publisher #91044
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant