Skip to content

fix: read every sidebar mode's availability from injected defaults - #16353

Closed
lawrencecchen wants to merge 13 commits into
mainfrom
fix-sidebar-modes-injected-defaults
Closed

lawrencecchen wants to merge 13 commits into
mainfrom
fix-sidebar-modes-injected-defaults

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Summary

FileExplorerStateModePersistenceTests.testInjectedDefaultsOwnCustomSidebarAvailabilityAndPersistence fails on main (seen in run https://github.com/manaflow-ai/cmux/actions/runs/36796217267, shard 3/7). It was added by #15381 but never ran green on main because the test target stopped compiling right after that merge.

The product bug: RightSidebarMode.availableModes(defaults:) passed the injected UserDefaults only to the feed and machines flags. The custom-sidebar case went through the flag-only isAvailable(feedEnabled:machinesEnabled:) overload, which reads UserDefaults.standard. A FileExplorerState built on an isolated suite therefore reported .customSidebar as its mode while availableModes(defaults:) left it out.

availableModes(defaults:) now filters allCases through isAvailable(defaults:), the single predicate that already reads every flag (feed, machines, custom sidebar) from the given store. Production callers pass .standard, so their result is unchanged.

Stacked on #16306, which restores test-target compilation. Retarget or rebase once it merges.

Testing

Red: the existing test fails at FileExplorerStateModePersistenceTests.swift:131 (XCTAssertTrue failed) in run 36796217267 attempt 2, job "app-host unit tests (3/7)". Green: full-suite ci.yml run on this branch, linked in a comment below. Swift syntax check passed locally. No app tests ran on this Mac.

Changelog

none

🤖 Generated with Claude Code


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


Summary by cubic

Fixes the right sidebar availability check so the custom-sidebar mode reads its flag from injected defaults, and restores the cmuxCLITests build on main that broke after #15381.

RightSidebarMode.availableModes(defaults:) only passed the injected suite to the feed and machines flags; the custom-sidebar case read UserDefaults.standard instead, so a FileExplorerState built on an isolated suite could report .customSidebar while availableModes(defaults:) excluded it. The method now filters allCases through isAvailable(defaults:), the predicate that already reads every flag from the given store, so the reported mode and the available list always agree. Production callers pass .standard, so their result is unchanged.

Test build

  • Hook state recovery tests now run the bundled cmux binary against a mock socket instead of @testable import cmux_cli, which this target cannot link; seeded records use current timestamps so prune-on-save doesn't remove them for an unrelated reason.
  • The vm poll interval policy moved to VMReadyPollInterval.swift, compiled into both the CLI and cmuxCLITests, so override boundaries are testable there and the app-hosted CLIVMTransferTests check is gone.
  • PaneResizeShortcutTests restores the controller binding its divider assertions need; the reconcile-budget test binds results before #expect; drainMainQueue accepts an optional timeout.

Written for commit 935b08c. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Bug Fixes
    • vm wait now uses CMUX_VM_WAIT_POLL_SECONDS only when it is a valid interval from 0.01 to 3 seconds; otherwise, it uses the 3-second default.
    • Sidebar modes now reflect availability based on the current defaults.
  • Tests
    • Expanded coverage for CLI session recovery, polling intervals, and workspace behavior.

austinywang and others added 13 commits September 30, 2026 14:44
The same change as #16232 (7a51764), carried so this PR can restore
main's cmuxTests build in one piece. #15381 made
LastSurfaceClosePreferenceTests and WorkspaceCloseTabsContextMenuTests
call drainMainQueue(timeout:), but the shared helper takes no arguments.

Refs #15488

Co-authored-by: Leo Li <cheerleaderleo@outlook.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The same change as #16242 (90851e5), carried so this PR can restore
main's cmuxTests build in one piece. #15381 called
CMUXCLI.vmReadyPollInterval from the app-hosted CLIVMTransferTests, where
CMUXCLI names the app's routing type, not the CLI. The policy check moves
to cmuxCLITests, which builds the CLI target.

Refs #15488

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#15420 (d0dd226) resolved a merge in this test by dropping
`let controller = workspace.bonsplitController` while the divider
assertions below still use `controller`, so main's cmuxTests don't
compile:

  cmuxTests/PaneResizeShortcutTests.swift:66:39: error: cannot find
  'controller' in scope

The binding comes back just before its first use.

Refs #15488

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#16158's budget test passes budget.admit(...) straight to #expect. Xcode
26.3's macro expands the argument inside a closure where budget is
immutable ("cannot use mutating member on immutable value"), so the
macOS 15 lane fails at TEST BUILD. Bind each result first.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
#16196 added ClaudeHookSessionStoreRecoveryTests with `@testable import
cmux_cli`. cmux_cli is the cmux-cli executable, which cmuxCLITests does not
link and cannot host, so the target stopped compiling ("Unable to find
module dependency: CmuxControlSocketAtomicsC / CmuxSimulatorSystem"), and
adding those packages would only move the failure to link time.

The two tests now seed the hook state file, run a real `cmux hooks claude
session-start` against a mock socket, and read what the CLI left on disk,
like the rest of cmuxCLITests:

- a malformed sibling record no longer discards a valid session mapping,
  and a salvageable file is not quarantined;
- each of two unreadable state files is moved to its own quarantine backup
  with its original bytes, and the store keeps working afterwards.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
#16245 moved the vm poll-interval check into cmuxCLITests with
`@testable import cmux_cli`, which cannot compile or link for the same
reason as the hook store tests: cmux_cli is the CLI executable. The pure
policy now lives in CLI/VMReadyPollInterval.swift, compiled into both the
CLI and cmuxCLITests (the CMUXCLI+AutoNaming precedent), and
CMUXCLI.vmReadyPollInterval delegates to it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Every hook save prunes records older than the state retention window, so
the 1970 timestamps from the in-process test made the valid record vanish
for a reason unrelated to decode recovery.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
RightSidebarMode.availableModes(defaults:) passed the injected suite only to
the feed and machines flags. The custom-sidebar case went through the
flag-only isAvailable overload, which reads UserDefaults.standard, so a
FileExplorerState built on an isolated suite reported .customSidebar as its
mode while availableModes(defaults:) omitted it. Filter allCases through
isAvailable(defaults:), the one predicate that already reads every flag from
the given store.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@cursor

cursor Bot commented Oct 1, 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.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@coderabbitai

coderabbitai Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

🧰 Additional context used
📚 Code guidelines (4)
.github/review-bot-rules/test-determinism.md — configured
.github/review-bot-rules/swift-architectural-rethink.md — configured
.github/review-bot-rules/source-control-artifacts.md — configured
.github/review-bot-rules/swiftpm-package-resolved.md — configured

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: a3c382a2-7ee6-4ddb-a1cc-1bf5775caa56

📥 Commits

Reviewing files that changed from the base of the PR and between cade2e2 and 935b08c.

📒 Files selected for processing (10)
  • CLI/CMUXCLI+VMTransfer.swift
  • CLI/VMReadyPollInterval.swift
  • Sources/RightSidebarMode+Availability.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxCLITests/CLIVMReadyPollIntervalTests.swift
  • cmuxCLITests/ClaudeHookSessionStoreRecoveryTests.swift
  • cmuxTests/CLIVMTransferTests.swift
  • cmuxTests/CloudWorkspaceLiveProjectionTests.swift
  • cmuxTests/PaneResizeShortcutTests.swift
  • cmuxTests/TabManagerUnitTests.swift
💤 Files with no reviewable changes (1)
  • cmuxTests/CLIVMTransferTests.swift

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 4 remain after this review.


📝 Walkthrough

Walkthrough

The change centralizes VM-ready polling interval resolution, updates sidebar mode availability to use the supplied defaults store, and changes Claude hook recovery tests to exercise the bundled CLI. Several other tests receive assertion, reference, or timeout adjustments.

Changes

VM Poll Interval

Layer / File(s) Summary
Resolve and test the VM poll interval
CLI/VMReadyPollInterval.swift, CLI/CMUXCLI+VMTransfer.swift, cmuxCLITests/CLIVMReadyPollIntervalTests.swift, cmuxTests/CLIVMTransferTests.swift, cmux.xcodeproj/project.pbxproj
VM polling now uses a shared resolver. It accepts finite environment overrides from 0.01 through 3 seconds and otherwise returns 3 seconds. Tests cover valid, missing, and invalid overrides. Project references and build source lists include the helper and its tests.

Sidebar Mode Availability

Layer / File(s) Summary
Check availability from defaults
Sources/RightSidebarMode+Availability.swift
availableModes(defaults:) checks each mode through isAvailable(defaults:) using the supplied defaults store.

Claude Hook Recovery Tests

Layer / File(s) Summary
Exercise recovery through the CLI
cmuxCLITests/ClaudeHookSessionStoreRecoveryTests.swift
The recovery tests run session-start against temporary hook-state files with a mock socket server. They check salvaged and removed records, new session mappings, and quarantine backups.

Other Test Updates

Layer / File(s) Summary
Update test assertions and helpers
cmuxTests/CloudWorkspaceLiveProjectionTests.swift, cmuxTests/PaneResizeShortcutTests.swift, cmuxTests/TabManagerUnitTests.swift
Cloud projection assertions now name individual admission outcomes. The pane resize test stores the controller in a local variable. drainMainQueue accepts a configurable timeout.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 935b0

The change fixes sidebar availability so it reads from the injected defaults store, and it centralizes VM poll interval handling without changing its behavior. The remaining changes are test updates. No concrete merge-blocking risk was found.


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Cmux Swift Package Boundaries ❌ Error The new CLI/VMReadyPollInterval.swift is Foundation-only domain policy with a directly testable resolve(environment:) API. The project compiles the same implementation into both cmux-cli and `cm… Create a small SwiftPM target such as CmuxVMReadyPolicy. Move VMReadyPollInterval into it as a public type with a public resolve(environment:) API, add package unit tests, and link/import that package from cmux-cli and `cmuxCLITests…
Docstring Coverage ⚠️ Warning Docstring coverage is 15.79% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 19 functions across 8 files. (1 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (23 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the primary change: sidebar mode availability now reads from injected defaults.
Description check ✅ Passed The description explains the bug, resulting behavior, affected tests, test status, limitations, and changelog entry. The Demo Video and Checklist sections are omitted, but the core required informatio…
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 Cloud Persistent Session And Early Input ✅ Passed PASS: The PR does not introduce or materially change Cloud terminal creation, persistent cmux-tui transport, manual renderer admission, attachment input routing, or auth/revision/lease handling. The o…
Cmux Swift Actor Isolation ✅ Passed No actor-isolation defect is introduced. The production changes are a pure CLI polling helper and a defaults-based sidebar filter; they add no shared mutable Sendable reference, service protocol, UI s…
Cmux Swift Blocking Runtime ✅ Passed No new or materially expanded blocking runtime primitive is introduced. The production change moves the existing CMUX_VM_WAIT_POLL_SECONDS parsing into VMReadyPollInterval.resolve with the same 0.…
Cmux Browser Automation Off-Main ✅ Passed PASS: The pull request changes VM polling, sidebar availability, CLI hook tests, and unrelated test helpers. It does not modify browser socket automation, Sources/TerminalController.swift, `ControlC…
Cmux Expensive Synchronous Load ✅ Passed PASS. The production Swift diff only centralizes VM poll-interval parsing and changes sidebar availability to use the injected UserDefaults. These paths perform no agent-history loads, large-file pa…
Cmux Cache Substitution Correctness ✅ Passed PASS. The production diff does not replace a fresh authoritative read with a cache. RightSidebarMode.availableModes(defaults:) now evaluates each mode through isAvailable(defaults:), which reads t…
Cmux No Hacky Sleeps ✅ Passed PASS: The pull request changes only Swift files plus cmux.xcodeproj/project.pbxproj. The only non-Swift change registers Swift sources and tests in the Xcode project; it adds no runtime script or ti…
Cmux Algorithmic Complexity ✅ Passed PASS. The only new production collection operation is RightSidebarMode.allCases.filter in Sources/RightSidebarMode+Availability.swift:33. RightSidebarMode has seven explicit enum cases, so this …
Cmux Swift Concurrency ✅ Passed PASS. The production diff only extracts VMReadyPollInterval.resolve and changes sidebar availability filtering. It adds no background DispatchQueue, Combine state, completion-handler API, or fire-…
Cmux Swift @Concurrent ✅ Passed PASS: The PR adds or changes only synchronous functions for VM poll resolution, sidebar availability, test setup, and queue draining. The changed test methods that perform file and process I/O are syn…
Cmux Swiftpm Lockfiles ✅ Passed PASS. The pull request changes cmux.xcodeproj/project.pbxproj only to add Swift source and test file references. It does not change SwiftPM package references. No Package.swift, .gitignore, work…
Cmux Swift Logging ✅ Passed PASS. The production Swift diff only refactors VM poll-interval resolution and sidebar availability. It adds or changes no print, debugPrint, dump, NSLog, Logger, or diagnostic file/stdout log…
Cmux User-Facing Error Privacy ✅ Passed PASS: The production changes only alter sidebar-mode availability lookup and VM poll-interval resolution. They add or modify no user-facing errors, alerts, command output, API error bodies, or recover…
Cmux Full Internationalization ✅ Passed PASS. The production diff only changes sidebar availability resolution and VM poll-interval configuration. It adds no user-facing text, localization keys, web copy, metadata, or changelog content. The…
Cmux Swiftui State Layout ✅ Passed PASS. The PR does not add or expand SwiftUI state or layout patterns covered by the rule. The changed production Swift files contain CLI polling logic and RightSidebarMode availability filtering. Th…
Cmux Architecture Rethink ✅ Passed The diff does not introduce a production timing or lifecycle repair. The existing VM status polling and Thread.sleep remain unchanged; only the interval parsing moved into a shared resolver. The new…
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS. The PR changes CLI polling, sidebar availability, project references, and test code. The authoritative diff adds no user-visible NSWindow, NSPanel, NSWindowController, SwiftUI Window, or WindowG…
Cmux Source Artifacts ✅ Passed All ten changed paths are Swift source, test files, or Xcode project configuration. The new poll-interval source and tests are deliberate product and test-system files. The recovery tests create tempo…
Cmux No Test Or Debug Seam In Production Source ✅ Passed PASS. The only changed Swift file under a production Sources/ path is Sources/RightSidebarMode+Availability.swift. Its diff changes availableModes(defaults:) to filter allCases with the existi…
Full details: Docstring Coverage

Explanation

Docstring coverage is 15.79% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 19 functions across 8 files. (1 skipped: 1 unsupported.)

Full details: Cmux Swift Package Boundaries

Explanation

The new CLI/VMReadyPollInterval.swift is Foundation-only domain policy with a directly testable resolve(environment:) API. The project compiles the same implementation into both cmux-cli and cmuxCLITests, but no SwiftPM package contains it. This matches the reusable logic boundary rule. The RightSidebarMode change is app-specific AppKit/sidebar glue and does not trigger the rule.

Resolution

Create a small SwiftPM target such as CmuxVMReadyPolicy. Move VMReadyPollInterval into it as a public type with a public resolve(environment:) API, add package unit tests, and link/import that package from cmux-cli and cmuxCLITests. Keep the CMUXCLI forwarding method in the CLI target.

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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.

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 10 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="cmuxCLITests/ClaudeHookSessionStoreRecoveryTests.swift">

<violation number="1" location="cmuxCLITests/ClaudeHookSessionStoreRecoveryTests.swift:125">
P3: `runSessionStart` sets `HOME` for the spawned `cmux` CLI but omits `CFFIXED_USER_HOME`. The repo's established child-process isolation pattern (see `codexHookTestEnvironment` in cmuxCLITestSupport/CLICodexHookTimeoutRegressionTestSupport.swift, which always sets both) requires both so the subprocess never reads the real user's CFPreferences/`~/Library/Preferences` defaults. Add `CFFIXED_USER_HOME` pointing at the same per-test `root` directory.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

executablePath: cliPath,
arguments: ["hooks", "claude", "session-start"],
environment: [
"HOME": root.path,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: runSessionStart sets HOME for the spawned cmux CLI but omits CFFIXED_USER_HOME. The repo's established child-process isolation pattern (see codexHookTestEnvironment in cmuxCLITestSupport/CLICodexHookTimeoutRegressionTestSupport.swift, which always sets both) requires both so the subprocess never reads the real user's CFPreferences/~/Library/Preferences defaults. Add CFFIXED_USER_HOME pointing at the same per-test root directory.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At cmuxCLITests/ClaudeHookSessionStoreRecoveryTests.swift, line 125:

<comment>`runSessionStart` sets `HOME` for the spawned `cmux` CLI but omits `CFFIXED_USER_HOME`. The repo's established child-process isolation pattern (see `codexHookTestEnvironment` in cmuxCLITestSupport/CLICodexHookTimeoutRegressionTestSupport.swift, which always sets both) requires both so the subprocess never reads the real user's CFPreferences/`~/Library/Preferences` defaults. Add `CFFIXED_USER_HOME` pointing at the same per-test `root` directory.</comment>

<file context>
@@ -1,58 +1,142 @@
+            executablePath: cliPath,
+            arguments: ["hooks", "claude", "session-start"],
+            environment: [
+                "HOME": root.path,
+                "PATH": "/usr/bin:/bin:/usr/sbin:/sbin",
+                "CMUX_SOCKET_PATH": socketPath,
</file context>
Suggested change
"HOME": root.path,
"HOME": root.path,
"CFFIXED_USER_HOME": root.path,

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Dogfood tours of 935b08c6

cloud-sidebar-audit-tour at 935b08c6: not run

skipped: CI left no app build for this head (its compile failed or was cancelled)

Tours are picked by the paths globs in dogfood/scenarios/*.json; a Dogfood-tours: a, b line in the description picks them instead (none turns this off). Look at every frame before merging: a green tour only means no step failed.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

CI failure attribution

CI failed on 935b08c659 (run 36813855319 attempt 3): 8 code.

Job Verdict Why
macos / CLI product tests code a test failed
macos / app-host unit tests (3/7) code a test failed
macos / app-host unit tests (1/7) code a test failed
macos / app-host unit tests (6/7) code a test failed
macos / app-host unit tests (4/7) code a test failed
macos / app-host unit tests (5/7) code a test failed
macos / app-host unit tests (2/7) code a test failed
macos / app-host unit tests (7/7) code a test failed
Matched log lines
macos / CLI product tests: ✘ Test inboxListsMessagesAndCanMarkThemRead() recorded an issue at CLIAgentMessageCommandTests.swift:117:9: Expectation failed: (readParams["ids"] as? [String] → ["abcdef0123456789", "fedcba9876543210"]) == ["fedcba9876543210"]
macos / app-host unit tests (3/7): /tmp/cmux-ci/src/cmuxTests/BrowserConfigTests.swift:2957: error: -[cmuxTests.BrowserSessionHistoryRestoreTests testGoBackPrefersLiveWKWebViewHistoryBeforeRestoredFallback] : failed - Timed out waiting for browser panel to load file:///var/folders/tn/hs17qg310b31lnr6ktn_3qwr0000gp/T/cmux-browser-hist
macos / app-host unit tests (1/7): ✘ Test manualDisconnectPreservesPersistentSlotUntilFinalCleanup() recorded an issue at RemoteSessionCleanupLifecycleTests.swift:21:17: Expectation failed: await Self.nextBootstrapRequest(runner) → nil
macos / app-host unit tests (6/7): /tmp/cmux-ci/src/cmuxTests/CJKIMEMarkedSelectionTests.swift:49: error: -[cmuxTests.CJKIMEMarkedSelectionTests testKeyDownDoesNotForwardWhenZhuyinStartsMarkedText] : XCTUnwrap failed: expected non-nil value of type "UnsafeMutableRawPointer" - Expected native surface before dispatching composed input
macos / app-host unit tests (4/7): /tmp/cmux-ci/src/cmuxTests/CLIAmpLifecycleIntegrationTests.swift:334: error: -[cmuxTests.CLINotifyProcessIntegrationRegressionTests testAmpRunningAndNeedsInputSignalsFailClosedForDeadProcess] : XCTAssertFalse failed
macos / app-host unit tests (5/7): ✘ Test configuredActionsCycleMembersWithoutSelectingAnchor() recorded an issue at WorkspaceGroupCycleShortcutTests.swift:93:9: Expectation failed: (manager.selectedTabId → 23F311EA-80BC-4D0F-9DA9-E7DD39897C31) == (firstMember.id → 3F4EFD14-66DC-4724-B3E9-D49AC9489357)
macos / app-host unit tests (2/7): /tmp/cmux-ci/src/cmuxTests/CLINotifyProcessIntegrationRegressionTests.swift:3573: error: -[cmuxTests.CLINotifyProcessIntegrationRegressionTests testCodexStopWithMissedPromptSubmitClearsTerminalStaleTurn] : XCTAssertTrue failed - A Stop after a missed prompt-submit must clear terminal stale turns and
macos / app-host unit tests (7/7): /tmp/cmux-ci/src/cmuxTests/CLIEventsStreamPeerCloseTests.swift:68: error: -[cmuxTests.CLIEventsStreamPeerCloseTests testEventsDeliversFramesBufferedBeforePeerClose] : XCTAssertEqual failed: ("0") is not equal to ("2")

Not re-run automatically: macos / CLI product tests, macos / app-host unit tests (3/7), macos / app-host unit tests (1/7), macos / app-host unit tests (6/7), macos / app-host unit tests (4/7) 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.

@teamleaderleo teamleaderleo left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Superseded on main: 91fca8c (#12809) already changed RightSidebarMode.availableModes(defaults:) to allCases.filter { $0.isAvailable(defaults: defaults) }, the same change as here. The rest of the diff is the #16306 stack, which conflicts in four test files and auto-merges a duplicate let controller into cmuxTests/PaneResizeShortcutTests.swift (see my note on #16306). Nothing is left to land, so this can close once testInjectedDefaultsOwnCustomSidebarAvailabilityAndPersistence passes on main.

One gap is left on main, not caused by this PR: the flag-only isAvailable(feedEnabled:machinesEnabled:) still reads .customSidebar from .standard. Any caller of availableModes(feedEnabled:machinesEnabled:) still has the original mixed-store bug.

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Closing: covered on main by #12809 (91fca8c), which made availableModes(defaults:) filter through isAvailable(defaults:).

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.

3 participants