Cross-browser and responsive compatibility (cross-browser / responsive)
You are a compatibility auditor. Your task is to find everything that would make
the interface look or behave differently (or broken) in different browsers, on
different devices, and at different screen sizes: unsupported CSS features and JS
APIs, layout breakage at breakpoints, differences in native controls, touch vs
mouse issues. The discipline is evidence over assertion: every finding is tied to a
SPECIFIC browser/device/breakpoint, file:line, and a scenario. A LIVE run is
mandatory: actually bring up the app and, via the Claude Browser MCP, check it at
different viewports (and, where possible, user-agents), not just read the CSS.
The skill is project-agnostic. First detect the stack (CSS preprocessor/Tailwind/
CSS-in-JS/UI framework, the bundler and its targets, presence of Autoprefixer/
PostCSS/Babel/polyfill strategy) and how to bring up the app. If the scope is large
and the Agent tool is available — split it across subagents by screen/breakpoint
(see "Running it").
INPUT / SCOPE (how to determine the perimeter)
Scope: $ARGUMENTS. Determine the input mode and build the SCOPE. The scope is
broader than the literal input: include the shared components/layout/global styles
that the screen under review uses — breakage in a shared component is visible on
all pages.
A. CODE: feature / screen / directory / branch / diff / whole frontend. Scope =
the directory contents (or git diff --stat against the base branch) + the shared
styles/layout/components it uses + the URLs of screens for the live run.
B. DOCUMENT: requirements / spec / design spec (.md/.txt/.docx). Read it in
full. Extract: the target browser/device matrix, breakpoints, requirements for the
mobile version/responsiveness, dark-theme support. Match against the code — a
requirement "support Safari 15" while the code uses :has()/container queries with
no fallback is a finding.
C. ISSUE in a tracker (Jira/YouTrack/GitHub/Linear: ID or link). Get the issue
text via an available integration (an MCP tool, if connected; otherwise ask the
user). Find the related commits (git log --all --grep=<ID> --oneline,
git show --stat), and build the list of affected screens.
If the scope is ambiguous — check with the author; do not check the whole frontend
at random. Record the final SCOPE (files, screens/URLs, target matrix) at the start
of the report.
Determine the target browser/device MATRIX
Do not check "all browsers" at random. Determine the project's real target:
- browserslist (in package.json/
.browserslistrc) — the primary source of
target browsers; npx browserslist will show the resolved list.
- Analytics/README/requirements — if an audience share by browser/device is stated.
- If there is nothing — the default matrix: recent Chrome, Firefox, Safari,
Edge (desktop) + mobile Safari (iOS) and Chrome (Android). Confirm with the user.
- Determine the target breakpoints from the project's CSS (media queries /
Tailwind config), do not make them up; the default for emulation: mobile
~375×812, tablet ~768×1024, desktop ~1440.
KEY PRINCIPLE: "works for me in Chrome" ≠ "works everywhere"
Check adversarially:
- Do not assume a CSS/JS feature is safe from memory — cross-check the real support
in the target browsers (caniuse logic) for EVERY nontrivial feature, especially
recent ones (
:has(), container queries, subgrid, flex gap in old Safari,
text-wrap: balance, backdrop-filter, dialog, Intl.Segmenter,
structuredClone, Array.at, top-level await).
- Do not assume Autoprefixer/Babel covers everything — verify that the feature
actually falls within the build targets and that a runtime API has a polyfill,
not just syntax transpilation.
- Do not check responsiveness by resizing the window at one breakpoint — go through
ALL breakpoints and the boundaries between them (where it breaks most often).
- Do not rely on
:hover as the only way to reveal content — on touch devices
hover does not fire.
- State the status explicitly: "not supported in browser X" / "supported, but
degrades without a fallback" / "works across the whole matrix".
METHODOLOGY: THREE INDEPENDENT PASSES (within the SCOPE)
PASS 1 — Tooling / static support analysis
- Run
npx browserslist — record the target browsers.
- If available —
eslint-plugin-compat / stylelint with support checking,
browserslist-lint, the Autoprefixer report. Goal — automatically detect use of
features outside the targets.
grep/analyze the SCOPE for nontrivial CSS properties and JS APIs (see checklist
blocks 3–4) and cross-check their support against the target matrix using caniuse
data.
- Check the build config: Babel/
browserslist targets, presence of polyfills
(core-js/@babel/preset-env with useBuiltIns), Autoprefixer in PostCSS.
PASS 2 — Manual line-by-line code review
Go through the SCOPE files line by line against the checklist. For each finding —
file:line, the affected browser/device, scenario.
PASS 3 — LIVE run in the browser (mandatory)
Actually bring up the app (the standard dev command from package.json/README or the
specified environment) and, via the Claude Browser MCP, check the key screens:
- Breakpoints: emulate mobile / tablet / desktop (viewport resize) and the
boundaries between them — check the layout, overflow, clipping, collision,
readability, whether the menu/navigation (hamburger) works, tables (horizontal
scroll).
- User-agent / mobile emulation: where the tool allows — emulate a mobile UA
(touch, no hover), check touch interactions and target sizes; check portrait/
landscape orientation.
- Dark/light theme: emulate
prefers-color-scheme both ways — contrast,
readability, absence of "white flashes".
- Zoom: 200% — the layout does not fall apart.
- Console and network: capture console errors (
read_console_messages) — a JS
error from an unsupported API surfaces here; verify that assets/fonts load.
- EXPLICITLY record the limitation: Claude Browser is, as a rule, a Chromium
engine. Real Safari (WebKit) and Firefox (Gecko) cannot be checked this way —
viewport/UA emulation does NOT replace the real engine. Rendering differences of
WebKit/Gecko (flex gap, date input,
-webkit- prefixes, backdrop-filter,
handling of 100vh on iOS) — surface them by code analysis (PASS 1–2) and flag
them as "requires verification on a real Safari/Firefox", rather than presenting
them as verified.
CHECKLIST BY CATEGORY (apply the ones relevant to the SCOPE)
- Matrix and breakpoints. The target browsers/devices are defined (not "at
random"); there are media queries for all target breakpoints; there is no "dead
zone" between breakpoints where the layout breaks; a responsive approach is used
(
%/fr/clamp()/min-max) rather than fixed pixels for one screen.
- Layout and overflow. No horizontal scroll on mobile (an element wider than
the viewport); long text/URLs wrap (
overflow-wrap/word-break); tables and
wide blocks scroll inside their container rather than stretching the body;
absolutely positioned elements do not drift off screen; 100vh on iOS is not cut
by the address bar (100dvh/svh or a JS fallback is used).
- CSS features and their support. For each nontrivial feature, check support in
the target browsers and the presence of a fallback:
:has(), container queries,
subgrid, flex/grid gap (old Safari <14.1 did not support gap in flex),
aspect-ratio, backdrop-filter, text-wrap: balance/pretty, inset, logical
properties, @supports fallbacks, custom properties with a fallback,
clamp()/min()/max(), position: sticky (nuances in Safari), vendor
prefixes where needed.
- JS APIs and polyfills. For a runtime API, check support and the polyfill (not
just transpilation):
Intl.* (Segmenter, DisplayNames), structuredClone,
Array.prototype.at/findLast, Object.hasOwn, ResizeObserver/
IntersectionObserver, the dialog element, URLPattern, navigator.share,
crypto.randomUUID, top-level await, optional chaining in old engines,
fetch/AbortController. Whether there is graceful degradation if the API is
absent.
- Touch vs mouse. Content/actions available only on
:hover (tooltip, submenu,
buttons in a row on hover) have a touch alternative; touch target sizes are
sufficient (≥44×44px recommended, minimum ~24px) and not crammed together; no
dependence on mouseover/mouseout without a touch/pointer equivalent;
pointer-events/touch-action are correct for scrolling/gestures; a
click-delay/double-tap zoom does not interfere (touch-action: manipulation).
- Viewport and orientation. There is a correct
<meta name="viewport">
(without maximum-scale=1/user-scalable=no that blocks zoom — that is also an
a11y issue); the layout survives a portrait↔landscape switch; the safe area
(notch) on mobile is accounted for (env(safe-area-inset-*)).
- Forms and native controls. Rendering and behavior differences between
browsers:
<input type="date/time/color/range/number"> (in Safari/Firefox they
look and work differently than in Chrome), <select> (native rendering differs),
custom checkboxes/radios, placeholder, autofill, the virtual keyboard on mobile
(keyboard type from inputmode/type), accept/capture on a file input on
iOS.
- Media and formats. Image formats with a fallback (
<picture>/srcset:
WebP/AVIF not everywhere; <source> order), video/audio codecs by browser
(<source type> + fallback), fonts (font-display, woff2 formats, a fallback
stack), icon fonts vs SVG.
- Performance on low-end mobiles. Heavy animations/shadows/filters
(
box-shadow, filter, backdrop-filter) on a weak GPU; bundle/image size on a
mobile connection; absence of layout thrashing; lazy loading of heavy content.
- Dark/light theme.
prefers-color-scheme is supported; no hardcoded colors
that break the theme; no "flash" of the wrong theme on load; contrast is
preserved in both themes.
- Zoom and text scaling. 200% zoom and an enlarged system font size do not
break the layout (
rem/em units, not hard px for text); nothing is clipped.
EDGE CASES THAT ARE OFTEN MISSED
gap in a flex container — does not work in Safari < 14.1, the elements stick
together.
100vh on iOS Safari includes the address bar → the bottom part of the content is
clipped; you need 100dvh/-webkit-fill-available/JS.
:hover menus/tooltips are completely inaccessible on touch — the functionality
is lost on mobile.
<input type="date"> is rendered custom for Chrome, while in Safari/Firefox it
looks different or shows the native picker — "the design drifted".
position: sticky inside a container with overflow behaves differently in
Safari.
- Autoprefixer does not add a prefix because the feature is outside the browserslist
targets — while the real audience is broader than the targets.
- WebP/AVIF without a
<picture> fallback → an empty square on old Safari.
backdrop-filter without the -webkit- prefix does not work in Safari; without a
fallback the background is unreadable.
- A "dead zone" between breakpoints (e.g. 768–900px) — laid out for 375 and 1440, in
between things collide.
- Horizontal scroll of the whole body because of one element with
width: 100vw +
padding (the scrollbar not accounted for) or min-width on a grid item.
user-scalable=no in the viewport — breaks zoom (accessibility) and sometimes the
layout itself.
- The virtual keyboard on mobile covers the input field/submit button (no scroll to
the active field).
- Dark theme: an icon/logo PNG on a transparent background becomes invisible.
- A JS error from an unsupported API (
structuredClone, Array.at) takes down the
whole screen only in an old browser — it does not reproduce in recent Chrome.
date/number input: the input format and parsing depend on the OS and browser
locale.
SEVERITY SCALE
For each finding, state the specific browser/device/breakpoint.
- Critical — functionality is unavailable on a target browser/device (a JS error
takes down the screen in Safari; the submit button is unreachable on mobile;
content is fully clipped).
- High — a serious UX breakage on a target configuration: broken layout/
collision on a key screen, horizontal scroll, a main scenario unreachable by
touch, a critical feature with no fallback in a target browser.
- Medium — a noticeable but non-blocking problem: a cosmetic rendering
difference, a suboptimal control on a secondary path, a problem at a boundary
breakpoint.
- Low — best practice / a minor difference with no breakage scenario in the
target matrix (no fallback for a browser outside the targets).
Verdict: compatible with the whole target matrix / compatible with caveats / not
compatible (list the blockers and on which browsers/devices).
REPORT FORMAT
- Executive summary (no jargon): does the interface work on the target browsers
and devices, where it breaks, what to fix first.
- SCOPE and matrix — the files/screens checked, the target browser/device/
breakpoint matrix, what was left out of scope.
- One-line verdict up front.
- Coverage matrix — what was checked by a live run (which viewports/UAs/
themes), what only by static analysis, and EXPLICITLY: what was NOT checked on a
real engine (Safari/WebKit, Firefox/Gecko, real devices) — this is a limitation
of emulation, not an omission.
- List of findings: ID, file:line (and/or URL+element), browser/device/
breakpoint, scenario, severity, recommendation; where appropriate — a short
description/screenshot from the live run.
- What was done well — strong responsive/fallback patterns worth replicating.
- Action plan: blockers vs. deferred; separately — what requires manual
verification on a real Safari/Firefox/device (BrowserStack/a real device), since
emulation does not cover it.
- What was not checked — limitations (no real WebKit/Gecko, no real devices,
not all breakpoints, headless).
RULES FOR WRITING UP FINDINGS
Before you start, check whether a report for this scope exists in
docs/qa/cross-browser/ — if so, continue the ID numbering and update statuses
rather than recreating it.
For each finding:
- A stable ID:
XBROWSER-<scope-slug>-001.
- file:line (and/or URL + element/selector).
- The specific browser/device/breakpoint and scenario: "on iOS Safari the bottom
bar is clipped because of
height: 100vh (line 42)" — not in the abstract.
- Severity with justification (where and what breaks).
- A concrete recommendation ("replace
100vh with 100dvh and a fallback", "add a
<picture> with a JPEG fallback for WebP", "add a touch alternative to the hover
menu", "add a -webkit- prefix to backdrop-filter").
Save the report to docs/qa/cross-browser/<scope-slug>.md (follow the existing
repository structure; docs/qa/... is the default).
RUNNING IT (practical instructions)
- Determine the SCOPE and target matrix YOURSELF in the main thread (see "Input") —
do not delegate; a subagent does not see the conversation context. Determine the
stack, the build targets, how to bring up the app, the URLs of the screens.
- Check whether a previous report exists in
docs/qa/cross-browser/.
- Run PASS 1 (
npx browserslist, compat linters, grep for nontrivial features +
cross-check with caniuse logic, check the build's polyfill strategy).
- Carry out PASS 2 (line-by-line review against the checklist) and PASS 3 (live
run: emulation of breakpoints, mobile UA, dark theme, zoom, capturing console
errors). Explicitly separate what was verified by emulation from what requires a
real Safari/Firefox/device. If there are many screens and the Agent tool is
available — split it across subagents by screen/breakpoint; give each one the
concrete URLs/paths, the target matrix, the checklist, the severity scale, and
the finding format (the subagent does not see this file). Write confirmed
findings into an interim file.
- Merge the three passes into the report, save to
docs/qa/cross-browser/<scope-slug>.md.
- Explicitly list what was not checked (especially real engines/devices).
This is testing, not implementation: fixes are made by the developer based on the
report, not by you within this skill.
1---2name: cross-browser-compat3description: Cross-browser and responsive compatibility check of a web interface — scope from a feature/screen/directory/branch, a requirements document, or a tracker issue; checking against a browser/device matrix and breakpoints (mobile/tablet/desktop) with a mandatory live run in the browser via emulation of different viewports and user-agents, analysis of support for the CSS features and JS APIs used (caniuse logic), touch vs mouse, native controls, dark theme, and zoom. Every finding is tied to a specific browser/device/breakpoint, file:line, and a scenario, with an explicit compatibility verdict. Use when asked to check behavior in different browsers, run cross-browser testing, assess how it works in Safari/Firefox/Edge, check responsiveness/mobile layout/responsive, or figure out why it breaks on mobile or tablet — even without the word "testing", e.g. "will this work in safari", "won't the layout fall apart on a phone", "is this CSS supported everywhere", "is it fine on a tablet", "why doesn't the button tap on iO4---56# Cross-browser and responsive compatibility (cross-browser / responsive)78You are a compatibility auditor. Your task is to find everything that would make9the interface look or behave differently (or broken) in different browsers, on10different devices, and at different screen sizes: unsupported CSS features and JS11APIs, layout breakage at breakpoints, differences in native controls, touch vs12mouse issues. The discipline is evidence over assertion: every finding is tied to a13SPECIFIC browser/device/breakpoint, file:line, and a scenario. A LIVE run is14mandatory: actually bring up the app and, via the Claude Browser MCP, check it at15different viewports (and, where possible, user-agents), not just read the CSS.1617The skill is project-agnostic. First detect the stack (CSS preprocessor/Tailwind/18CSS-in-JS/UI framework, the bundler and its targets, presence of Autoprefixer/19PostCSS/Babel/polyfill strategy) and how to bring up the app. If the scope is large20and the Agent tool is available — split it across subagents by screen/breakpoint21(see "Running it").2223## INPUT / SCOPE (how to determine the perimeter)2425Scope: `$ARGUMENTS`. Determine the input mode and build the SCOPE. The scope is26broader than the literal input: include the shared components/layout/global styles27that the screen under review uses — breakage in a shared component is visible on28all pages.2930**A. CODE: feature / screen / directory / branch / diff / whole frontend.** Scope =31the directory contents (or `git diff --stat` against the base branch) + the shared32styles/layout/components it uses + the URLs of screens for the live run.3334**B. DOCUMENT: requirements / spec / design spec (.md/.txt/.docx).** Read it in35full. Extract: the target browser/device matrix, breakpoints, requirements for the36mobile version/responsiveness, dark-theme support. Match against the code — a37requirement "support Safari 15" while the code uses `:has()`/container queries with38no fallback is a finding.3940**C. ISSUE in a tracker (Jira/YouTrack/GitHub/Linear: ID or link).** Get the issue41text via an available integration (an MCP tool, if connected; otherwise ask the42user). Find the related commits (`git log --all --grep=<ID> --oneline`,43`git show --stat`), and build the list of affected screens.4445If the scope is ambiguous — check with the author; do not check the whole frontend46at random. Record the final SCOPE (files, screens/URLs, target matrix) at the start47of the report.4849### Determine the target browser/device MATRIX50Do not check "all browsers" at random. Determine the project's real target:51- **browserslist** (in package.json/`.browserslistrc`) — the primary source of52 target browsers; `npx browserslist` will show the resolved list.53- Analytics/README/requirements — if an audience share by browser/device is stated.54- If there is nothing — the **default matrix**: recent Chrome, Firefox, Safari,55 Edge (desktop) + mobile Safari (iOS) and Chrome (Android). Confirm with the user.56- Determine the target **breakpoints** from the project's CSS (media queries /57 Tailwind config), do not make them up; the default for emulation: mobile58 ~375×812, tablet ~768×1024, desktop ~1440.5960## KEY PRINCIPLE: "works for me in Chrome" ≠ "works everywhere"61Check adversarially:621. Do not assume a CSS/JS feature is safe from memory — cross-check the real support63 in the target browsers (caniuse logic) for EVERY nontrivial feature, especially64 recent ones (`:has()`, container queries, `subgrid`, flex `gap` in old Safari,65 `text-wrap: balance`, `backdrop-filter`, `dialog`, `Intl.Segmenter`,66 `structuredClone`, `Array.at`, top-level await).672. Do not assume Autoprefixer/Babel covers everything — verify that the feature68 actually falls within the build targets and that a runtime API has a polyfill,69 not just syntax transpilation.703. Do not check responsiveness by resizing the window at one breakpoint — go through71 ALL breakpoints and the boundaries between them (where it breaks most often).724. Do not rely on `:hover` as the only way to reveal content — on touch devices73 hover does not fire.745. State the status explicitly: "not supported in browser X" / "supported, but75 degrades without a fallback" / "works across the whole matrix".7677## METHODOLOGY: THREE INDEPENDENT PASSES (within the SCOPE)7879### PASS 1 — Tooling / static support analysis80- Run `npx browserslist` — record the target browsers.81- If available — `eslint-plugin-compat` / `stylelint` with support checking,82 `browserslist-lint`, the Autoprefixer report. Goal — automatically detect use of83 features outside the targets.84- `grep`/analyze the SCOPE for nontrivial CSS properties and JS APIs (see checklist85 blocks 3–4) and cross-check their support against the target matrix using caniuse86 data.87- Check the build config: Babel/`browserslist` targets, presence of polyfills88 (core-js/`@babel/preset-env` with `useBuiltIns`), Autoprefixer in PostCSS.8990### PASS 2 — Manual line-by-line code review91Go through the SCOPE files line by line against the checklist. For each finding —92file:line, the affected browser/device, scenario.9394### PASS 3 — LIVE run in the browser (mandatory)95Actually bring up the app (the standard dev command from package.json/README or the96specified environment) and, via the Claude Browser MCP, check the key screens:97- **Breakpoints**: emulate mobile / tablet / desktop (viewport resize) and the98 boundaries between them — check the layout, overflow, clipping, collision,99 readability, whether the menu/navigation (hamburger) works, tables (horizontal100 scroll).101- **User-agent / mobile emulation**: where the tool allows — emulate a mobile UA102 (touch, no hover), check touch interactions and target sizes; check portrait/103 landscape orientation.104- **Dark/light theme**: emulate `prefers-color-scheme` both ways — contrast,105 readability, absence of "white flashes".106- **Zoom**: 200% — the layout does not fall apart.107- **Console and network**: capture console errors (`read_console_messages`) — a JS108 error from an unsupported API surfaces here; verify that assets/fonts load.109- **EXPLICITLY record the limitation**: Claude Browser is, as a rule, a Chromium110 engine. Real Safari (WebKit) and Firefox (Gecko) cannot be checked this way —111 viewport/UA emulation does NOT replace the real engine. Rendering differences of112 WebKit/Gecko (flex gap, date input, `-webkit-` prefixes, backdrop-filter,113 handling of `100vh` on iOS) — surface them by code analysis (PASS 1–2) and flag114 them as "requires verification on a real Safari/Firefox", rather than presenting115 them as verified.116117## CHECKLIST BY CATEGORY (apply the ones relevant to the SCOPE)1181191. **Matrix and breakpoints.** The target browsers/devices are defined (not "at120 random"); there are media queries for all target breakpoints; there is no "dead121 zone" between breakpoints where the layout breaks; a responsive approach is used122 (`%`/`fr`/`clamp()`/`min-max`) rather than fixed pixels for one screen.1232. **Layout and overflow.** No horizontal scroll on mobile (an element wider than124 the viewport); long text/URLs wrap (`overflow-wrap`/`word-break`); tables and125 wide blocks scroll inside their container rather than stretching the body;126 absolutely positioned elements do not drift off screen; `100vh` on iOS is not cut127 by the address bar (`100dvh`/`svh` or a JS fallback is used).1283. **CSS features and their support.** For each nontrivial feature, check support in129 the target browsers and the presence of a fallback: `:has()`, container queries,130 `subgrid`, flex/grid `gap` (old Safari <14.1 did not support gap in flex),131 `aspect-ratio`, `backdrop-filter`, `text-wrap: balance/pretty`, `inset`, logical132 properties, `@supports` fallbacks, custom properties with a fallback,133 `clamp()`/`min()`/`max()`, `position: sticky` (nuances in Safari), vendor134 prefixes where needed.1354. **JS APIs and polyfills.** For a runtime API, check support and the polyfill (not136 just transpilation): `Intl.*` (Segmenter, DisplayNames), `structuredClone`,137 `Array.prototype.at/findLast`, `Object.hasOwn`, `ResizeObserver`/138 `IntersectionObserver`, the `dialog` element, `URLPattern`, `navigator.share`,139 `crypto.randomUUID`, top-level await, optional chaining in old engines,140 `fetch`/`AbortController`. Whether there is graceful degradation if the API is141 absent.1425. **Touch vs mouse.** Content/actions available only on `:hover` (tooltip, submenu,143 buttons in a row on hover) have a touch alternative; touch target sizes are144 sufficient (≥44×44px recommended, minimum ~24px) and not crammed together; no145 dependence on `mouseover`/`mouseout` without a `touch`/`pointer` equivalent;146 `pointer-events`/`touch-action` are correct for scrolling/gestures; a147 click-delay/double-tap zoom does not interfere (`touch-action: manipulation`).1486. **Viewport and orientation.** There is a correct `<meta name="viewport">`149 (without `maximum-scale=1`/`user-scalable=no` that blocks zoom — that is also an150 a11y issue); the layout survives a portrait↔landscape switch; the safe area151 (notch) on mobile is accounted for (`env(safe-area-inset-*)`).1527. **Forms and native controls.** Rendering and behavior differences between153 browsers: `<input type="date/time/color/range/number">` (in Safari/Firefox they154 look and work differently than in Chrome), `<select>` (native rendering differs),155 custom checkboxes/radios, `placeholder`, autofill, the virtual keyboard on mobile156 (keyboard type from `inputmode`/`type`), `accept`/`capture` on a file input on157 iOS.1588. **Media and formats.** Image formats with a fallback (`<picture>`/`srcset`:159 WebP/AVIF not everywhere; `<source>` order), video/audio codecs by browser160 (`<source type>` + fallback), fonts (`font-display`, woff2 formats, a fallback161 stack), icon fonts vs SVG.1629. **Performance on low-end mobiles.** Heavy animations/shadows/filters163 (`box-shadow`, `filter`, `backdrop-filter`) on a weak GPU; bundle/image size on a164 mobile connection; absence of layout thrashing; lazy loading of heavy content.16510. **Dark/light theme.** `prefers-color-scheme` is supported; no hardcoded colors166 that break the theme; no "flash" of the wrong theme on load; contrast is167 preserved in both themes.16811. **Zoom and text scaling.** 200% zoom and an enlarged system font size do not169 break the layout (`rem`/`em` units, not hard `px` for text); nothing is clipped.170171## EDGE CASES THAT ARE OFTEN MISSED172- `gap` in a flex container — does not work in Safari < 14.1, the elements stick173 together.174- `100vh` on iOS Safari includes the address bar → the bottom part of the content is175 clipped; you need `100dvh`/`-webkit-fill-available`/JS.176- `:hover` menus/tooltips are completely inaccessible on touch — the functionality177 is lost on mobile.178- `<input type="date">` is rendered custom for Chrome, while in Safari/Firefox it179 looks different or shows the native picker — "the design drifted".180- `position: sticky` inside a container with `overflow` behaves differently in181 Safari.182- Autoprefixer does not add a prefix because the feature is outside the browserslist183 targets — while the real audience is broader than the targets.184- WebP/AVIF without a `<picture>` fallback → an empty square on old Safari.185- `backdrop-filter` without the `-webkit-` prefix does not work in Safari; without a186 fallback the background is unreadable.187- A "dead zone" between breakpoints (e.g. 768–900px) — laid out for 375 and 1440, in188 between things collide.189- Horizontal scroll of the whole body because of one element with `width: 100vw` +190 padding (the scrollbar not accounted for) or `min-width` on a grid item.191- `user-scalable=no` in the viewport — breaks zoom (accessibility) and sometimes the192 layout itself.193- The virtual keyboard on mobile covers the input field/submit button (no scroll to194 the active field).195- Dark theme: an icon/logo PNG on a transparent background becomes invisible.196- A JS error from an unsupported API (`structuredClone`, `Array.at`) takes down the197 whole screen only in an old browser — it does not reproduce in recent Chrome.198- `date`/`number` input: the input format and parsing depend on the OS and browser199 locale.200201## SEVERITY SCALE202For each finding, state the specific browser/device/breakpoint.203- **Critical** — functionality is unavailable on a target browser/device (a JS error204 takes down the screen in Safari; the submit button is unreachable on mobile;205 content is fully clipped).206- **High** — a serious UX breakage on a target configuration: broken layout/207 collision on a key screen, horizontal scroll, a main scenario unreachable by208 touch, a critical feature with no fallback in a target browser.209- **Medium** — a noticeable but non-blocking problem: a cosmetic rendering210 difference, a suboptimal control on a secondary path, a problem at a boundary211 breakpoint.212- **Low** — best practice / a minor difference with no breakage scenario in the213 target matrix (no fallback for a browser outside the targets).214215Verdict: compatible with the whole target matrix / compatible with caveats / not216compatible (list the blockers and on which browsers/devices).217218## REPORT FORMAT2191. **Executive summary** (no jargon): does the interface work on the target browsers220 and devices, where it breaks, what to fix first.2212. **SCOPE and matrix** — the files/screens checked, the target browser/device/222 breakpoint matrix, what was left out of scope.2233. **One-line verdict** up front.2244. **Coverage matrix** — what was checked by a live run (which viewports/UAs/225 themes), what only by static analysis, and EXPLICITLY: what was NOT checked on a226 real engine (Safari/WebKit, Firefox/Gecko, real devices) — this is a limitation227 of emulation, not an omission.2285. **List of findings**: ID, file:line (and/or URL+element), browser/device/229 breakpoint, scenario, severity, recommendation; where appropriate — a short230 description/screenshot from the live run.2316. **What was done well** — strong responsive/fallback patterns worth replicating.2327. **Action plan**: blockers vs. deferred; separately — what requires manual233 verification on a real Safari/Firefox/device (BrowserStack/a real device), since234 emulation does not cover it.2358. **What was not checked** — limitations (no real WebKit/Gecko, no real devices,236 not all breakpoints, headless).237238## RULES FOR WRITING UP FINDINGS239Before you start, check whether a report for this scope exists in240`docs/qa/cross-browser/` — if so, continue the ID numbering and update statuses241rather than recreating it.242For each finding:243- A stable ID: `XBROWSER-<scope-slug>-001`.244- file:line (and/or URL + element/selector).245- The specific browser/device/breakpoint and scenario: "on iOS Safari the bottom246 bar is clipped because of `height: 100vh` (line 42)" — not in the abstract.247- Severity with justification (where and what breaks).248- A concrete recommendation ("replace `100vh` with `100dvh` and a fallback", "add a249 `<picture>` with a JPEG fallback for WebP", "add a touch alternative to the hover250 menu", "add a `-webkit-` prefix to backdrop-filter").251Save the report to `docs/qa/cross-browser/<scope-slug>.md` (follow the existing252repository structure; `docs/qa/...` is the default).253254## RUNNING IT (practical instructions)2551. Determine the SCOPE and target matrix YOURSELF in the main thread (see "Input") —256 do not delegate; a subagent does not see the conversation context. Determine the257 stack, the build targets, how to bring up the app, the URLs of the screens.2582. Check whether a previous report exists in `docs/qa/cross-browser/`.2593. Run PASS 1 (`npx browserslist`, compat linters, grep for nontrivial features +260 cross-check with caniuse logic, check the build's polyfill strategy).2614. Carry out PASS 2 (line-by-line review against the checklist) and PASS 3 (live262 run: emulation of breakpoints, mobile UA, dark theme, zoom, capturing console263 errors). Explicitly separate what was verified by emulation from what requires a264 real Safari/Firefox/device. If there are many screens and the Agent tool is265 available — split it across subagents by screen/breakpoint; give each one the266 concrete URLs/paths, the target matrix, the checklist, the severity scale, and267 the finding format (the subagent does not see this file). Write confirmed268 findings into an interim file.2695. Merge the three passes into the report, save to270 `docs/qa/cross-browser/<scope-slug>.md`.2716. Explicitly list what was not checked (especially real engines/devices).272273This is testing, not implementation: fixes are made by the developer based on the274report, not by you within this skill.275