Skip to content

fix: coalesce browser rendering and teardown - #8958

Closed
usr-bin-roygbiv wants to merge 49 commits into
manaflow-ai:mainfrom
usr-bin-roygbiv:feature/browser-rendering-performance
Closed

usr-bin-roygbiv wants to merge 49 commits into
manaflow-ai:mainfrom
usr-bin-roygbiv:feature/browser-rendering-performance

Conversation

@usr-bin-roygbiv

@usr-bin-roygbiv usr-bin-roygbiv commented Jul 26, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Purpose

Coalesce browser-portal geometry and presentation work without synchronous AppKit/WebKit display flushing, keep one explicit rendering-state repair at lifecycle transitions, skip redundant single-browser reconciliation, and synchronously release browser-pane discard and presentation resources on close. This preserves active viewport, rebind, inspector, reveal, recovery, and teardown behavior while reducing avoidable main-thread work.

Fixes #1114.
Related: #4188, #5305, #3085, #7895.

Tests

  • TDD coverage exercises external geometry coalescing; direct and active-viewport redraw invalidation; single-entry synchronization; initial bind, reveal, forced refresh, same/new-anchor and delayed workspace rebind; hosted-inspector adjustment; first-sized reveal; bounded transient-anchor and off-window recovery; discard-manager shutdown; and loaded local-webview teardown.
  • The initial failing lifecycle probe reproduced stale transient-anchor visibility: 6 selected cases ran with 1 assertion failure before the recovery fix.
  • macOS Compatibility run 30210823264 compiled the application and test targets at the first complete code-and-test checkpoint. The active-viewport, external-split, workspace-rebind, portal-anchor, and single-entry regressions passed on macOS 15. Repository-wide jobs later reached their time limits, unrelated suites also reported failures, and the Intel macOS 14 job could not start under the account spending limit; this is scoped rather than full-suite-green evidence.
  • Tagged application build 30225738150 built reviewed source head e779b88e3c successfully on macOS 15. The installed tagged app passed activation, local-page loading, scrolling, browser-owned screenshot capture, deterministic resize, a 220-sample live-resize probe with zero browser RPC errors, and the bounded 12-surface close/reclaim probe.
  • Current head 213f48628e adds causal refresh checks and delayed-workspace-rebind coverage. Its focused lifecycle, first-reveal, and teardown workflows are pending on macOS 15: run 30323970929, run 30323971382, and run 30323971416. They have no observed conclusions yet and are not claimed as passing. Two earlier df5c4b9063 focused runs ended with workflow exit code 4 instead of reporting an assertion result.

Metrics

All measurements used local deterministic fixtures on an Apple Silicon macOS 15 system. They are bounded before/after observations, not universal speed claims.

  • Browser process cleanup (12 surfaces): baseline loaded/settled at 15/4 WebKit processes; reviewed treatment loaded/settled at 15/3, so one fewer process remained after close and the 12 closed surfaces did not leave 12 WebContent processes alive.
  • WebKit footprint: baseline loaded 262.1–266.3 MB and settled 87.4–92.3 MB; reviewed treatment loaded 253.2 MB and settled 83.3 MB. Loaded footprint was 8.9–13.1 MB lower and settled footprint was 4.1–9.0 MB lower than the two baseline runs.
  • Installed-app resize probe: deterministic baseline browser RPC median/p95 was 59.030/84.691 ms with 1.73% app CPU; the 220-sample live-resize treatment measured 23.180/60.900 ms with 1.05% app CPU and zero RPC errors. Because the loops differ and repeated runs showed directionally variable timing, these values document the exercised probes rather than establish a general RPC or CPU speedup.
  • Portal trace context: one measured comparison reduced geometry invalidations from 383 to 180 and full presentation refreshes from 47 to 2. Required per-anchor synchronization remains; the change removes duplicate invalidation and forced recovery rather than suppressing necessary geometry work.

The memory probe is synthetic and short, not a long-session soak. Whole-window SwiftUI/AppKit layout still produces long frames during aggressive resize. Screen-level capture could not score intermediate hosted-layer tearing, so the evidence does not claim that all long frames, historical memory growth, or compositor tearing are eliminated.

