Skip to content

arch: active-look glass scope, batch-close set and kill-switch reader become instances - #28266

Merged
lawrencecchen merged 2 commits into
feat-cmux-nextfrom
fix/arch-rise-glass-close
Oct 31, 2026
Merged

lawrencecchen merged 2 commits into
feat-cmux-nextfrom
fix/arch-rise-glass-close

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Three groups of global state that rose on feat-cmux-next with no reviewed exception become instances made once at the composition root and passed through init. Two small behavior changes (below, "Behavior changes").

Sites fixed

  • Packages/macOS/CmuxNext/Sources/CmuxNextDesign/GlassPanelView.swift:289, :291, :293, :295, :296, :395, :426: the seven ActiveLookScope statics (windows, pending, candidate, materialSite, installed, counts, kinds; 1335e10, cmux-next: no window background change when switching apps #25704). They are now one ActiveLookScope instance:
    • The AppKit getter hook captures that instance. The first ActiveLookGlassEffectView installs the hook.
    • AppServices makes the instance once (AppServices.activeLook). It is in no store and no global; review FIX at 723ce04 found the earlier ThemeStore.activeLook slot to be a static by another name, and d535691 removes it.
    • The main window gets it through WindowController -> WindowRootView(activeLook:). Every window-kit window gets it as a required parameter of NSWindow.install(kind:content:scope:activeLook:) and then WindowSurfaceView: browser popups (AppServices -> BrowserPopupWindows -> BrowserPopupWindow), sign-in panels (AppDelegate -> WebAuthSessionWindows -> WebAuthSessionWindow -> BrowserPopupWindow), onboarding (OnboardingService -> OnboardingWindowPresenter -> OnboardingWindowController) and Debug Settings (DebugSettingsService -> DebugSettingsWindowController).
    • DevTools and Page Info are child windows: they read their owner window's scope (NSWindow.backdropActiveLook, the owner's own WindowMaterialView.activeLook), the same way they already take the owner's themeScope. With no owner window they get plain glass.
    • BrowserDebugWindow passes nil: its init is private and nothing outside its file refers to it (dead code).
    • One process-wide once-guard stays: the AppKit getter swizzle is process-wide by nature, so the first install adds a marker method to NSWindow (class_addMethod), and only that install hooks the getter. It replaces the base's private static var installed. The ratchet does not count a method marker, so the -7 here does not mean that all process-wide state is gone: this guard remains, by design. In the app the first and only installing scope is AppServices' (ActiveLookScope() is made only at AppServices.swift:52).
    • The backdrop gets it through WindowMaterialView(activeLook:) and then GlassPanelView(activeLook:), which replaces keepsActiveLook: Bool.
    • The hook does the same thing as before.
  • Packages/macOS/CmuxNext/Sources/CmuxNextAppCore/WorkspaceSelectionCloseFlow.swift:25 public private(set) static var running (a439d29, Close a sidebar selection as one batch: one pass, one question, one undo #24341): this is now WorkspaceSelectionCloseFlow.Running. The app has one (AppServices.selectionCloses). It goes to every batch close and Close Workspace reads it. It stays app-wide, as the static was (see the reviewer notes).
  • Packages/macOS/CmuxNext/Sources/CmuxNextUpdater/KillSwitchReader.swift:33 static weak var app and start(updater:) (52c918f, cmux NEXT: per-PR kill switches (registry, expiry lint, signed Swift reader) #24212): removed. UpdaterService.startKillSwitchReader() stops the previous reader through its own killSwitchReader property.
  • The AppServices wiring is paid for by MainMenu+Placements.swift. It loses helpGroups, groupedItems and otherItems, which nothing has used since feat(cmux-next): trim native app menu bar #24615.

CmuxNextCompat/KillSwitches.swift static let shared stays as it is (an exception candidate).

Ratchet delta

python3 scripts/cmux-next/arch_counts.py --delta origin/feat-cmux-next HEAD:

stateful_singletons                -1 {'CmuxNextUpdater': -1}
global_mutable_statics             -8 {'CmuxNextAppCore': -1, 'CmuxNextDesign': -7}
app_lines                          -22 {'CmuxNextApp': -22}   (against the merge base; against the moved tip it reads lower because of base changes)

No other row changes. arch-ratchet.py --base origin/feat-cmux-next --head HEAD: "no architecture count rises". arch-ratchet.json is not changed (no --update, no exception).

Behavior changes

  • A DevTools window that opens for a tab not on screen (a handler that targets the tab, or the async undock after a workspace switch), or a Page Info window whose anchor went away, has no owner window. Its glass now follows the key state (it greys when not key); before, every backdrop glass kept the key look. The base already falls back to the .app theme in the same case.
  • A WindowMaterialView made with no scope now gives plain glass. All production backdrops that can show glass pass the scope.

Testing

  • InactiveWindowTintTests now makes its own ActiveLookScope for the attach, detach, scope and backdrop checks. One new check proves that a WindowMaterialView with no scope keeps plain glass.
  • python3 scripts/cmux-next/prepush-gate.py: no new violations.
  • ./scripts/lint-ios-package-conventions.sh --namespace-fix: no violations.
  • Fleet compile-check of head d535691: job c9e7588261ee59b7a47bd605 passed (CmuxNext, app). The earlier head 723ce04: job 2dcbecc3d48bb5e5a2b2fa51.

Observed / Not run

  • Observed: the arch_counts delta above, the arch-ratchet result, the prepush gate and the namespace lint.
  • Observed: fleet compile c9e7588261ee59b7a47bd605 passed at d535691.
  • Not run: the Swift tests on the fleet (a refactor: an independent review judged that it fixes no user-visible bug, so no red/green proof is needed). There is no live check of an inactive glass window on macOS 26 or later.

Reviewer notes

  • With no activeLook, WindowMaterialView(frame:) now makes plain glass. The production backdrops that can show glass (the main window root and WindowSurfaceView) pass the scope. The pane art view is always .translucent (PaneBackdropPlan), so it never makes glass.
  • In a test process the hook keeps the first scope that installs it; later scopes do no forcing. No test depends on its own scope's hook (InactiveWindowTintTests check scope state directly). WindowRootView(sidebar:activeLook:) keeps a nil default for 15 test call sites; its one production caller passes the scope.
  • Running is app-wide, not per window (the audit proposal said per window). The old static gave dedupe across windows. Also, WorkspaceSelectionClose and Close Workspace can both run with no controller or owner window.
  • The hook (unchanged here): on the main thread, every read of NSWindow._hasActiveAppearanceIgnoringKeyFocus calls AppKit's getter. Once the scope is calibrated, a read that answers inactive in a window that holds backdrop glass takes a 16-frame backtrace() plus cached dladdr image lookups. Every other read is one NSMapTable lookup. While the scope calibrates, a read inside that window's glass update takes a 32-frame backtrace(). Off the main thread it does nothing. NSGlassEffectView has no public active-state API. A candidate public route that nobody has checked: draw the backdrop with SwiftUI glassEffect in our own hosting view, with \.appearsActive / \.controlActiveState forced in its environment. Owner: Performance Lead.

Changelog

none

… become instances

Lowers the arch-ratchet rows these sites raised with no reviewed exception
(audit-rh, cmux-ad); no behavior change.

- CmuxNextDesign/GlassPanelView.swift: the seven ActiveLookScope statics
  (windows, pending, candidate, materialSite, installed, counts, kinds;
  1335e10, #25704) are one ActiveLookScope instance. The AppKit getter
  hook that its first ActiveLookGlassEffectView installs captures it.
  AppServices makes it once and hands it to the app's ThemeStore
  (ThemeStore.activeLook). The main window gets it through
  WindowRootView(activeLook:), every window-kit window through
  NSWindow.install (scope.store.activeLook) and WindowSurfaceView, and the
  backdrop through WindowMaterialView(activeLook:) and
  GlassPanelView(activeLook:). The hook itself is unchanged.
- CmuxNextAppCore/WorkspaceSelectionCloseFlow.swift: the static running set
  (a439d29, #24341) is WorkspaceSelectionCloseFlow.Running, one per app
  (AppServices.selectionCloses), passed to every batch close and read by
  Close Workspace. It stays app-wide, as the static was.
- CmuxNextUpdater/KillSwitchReader.swift: the static weak app reader and
  start(updater:) (52c918f, #24212) are gone; UpdaterService stops its
  previous reader through its own killSwitchReader property.
- CmuxNextApp/MainMenu+Placements.swift: removes the unused helpGroups,
  groupedItems and otherItems (dead since #24615), which pays for the
  AppServices wiring (app_lines -24).

Tests construct their own ActiveLookScope (InactiveWindowTintTests), and
one more check proves a backdrop with no scope keeps plain glass.
Not compiled or run here (no Swift on the agent VM); fleet compile-check
of the pushed head follows.
@lawrencecchen lawrencecchen added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@github-actions github-actions Bot added risk:high Risk tier (docs/ci/risk-tiers.md) and removed risk:normal Risk tier (docs/ci/risk-tiers.md) labels Oct 30, 2026
@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 d535691: 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=pr28266 -f ref=fix/arch-rise-glass-close -f platform=macos -f backend_mode=local

red: cmux-next checks (god files, concurrency, crash safety, l10n); NEW: 3 commit(s) change the sidebar's drawing code without a Sidebar-Look: trailer or an entry in plans/cmux-next/sidebar-owner.md is not red on the base 1d98fce; do not merge until green; see lane-rules
red: cmux-next crash ratchet; NEW: green on the base 1d98fce; do not merge until green; see lane-rules

Shipped in:

@blacksmith-sh

blacksmith-sh Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Found 27 test failures on Blacksmith runners:

Failures

Test View Logs
/tmp/tmpb6n73plh/summary-fail.json (live):/summary-fail.json (live): View Logs
/tmp/tmpz67y7uic/summary-missing.json (live):/summary-missing.json (live): View Logs
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows/
[new_workspaces] debug.new_workspace timed 0 of 50 new workspace rows
View Logs
[new_workspaces] the window draws no frames/[new_workspaces] the window draws no frames View Logs
[tabs] debug.tab_switch timed 0 of 40 switches/
[tabs] debug.tab_switch timed 0 of 40 switches
View Logs
[tabs] the window draws no frames/[tabs] the window draws no frames View Logs
test_every_linux_nightly_job_takes_a_runner_set_member (main.NightlyTrustedRouting.
test_every_linux_nightly_job_takes_a_runner_set_member) (job='attest-nightly-remote-dae
mon', runner='', primary='failure')/
test_every_linux_nightly_job_takes_a_runner_set_member (main.NightlyTrustedRouting.
test_every_linux_nightly_job_takes_a_runner_set_member) (job='attest-nightly-remote-dae
mon', runner='', primary='failure')
View Logs
test_every_linux_nightly_job_takes_a_runner_set_member (main.NightlyTrustedRouting.
test_every_linux_nightly_job_takes_a_runner_set_member) (job='attest-nightly-remote-dae
mon', runner='', primary='success')/
test_every_linux_nightly_job_takes_a_runner_set_member (main.NightlyTrustedRouting.
test_every_linux_nightly_job_takes_a_runner_set_member) (job='attest-nightly-remote-dae
mon', runner='', primary='success')
View Logs
test_every_linux_nightly_job_takes_a_runner_set_member (main.NightlyTrustedRouting.
test_every_linux_nightly_job_takes_a_runner_set_member) (job='attest-nightly-remote-dae
mon', runner='blacksmith-16vcpu-ubuntu-2404', primary='failure')/
test_every_linux_nightly_job_takes_a_runner_set_member (main.NightlyTrustedRouting.
test_every_linux_nightly_job_takes_a_runner_set_member) (job='attest-nightly-remote-dae
mon', runner='blacksmith-16vcpu-ubuntu-2404', primary='failure')
View Logs
test_every_linux_nightly_job_takes_a_runner_set_member (main.NightlyTrustedRouting.
test_every_linux_nightly_job_takes_a_runner_set_member) (job='attest-nightly-remote-dae
mon', runner='blacksmith-16vcpu-ubuntu-2404', primary='success')/
test_every_linux_nightly_job_takes_a_runner_set_member (main.NightlyTrustedRouting.
test_every_linux_nightly_job_takes_a_runner_set_member) (job='attest-nightly-remote-dae
mon', runner='blacksmith-16vcpu-ubuntu-2404', primary='success')
View Logs

...and 17 more test failures. View all on Blacksmith

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

…re slot; one getter hook per process

Review of 723ce04 (FIX): ThemeStore.activeLook put the one
ActiveLookScope in a public settable slot on ThemeScope.app.store, a static
by another name, read by six window owners through NSWindow.install.

- ThemeStore.activeLook is removed. AppServices holds the scope
  (AppServices.activeLook) and passes it down.
- NSWindow.install(kind:content:scope:activeLook:) takes the scope as a
  parameter with no default, and every caller passes it:
  - the main window (WindowController), from AppServices;
  - browser popups (BrowserPopupWindows, from AppServices) and sign-in
    panels (WebAuthSessionWindows from AppDelegate, then
    WebAuthSessionWindow, then BrowserPopupWindow);
  - the onboarding tool window (OnboardingService, then
    OnboardingWindowPresenter, then OnboardingWindowController);
  - Debug Settings (DebugSettingsService, then
    DebugSettingsWindowController);
  - DevTools and the page info windows, which are child windows: they pass
    their owner window's NSWindow.backdropActiveLook, which reads the
    owner's own WindowMaterialView (as they already take the owner's
    themeScope);
  - BrowserDebugWindow passes nil: it has no entry point.
- ActiveLookScope.install adds a marker method to NSWindow with
  class_addMethod. Only the first install can add it, so the getter hook is
  installed once per process and a later scope (a test's) never stacks a
  second hook over the first. A stacked hook could push the reader past the
  16-frame forcingDepth.
- Tests pass activeLook: nil where they built these windows.

Not compiled here (no Swift on the agent VM); the fleet compile-check of the
pushed head follows.
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Default changes

This pull request changes 4 defaults at d5356919aca1 (what everyone gets without configuring anything):

  • tunable-source.CmuxNextApp/AppActions+Workspaces.swift:closeWorkspace: "2839d35bf7ba2b4667d410b011c4de1fa3a81a711f5b2f61b2f423e426ce9c05" -> "7061f4bdaf558471bf741d7f4215d73532870775ff46a0d52d1f1bad1fb610e7"
  • tunable-source.CmuxNextAppCore/WorkspaceSelectionCloseFlow.swift:canStart: "4407331d447be9be757d4a319e9662f5b0db1c02f8dcb730e8ac52089f9ae774" -> (none)
  • tunable-source.CmuxNextAppCore/WorkspaceSelectionCloseFlow.swift:running: "b8abf5f1508482a8fab3b51c7dc6760e5300228d3a3f897b7b31baf791593619" -> (none)
  • tunable-source.CmuxNextDaemonService/WorkspaceCloseFlow.swift:running: "b8abf5f1508482a8fab3b51c7dc6760e5300228d3a3f897b7b31baf791593619" -> (none)

Needs a review. It passes with an independent review receipt on this commit: a comment or review whose first line is Review (<reviewer>): SHIP at d5356919aca1425fd855b458298f0bae47e06094, from a member, not a self-review (the newest verdict naming the head decides; a later BLOCK beats an earlier SHIP), or with an approving review on this commit from @austinywang or @teamleaderleo (the call owners in .github/defaults-call-owners.json, never the author). A receipt posted as a review re-runs this check; after a plain comment, re-run it. The needs a call label alone does not pass, and a new push needs a new receipt.

Merge receipt: merged as 346c50a0d1fa with these defaults changed, WITHOUT a SHIP receipt or an approving call owner review on its head.

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

@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Review (independent review subagent, arch-rise): SHIP at d535691
perf claim: none
compile: c9e7588261ee59b7a47bd605 passed

Summary:

  • AppServices.activeLook is an instance on the composition root, passed through init. ThemeStore.activeLook is removed.
  • All 7 install(kind:content:scope:activeLook:) sites pass a scope. The main window and WindowSurfaceView are the only production backdrops that can show glass. Pane art is always .translucent.
  • BrowserDebugWindow is dead code: its init is private and nothing outside its file refers to it.
  • NSWindow.backdropActiveLook is a lookup by context: it reads the owner window's own injected scope, the same way owner.themeScope is read. It is not a hidden global.
  • The class_addMethod marker is a process-wide once-guard for a swizzle that is process-wide by nature. It replaces the base's static var installed. The PR body discloses it.
  • In the app, the first and only scope that installs the hook is the AppServices scope: ActiveLookScope() is made only at AppServices.swift:52, and the hook installs only from ActiveLookGlassEffectView.init(scope:).
  • No test depends on the hook of its own scope.
  • The behavior changes are limited to DevTools or Page Info with no owner window. They are rare and only cosmetic, and the PR body names them.
  • This is a refactor, so it needs no red/green proof.
  • I read every call site of each changed init and API, including the tests. Access levels and imports are correct.
  • arch_counts --delta: stateful_singletons -1, global_mutable_statics -8. No row rises. arch-ratchet: no rise. prepush-gate: no new violations.
  • The PR adds no CI job, step or gate.

Not blocking: WindowRootView(sidebar:activeLook:) keeps = nil for test call sites. A later production caller could forget to pass the scope.

@lawrencecchen lawrencecchen added the ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds label Oct 30, 2026
lawrencecchen added a commit that referenced this pull request Oct 30, 2026
…der, not the dead Help groups

#28266 (fix/arch-rise-glass-close) already removes MainMenu.helpGroups/groupedItems/otherItems for its own
lines; the second PR to land would lose its payment. MainMenu+Placements.swift is back to the base.
PageFactory.homeChannelsEditRoute had no production caller (the page builds its PageEditProvider route
inline); HomeChannelsComposerEditTests now builds that route the way the page does.
lawrencecchen added a commit that referenced this pull request Oct 31, 2026
…composition root, never the global NSApp (#28321)

* test(app): a key-window lookup in a test process with no NSApplication must not trap

AppServices' default key-window source implicitly unwraps the global NSApp, which is nil in a
test process that never made NSApplication.shared; the trap ends the whole CmuxNextAppTests process.
Red on the base: the suite runs alone (swift test --filter), NSApp is nil, and the first lookup traps
at AppServices.swift:87.

* fix(app): AppServices takes its key-window source from the composition root, never the global NSApp

AppServices.keyWindowSource defaulted to { NSApp.keyWindow }. NSApp is NSApplication!, nil in a
test process that never made NSApplication.shared, so any test that built AppServices and reached a
key-window lookup (windows.active, keyWindowRole, the quit sheet, ListHandlers) trapped and ended the
whole CmuxNextAppTests process (#28275, #28090 green jobs).

- AppServices.init takes keyWindowSource with no default; AppDelegate (the composition root) passes
  { NSApp.keyWindow }, so production cannot forget it.
- The test target alone has the convenience init with no key window ({ nil }); no test call site changes.
- QuitCoordinator asks the sender (the NSApplication AppKit passed) for isActive and activate(), and
  reads NSApp?.mainWindow for the sheet; the auto-archive toast reads NSApp?.mainWindow: no implicit
  unwrap of the global on a path a test can reach.

Regression test: AppServicesKeyWindowSourceTests (red on the base: traps at AppServices.swift:87).

* fix(app tests): import LaunchReveal for the test-target AppServices init

Compile job 26f2055725867054aa419409 failed: AppServices+TestKeyWindow.swift did not see LaunchReveal
(CmuxNextDesign), so the convenience init did not compile and every test call site fell to the
designated init (missing keyWindowSource). Every other error in that log follows from this one.

* fix(app): AppServices takes whether the app is active from the composition root too

The second trap (#28275 green eb20257db2553e2e4a4dd378, NotificationCenterService+ProgramStatusSeen.swift:57):
AppServices.init starts notifications, whose viewed-program-status observation calls viewedTabs, which
read NSApp.isActive. Any test that built AppServices and then awaited (each quit step awaits) trapped.

- AppServices.init takes appActiveSource with no default; AppDelegate passes { NSApp.isActive }.
- The notifications' six reads (viewedTabs, isViewed, the program-status visibility, arrive, the
  hand-off and sandbox-run banners) ask services.appActiveSource().
- The test target's init reads the application only if the test made one (NSApp?.keyWindow,
  NSApp?.isActive ?? false), so tests behave as before and never unwrap the global.
- AppServicesKeyWindowSourceTests: the recording test also checks the app-active lookups and awaits the
  started observation's first ask of the injected source (no clock).

* fix(app): the feed presence, Chief pet, new window focus and New Tab spares read the injected sources

Review of #28321 (SHIP with gaps at 3980462):
- FeedService read NSApp.isActive in observePresence and startIfSignedIn; its sign-in task starts with
  AppServices, so a signed-in test with no NSApplication trapped. FeedService takes appActive (no default);
  AppServices passes its appActiveSource.
- Re-scan of what AppServices builds and starts: ChiefPetRoutes' appIsActive (made from the notifications
  service), WindowController's first .appActive focus event and NewTabSparePool's key-window reads (started
  after the first frame) now ask services.appActiveSource() / keyWindowSource().
- appActiveSource has its own doc; keyWindowSource's doc says debug.key replaces it alone, with the reason.
- app_lines: the three joined doc comments are split again; paid by removing dead code instead:
  MainMenu.helpGroups, groupedItems and otherItems have no caller since #24615 (2e71847).
- AppServicesKeyWindowSourceTests: the first test checks only that the lookups return (a GUI lane can have a
  real key window); it also calls the notifications' viewedTabs and isViewed.

* fix(app): pay app_lines with the Channels page's test-only route builder, not the dead Help groups

#28266 (fix/arch-rise-glass-close) already removes MainMenu.helpGroups/groupedItems/otherItems for its own
lines; the second PR to land would lose its payment. MainMenu+Placements.swift is back to the base.
PageFactory.homeChannelsEditRoute had no production caller (the page builds its PageEditProvider route
inline); HomeChannelsComposerEditTests now builds that route the way the page does.

* fix(app): the input invariant check reads the injected key window; one Channels edit route builder

Delta review of #28321 at 923b306 (FIX):
- InputObservationBuilder.keyWindow read NSApp.keyWindow; AppServices starts input verification, whose
  presentation-change subscription runs it (DEBUG invariant monitor, window geometry). It now takes the key
  window from services.keyWindowSource().
- Re-scan of subscriptions, timers and tasks AppServices starts: KeyRouter's menu gate (keyWindowFocus),
  the refusal HUD's window (AppActionContext, ChatsOpenCoordinator, HomeChiefActions, LinkHandlers,
  ViewerService) ask services.keyWindowSource(); the agent cursor snapshot, a pane's surface diagnostics
  (SurfaceInvariantMonitor) and SheetDismissal.endAll's default read NSApp? (never the unwrapped global).
- HomeChannelsPage: PageFactory.homeChannelsEditRoute() builds the edit route and gives back its provider;
  homeChannelsWebPage uses it and sets run once its view exists, and HomeChannelsComposerEditTests calls it.
- app_lines: paid by removing FilePageService.openEmpty, which has no caller.
@lawrencecchen
lawrencecchen merged commit 346c50a into feat-cmux-next Oct 31, 2026
178 of 196 checks passed
@lawrencecchen
lawrencecchen deleted the fix/arch-rise-glass-close branch October 31, 2026 00:34
lawrencecchen added a commit that referenced this pull request Oct 31, 2026
…(build skew of #28266 and #27638)

#28266 turned GlassPanelView(keepsActiveLook:) into GlassPanelView(activeLook:)
while #27638 added Glass.makePanel/makeOverlayPanel(keepsActiveLook:) for the
dialog card. Both merged, and feat-cmux-next stopped compiling
(Glass.swift:79 extra argument 'keepsActiveLook').

Glass.makePanel, Glass.makeOverlayPanel and OverlaySurfaceView now take
activeLook: ActiveLookScope?. CmuxDialogView takes it from CmuxDialogCenter,
which passes the dialog window's backdropActiveLook. An app-scoped dialog
(no window) follows the key state.

Compiled: 9b4cea495b0bc379ed0794d1
@lawrencecchen

Copy link
Copy Markdown
Contributor Author

Base red from this PR: the feat-cmux-next "Crash safety" step (check-crash-safety.sh) is red since 346c50a. The new NSSelectorFromString("cmux_activeLookScopeInstalled") in CmuxNextDesign/GlassPanelView.swift has a reviewed crash-allow, but the waiver was not recorded (CmuxNextDesign: dynamic_dispatch.waived 5 -> 6). #28783 records it with crash_ratchet.py --record-waivers. Next time, run that in the same PR as a new crash-allow.

lawrencecchen added a commit that referenced this pull request Oct 31, 2026
…tor waiver (#28266) (#28783)

#28266 (346c50a) added NSSelectorFromString("cmux_activeLookScopeInstalled")
in CmuxNextDesign/GlassPanelView.swift with a reviewed crash-allow (our own
marker selector, added with class_addMethod and never called), but did not
record the waiver: CmuxNextDesign dynamic_dispatch.waived 5 -> 6 turned
"Crash safety" red on every feat-cmux-next push since 346c50a.

crash_ratchet.py --record-waivers writes the row (and lowers the rows that
went down: acpmux and cmux-tui-core unwrap). No source change.

check-crash-safety.sh: red at 18757c2 (base), ok at this commit.

This branch was previously deployed

1 inactive deployment
ci-routing-agent — d5356919 Deployed Oct 30, 2026 by lawrencecchen via cmux-tui tree preflight #82478
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-to-land Reviewed at this head; next-autoland merges it into feat-cmux-next when its only reds are base reds risk:high Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant