The WebKit cross-engine pointer/focus lane added for #10722 (opt-in webkit project in packages/app/playwright.ui-smoke.config.ts, PLAYWRIGHT_WEBKIT=1, Desktop Safari over the keyless chat pointer/focus/composer specs) was never actually executed anywhere — no workflow set the flag or installed the WebKit browser. Running it for real (locally, Playwright WebKit 1.61.1, stub stack) immediately surfaced real cross-engine divergences. Current tally after the first fix: 3 passed / 6 failed.
Fixed already (PR #11103): chat-overlay-controls-interactions "transcript text is selectable" — WebKit's getComputedStyle returns "" for unprefixed user-select (only -webkit-user-select reports); the spec now probes both and keeps the behavioral range-selection assert. The app itself is fine (Tailwind select-text emits both properties).
Remaining reds:
- All four
slash-commands.spec.ts tests (WebKit-only). composer.fill("/") never mounts slash-command-menu — the element is absent from the DOM entirely (screenshot shows the composer holding "/" with the app fully booted). Passes on Chromium. The menu mounts from useSlashMenu state (open = mode !== "none" && items.length > 0, items from useSlashCommandController's client.listCommands("gui") + filterCommandsForSurface). Since the transcript/stub API demonstrably works on WebKit in the same run, suspects are: the catalog fetch silently failing (.catch(() => []) swallows it — worth removing that silent default while debugging), filterCommandsForSurface gating on isAuthorized/isElevated state that hydrates differently, or a WebKit-specific difference in how fill() interacts with the draft-change plumbing. Needs runtime diagnosis with the catalog fetch observed.
conversation-management.spec.ts "message persists across a full page reload" (WebKit-only). Visibility timeout after reload — possibly WebKit page-lifecycle/bfcache interaction with the stub SSE stream.
chat-overlay-controls-interactions.spec.ts "long transcript scrolls" — NOT WebKit-specific. This fails on Chromium too, in isolation, at the current develop tip (ContinuousChatOverlay.tsx is byte-identical between develop and the PR branch): focusing chat-composer-textarea no longer flips the overlay to data-open="true". Whoever owns the overlay focus-to-open path should bisect this on develop — it looks like a real recent regression, hidden by CI's chronic queue.
CI wiring status: PR #11103 adds the lane to test.yml's zero-key browser job (installs WebKit, runs --project=webkit) as running-and-reporting (continue-on-error) so the reds above are visible on every PR without blocking unrelated work. Once 1-3 are fixed, flip the step to blocking by deleting continue-on-error — that's the whole remaining change.
Local repro: PLAYWRIGHT_WEBKIT=1 ELIZA_UI_SMOKE_FORCE_STUB=1 bun run --cwd packages/app test:e2e --project=webkit (needs bunx playwright install webkit).
The WebKit cross-engine pointer/focus lane added for #10722 (opt-in
webkitproject inpackages/app/playwright.ui-smoke.config.ts,PLAYWRIGHT_WEBKIT=1, Desktop Safari over the keyless chat pointer/focus/composer specs) was never actually executed anywhere — no workflow set the flag or installed the WebKit browser. Running it for real (locally, Playwright WebKit 1.61.1, stub stack) immediately surfaced real cross-engine divergences. Current tally after the first fix: 3 passed / 6 failed.Fixed already (PR #11103):
chat-overlay-controls-interactions"transcript text is selectable" — WebKit'sgetComputedStylereturns""for unprefixeduser-select(only-webkit-user-selectreports); the spec now probes both and keeps the behavioral range-selection assert. The app itself is fine (Tailwindselect-textemits both properties).Remaining reds:
slash-commands.spec.tstests (WebKit-only).composer.fill("/")never mountsslash-command-menu— the element is absent from the DOM entirely (screenshot shows the composer holding "/" with the app fully booted). Passes on Chromium. The menu mounts fromuseSlashMenustate (open = mode !== "none" && items.length > 0, items fromuseSlashCommandController'sclient.listCommands("gui")+filterCommandsForSurface). Since the transcript/stub API demonstrably works on WebKit in the same run, suspects are: the catalog fetch silently failing (.catch(() => [])swallows it — worth removing that silent default while debugging),filterCommandsForSurfacegating onisAuthorized/isElevatedstate that hydrates differently, or a WebKit-specific difference in howfill()interacts with the draft-change plumbing. Needs runtime diagnosis with the catalog fetch observed.conversation-management.spec.ts"message persists across a full page reload" (WebKit-only). Visibility timeout after reload — possibly WebKit page-lifecycle/bfcache interaction with the stub SSE stream.chat-overlay-controls-interactions.spec.ts"long transcript scrolls" — NOT WebKit-specific. This fails on Chromium too, in isolation, at the current develop tip (ContinuousChatOverlay.tsxis byte-identical between develop and the PR branch): focusingchat-composer-textareano longer flips the overlay todata-open="true". Whoever owns the overlay focus-to-open path should bisect this on develop — it looks like a real recent regression, hidden by CI's chronic queue.CI wiring status: PR #11103 adds the lane to
test.yml's zero-key browser job (installs WebKit, runs--project=webkit) as running-and-reporting (continue-on-error) so the reds above are visible on every PR without blocking unrelated work. Once 1-3 are fixed, flip the step to blocking by deletingcontinue-on-error— that's the whole remaining change.Local repro:
PLAYWRIGHT_WEBKIT=1 ELIZA_UI_SMOKE_FORCE_STUB=1 bun run --cwd packages/app test:e2e --project=webkit(needsbunx playwright install webkit).