Skip to content

Fix Cloud sidebar unread indicator placement - #13367

Merged
austinywang merged 20 commits into
mainfrom
13366-cloud-notification-layout
Sep 23, 2026
Merged

austinywang merged 20 commits into
mainfrom
13366-cloud-notification-layout

Conversation

@austinywang

@austinywang austinywang commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Cloud workspace and terminal rows now show the unread dot on the left, before the pin, icon, and title. Read rows reserve no notification space. An unread row inserts a scaled 12pt slot containing the centered six-point dot, keeping it separate from the disclosure caret and row content.

Closes #13366.

The user's follow-up explicitly requested compact read rows and space only while unread. The resulting trade-off is that the identity cluster moves by the slot width plus 2pt on arrival/clear; this supersedes the original issue's no-title-movement requirement. Unread titles have correspondingly less space at narrow widths. Full accessible titles remain available.

Dogfood and evidence

Austin tested the authenticated tagged build and confirmed “it works now.” The local tagged reload of ab0d82a95b succeeded in 911 seconds with CMUX_SKIP_ZIG_BUILD=1, personal authentication, the GCP development backend, and Cloud dogfood/beta gates enabled. The preserved tag is issue-13366-cloud-notification-layout. It was opened again at Austin's request and the live GCP-backed sidebar showed compact read terminal rows alongside the unread terminal/workspace with their leading blue dots; unread state was preserved during observation. Subsequent issue changes affect tests only; main was merged through 70dfb472ec.

  • Original regression-only commit caught the icon-overlap regression before the placement fix.
  • Hosted run 35805897693 passed all four attention tests on the production fix, including real-outline transitions, reuse, pinned/unpinned rows, 140/300pt cells and 75–200% magnification. Its result bundle contains read/unread and composed-outline PNGs. The combined run failed an existing compact raster assertion.
  • Main independently landed the same actual-icon-bounds test correction in Make app-host unit tests green on main #13643. The merge adopts that shared implementation, retains the positive-width assertion, and removes our duplicate helper. It no longer assumes every symbol is one connected ink group or filters by expected text coordinates. Pin tests render a full-width content surface. All regression tests remain enabled.
  • Pre-merge hosted run 35814003567 covers CloudSidebarAttentionLayoutTests, CloudSidebarPinGeometryTests, CloudTreeCompactLayoutTests, and CloudNotificationDismissParityTests at ac3f20c6293a726b1496034a333e8ea958f90396. Passed: 24 tests in 4 suites in 11.252 seconds. The result bundle contains the rendered read/unread and compact-layout attachments.
  • Current head is f64ccb6f4d0f52c7b5413dfa4d591d99a5ac55ad. The placement, pin, compact-caret, and acceptance matrices now also cover the supported 50% minimum (maximum 200%). Current four-suite run 35817904000 passed all 24 tests in 17.886 seconds, including the 50% minimum. All four suite pass lines and a successful executed-test guard were verified in the log. Pre-merge run 35816378262 also passed on 0ce01ea071.
  • Static checks passed: diff whitespace, Swift file-length budget, test wiring (1,037 files), CI shard routing, and localization audit (8 catalogs, 9 locales, no new keys). No Swift budget TSV changes.
  • Main ci: streamline app-host test consumers #13427 replaced dedicated gates with shared strict batches that validate built inventory, completion, and failures. All four Cloud suites are discovered exactly once; obsolete exclusions and duplicate invocations are gone. The PR has no CI policy diff. full-ci remains enabled to verify shared app-host interactions, with the trade-off of broader lanes and additional queue time. Required CI is pending. The instant Web complexity failure was fixed by refreshing the PR base to include ci: scope trusted web complexity before Bun setup #13598's trusted helper; run 35816873375 passed on 368c1fbad1; the final head inherits the corrected base. Canonical autoreview at ac3f20c629 passed with no actionable findings; review also passed on 0ce01ea071, and canonical review at f64ccb6f4d passed with no actionable findings; merge-conflict and policy gates were clean. Review is separate from test execution.

Rendered fixture attachments establish layout behavior; they are distinct from Austin's live Cloud dogfood. No post-suite hang is inferred from the hosted command's duration, which includes compilation.

Issue-lifecycle impact map

Stage Owner and impact
Delivery and identity Existing notification admission, daemon identity, placement and synchronization. No delivery failure inferred or delivery behavior changed.
Unread projection Hub unread terminal IDs feed the view model, terminal rows and containing workspace attention.
Rendering and refresh Shared decoration inserts space only while unread. Immutable snapshots and targeted outline refresh repaint terminals and collapsed parents.
Read/clear #13004's notification-store observer and hub reconciliation remain authoritative. No new state, persistence or dismissal path.
Interaction Existing pins, native disclosure actions, selection and hover controls retain ownership.

Review audit

Finding Disposition
Greptile Swift 6.0 trailing comma Replied and resolved as a false positive. CloudTreeCellView.swift:78 ends with attentionSlot: style.rowGrid.attentionSlot, followed by )); there is no argument-list trailing comma.
Outline transition coverage Replied and resolved. outlineAttentionTransitions, captureRow, and the acceptance-suite call are restored; hosted execution passed.
Cursor spend-limit notices Service availability notices, with no code finding.
CodeRabbit paused review and older summary The older trailing-placement summary is superseded by the left-side design above. No actionable inline findings remain; canonical review passed before the merge; final-head canonical review passed.

Checklist

  • User confirmed the tagged app behavior.
  • Retained outline, pin, magnification, compact layout and dismissal coverage.
  • Audited localization; no new user-facing text.
  • Final-head focused hosted tests green (24 tests, including 50–200% placement coverage).
  • Required CI aggregate green; full macOS admission and package jobs are queued for a runner.
  • Final-head review complete.
  • Merge approved and performed by Austin.

@coderabbitai

coderabbitai Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

Review Change StackReview Change Stack

Understand this PR’s impact

Explore downstream dependencies and potential security impact with Blast Radius.

View blast radius →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

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: 7c8dfd84-dff6-4300-badf-28695eb1d84d

📥 Commits

Reviewing files that changed from the base of the PR and between a63a458 and a4acf3f.

📒 Files selected for processing (2)
  • cmuxTests/CloudSidebarAcceptanceTests.swift
  • cmuxTests/CloudSidebarAttentionLayoutTests.swift

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


📝 Walkthrough

Walkthrough

Cloud sidebar unread indicators now use the row’s trailing padding instead of the leading corner. Tests cover placement across widths, row states, font magnification, and transitions. CI runs the related layout suites in the focused gate.

Changes

Cloud notification layout

Layer / File(s) Summary
Trailing indicator placement
Sources/Cloud/Sidebar/CloudSidebarRowDecoration.swift, Sources/Cloud/CloudTreeCellView.swift
The unread indicator aligns to the row’s trailing edge and centers within configurable trailing padding supplied by the row style.
Layout regression coverage
cmuxTests/CloudSidebarAttentionLayoutTests.swift, cmuxTests/CloudSidebarAcceptanceTests.swift
Tests validate indicator geometry across widths, row kinds, font magnification, row heights, pin states, and unread transitions.
Focused CI execution
.github/workflows/ci.yml, scripts/ci/cmux_unit_test_shard.py
The focused Cloud regression step and focused gate include notification, sidebar attention, pin geometry, and compact tree layout suites.

Priority: ➖ Normal

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

Change: Bug fix · Severity of issue fixed: Medium

🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.09% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 11 functions across 5 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR meets the coding requirements in issue #13366. CloudSidebarRowDecoration places the unread indicator in the row's trailing padding and centers it vertically. CloudTreeCellView supplies the …
Out of Scope Changes check ✅ Passed The changes remain within issue #13366. Source changes reposition the Cloud unread indicator and pass the required layout padding. Test changes validate indicator placement, compact layout, pin geomet…
Cmux Cloud Persistent Session And Early Input ✅ Passed PASS. The review-scoped diff changes only Cloud sidebar rendering, rendered layout tests, and CI test selection. CloudSidebarRowDecoration moves the unread dot to existing trailing padding, and `Clo…
Cmux Swift Actor Isolation ✅ Passed PASS. The production diff only changes UI rendering. CloudTreeCellView passes existing CloudTreeStyle.rowGrid.trailingPadding to CloudSidebarRowDecoration, and the ViewModifier moves the badge…
Cmux Swift Blocking Runtime ✅ Passed PASS: The production Swift diff only changes Cloud row decoration layout. It passes style.rowGrid.trailingPadding and moves the unread circle to a trailing overlay with a fixed frame. No semaphore, …
Cmux Browser Automation Off-Main ✅ Passed The check is not applicable to this pull request. The authoritative diff changes only Cloud sidebar rendering, tests, and CI selection. Sources/TerminalController.swift and `Packages/macOS/CmuxContr…
Cmux Expensive Synchronous Load ✅ Passed PASS: The production diff only changes CloudTreeCellView.configure to pass style.rowGrid.trailingPadding and changes CloudSidebarRowDecoration to place a six-point indicator in trailing padding.…
Cmux Cache Substitution Correctness ✅ Passed PASS — The production diff only changes Cloud sidebar rendering. CloudTreeCellView.configure passes style.rowGrid.trailingPadding, and CloudSidebarRowDecoration moves the unread dot from `.topLe…
Cmux No Hacky Sleeps ✅ Passed PASS. The pull request changes only Swift implementation/tests, CI workflow selectors, and three suite names in scripts/ci/cmux_unit_test_shard.py. The added non-Swift lines introduce no sleeps, tim…
Cmux Algorithmic Complexity ✅ Passed PASS. The production diff only changes CloudTreeCellView to pass a scalar style.rowGrid.trailingPadding and changes CloudSidebarRowDecoration to place a fixed six-point indicator inside that pad…
Cmux Swift Concurrency ✅ Passed PASS. The reviewed Swift diff adds no DispatchQueue, custom queue, DispatchGroup, Combine state, completion-handler API, or fire-and-forget Task. The production changes only pass `trailingPaddin…
Cmux Swift @Concurrent ✅ Passed PASS: The PR adds no @concurrent, nonisolated, or async declarations, and no async call sites. The production Swift changes are synchronous view configuration and SwiftUI layout code. The new la…
Cmux Swift Package Boundaries ✅ Passed PASS: The production Swift diff changes only AppKit/SwiftUI UI composition. CloudTreeCellView.configure passes style.rowGrid.trailingPadding to CloudSidebarRowDecoration, and the modifier change…
Cmux Swiftpm Lockfiles ✅ Passed The authoritative PR diff changes only CI test selection, Cloud SwiftUI code, tests, and the test-shard script. It contains no Package.swift, Package.resolved, .gitignore, Xcode project, or workspace …
Cmux Swift Logging ✅ Passed PASS. The PR adds no prohibited logging. The only production Swift changes update CloudSidebarRowDecoration placement and pass trailing padding; they add no print, debugPrint, dump, NSLog, file loggin…
Cmux User-Facing Error Privacy ✅ Passed PASS. The authoritative diff changes Cloud sidebar unread-indicator layout and test/CI coverage. It does not add or materially change a user-facing error, alert, command output, API error body, or rec…
Cmux Full Internationalization ✅ Passed PASS. The production diff changes unread-indicator layout and passes numeric trailing padding. It adds no user-facing text, localization key, string catalog entry, web message, or locale change. Exist…
Cmux Swiftui State Layout ✅ Passed PASS. The SwiftUI production change adds only value inputs to CloudSidebarRowDecoration and places the existing indicator in an overlay frame. Its body uses immutable booleans plus `trailingPaddin…
Cmux Architecture Rethink ✅ Passed PASS. The production diff is a small local layout correction. CloudTreeCellView.configure passes the existing style.rowGrid.trailingPadding into CloudSidebarRowDecoration, and the modifier place…
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS. The scoped diff changes only Cloud row SwiftUI decoration and test coverage. It adds no user-visible NSWindow, NSPanel, NSWindowController, SwiftUI Window, WindowGroup, close shortcut, or window…
Cmux Source Artifacts ✅ Passed All six changed paths are hand-written Swift, Python, or CI configuration files. The authoritative diff adds no screenshot, log, recording, cache, build output, DerivedData, dependency checkout, temp …
Cmux No Test Or Debug Seam In Production Source ✅ Passed PASS. The PR adds no test or debug seam to production source. The only production Swift changes pass the row-grid trailingPadding into CloudSidebarRowDecoration and use it for normal unread-indica…
Title check ✅ Passed The title clearly and concisely identifies the main change: fixing Cloud sidebar unread indicator placement.
Description check ✅ Passed The description is detailed and directly covers the change, rationale, testing, verification evidence, known gaps, and checklist status. It omits a dedicated demo video and review-trigger block, but t…
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

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

Copy link
Copy Markdown
Contributor

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

@austinywang
austinywang marked this pull request as ready for review September 21, 2026 09:17
@greptile-apps

greptile-apps Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

The PR appears safe to merge with no outstanding correctness, security, or repository-rule violations.

Findings

  1. P1 Swift 6.0 Build Break ▶
  2. P2 Outline transition coverage removed ▶

Summary

The PR moves Cloud sidebar unread indicators from the leading icon area into the row’s existing trailing padding and adds strict rendered regression coverage.

  • Passes the active row-grid trailing padding into the shared row decoration.
  • Centers the persistent six-point unread indicator at the trailing edge without changing row identity geometry.
  • Restores composed-outline coverage for unread, cleared, pinned, and unpinned transitions.
  • Adds the layout and geometry suites to the focused CI gate.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
    A[Cloud tree node unread state] --> B[CloudTreeCellView]
    B --> C[CloudSidebarRowDecoration]
    D[Active row-grid trailing padding] --> C
    C --> E[Six-point indicator centered in trailing padding]
    E --> F[Row icon, title, disclosure, and hover controls remain unchanged]
Loading

Reviews (5) · Last reviewed commit: "fix: separate Cloud unread indicators fr..."

Comment thread Sources/Cloud/CloudTreeCellView.swift Outdated
@austinywang
austinywang force-pushed the 13366-cloud-notification-layout branch from 06265d8 to 654deb4 Compare September 21, 2026 09:26
@cursor

cursor Bot commented Sep 21, 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.

@austinywang
austinywang force-pushed the 13366-cloud-notification-layout branch 2 times, most recently from f87da02 to a63a458 Compare September 21, 2026 09:51
Comment thread cmuxTests/CloudSidebarAcceptanceTests.swift
@cursor

cursor Bot commented Sep 23, 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.

@austinywang austinywang added the full-ci EXPENSIVE: full macOS tests/builds; overrides selective PR routing. Not needed for normal checks. label Sep 23, 2026
@cursor

cursor Bot commented Sep 23, 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.

@cursor

cursor Bot commented Sep 23, 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.

@austinywang
austinywang merged commit e9154a9 into main Sep 23, 2026
46 of 48 checks passed
rustybret pushed a commit to rustybret/bmux that referenced this pull request Sep 23, 2026
e9154a9 Merge pull request manaflow-ai#13367 from manaflow-ai/13366-cloud-notification-layout
66dd9ea Remember the iOS computer picker selection across launches (manaflow-ai#13772)
f64ccb6 test: cover Cloud notification layout at minimum font magnification
156cce4 Merge remote-tracking branch 'origin/main' into 13366-cloud-notification-layout
70dfb47 ci: parallelize iOS test product downloads (manaflow-ai#13884)
368c1fb Merge remote-tracking branch 'origin/main' into 13366-cloud-notification-layout
0ce01ea Merge remote-tracking branch 'origin/main' into 13366-cloud-notification-layout
ac3f20c Merge remote-tracking branch 'origin/main' into 13366-cloud-notification-layout
efe16fa test: measure rendered Cloud row geometry without style heuristics
5985511 test: scope title raster workaround to ledger rows
8b71061 test: measure Cloud machine title columns robustly
ab0d82a fix: remove empty Cloud notification gutter
403a815 Merge remote-tracking branch 'origin/main' into 13366-cloud-notification-layout
d454a9c fix: import Cloud font scaling support
84303f0 fix: avoid empty Cloud attention space until unread
f5c168d Merge branch 'main' of https://github.com/manaflow-ai/cmux into 13366-cloud-notification-layout
696afe4 test: account for clipped narrow Cloud rows
20d4e69 test: align compact Cloud spacing with attention slots
15b4b5d ci: keep Cloud layout suites in the strict macOS gate
a49053c Merge origin/main into 13366-cloud-notification-layout
05ba773 fix: keep Cloud attention indicators in the leading slot
a4acf3f fix: separate Cloud unread indicators from row icons
649f602 test: catch overlapping Cloud unread indicators

# Conflicts:
#	.github/workflows/test-ios.yml
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

full-ci EXPENSIVE: full macOS tests/builds; overrides selective PR routing. Not needed for normal checks.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Restore Cloud right-sidebar notification indicator layout

1 participant