Skip to content

Fix stale "Not Connected" status line over a healthy iOS workspace list - #10397

Closed
austinywang wants to merge 0 commit into
mainfrom
fix-ios-stale-not-connected-status-line
Closed

austinywang wants to merge 0 commit into
mainfrom
fix-ios-stale-not-connected-status-line

Conversation

@austinywang

@austinywang austinywang commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor

Status: superseded and closed

This feature branch was rebased to the origin/main snapshot 23941b41dc0a47911d31464739412077bc6aea77 on 2026-09-01 and contains zero changes. Merged PR #10437 (commit 7c3093ef855c097abdc44ff38e0a6b9a4f0ba7fe) independently includes the connected-aggregate guard and regression expectation from this PR; current main also carries newer hasLiveTransportPath handling. The upstream branch continued advancing afterward, but no branch-specific code remains here. GitHub closed this PR automatically when its head reached its base; the closed-PR API record retains the earlier head SHA. There is no code left to merge.

The original test-first/fix commits were 697f6c0418 and 5368b9ee31; they are superseded by the merged upstream implementation.

Testing

  • git merge-base --is-ancestor HEAD origin/main — passed for the audited base snapshot.
  • git diff --check — passed.
  • ./scripts/lint-pbxproj-test-wiring.sh — passed.
  • python3 scripts/check-package-resolved-policy.py — passed.
  • PR review/check audit was re-run through GitHub REST and GraphQL: zero review threads, zero submitted reviews, no CHANGES_REQUESTED; CodeRabbit reported no actionable code comments.
  • No local Xcode build, simulator, XCUITest, or app launch was run.
  • I did not personally verify the behavior end to end in this resumed session, so no merge was attempted.

Demo Video

Not recorded: after the rebase there is no branch-specific implementation to demonstrate; a video would exercise the already-merged main behavior from #10437 rather than this PR.

Review trigger

The review surface was audited at feature-branch HEAD 23941b41dc0a47911d31464739412077bc6aea77. Cursor/Bugbot was unavailable because its spend limit was reached; CodeRabbit's recent review found no actionable comments; no Greptile or Codex review body and no inline review thread exists.

Checklist

  • Rebased the feature branch to the audited origin/main snapshot.
  • Addressed the description-check request with explicit Testing, Demo Video, Review Trigger, and Checklist sections.
  • Posted and re-checked the required audit-table comment.
  • Confirmed the branch and PR are unmerged/superseded.
  • Merge — intentionally not done: the PR is empty, already closed, and the behavior was not personally verified end to end in this session.

No closing issue was attached to PR #10397, so no issue comment or issue close action was performed.

@cursor

cursor Bot commented Aug 19, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@coderabbitai

coderabbitai Bot commented Aug 19, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 31a2cae7-9a8e-4319-859f-7fd2c6275bd7

📥 Commits

Reviewing files that changed from the base of the PR and between ae7d761 and 5368b9e.

📒 Files selected for processing (2)
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListConnectionChrome.swift
  • Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListConnectionChromeTests.swift

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.


📝 Walkthrough

Walkthrough

The connection chrome now shows “Not Connected” for unavailable or degraded connections, but not when foreground recovery fails while the aggregate connection remains connected. Tests update the status-line and Mac update-indicator expectations.

Changes

Connection chrome recovery state

Layer / File(s) Summary
Preserve connected aggregate status
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListConnectionChrome.swift, Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListConnectionChromeTests.swift
The status condition excludes connected aggregate states after recovery failure. Tests expect no connection chrome and preserve the Mac update indicator in this state.

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: ⚪ Minimal · up to 5368b

This change prevents a stale “Not Connected” caption from appearing over a healthy workspace list while preserving degraded and per-device status behavior; no actionable merge-blocking risk remains beyond normal checks and review.

Possibly related PRs

  • manaflow-ai/cmux#9956: Both changes modify WorkspaceListConnectionChrome and its tests for connection-state UI behavior.
  • manaflow-ai/cmux#10075: Both changes modify connection-state presentation in WorkspaceListConnectionChrome.
  • manaflow-ai/cmux#10182: This change refines recovery-related status behavior introduced by that PR.

Suggested reviewers: azooz2003-bit

🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description explains the symptom, root cause, fix, and test intent, but omits the required Testing, Demo Video, review trigger, and checklist sections. Add the required Testing and Demo Video sections, include verification details and a video or state why none is needed, and complete the review trigger and checklist.
✅ Passed checks (24 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the stale “Not Connected” status line and the iOS workspace list fix.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed The production diff only changes a status condition in an existing UI enum initializer; it adds no actor-isolated model, service, Sendable reference, or background access.
Cmux Swift Blocking Runtime ✅ Passed The PR changes only a status condition and comments in production Swift; changed Swift files contain no semaphores, waits, sleeps, delayed dispatch, polling, sync, or locks.
Cmux Browser Automation Off-Main ✅ Passed The PR changes only iOS workspace-list chrome and its tests; it introduces no browser.* socket command, WebKit/AppKit worker routing, or browser policy change.
Cmux Expensive Synchronous Load ✅ Passed The production diff only changes a connection-status boolean condition; it adds no agent-history loader, file read, JSON parse, directory scan, or background-path change.
Cmux Cache Substitution Correctness ✅ Passed The diff changes only a derived SwiftUI chrome condition and tests; it does not replace an authoritative read in persistence, history, undo, or snapshot code.
Cmux No Hacky Sleeps ✅ Passed The PR changes only Swift source and Swift tests. The custom check covers non-Swift runtime changes, and the diff adds no sleep or timer logic.
Cmux Algorithmic Complexity ✅ Passed The PR changes one scalar Boolean/enum condition in WorkspaceListConnectionChrome.swift; AST inspection found no loops or collection scans. Tests are exempt, so no complexity failure applies.
Cmux Swift Concurrency ✅ Passed The pull request changes one synchronous Swift condition and expectations; it introduces no Dispatch, Combine, completion-handler, or fire-and-forget Task pattern.
Cmux Swift @Concurrent ✅ Passed The PR changes only synchronous chrome selection and tests; no async/nonisolated/@Concurrent declarations or CPU, file, parsing, or network-heavy async call sites were introduced.
Cmux Swift Package Boundaries ✅ Passed The production diff only adjusts UI chrome selection in the existing CmuxMobileShellUI SwiftPM target; its Package.swift defines library and test targets, with no new app-target or reusable domain...
Cmux Swiftpm Lockfiles ✅ Passed The PR diff contains only WorkspaceListConnectionChrome.swift and its tests; it changes no Package.swift, Package.resolved, .gitignore, or Xcode project package references.
Cmux Swift Logging ✅ Passed The combined PR diff changes one status condition, tests, and comments; it adds no print/debugPrint/dump/NSLog, file logging, Logger, or sensitive-data logging.
Cmux User-Facing Error Privacy ✅ Passed The production diff only changes when the existing generic “Not Connected” line appears and adds a developer comment; it adds no vendor, provider, raw-error, credential, or sensitive user-facing text.
Cmux Full Internationalization ✅ Passed The PR changes only status-selection logic, comments, and tests; the existing localized renderer and catalog key remain unchanged with translated en/ja entries.
Cmux Swiftui State Layout ✅ Passed The diff changes only connection-chrome classification and test expectations. It adds no ObservableObject state, GeometryReader, lazy-row store reference, or render-time state mutation.
Cmux Architecture Rethink ✅ Passed The diff adds only a local aggregate-status guard and explanatory invariant; both UI surfaces use the shared initializer, with no timing, flags, observers, locks, or lifecycle wiring.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed The PR changes only WorkspaceListConnectionChrome logic and tests. The diff adds no NSWindow, NSPanel, NSWindowController, Window, or WindowGroup code.
Cmux Source Artifacts ✅ Passed The PR changes only two intentional Swift source/test files; no artifact-like paths, binaries, logs, caches, temp folders, or generated outputs appear in the diff.
Cmux No Test Or Debug Seam In Production Source ✅ Passed The PR changes only the production condition and explanatory comments; it adds no test/debug guard, seam-like member, visibility widening, or wrapper. Test edits remain under Tests/.
Cmux No Ambient Global State ✅ Passed The PR-range production diff only changes an existing enum initializer condition and comments; it adds no top-level function, mutable global, static namespace, or singleton.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-ios-stale-not-connected-status-line

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@austinywang

Copy link
Copy Markdown
Contributor Author

Red/green evidence note. The repo's two-commit policy expects CI to prove the regression test catches the bug, but the only lane that executes CmuxMobileShellUITests (test-ios.yml → ios-simulator, via cmux.xctestplan) has been manual-only since 2026-07-13 and is currently broken on main independent of this PR: the test bundle fails to compile with pre-existing Sendable macro-expansion errors in MobileInjectedAttachStartupTests.swift (untouched here), and package-conventions-lint fails on pre-existing violations in files this PR doesn't touch. Two manual dispatches confirmed both commits fail identically at that pre-existing compile error, giving no signal about this change:

Red/green was instead verified locally by compiling the real production sources (WorkspaceListConnectionChrome.swift + MobileMacConnectionStatus.swift, unmodified) into a host harness covering the full 25-case chrome decision table: on the test-only commit exactly the two corrected expectations fail (storeRecoveryFailureWithConnectedStatusShowsNoChrome, the update-hint gate); with the fix all 25 pass and every other chrome case is unchanged.

🤖 Generated with Claude Code

@austinywang austinywang closed this Sep 1, 2026
@austinywang
austinywang force-pushed the fix-ios-stale-not-connected-status-line branch from 5368b9e to c3f4059 Compare September 1, 2026 10:18
@austinywang

austinywang commented Sep 1, 2026 •

Copy link
Copy Markdown
Contributor Author

Audit table (re-checked 2026-09-01 against feature-branch HEAD 23941b41dc0a47911d31464739412077bc6aea77; GitHub's closed-PR record retains original head c3f405901c)

Comment ID Author File:line Ask Disposition Commit SHA
5337939790 cursor[bot] — Bugbot could not review because the team spend limit was reached. already-fixed 23941b4
5337943945 coderabbitai[bot] PR body Add explicit Testing, Demo Video, Review Trigger, and Checklist sections; the recent code review itself reported no actionable comments. fix 23941b4
5337943945 coderabbitai[bot] (cubic summary embedded) WorkspaceListConnectionChrome.swift:49-58; WorkspaceListConnectionChromeTests.swift:61-68,173 Keep a stale foreground recovery failure from overriding a connected aggregate and preserve the update hint. already-fixed 7c3093e (present at HEAD 23941b4)
5338348432 austinywang PR body Record the red/green validation limitation and the fallback harness evidence. already-fixed 23941b4
— Greptile — No Greptile top-level review body or inline thread exists on this PR. already-fixed 23941b4
— Codex — No Codex top-level review body or inline thread exists on this PR. already-fixed 23941b4
— Review threads — GraphQL review-thread audit returned zero threads; REST returned zero inline review comments and zero submitted reviews. already-fixed 23941b4

The source/test behavior is already present on main via #10437, so this PR is intentionally unmerged and closed as superseded. No closing issue was attached to #10397.

@vercel
vercel Bot temporarily deployed to Preview – cmux41 September 1, 2026 22:07 Inactive
@vercel
vercel Bot temporarily deployed to Preview – cmux166 September 1, 2026 22:07 Inactive

This branch was successfully deployed

3 active and 2 inactive deployments
Preview – cmux166 — c3f40590 Deployed Sep 1, 2026 by vercel[bot]
Preview – cmux41 — c3f40590 Deployed Sep 1, 2026 by vercel[bot]
Production – cmux — c3f40590 Deployed Sep 1, 2026 by vercel[bot]
Production – cmux166 — c3f40590 Deployed Sep 1, 2026 by vercel[bot]
Production – cmux41 — c3f40590 Deployed Sep 1, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant