Summary
Six e2e specs reliably fail on GitHub Actions runners but pass cleanly on the Jetson worktree (verified 7-18s per test in isolation, even with 3 parallel workers). Bumping per-test timeout to 60s and action/expect timeouts to 15s did not fix the issue.
Affected specs
e2e/browser-vnc.spec.ts — "browser app installs chromium..."
e2e/desktop-selection.spec.ts — "desktop background context menu can launch the terminal"
e2e/installed-app-settings.spec.ts — "installed app settings can save configuration..."
e2e/mascot-context.spec.ts — "mascot tap opens the chat popup"
e2e/terminal-reconnect.spec.ts — "terminal can open and connect to the websocket backend"
e2e/clawkeep-interactions.spec.ts — "unpair flow opens the confirm dialog..."
All six are currently test.fixme(...) with a comment pointing back to PR #113.
Failure shape
Each fails at the first user action with a timeout — getByRole('button', { name: ... }).click() or similar — even though the parent locator (getByTestId('app-launcher'), chrome-window-clawkeep, etc.) resolved fine. The tests can see the desktop / window mounted, just can't interact with what's inside.
Investigation done
.scratch/investigate-failing-tests.sh runs the 5 originally-flaky specs in a fresh git worktree on the Jetson with bunx playwright test --grep-invert fixme. All 5 pass in ~17.8s with 3 parallel workers.
- Bumping
actionTimeout 5s → 15s, navigationTimeout to 30s, timeout (per-test) 30s → 60s, and expect.timeout to 15s did not change the failure pattern on GH Actions.
- Total e2e job runtime stays 5-7 minutes on GH Actions vs ~1.6 minutes when the failing tests are skipped.
Likely causes
- Runner memory/CPU pressure with
bun run dev under sequential workers:1
- Different chromium build / display server setup on GH runner vs Jetson
- Possible font-rendering or accessibility-tree differences affecting
getByRole matching
Suggested next steps
- Reproduce on a self-hosted GH runner with the same image as Jetson, isolate which environmental variable matters.
- Try sharding (
workers: 2) or splitting e2e into multiple jobs to spread the dev-server load.
- Consider switching e2e to a production build (
bun run start) instead of bun run dev so Turbopack doesn't recompile on demand under each test.
Summary
Six e2e specs reliably fail on GitHub Actions runners but pass cleanly on the Jetson worktree (verified 7-18s per test in isolation, even with 3 parallel workers). Bumping per-test timeout to 60s and action/expect timeouts to 15s did not fix the issue.
Affected specs
e2e/browser-vnc.spec.ts— "browser app installs chromium..."e2e/desktop-selection.spec.ts— "desktop background context menu can launch the terminal"e2e/installed-app-settings.spec.ts— "installed app settings can save configuration..."e2e/mascot-context.spec.ts— "mascot tap opens the chat popup"e2e/terminal-reconnect.spec.ts— "terminal can open and connect to the websocket backend"e2e/clawkeep-interactions.spec.ts— "unpair flow opens the confirm dialog..."All six are currently
test.fixme(...)with a comment pointing back to PR #113.Failure shape
Each fails at the first user action with a timeout —
getByRole('button', { name: ... }).click()or similar — even though the parent locator (getByTestId('app-launcher'),chrome-window-clawkeep, etc.) resolved fine. The tests can see the desktop / window mounted, just can't interact with what's inside.Investigation done
.scratch/investigate-failing-tests.shruns the 5 originally-flaky specs in a fresh git worktree on the Jetson withbunx playwright test --grep-invert fixme. All 5 pass in ~17.8s with 3 parallel workers.actionTimeout5s → 15s,navigationTimeoutto 30s,timeout(per-test) 30s → 60s, andexpect.timeoutto 15s did not change the failure pattern on GH Actions.Likely causes
bun run devunder sequentialworkers:1getByRolematchingSuggested next steps
workers: 2) or splitting e2e into multiple jobs to spread the dev-server load.bun run start) instead ofbun run devso Turbopack doesn't recompile on demand under each test.