Safety

  • Pure geometry changes invalidate layout/display for AppKit's normal pass; they do not synchronously call displayIfNeeded() or invoke WebKit recovery.
  • Bind, reveal, force-refresh, inspector adjustment, rebind, and recovery transitions retain one explicit rendering-state repair owned by portal synchronization.
  • Multi-browser reconciliation remains deferred; only the single-entry redundant all-entry pass is skipped.
  • Close is idempotent, cancels viewport restoration, shuts down the discard manager, clears delegates/observers, detaches portal or inline presentation, and replaces a loaded view with an unloaded view while preserving the non-optional panel contract.
  • Focused tests observe production state directly; no test-only production counter remains.
  • The detailed investigation and claim boundaries are recorded in docs/browser-rendering-performance-investigation.md.

Testing

  • Focused lifecycle, viewport, rebind, recovery, first-reveal, discard, and loaded-webview teardown regressions as described above.
  • Installed tagged-app local-fixture probe: activation, load, scroll, browser-owned PNG, deterministic resize, 220-sample live resize, close, and process reclamation.
  • No project-wide green claim; repository-wide timeouts, unrelated failures, and unavailable Intel capacity are explicitly excluded from the focused proof.

Demo Video

No video attached. Screen-level capture on the validation system omitted the hosted WebKit surface. Browser-owned PNGs plus DOM, animation-frame, RPC, process, and footprint instrumentation verify the exercised behavior; the capture limitation and claim boundary are documented in the investigation report.

  • Video URL or attachment: None

Review Trigger (Copy/Paste as PR comment)

@codex review
@coderabbitai review
@greptile-apps review
@cubic-dev-ai review

Checklist

  • I tested the change locally
  • I added or updated tests for behavior changes
  • I updated docs/changelog if needed
  • I requested bot reviews after my latest commit (copy/paste block above or equivalent)
  • All code review bot comments are resolved
  • All human review comments are resolved

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@coderabbitai

coderabbitai Bot commented Jul 26, 2026 •

Copy link
Copy Markdown

Review Change Stack

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
📝 Walkthrough

Walkthrough

The portal now coalesces geometry and presentation refreshes, relies on invalidation instead of synchronous WebKit display flushing, and avoids redundant synchronization. Browser-panel close teardown now shuts down lifecycle resources, detaches hosted views, and installs a replacement web view with expanded regression coverage.

Changes

Browser portal rendering and lifecycle

Layer / File(s) Summary
Coalesced portal refresh and invalidation
Sources/BrowserPortalWebViewRenderingState.swift, Sources/BrowserWindowPortal.swift, Sources/Panels/BrowserViewportHostView.swift
Geometry nudges no longer force synchronous layout/display. Portal refreshes use coalesced work, presentation invalidation, updated ownership checks, and deferred rendering-state repair.
Portal binding and readiness integration
Sources/BrowserWindowPortal.swift, Sources/Panels/BrowserPanelView.swift, Sources/Workspace.swift, Sources/DockSplitStore+PortalReconcile.swift, Sources/Panels/BrowserPanel+AutomationViewport.swift, Sources/Panels/BrowserPanel.swift
Binding owns forced presentation refreshes, duplicate refresh calls are removed, and readiness checks restrict refreshes to already-ready hidden portal containers.
Rendering and synchronization regression coverage
cmuxTests/BrowserPanelTests.swift, cmuxTests/BrowserPortalFirstRevealScrollTests.swift, docs/browser-rendering-performance-investigation.md
Tests measure redraw invalidation, deferred completion, rendering reattachment, display flushing, anchor conversions, reveal behavior, and single-entry synchronization; documentation records the investigation and validation.
Browser-panel close teardown
Sources/Panels/BrowserHiddenWebViewDiscardManager.swift, Sources/Panels/BrowserPanel.swift, cmuxTests/BrowserPanelViewIdentityTests.swift
Close is re-entrancy guarded, discard management is shut down, hosted presentation views are detached, delegates are cleared, and a replacement web view is installed and validated.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Geometry as External geometry
  participant Portal as WindowBrowserPortal
  participant Host as BrowserViewportHostView
  participant WebView as WKWebView
  Geometry->>Portal: synchronizeAllWebViews(source: externalGeometry)
  Portal->>Portal: coalesce presentation refresh
  Portal->>Host: invalidateBrowserPortalPresentation()
  Host->>WebView: request layout and display invalidation
  Portal->>WebView: refresh rendering state when required
Loading

Possibly related PRs

  • manaflow-ai/cmux#8909: Portal reveal tests and rendering-state reattach behavior overlap with this refresh lifecycle change.

Suggested reviewers: austinywang, lawrencecchen

🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed The new shutdown/bind/refresh paths stay within @MainActor browser UI types; no new nonisolated shared mutable state or background UI-store access was introduced.
Cmux Swift Blocking Runtime ✅ Passed PR removes delayed refresh work and adds only test waits; no new production waits, sleeps, syncs, or locks were introduced.
Cmux Browser Automation Off-Main ✅ Passed This commit only adjusts a BrowserWindowPortalLifecycle test; no browser.* socket routing or worker-lane code changed, so the off-main rule isn’t implicated.
Cmux Expensive Synchronous Load ✅ Passed PR diff is portal geometry/lifecycle only; diff scan found no added RestorableAgentSessionIndex.load()/JSONL/transcript loads on main or interactive paths.
Cmux Cache Substitution Correctness ✅ Passed No persistence/history/undo path swaps fresh reads for cached values; snapshot use is transient portal-sync UI state, with fresh readiness checks still present.
Cmux No Hacky Sleeps ✅ Passed No covered TS/JS/shell/build-runtime files changed, and the diff adds no fixed sleeps or polling in runtime code.
Cmux Algorithmic Complexity ✅ Passed No new nested full-collection rescans or repeated sort/filter hot-path work were introduced; the new scans are linear, bounded, or existing, and one retry loop is capped at 12.
Cmux Swift Concurrency ✅ Passed Diff only tightens a XCTest assertion in BrowserPanelTests; it adds no DispatchQueue/Combine/completion-handler/fire-and-forget Task patterns.
Cmux Swift @Concurrent ✅ Passed No changed Swift file introduces @concurrent, nonisolated async misuse, or UI-isolated heavy async work; the new async test helpers are UI-bound.
Cmux Swift Package Boundaries ✅ Passed PASS: the diff only adjusts AppKit/WKWebView portal lifecycle glue and tests/docs; no new independently reusable domain logic remains in the app target.
Cmux Swiftpm Lockfiles ✅ Passed Diff only changes app sources, tests, and docs; no .gitignore, Package.swift/resolved, Xcode project, or workflow files were touched, so the SwiftPM lockfile rule isn't violated.
Cmux Swift Logging ✅ Passed PASS: The production diff only changes BrowserWindowPortal.swift and adds no print/debugPrint/dump/NSLog or Logger declarations; only tests add stdout, which is allowed.
Cmux User-Facing Error Privacy ✅ Passed Production hunks only add internal reason strings and teardown/refresh logic; no user-facing alert/error copy or sensitive vendor/provider details appear.
Cmux Full Internationalization ✅ Passed No new user-facing Swift/web copy was added; changes are logic/tests/docs only, and the new markdown report isn’t wired into published docs routes.
Cmux Swiftui State Layout ✅ Passed Changed SwiftUI code only adds a bridge parameter in WebViewRepresentable; no new ObservableObject/@Published/GeometryReader/lazy-row or render-time state mutation was introduced.
Cmux Architecture Rethink ✅ Passed dce9482 removed the queued refresh side channel; current code refreshes synchronously in synchronizeWebView/bind, with only bridge/test async left.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS: the PR only changes browser panel/portal behavior and tests; no new standalone NSWindow/NSPanel/WindowGroup declarations or cmux window-identifier wiring were added.
Cmux Source Artifacts ✅ Passed All changed paths are intentional source/test/doc files; no logs, screenshots, recordings, caches, temp dirs, or build outputs were added.
Cmux No Test Or Debug Seam In Production Source ✅ Passed No new test/debug seam was added in production Sources; the only debug-named change is a production call to existing BrowserWindowPortalRegistry.debugSnapshot.
Cmux No Ambient Global State ✅ Passed Diff scan found no new file-scope funcs/vars or singleton state; added APIs are instance methods on owning types, not ambient globals.
Title check ✅ Passed The title is concise and accurately summarizes the main change: browser rendering coalescing and teardown work.
Description check ✅ Passed The description follows the template well, covering summary, testing, demo video, review trigger, and checklist sections.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@usr-bin-roygbiv

Copy link
Copy Markdown
Contributor Author

@codex review
@coderabbitai review
@greptile-apps review
@cubic-dev-ai review

@cubic-dev-ai

cubic-dev-ai Bot commented Jul 26, 2026

Copy link
Copy Markdown

@codex review
@coderabbitai review
@greptile-apps review
@cubic-dev-ai review

@usr-bin-roygbiv I can't start this review because your workspace has reached its free monthly review limit. cubic has reviewed 241,631 of the 240,000 allowed lines of code this month. Reviews resume on 1 August 2026 (in 6 days). Paid plans include much higher monthly review limits. Upgrade now to resume reviews.

To help optimise your usage, you can tune cubic to get the most out of your usage limits:

Learn more →

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@coderabbitai

coderabbitai Bot commented Jul 26, 2026 •

Copy link
Copy Markdown

@usr-bin-roygbiv: Starting a review of the latest changes in #8958.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create a Codex account and connect to github.

@greptile-apps

greptile-apps Bot commented Jul 26, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Coalesces browser rendering updates and makes browser-pane teardown deterministic.

  • Replaces synchronous AppKit/WebKit layout and display flushes with deferred invalidation.
  • Consolidates portal presentation recovery into a latest-wins synchronization pass.
  • Detaches local and portal presentation hierarchies and shuts down discard resources when a browser pane closes.
  • Adds focused rendering, lifecycle, workspace-rebind, and teardown regression coverage.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
Sources/BrowserPortalWebViewRenderingState.swift Replaces synchronous first-reveal layout and display flushes with deferred invalidation.
Sources/BrowserWindowPortal.swift Coalesces geometry and presentation synchronization while removing redundant delayed refresh passes.
Sources/Panels/BrowserHiddenWebViewDiscardManager.swift Adds deterministic shutdown of hidden-webview discard resources.
Sources/Panels/BrowserPanel.swift Strengthens browser-pane close teardown and presentation detachment.
Sources/Panels/BrowserViewportHostView.swift Invalidates active viewport presentation through normal AppKit layout and display state without retaining the previously reported production test counter.
cmuxTests/BrowserPanelTests.swift Adds focused coverage for coalesced refresh, rebind, redraw, and synchronous teardown behavior.

Reviews (14): Last reviewed commit: "test: cover delayed workspace rebind" | Re-trigger Greptile

Comment thread Sources/Panels/BrowserViewportHostView.swift Outdated
@cursor

cursor Bot commented Jul 26, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

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

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

@coderabbitai coderabbitai Bot 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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
cmuxTests/BrowserPanelTests.swift (1)

4336-4352: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Stale displayIfNeededCount expectation contradicts the sibling rebind test.

Line 4348 still requires displayIfNeededCount to increase after the rebind, but runHostedWebViewRefreshPass no longer flushes display — and the equivalent workspace-rebind test at line 4562 now asserts the opposite ("must not synchronously flush WebKit display"). Any pass here comes from incidental AppKit flushing during addSubview/unhide, not from a contract, so this will flake. setNeedsDisplayCount is the counter that expresses the intended "refresh presentation" invariant, as already used at line 4547.

