Skip to content

cmux-next: glass over art keeps main text readable, like iOS, and shows the art - #21783

Closed
teamleaderleo wants to merge 30 commits into
feat-cmux-nextfrom
leo/next-glass-legibility
Closed

teamleaderleo wants to merge 30 commits into
feat-cmux-nextfrom
leo/next-glass-legibility

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator

Over background art, the window's glass held every text role (primary, secondary, tertiary) at WCAG contrast against the art's darkest and lightest colors (BackdropArtRange.scrimOpacity). That pinned the tint at 0.82–1.0 for every theme, so a work's own 0.7 tint never applied and the art showed through at 6–14%.

Leo asked for iOS-style glass ("IOS IOS", 2026-10-18). iOS keeps primary text readable over a wallpaper and lets secondary text ride on the material. This PR does the same by default, and adds a setting to go back.

  • ArtLegibility (CmuxNextDesign) has two cases:
    • .primary (default) counts only primary text at AA in the floor.
    • .all is the old rule.
    • It is part of the backdrop repaint key, so changing it repaints every window and workspace scope.
  • appearance.glassLegibility (CmuxNextSettings) takes "primary" (Main Text) or "all" (All Text). It has a Settings choice under Window, with strings in all 21 languages; the non-English ones are marked needs_review. SettingsApplier applies it, so CmuxNextApp does not grow.
  • Floor over Hokusai. These numbers come from my model of the derivation, not from the app:
Theme All text (before) Main text (now)
Clay Orange 0.85 0.63
Soft Blue 0.82 0.58
Clay Orange Light ~1.0 0.49
Soft Blue Light 0.96 0.43
  • Trade-off: secondary and tertiary text can fall below AA over the brightest or darkest parts of a work. Reduce Transparency is unchanged and stays opaque.
  • Follow-ups: blurring the art (with a slider), glass overlays, and composer glass with a native refracting rim.

Tests: GlassLegibilityTests (the main-text floor is lower and keeps primary text at AA) and GlassLegibilitySettingTests (default, "all", a bad value plus its diagnostic). Before/after tour media will follow once #21655, which adds the glass tour, is on the base.

🤖 Generated with Claude Code


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


Summary by cubic

The glass over background art now keeps only primary text at WCAG AA by default, like iOS glass over a wallpaper, so far more of the art shows (about 0.43–0.63 tint instead of 0.82–1.0).

  • appearance.glassLegibility takes "primary" (Main Text, the default) or "all" (All Text, the old dense glass); a bad value falls back to Main Text with a diagnostic.
  • The choice lives on ThemeScope and inherits like art: SettingsApplier sets it on the app scope, so changing it repaints every window and workspace scope from the root. WindowBackdrop takes it as a parameter from the scope that paints, and Settings' unset Opacity slider now rests on the same tint floor the window paints.
  • Secondary and tertiary text can drop below AA over the brightest or darkest parts of a work; Reduce Transparency is unchanged. A see-through webview's tertiary text now maps to the secondary tier to match.
  • Ships the setting schema, MDM docs, agent policy, and strings in all 21 languages (non-English marked needs_review).

Tests

  • GlassLegibilityTests covers the lower primary-only floor, the "all" floor holding every role, backdrop inheritance, the window backdrop floor, and the unset Opacity slider following the choice. GlassLegibilitySettingTests covers the default, "all", and a bad value plus its diagnostic.

Written for commit 22dbdc9. Summary will update on new commits.

View guided diff Turn on auto-fix

…ws the art

The tint floor over background art held every text role at WCAG contrast over
the art's darkest and lightest colors, so the window's glass sat at 0.82-1.0 and
the art showed at a few percent. By default it now holds primary text at AA,
as iOS glass does over a wallpaper, and the art shows through (about 0.43-0.63).
appearance.glassLegibility "all" keeps the old dense glass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 8571fabc-8a86-4fd6-b118-4cb8c71ddb0b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@github-actions

github-actions Bot commented Oct 18, 2026 •

Copy link
Copy Markdown
Contributor

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

Review 22dbdc9: 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=pr21783 -f ref=leo/next-glass-legibility -f platform=macos -f backend_mode=local

Pending: CI is running on 22dbdc96f4 (run); the result below was for 3baba45398 and no longer applies.

Last result: Unclear: web / react-apps-check failed: no known signature; failed step: Check webview test shards.

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); it is rewritten when this head's CI completes.

red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base 4d7890f; does not block
red: web / Web status; base red: the same failure on the base 4d7890f; does not block
red: web / react-apps-check; base red: the same failure on the base 4d7890f; does not block
red: web / react-apps-check (1); base red: the same failure on the base 4d7890f; does not block
red: web / react-apps-check (2); base red: the same failure on the base 4d7890f; does not block
red: web / react-apps-check (3); base red: the same failure on the base 4d7890f; does not block
red: web / react-apps-check (4); NEW: { "source": "Area is $\pi r^2$ here.", - "tex": [ - "\pi r^2", - ], + "tex": [], } - Expected - 3 + Received + 1 at <anonymous> (/home/runner/_work/cmux/cmux/we is not red on the base 4d7890f; do not merge until green; see lane-rules

CI fast guards failed on 3baba45398 (https://github.com/manaflow-ai/cmux/actions/runs/39366934881). It does not block the merge; a red guard merged into main breaks it for every open PR.
The log named no failed step; see the run.

Agents: python3 scripts/ci/guard_attribution.py fix applies the mechanical fixes locally.

Tour of 22dbdc96f4 (run)

The path-selected recorder failed for core-after; see the run artifact and failed manifests.

Path-selected interactions

Interaction Changed paths
glass Packages/macOS/CmuxNext/Sources/CmuxNextDesign/BackdropArtRange.swift
Packages/macOS/CmuxNext/Sources/CmuxNextDesign/ThemeScope.swift
Packages/macOS/CmuxNext/Sources/CmuxNextDesign/WindowBackdrop\+Current.swift
Packages/macOS/CmuxNext/Sources/CmuxNextDesign/WindowBackdrop.swift
Packages/macOS/CmuxNext/Sources/CmuxNextSettings/GlassLegibilitySetting.swift
Packages/macOS/CmuxNext/Sources/CmuxNextTerminal/TerminalHostView.swift
Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/GlassLegibilityTests.swift
Packages/macOS/CmuxNext/Tests/CmuxNextAppTests/WindowGlassTests.swift
Packages/macOS/CmuxNext/Tests/CmuxNextSettingsTests/GlassLegibilitySettingTests.swift
core Packages/macOS/CmuxNext/Sources/CmuxNextApp/WindowRootView.swift
Packages/macOS/CmuxNext/Sources/CmuxNextDesign/ArtLegibility.swift
Packages/macOS/CmuxNext/Sources/CmuxNextDesign/Windows/WindowSurfaceView.swift
Packages/macOS/CmuxNext/Sources/CmuxNextSettings/CmuxConfigSnapshot.swift
Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Localizable.xcstrings
Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Schema/SettingsSchema\+AgentPolicy.swift
Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Schema/SettingsSchema\+Appearance.swift
Packages/macOS/CmuxNext/Sources/CmuxNextSettings/SettingsApplier.swift

Core UI (before): DEGRADED — 17 ok, 1 unavailable

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 New workspace ok cmux workspace new --name Tour
3 Type in the terminal ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "echo hello from the cmux-next tour\r"
4 A command reports progress: tab loading spinner ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "clear; printf '\\033]9;4;3\\007'; sleep 900\r"
5 Split right ok cmux action run splitRight
6 Split down ok cmux action run splitDown
7 New terminal tab ok cmux action run newSurface
8 Browser tab ok cmux tab new-browser --url https://example.com
9 Hide the sidebar ok cmux action run toggleSidebar
10 Show the sidebar ok cmux action run toggleSidebar
11 Notification ok cmux notify --title Tour --body "Hello from CI"
12 Notifications panel ok cmux action run showNotifications
13 Agent chat ok cmux agent new-chat
14 Agent workspace ok cmux workspace new --name Agent
15 Agent starts ok cmux workspace name:Agent screen current pane current tab current terminal current write --text "clear; printf '\\033]7501;state=working\\033\\\\'; sleep 8; printf '\\033]7501;state=done\\033\\\\'; sleep 900\r"
16 An agent works: row working spinner ok cmux workspace new --name Notes
17 The agent finishes: done mark in the spinner's place ok
18 Profile menu unavailable: exited 1 (the menu shot needs a screen capture route) cmux action run sidebar.profileMenu
Screenshots (14)

1. Launch
Launch

2. New workspace
New workspace

3. Type in the terminal
Type in the terminal

4. A command reports progress: tab loading spinner
A command reports progress: tab loading spinner

5. Split right
Split right

6. Split down
Split down

7. New terminal tab
New terminal tab

8. Browser tab
Browser tab

9. Hide the sidebar
Hide the sidebar

11. Notification
Notification

12. Notifications panel
Notifications panel

13. Agent chat
Agent chat

16. An agent works: row working spinner
An agent works: row working spinner

17. The agent finishes: done mark in the spinner's place
The agent finishes: done mark in the spinner's place

### Core UI \(after\): FAILED — 13 ok, 4 failed, 1 unavailable

tour

Video (mp4)

# Step Result Command
1 Launch ok
2 New workspace ok cmux workspace new --name Tour
3 Type in the terminal ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "echo hello from the cmux-next tour\r"
4 A command reports progress: tab loading spinner ok cmux workspace name:Tour screen current pane current tab current terminal current write --text "clear; printf '\\033]9;4;3\\007'; sleep 900\r"
5 Split right failed: exited 1 cmux action run splitRight
6 Split down failed: exited 1 cmux action run splitDown
7 New terminal tab failed: exited 1 cmux action run newSurface
8 Browser tab failed: exited 1 cmux tab new-browser --url https://example.com
9 Hide the sidebar ok cmux action run toggleSidebar
10 Show the sidebar ok cmux action run toggleSidebar
11 Notification ok cmux notify --title Tour --body "Hello from CI"
12 Notifications panel ok cmux action run showNotifications
13 Agent chat ok cmux agent new-chat
14 Agent workspace ok cmux workspace new --name Agent
15 Agent starts ok cmux workspace name:Agent screen current pane current tab current terminal current write --text "clear; printf '\\033]7501;state=working\\033\\\\'; sleep 8; printf '\\033]7501;state=done\\033\\\\'; sleep 900\r"
16 An agent works: row working spinner ok cmux workspace new --name Notes
17 The agent finishes: done mark in the spinner's place ok
18 Profile menu unavailable: exited 1 (the menu shot needs a screen capture route) cmux action run sidebar.profileMenu

Failed steps:

5. Split right
Split right

6. Split down
Split down

7. New terminal tab
New terminal tab

8. Browser tab
Browser tab

Screenshots (10)

1. Launch
Launch

2. New workspace
New workspace

3. Type in the terminal
Type in the terminal

4. A command reports progress: tab loading spinner
A command reports progress: tab loading spinner

9. Hide the sidebar
Hide the sidebar

11. Notification
Notification

12. Notifications panel
Notifications panel

13. Agent chat
Agent chat

16. An agent works: row working spinner
An agent works: row working spinner

17. The agent finishes: done mark in the spinner's place
The agent finishes: done mark in the spinner's place

### Glass and themes \(before\): PASS — 14 ok

tour

Video (mp4)

# Step Result Command
1 Launch over art ok
2 New workspace ok cmux workspace new --name Glass
3 Terminal text and ANSI colors over art ok cmux workspace name:Glass screen current pane current tab current terminal current write --text "clear; echo 'cmux glass tour: plain text stays readable over the art'; for c in 1 2 3 4 5 6 7; do printf '\\033[3%sm color %s \\033[1m bold \\033[0m' $c $c; done; echo\r"
4 Split right ok cmux action run splitRight
5 Agent chat beside the terminal ok cmux agent new-chat
6 Command palette on glass over art ok cmux action run commandPalette
7 Close the palette ok cmux action run commandPalette
8 Soft Blue over art ok cmux settings set appearance.theme "Soft Blue"
9 Soft Blue Light over art ok cmux settings set appearance.theme "Soft Blue Light"
10 Clay Orange Light over art ok cmux settings set appearance.theme "Clay Orange Light"
11 Art off: Clay Orange Light ok cmux settings unset appearance.background
12 Clay Orange ok cmux settings set appearance.theme "Clay Orange"
13 Soft Blue ok cmux settings set appearance.theme "Soft Blue"
14 Soft Blue Light ok cmux settings set appearance.theme "Soft Blue Light"
Screenshots (14)

1. Launch over art
Launch over art

2. New workspace
New workspace

3. Terminal text and ANSI colors over art
Terminal text and ANSI colors over art

4. Split right
Split right

5. Agent chat beside the terminal
Agent chat beside the terminal

6. Command palette on glass over art
Command palette on glass over art

7. Close the palette
Close the palette

8. Soft Blue over art
Soft Blue over art

9. Soft Blue Light over art
Soft Blue Light over art

10. Clay Orange Light over art
Clay Orange Light over art

11. Art off: Clay Orange Light
Art off: Clay Orange Light

12. Clay Orange
Clay Orange

13. Soft Blue
Soft Blue

14. Soft Blue Light
Soft Blue Light

### Glass and themes \(after\): PASS — 14 ok

tour

Video (mp4)

# Step Result Command
1 Launch over art ok
2 New workspace ok cmux workspace new --name Glass
3 Terminal text and ANSI colors over art ok cmux workspace name:Glass screen current pane current tab current terminal current write --text "clear; echo 'cmux glass tour: plain text stays readable over the art'; for c in 1 2 3 4 5 6 7; do printf '\\033[3%sm color %s \\033[1m bold \\033[0m' $c $c; done; echo\r"
4 Split right ok cmux action run splitRight
5 Agent chat beside the terminal ok cmux agent new-chat
6 Command palette on glass over art ok cmux action run commandPalette
7 Close the palette ok cmux action run commandPalette
8 Soft Blue over art ok cmux settings set appearance.theme "Soft Blue"
9 Soft Blue Light over art ok cmux settings set appearance.theme "Soft Blue Light"
10 Clay Orange Light over art ok cmux settings set appearance.theme "Clay Orange Light"
11 Art off: Clay Orange Light ok cmux settings unset appearance.background
12 Clay Orange ok cmux settings set appearance.theme "Clay Orange"
13 Soft Blue ok cmux settings set appearance.theme "Soft Blue"
14 Soft Blue Light ok cmux settings set appearance.theme "Soft Blue Light"
Screenshots (14)

1. Launch over art
Launch over art

2. New workspace
New workspace

3. Terminal text and ANSI colors over art
Terminal text and ANSI colors over art

4. Split right
Split right

5. Agent chat beside the terminal
Agent chat beside the terminal

6. Command palette on glass over art
Command palette on glass over art

7. Close the palette
Close the palette

8. Soft Blue over art
Soft Blue over art

9. Soft Blue Light over art
Soft Blue Light over art

10. Clay Orange Light over art
Clay Orange Light over art

11. Art off: Clay Orange Light
Art off: Clay Orange Light

12. Clay Orange
Clay Orange

13. Soft Blue
Soft Blue

14. Soft Blue Light
Soft Blue Light

Tours are data in scripts/cmux-next/media/tours: add a step or a tour file to show your feature.

@teamleaderleo teamleaderleo added the media-tour Run the cmux-next UI tour (cmux-next-media.yml) on every push label Oct 18, 2026
…ot scope

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cursor

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

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-9a3d9 created for this PR by the cmux coordinator.

…tches the floor

The namespace lint rewrites an all-static enum. pageBase.css said the floor holds secondary text;
by default it holds primary text only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@blacksmith-sh

This comment has been minimized.

teamleaderleo and others added 3 commits October 18, 2026 15:09
- regenerated docs/mdm/com.manaflow.cmux.json
- regenerated docs/mdm/com.manaflow.cmux.plist
- regenerated docs/mdm/managed-preferences.md
- regenerated schemas/settings-export/settings-schema.sources.sha256
- regenerated schemas/settings/settings-schema.json
- regenerated webviews/src/pages/settings/generated/strings.json
- regenerated schemas/defaults/cmux-next.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39200292974
teamleaderleo and others added 2 commits October 18, 2026 23:28
…-glass-legibility

# Conflicts:
#	Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Localizable.xcstrings
#	schemas/settings-export/settings-schema.sources.sha256
#	schemas/settings/settings-schema.json
… base merge

The exports and the source stamp regenerate on the autofix bot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 19, 2026 06:29 — with GitHub Actions Inactive
…-glass-legibility

# Conflicts:
#	webviews/src/pages/settings/generated/strings.json
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 19, 2026 06:30 — with GitHub Actions Inactive
@github-actions

Copy link
Copy Markdown
Contributor

CI fast guards failed on 0d69ea801b (https://github.com/manaflow-ai/cmux/actions/runs/39210339678). It does not block the merge; a red guard merged into main breaks it for every open PR.
The log named no failed step; see the run.

Agents: python3 scripts/ci/guard_attribution.py fix applies the mechanical fixes locally. This comment is updated in place on each push.

@blacksmith-sh

This comment has been minimized.

- regenerated Packages/macOS/CmuxNext/ci-target-graph.json
- vp fmt webviews/src/agent-session/acpmux/replyHref.ts
- vp fmt webviews/src/pages/markdown/README.md
- vp fmt webviews/src/pages/markdown/links.ts
- vp fmt webviews/test/markdown-cmux-app-links.test.ts

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39210339626
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 19, 2026 06:54 — with GitHub Actions Inactive
…-glass-legibility

# Conflicts:
#	schemas/defaults/cmux-next.json
#	schemas/settings/settings-schema.json
#	webviews/src/agent-session/acpmux/replyHref.ts
#	webviews/src/pages/markdown/links.ts
@greptile-apps

greptile-apps Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] The PR changes glass appearance across app windows and updates a notification default.

Fix the graph’s disagreement with Package.swift before merging.

Findings

  1. P1 Generated-files check fails ▶
  2. P2 Tint adjustments lower text contrast ▶

Summary

Adds a choice between glass that protects primary text and denser glass that protects every text role.

  • Glass over background art keeps main text readable and shows more art.
  • Notifications clear on focus by default.
  • Settings exports list pane-focus and Chief chat choices.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A["appearance.glassLegibility"] --> B["CmuxConfigSnapshot"]
  B --> C["SettingsApplier"]
  C --> D["ThemeScope.artLegibility"]
  D --> E["WindowBackdrop"]
  D --> F["shownWindowOpacity"]
  E --> G["Window tint floor"]
Loading

Reviews (14) · Last reviewed commit: "chore(next): PR autofix at 3baba45398d5" · Reviewed by Greptile

selection: BackdropSelection? = nil, tuning: AppearanceTuning = .identity,
texture: BackdropTexture = .default, tintOpacity workspaceTint: Double? = nil) {
texture: BackdropTexture = .default, tintOpacity workspaceTint: Double? = nil,
legibility: ArtLegibility = .primary) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Opacity slider understates window tint

shownWindowOpacity still calls WindowBackdrop without legibility: artLegibility. With All Text selected and the contrast floor setting the window’s tint, that call uses the new .primary default and reports a lower opacity than the window paints. Settings uses that result for the unset Opacity slider, so its automatic value can be misleading. Pass the scope’s choice through that call too.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / defaults-snapshot is red on 22 of 22 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

- docs/mdm/com.manaflow.cmux.json
- docs/mdm/com.manaflow.cmux.plist
- docs/mdm/managed-preferences.md
- schemas/defaults/cmux-next.json
- schemas/settings-export/settings-schema.sources.sha256
- schemas/settings/settings-schema.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39359572922
@cursor

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

@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 20, 2026 03:21 — with GitHub Actions Inactive
@teamleaderleo
teamleaderleo temporarily deployed to cmux-tui-merge-tree October 20, 2026 03:23 — with GitHub Actions Inactive
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Correctness review at 1dd9656 (base feat-cmux-next 1554e40, independent subagent)

Verdict: NON-BLOCKING. No blocking findings.

Checked: ArtLegibility lives on ThemeScope (inherited, part of BackdropKey, repaints through ThemeRepaint.batch). Every scope-backed WindowBackdrop caller passes legibility: (WindowRootView, WindowSurfaceView, TerminalHostView, WindowBackdrop.current). SurfaceBackgrounds.fill has no selection, so the floor does not apply there. The parse goes through snapshot.take, falls back to .primary and emits a diagnostic for a bad value. The schema descriptor, agent-policy list, MDM json/plist/md and defaults snapshot all name appearance.glassLegibility with default "primary". The four new strings have all 21 locales. Tests cover the floor order (primary < all), AA legibility for each choice, and inheritance.

Findings

  1. P2: Packages/macOS/CmuxNext/Sources/CmuxNextDesign/WindowBackdrop+Current.swift:19. shownWindowOpacity builds WindowBackdrop without legibility:, so with "all" the unset Opacity slider in Settings (SettingsWindowService.swift:216) shows the lower primary floor while the window paints the denser tint. Fix: add legibility: artLegibility to that call, and test that shownWindowOpacity rises when the scope is set to .all. (Greptile's open thread is valid at this head.)
  2. P3: webviews/src/pages/shared/pageBase.css:20-26. Under the new default, see-through web pages map tertiary text to --page-text-2, which the native floor no longer holds at 4.5:1 over art. That is the intended iOS trade-off; the comment says so accurately. No fix needed unless secondary text on pages must stay AA.
  3. Note: schemas/defaults/cmux-next.json and docs/mdm/managed-preferences.md also pick up base drift (home.chiefBubbleStyle, layout.focusPaneOnScroll, notifications.dismissal keystroke -> focus). These match settings already on the base, so this repairs the base-red defaults snapshot rather than changing behavior. Expect a trivial conflict if the base-reds lane lands the same regeneration first.

Greptile: "Glass settings lack scoped owners" is resolved at this head (the lock is gone, the value sits on the scope, and parsing uses an instance). "Glass warning ignores app language" is not valid as a blocker: every CmuxNextSettings value diagnostic uses the same English "expected one of" text with the literal config tokens. "Opacity slider understates window tint" is valid (finding 1).

Read-only review: no build or test run.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

high-signal review link / link is red on 27 of 27 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

Comment on lines +61 to +63
func legibleTintOpacity(over art: BackdropArtRange = .any, requested: Double,
legibility: ArtLegibility) -> Double {
art.scrimOpacity(texts: backdropTexts(legibility), scrim: surfaceBackground.withAlpha(1), requested: requested)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Tint adjustments lower text contrast

With experimental appearance enabled, appearance.saturation: 0 and appearance.glassTransparency: 1, the new primary-only floor can leave primary text below its promised contrast. The floor uses the original surfaceBackground, but WindowMaterialView paints a tint with changed saturation.

For ghosttyDefault over Hokusai, the new floor is 0.63. The gray tint gives white primary text about 4.19:1 contrast over the lightest art color, below 4.5:1. The old all-text floor keeps it above 4.5:1.

Compute the floor from the tint color that will actually be painted, and cover this combination in a test.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

teamleaderleo and others added 2 commits October 19, 2026 20:55
Failing test for the correctness review at 1dd9656 (finding 1): with "all" the slider showed
the primary floor while the window painted the denser tint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… floor the window paints

shownWindowOpacity built its WindowBackdrop without the scope's legibility, so with "all"
the slider showed the primary floor. Pass artLegibility (correctness review at 1dd9656, finding 1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"CmuxNextDaemonRecovery",
"CmuxNextDaemonService",
"CmuxNextDiff",
"CmuxNextFeed",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Generated-files check fails

ci-target-graph.json adds CmuxNextFeed as a direct dependency of CmuxNextAppTests, but Package.swift does not declare it. The generator copies only declared dependencies, so it will remove this entry. That makes ci-target-graph.py --check fail, and the workflow fails on stale generated files.

Regenerate the graph from this branch’s manifest, or add the dependency to the manifest first if it is needed.

teamleaderleo added a commit that referenced this pull request Oct 20, 2026
…loor share one backdrop

The size cap allows no source growth in CmuxNextApp, so derived_min comes
from pageDerivedNumbers(floor:) instead of a second helper. In
CmuxNextDesign, shownWindowOpacity and shownWindowOpacityFloor read the
same backdrop, so a later change to how it is built (glass legibility,
#21783) applies to both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
teamleaderleo added a commit that referenced this pull request Oct 20, 2026
… changes the window (#22378)

* cmux-next settings: failing tests for an Opacity slider that moves nothing over a picture

Over a background picture the window never paints below the legibility
floor (0.82 to 1.0 for the bundled themes), so most of the Opacity
slider's travel changed nothing. The tests pin that the app reports the
floor and the slider starts there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* cmux-next settings: the Opacity slider over a picture starts at the legibility floor

Over a background picture the window's tint never drops below the floor
that keeps text legible (0.82 to 1.0 for the bundled themes), so the
slider's travel below it changed nothing. The app now reports that floor
(host lists derived_min, from ThemeScope.shownWindowOpacityFloor) and the
picker's Opacity slider starts there, on the step grid, with a summary
saying why. Without a picture the slider keeps its whole range.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* cmux-next settings: keep CmuxNextApp's size flat; resting value and floor share one backdrop

The size cap allows no source growth in CmuxNextApp, so derived_min comes
from pageDerivedNumbers(floor:) instead of a second helper. In
CmuxNextDesign, shownWindowOpacity and shownWindowOpacityFloor read the
same backdrop, so a later change to how it is built (glass legibility,
#21783) applies to both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(next): PR autofix at 004a6b7

- Packages/macOS/CmuxNext/ci-target-graph.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39380761122

* test(next): a picture whose floor reaches 95% disables the Opacity slider

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(next): the Opacity slider is disabled when the picture's floor leaves it no travel

Greptile on #22378: a legibility floor above 90% rounds to the 95% cap, so min equals max and
the thumb could not move while the slider looked enabled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(next): with no picture the Opacity slider ignores a reported floor

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* chore(next): PR autofix at 6e16816

- schemas/defaults/cmux-next.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39399195408

* chore(next): PR autofix at f5b1e59

- schemas/defaults/cmux-next.json

Autofix-Run: https://github.com/manaflow-ai/cmux/actions/runs/39406623039

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: cmux-autofix[bot] <cmux-autofix[bot]@users.noreply.github.com>
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Orphaned: no activity for 14 h, and no lane holds a lease on it. The orphan sweep could not merge feat-cmux-next in: conflicts in Packages/macOS/CmuxNext/Sources/CmuxNextDesign/ThemeScope.swift, Packages/macOS/CmuxNext/Sources/CmuxNextDesign/WindowBackdrop+Current.swift, Packages/macOS/CmuxNext/Sources/CmuxNextDesign/WindowBackdrop.swift, Packages/macOS/CmuxNext/Sources/CmuxNextSettings/Localizable.xcstrings, Packages/macOS/CmuxNext/Sources/CmuxNextSettings/SettingsApplier.swift, docs/mdm/com.manaflow.cmux.json, docs/mdm/com.manaflow.cmux.plist, docs/mdm/managed-preferences.md and 3 more. Listed for a lane to resolve.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Closing: superseded by #22566. Readability now comes from the tint, blur and glass you set over any picture, so there's no picture-dependent floor.

This branch was previously deployed

2 inactive (1 outdated) deployments
cmux-tui-merge-tree — 22dbdc96 Deployed Oct 20, 2026 by manaflow-cmux-pr-autofix[bot]
artifacts — 7a78e5eb Deployed Oct 19, 2026 by manaflow-cmux-pr-autofix[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

media-tour Run the cmux-next UI tour (cmux-next-media.yml) on every push

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant