Skip to content

ci: add a macOS desktop e2e lane - #3137

Open
1625567290 wants to merge 2 commits into
apache:mainfrom
1625567290:ci/macos-desktop-e2e
Open

ci: add a macOS desktop e2e lane#3137
1625567290 wants to merge 2 commits into
apache:mainfrom
1625567290:ci/macos-desktop-e2e

Conversation

@1625567290

Copy link
Copy Markdown
Contributor

Summary

Desktop e2e only ran on Linux xvfb, so macOS overlay-scrollbar hit testing and App Nap compositor throttling could not fail a PR. This adds a macos-15 sibling of the existing e2e job.

The Linux job name is unchanged so the required check stays intact. Isolated CI displays (xvfb and GitHub macOS runners) show the fixture window; local machines stay hidden.

Fixes #2342

Test plan

  • Official desktop e2e on macOS: 26 passed, 1 skipped
  • Alignment audit: all fixtures clean
  • isCiIsolatedDisplay covers Linux CI, macOS CI, and local Darwin

@coderabbitai

coderabbitai Bot commented Aug 17, 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

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 73c58ec4-acb0-40d3-bcc5-fc5bcc25dd88

📥 Commits

Reviewing files that changed from the base of the PR and between 5f3c942 and e7cfa3e.

📒 Files selected for processing (1)
  • apps/desktop/e2e/prompt-rail.spec.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/desktop/e2e/prompt-rail.spec.ts

Included review availability: Your plan includes up to 3 reviews per rolling hour; 1 remains after this review.


📝 Walkthrough

Summary

This PR adds a macOS 15 desktop E2E lane. It uses the existing shard configuration and preserves the Linux e2e job name. This enables coverage for macOS renderer behavior that Linux Xvfb cannot reproduce, including overlay-scrollbar hit testing, post-scroll hit timing, and background-window compositor throttling.

The PR extends the existing E2E path. It does not create a separate fixture or test framework. isCiIsolatedDisplay centralizes display detection for Linux CI, macOS CI, and local Darwin. Fixture windows remain hidden locally and become visible on isolated CI displays.

The solution is coherent and small. The new macOS lane is required for platform coverage. The scrolling helper and updated hit-testing diagnostics address macOS-specific window restoration and virtualized transcript timing. No deletion is evident without reducing regression coverage. Some test diagnostics could be simplified later if they prove unnecessary after the macOS lane stabilizes.

Validation

  • The reported test plan passed 26 macOS desktop E2E tests.
  • One macOS desktop E2E test was skipped.
  • The reported plan confirmed fixture alignment.
  • The reported plan covered isCiIsolatedDisplay for Linux CI, macOS CI, and local Darwin.
  • The alignment audit runs in the macOS lane.
  • Required check status is unverified from the available evidence.

Review-relevant risks

  • The PR changes CI workflow permissions and checkout credential persistence. These are governance and security-relevant changes. Material changes in these areas require independent human review under repository policy.
  • The PR changes prompt-rail offsets from 12px/15px to 48px/51px. This can affect user-visible prompt-rail placement and macOS scrollbar hit behavior. Material changes in user-visible behavior require independent human review under repository policy.
  • The PR changes desktop E2E scrolling and click behavior. These changes can affect regression detection and test reliability. Material changes to release-quality validation require independent human review under repository policy.
  • The person performing the merge must review the final diff. A maintainer makes the final determination.

Walkthrough

The pull request adds a macOS desktop E2E lane, broadens isolated-display handling to macOS, tightens CI checkout permissions, reserves prompt-rail space for overlay scrollbars, and improves prompt-rail and slash-command E2E synchronization.

Changes

macOS E2E and CI display support

Layer / File(s) Summary
Isolated CI display detection
scripts/fixture-env.mjs
Adds isCiIsolatedDisplay for Linux and macOS and accepts only explicit truthy CI values.
Fixture visibility integration
apps/desktop/e2e/fixtures.ts, scripts/fixture-window.mjs, apps/desktop/e2e/playwright.config.ts
Fixtures and Electron windows use isolated-display detection. Documentation describes Linux isolated displays and visible macOS windows.
macOS E2E workflow and CI permissions
.github/workflows/ci.yml
Adds read-only contents access, disables persisted checkout credentials, and runs macOS 15 E2E tests with Electron caching and alignment auditing.
Prompt rail layout and E2E synchronization
apps/desktop/src/renderer/styles/prompt-rail.css, apps/desktop/e2e/prompt-rail.spec.ts
Moves the rail 48px from the right edge and improves scrolling, direct activation, hit testing, and diagnostics in prompt-rail tests.
Slash-command menu synchronization
apps/desktop/e2e/slash-command-menu.spec.ts
Focuses the remounted composer and types / before validating command-menu entries.

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

Merge Risk: 🔵 Low · up to e7cfa

The PR adds macOS desktop end-to-end coverage, but a revised relay lifecycle timeout may allow regressions in the 10ms fallback deadline to pass undetected. The change is otherwise mergeable with explicit owner awareness and follow-up on that test guard.

Sequence Diagram(s)

sequenceDiagram
  participant CI as GitHub Actions
  participant Playwright
  participant Electron
  CI->>Playwright: Run desktop E2E tests on macOS 15
  Playwright->>Electron: Launch visible fixture windows
  Electron-->>Playwright: Render prompt rail and composer
  Playwright-->>CI: Report E2E results
  CI->>CI: Run alignment audit
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Ai Use Disclosure ⚠️ Warning The PR description selects neither required AI-use declaration. The eight introduced commit messages also contain no valid Generated-by trailer. Add one explicit declaration. If generative tooling made a substantive contribution, name the tool and scope, add trailers to affected commits, and ensure they survive squash/amend. See “Human ownership and AI attribution” in CONTRIBUTIN...
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the primary change: adding a macOS desktop E2E lane.
Description check ✅ Passed The description explains the change, links issue #2342, and reports verification results, although it omits the template checklist and AI-use sections.
Linked Issues check ✅ Passed The changes add the requested macOS E2E lane, preserve the Linux check, and address macOS display, scrolling, and compositor behavior described in issue #2342.
Out of Scope Changes check ✅ Passed The workflow, fixture handling, E2E updates, and prompt-rail adjustments support the linked issue objectives and do not show unrelated changes.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

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

Actionable comments posted: 2


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: ff3a97dc-ecaf-49cf-b569-3206d4d82ba6

📥 Commits

Reviewing files that changed from the base of the PR and between 4e8629c and 1030c8c.

📒 Files selected for processing (5)
  • .github/workflows/ci.yml
  • apps/desktop/e2e/fixtures.ts
  • apps/desktop/e2e/playwright.config.ts
  • scripts/fixture-env.mjs
  • scripts/fixture-window.mjs

Included review availability: Your plan includes up to 3 reviews per rolling hour; 1 remains after this review.

Comment thread .github/workflows/ci.yml
Comment thread scripts/fixture-env.mjs

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/desktop/src/renderer/styles/chat-header.css (1)

159-162: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Do not rely on scrollbar-gutter: stable for overlay scrollbars.

The CSS Overflow specification defines stable for classic scrollbars. Overlay scrollbars do not create a gutter. (w3.org) This declaration therefore cannot provide the stated macOS guarantee. Verify that .maka-chat-layout is the actual [data-chat-scroll-container="true"] element. If it is not, the rule is inert. Since prompt-rail.css already applies an explicit 48px offset, remove this rule unless classic-scrollbar stability on this exact scroll box is a separate requirement.

Sources: Path instructions, MCP tools


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 868001b8-cc67-4d25-966d-f8d405bec20b

📥 Commits

Reviewing files that changed from the base of the PR and between fbb9c24 and 97335a7.

📒 Files selected for processing (3)
  • apps/desktop/e2e/prompt-rail.spec.ts
  • apps/desktop/src/renderer/styles/chat-header.css
  • apps/desktop/src/renderer/styles/prompt-rail.css

Included review availability: Your plan includes up to 3 reviews per rolling hour; 0 remain after this review.

Comment thread apps/desktop/e2e/prompt-rail.spec.ts

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

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 561c6bc7-ce31-4fff-8cd6-e688c98d6d12

📥 Commits

Reviewing files that changed from the base of the PR and between 97335a7 and 5f3c942.

📒 Files selected for processing (3)
  • apps/desktop/e2e/prompt-rail.spec.ts
  • apps/desktop/e2e/slash-command-menu.spec.ts
  • packages/eval/harbor/test_relay_lifecycle.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/desktop/e2e/prompt-rail.spec.ts

Included review availability: Your plan includes up to 3 reviews per rolling hour; 2 remain after this review.

Comment thread packages/eval/harbor/test_relay_lifecycle.py Outdated

Copilot AI left a comment

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.

Pull request overview

This PR extends the desktop end-to-end CI surface to include macOS runners so platform-specific renderer/compositor behaviors (overlay scrollbars, App Nap throttling, post-scroll hit-testing) can fail PRs before merge, while preserving the existing Linux e2e job name to keep required checks stable.

Changes:

  • Add a new e2e_macos GitHub Actions job (macos-15) alongside the existing Linux xvfb e2e lane.
  • Generalize “CI display must be visible” detection from Linux-only (isCiLinuxDisplay) to cross-platform (isCiIsolatedDisplay), and update fixture launch behavior accordingly.
  • Harden prompt-rail styling and e2e tests against macOS-specific hit-testing/scrolling/titlebar overlay behaviors; reduce a slash-command menu flake by ensuring composer focus before typing.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
scripts/fixture-window.mjs Switches to isCiIsolatedDisplay() to decide when the fixture window must be visible on CI.
scripts/fixture-env.mjs Adds cross-platform CI-display detection and fixes CI flag parsing (CI=false no longer treated as truthy).
apps/desktop/src/renderer/styles/prompt-rail.css Moves prompt-rail away from macOS overlay scrollbar hit regions to prevent dead-band clicks.
apps/desktop/e2e/slash-command-menu.spec.ts Stabilizes slash-command triggering by refocusing the composer before typing /.
apps/desktop/e2e/prompt-rail.spec.ts Improves macOS-visible-window robustness for scroll mounting and hit-testing assertions.
apps/desktop/e2e/playwright.config.ts Updates documentation comment to reflect macOS CI compositor behavior.
apps/desktop/e2e/fixtures.ts Uses isCiIsolatedDisplay() so macOS CI runs with a visible Electron window when needed.
.github/workflows/ci.yml Adds e2e_macos lane and hardens checkout by disabling persisted credentials; sets minimal contents: read permissions.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread scripts/fixture-env.mjs

Copilot AI left a comment

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.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated no new comments.

Suppressed comments (1)

apps/desktop/src/renderer/styles/prompt-rail.css:53

  • The comment says “GitHub's macos-15 image uses Always”, but the new macOS CI lane explicitly sets AppleShowScrollBars to WhenScrolling. This inconsistency makes it unclear which scrollbar mode the 48px offset is primarily targeting (and can mislead future debugging if CI behavior changes).
     sailed through CI green. The overlay dead band is 14px when the bar
     appears only while scrolling, and ~16px when the system shows scroll
     bars Always — GitHub's macos-15 image uses Always, and a visible
     Electron window can stack a native overlay on the webview's own bar.
     Rest the rail at `space-8 + space-4` (48px), clear of that stack, and

@Astro-Han Astro-Han left a comment

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.

Adding a dedicated macOS lane is the right way to validate an OS-specific compositor/overlay problem, and the fixture isolation is thoughtfully scoped. One test seam still defeats that goal: the critical jump assertions bypass the native pointer path, while the test itself records that the first tick is hidden by the titlebar.

The first-principles split is simpler: prove user reachability with one real pointer interaction on a visible tick and assert its destination; test jump/auto-follow state transitions separately at the logic boundary. That removes the synthetic-click exception and makes each test responsible for exactly one claim.

Review performed with Codex reviewer agents and DeepSeek V4 Flash as advisory tools; I verified this finding against the latest head and live CI state.

中文评论

增加独立 macOS lane 是验证特定系统 compositor/overlay 问题的正确方向,fixture 隔离也很克制。但关键跳转断言绕过了原生 pointer path,而测试本身又明确记录首个 tick 被 titlebar 覆盖,因此当前测试不能证明真实用户交互可达。

更符合第一性原理的最小方案是:用一次真实 pointer 交互点击可见 tick 并断言落点,单独在逻辑边界验证 jump/auto-follow 状态变化。这样可以删掉 synthetic click 例外,每个测试只证明一个事实。

本次审查使用了 Codex reviewer agents 与 DeepSeek V4 Flash 作为辅助工具;我已依据最新 head 和实时 CI 状态复核该问题。

Comment thread apps/desktop/e2e/prompt-rail.spec.ts Outdated
@Astro-Han

Copy link
Copy Markdown
Contributor

/agentic_review

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Action required

1. macOS failure is nonblocking 🐞 Bug ≡ Correctness
Description
The new e2e_macos job is independent of the unchanged required e2e check, so Linux can pass and
permit merging while the macOS lane fails. This defeats the PR's goal of making macOS-specific
failures block a PR.
Code

.github/workflows/ci.yml[R235-238]

+  e2e_macos:
+    needs: changes
+    if: needs.changes.outputs.e2e == 'true'
+    runs-on: macos-15
Relevance

●●● Strong

Recent workflow reviews accept fixes ensuring platform-specific or filtered checks cannot bypass
required validation.

PR-#2961
PR-#3192

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The existing e2e job depends only on changes, while the added macOS job is a separate sibling
that also depends only on changes; neither consumes the other's result. The workflow comment
explicitly preserves the Linux job as the required check, and GitHub documents that configured
required status checks are what must succeed to permit merging.

.github/workflows/ci.yml[202-238]
.github/workflows/ci.yml[243-262]
🌐 GitHub states that required status checks must complete successfully to satisfy protected-branch merge requirements.

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new macOS E2E job does not feed into the existing required `e2e` status, so a macOS failure does not necessarily block merging.

## Issue Context
Reuse the existing required-check name as the single authority rather than requiring `e2e_macos` separately in branch protection. Because Linux and macOS require different runners, consolidating execution into one job is impossible; a small aggregator job retaining the `e2e` name is the unavoidable additional job/runner burden.

## Fix Focus Areas
- .github/workflows/ci.yml[202-262]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Titlebar blocks first tick 🐞 Bug ≡ Correctness
Description
The changed test acknowledges that the first prompt-rail tick is under the macOS titlebar and
replaces a real pointer click with HTMLElement.click(). The suite therefore passes while users
cannot physically activate the earliest prompt through that tick.
Code

apps/desktop/e2e/prompt-rail.spec.ts[R255-258]

+  await page.locator('.maka-prompt-rail-tick').first().evaluate((tick) => {
+    if (!(tick instanceof HTMLElement)) throw new Error('the first prompt-rail tick is missing');
+    tick.click();
+  });
Relevance

●●● Strong

Recent desktop reviews accept titlebar-safe-area and E2E hit-testing corrections; synthetic clicks
can mask a real interaction failure.

PR-#3160
PR-#3171

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The added comments state that a pointer click on the first tick lands on layout content rather than
the tick, and the new code invokes the handler synthetically instead. The rail controls are genuine
buttons whose pointer-driven onClick performs navigation, while the BrowserWindow uses a macOS
hiddenInset titlebar overlay and the rail's vertical sizing does not account for that overlay
clearance.

apps/desktop/e2e/prompt-rail.spec.ts[207-224]
apps/desktop/e2e/prompt-rail.spec.ts[246-258]
packages/ui/src/prompt-anchor-rail.tsx[519-538]
apps/desktop/src/main/main-window.ts[273-299]
apps/desktop/src/renderer/styles/prompt-rail.css[58-62]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The first prompt-rail tick remains occluded by the macOS titlebar, and the E2E now bypasses the defect with a synthetic DOM click.

## Issue Context
Correct the rail's vertical safe area using the existing titlebar-clearance seam, then retain a real Playwright pointer click. Reusing the existing clearance is preferable to adding a new platform flag, geometry authority, or synthetic interaction path; apply the same real-click behavior to both changed tests.

## Fix Focus Areas
- apps/desktop/e2e/prompt-rail.spec.ts[207-258]
- apps/desktop/e2e/prompt-rail.spec.ts[309-312]
- apps/desktop/src/renderer/styles/prompt-rail.css[58-62]
- apps/desktop/src/renderer/styles/shell-layout.css[102-116]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Web pages:
  +2 more
Review mode: ⚖️ Balanced: This changes CI execution, cross-platform fixture-window behavior, and interaction/layout tests across several files, creating real but reviewable correctness and maintenance risk in one careful pass.

Grey Divider

Tip of the day
💡 Did you know, you can keep summaries lean with Finding overflow, which tucks the rest behind 'View more'

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread .github/workflows/ci.yml
Comment thread apps/desktop/e2e/prompt-rail.spec.ts Outdated
@Astro-Han

Copy link
Copy Markdown
Contributor

This PR also changes the visible prompt-rail position on macOS to avoid overlay scrollbar and titlebar hit regions. Could you please add a screenshot of the resulting prompt rail in the Desktop UI, ideally with the macOS overlay scrollbar visible? A before/after comparison is welcome, but one clearly annotated result is sufficient. Thanks!

Posted by Codex on behalf of Astro-Han.

@1625567290
1625567290 force-pushed the ci/macos-desktop-e2e branch from bc64b35 to cebe9c5 Compare August 23, 2026 03:08
@1625567290

Copy link
Copy Markdown
Contributor Author

Rebased onto current main and force-updated the branch to cebe9c511. GitHub now reports the PR as mergeable.

Here is the requested macOS result with the native overlay scrollbar visible at the far right. The prompt rail is inset from that hit region and its first-to-last tick column stays below the titlebar clearance:

macOS prompt rail with overlay scrollbar

The rebased implementation restores normal Playwright pointer clicks for the first tick and verifies the complete painted rail column instead of trimming the titlebar-covered prefix. Local validation on the new head: prompt-rail E2E 7/7, the previously failing titlebar workbar scenario 1/1, Desktop build and typecheck, CI contract tests 29/29, helper tests 61/61, lint, format, ASF headers, and diff checks.

The new CI run is currently action_required, so it needs maintainer approval before the macOS lane can execute.

@1625567290
1625567290 force-pushed the ci/macos-desktop-e2e branch from cebe9c5 to 217df6e Compare August 23, 2026 06:23
@1625567290

Copy link
Copy Markdown
Contributor Author

@Astro-Han Fixed the two failures from the current macOS run in 217df6e69 after rebasing onto main@6ada6b546.

  • The prompt-rail hit-test now polls until ResizeObserver-published geometry has converged, while still failing if any titlebar-covered or between-tick gap remains.
  • The workbar safe-area test now normalizes the native caption inset to 0px before applying its simulated 80px override; the previous assertion incorrectly assumed every macOS runner started at zero, while the failed runner already exposed about 10px.

Local macOS verification:

  • both previously failing scenarios: 2/2 in normal mode and 2/2 with CI=true
  • complete visible-window suite: the two targeted scenarios passed; 51 passed and 1 skipped overall, with three unrelated current-main failures in unchanged Skills/settings tests
  • Desktop typecheck, CI/helper contracts (29/29), lint, format, ASF headers, and diff checks passed

The updated-head workflow is awaiting creation/approval; please approve it when GitHub exposes the run.

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.

ci: add a macOS e2e lane so platform-specific renderer regressions cannot sail through green

3 participants