💚 Align with the sibling rebind assertions
-        let displayCountBeforeRebind = webView.displayIfNeededCount
+        let displayCountBeforeRebind = webView.displayIfNeededCount
+        let redrawCountBeforeRebind = webView.setNeedsDisplayCount
         let enterInWindowCountBeforeRebind = webView.enterInWindowCount
         let endDeferringCountBeforeRebind = webView.endDeferringViewInWindowChangesCount
         let anchor2 = NSView(frame: anchorFrame)
         contentView.addSubview(anchor2)
         portal.bind(webView: webView, to: anchor2, visibleInUI: true)
         let enterInWindowCountAfterRebind = webView.enterInWindowCount
         let endDeferringCountAfterRebind = webView.endDeferringViewInWindowChangesCount
 
         XCTAssertTrue(webView.superview === slot, "Rebinding after transient anchor removal should reuse the existing portal slot")
         XCTAssertFalse(slot.isHidden)
         XCTAssertEqual(portal.debugEntryCount(), 1)
         XCTAssertGreaterThan(
-            webView.displayIfNeededCount,
-            displayCountBeforeRebind,
-            "Anchor rebinds should refresh hosted browser presentation even when geometry is unchanged"
+            webView.setNeedsDisplayCount,
+            redrawCountBeforeRebind,
+            "Anchor rebinds should invalidate hosted browser presentation even when geometry is unchanged"
+        )
+        XCTAssertEqual(
+            webView.displayIfNeededCount,
+            displayCountBeforeRebind,
+            "Anchor rebind must not synchronously flush WebKit display"
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmuxTests/BrowserPanelTests.swift` around lines 4336 - 4352, Update the
rebind assertions in the test around portal.bind and replace the
displayIfNeededCount increase requirement with the intended setNeedsDisplayCount
refresh invariant, matching the sibling workspace-rebind test. Keep the existing
superview, visibility, and entry-count assertions unchanged, and do not require
synchronous WebKit display flushing.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@cmuxTests/BrowserPanelTests.swift`:
- Around line 4336-4352: Update the rebind assertions in the test around
portal.bind and replace the displayIfNeededCount increase requirement with the
intended setNeedsDisplayCount refresh invariant, matching the sibling
workspace-rebind test. Keep the existing superview, visibility, and entry-count
assertions unchanged, and do not require synchronous WebKit display flushing.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 266c0129-088c-4ebe-a769-d164ebede07f

📥 Commits

Reviewing files that changed from the base of the PR and between 206b6f4 and f623959.

📒 Files selected for processing (6)
  • Sources/BrowserWindowPortal.swift
  • Sources/Panels/BrowserPanel+AutomationViewport.swift
  • Sources/Panels/BrowserPanel.swift
  • Sources/Panels/BrowserPanelView.swift
  • cmuxTests/BrowserPanelTests.swift
  • cmuxTests/BrowserPortalFirstRevealScrollTests.swift
💤 Files with no reviewable changes (2)
  • Sources/Panels/BrowserPanel+AutomationViewport.swift
  • cmuxTests/BrowserPortalFirstRevealScrollTests.swift

@coderabbitai coderabbitai 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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
cmuxTests/BrowserPanelTests.swift (1)

3497-3503: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Replace fixed-duration run-loop drains with deterministic completion.

These tests use advanceAnimations() to wait for deferred work; that helper waits a fixed 250 ms. In the display-count tests, the wait occurs before asserting that no synchronous flush happened, so normal deferred AppKit rendering can be misclassified as a synchronous portal flush. Capture synchronous counters immediately after the operation, then await a real completion signal or the existing one-main-turn helper for deferred assertions.

As per coding guidelines and path instructions, tests must avoid fixed wall-clock waits and use deterministic completion signals.

Also applies to: 3541-3569, 3571-3630, 3683-3707

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@cmuxTests/BrowserPanelTests.swift` around lines 3497 - 3503, Update the
display-count tests around anchor resizing and the related ranges to capture
conversion counters immediately after each operation, before any deferred-work
wait. Replace advanceAnimations() fixed-duration drains with a deterministic
completion signal or the existing one-main-turn helper, then perform deferred
assertions only after that completion.

Sources: Coding guidelines, Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@cmuxTests/BrowserPanelTests.swift`:
- Around line 3497-3503: Update the display-count tests around anchor resizing
and the related ranges to capture conversion counters immediately after each
operation, before any deferred-work wait. Replace advanceAnimations()
fixed-duration drains with a deterministic completion signal or the existing
one-main-turn helper, then perform deferred assertions only after that
completion.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 49233c61-7cf1-4604-ad3f-ff8f32c83f3a

📥 Commits

Reviewing files that changed from the base of the PR and between f623959 and 87afc2d.

📒 Files selected for processing (1)
  • cmuxTests/BrowserPanelTests.swift

@cursor

cursor Bot commented Jul 26, 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.

@usr-bin-roygbiv

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 27, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cursor

cursor Bot commented Jul 27, 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.

@usr-bin-roygbiv

Copy link
Copy Markdown
Contributor Author

@lawrencecchen, this browser rendering and teardown coalescing fix is ready for review when you have a chance.

@usr-bin-roygbiv
usr-bin-roygbiv force-pushed the feature/browser-rendering-performance branch 3 times, most recently from 632e033 to 1f74228 Compare July 28, 2026 20:47
@usr-bin-roygbiv
usr-bin-roygbiv force-pushed the feature/browser-rendering-performance branch from 4f6c06a to adba692 Compare July 28, 2026 22:00
@usr-bin-roygbiv

Copy link
Copy Markdown
Contributor Author

This work has moved to the Roy-owned nightly integration repository: https://github.com/usr-bin-roygbiv/cmux/pull/1

Closing this upstream PR so the nightly repository is the sole integration target.

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.

Browser panel drag/resize has inconsistent lag

1 participant