Skip to content

test(lint): enforce accessibility-tree selectors in new e2e specs#3192

Open
punk6529 wants to merge 1 commit into
mainfrom
claude/e2e-selector-lint
Open

test(lint): enforce accessibility-tree selectors in new e2e specs#3192
punk6529 wants to merge 1 commit into
mainfrom
claude/e2e-selector-lint

Conversation

@punk6529

@punk6529 punk6529 commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Issue

The E2E campaign is about to author several new spec families (crawl pack, write journeys, pseudo-locale assertions) and parallel campaigns (i18n URL routing, WCAG 2.2 AA) will keep reshaping surfaces. Specs that locate elements by CSS break on every markup change; specs that use the accessibility tree survive redesigns and double as a WCAG signal. The convention exists informally — ~389 accessible queries vs 94 literal locators — but nothing enforces it. PR 4 of the E2E architecture campaign (pulled ahead of the spec-writing PRs so they're born compliant).

Fix

One lint rule, new code only, via the repo's grandfather-ratchet idiom.

Changes

  • eslint.config.e2e-selectors.mjs — dedicated single-purpose flat config (the main lint surface globally ignores tests/**, and a flat-config global ignore can't be re-included per block). One no-restricted-syntax rule flags literal-string page.locator() calls; scoping chains under accessible queries remain allowed
  • 35 grandfathered legacy specs listed in the config with a shrink-only ratchet note — remove entries as files migrate, never add
  • lint:e2e-selectors package script; app-pr-ci gains an unconditional "Lint e2e selector usage" step beside knip

Validation

  • Clean run exits 0 (grandfathered exempt; the 6 already-clean specs pass)
  • Probe spec containing page.locator("div.foo") → flagged with the actionable message, then removed
  • knip clean, debt ratchet unchanged, workflow YAML parses

Risk

Low. New config + one CI step; zero impact on the main lint surface or existing specs. Failure mode is a clear per-line lint error pointing at the config's guidance.

Review Notes

  • Deliberately phase-1 narrow (literal CSS on page only). Chained .locator() scoping and non-page receivers stay legal — tightening can ride the same config later once the grandfather list shrinks.

🤖 Generated with Claude Code

New spec code must locate elements via getByRole/getByLabel/getByTestId/
getByText rather than literal CSS lookups on page.locator(). Accessible
queries keep specs resilient while surfaces change rapidly and double as
a WCAG signal - this lands ahead of the campaign's crawl pack and write
journeys so they are born compliant.

Mechanism: a dedicated single-purpose flat config
(eslint.config.e2e-selectors.mjs) because the main lint surface globally
ignores tests/** and a global ignore cannot be re-included per block.
One no-restricted-syntax rule flags literal-string page.locator() calls;
scoping chains under accessible queries stay allowed. The 35 existing
spec files with locator usage are grandfathered in the config with a
shrink-only ratchet note, so nothing mass-fails.

Wired as an unconditional "Lint e2e selector usage" step in the app PR
CI installed-checks job.

Validation: clean run exits 0 (grandfathered exempt, 6 clean specs
pass); a probe spec with page.locator("div.foo") is flagged; knip and
debt ratchet unchanged; workflow YAML parses.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Punk 6529 <108035228+punk6529@users.noreply.github.com>
@punk6529
punk6529 requested a review from a team July 7, 2026 23:44
@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 37 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f93d5cae-5f5c-45dd-95fc-b8502f1fad5f

📥 Commits

Reviewing files that changed from the base of the PR and between d291ef0 and 2d78ea6.

📒 Files selected for processing (3)
  • .github/workflows/app-pr-ci.yml
  • eslint.config.e2e-selectors.mjs
  • package.json
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/e2e-selector-lint

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

@6529bot

6529bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

6529bot general PR review - 2d78ea6

Verdict: Needs changes

Important

  • eslint.config.e2e-selectors.mjs:76 — The AST selector only matches page.locator("...") where the callee object is the literal identifier page and the argument is a Literal. This misses the common real-world patterns the policy claims to enforce:
    • Template-literal arguments: page.locator(\div.foo`)hasarguments.0.type === 'TemplateLiteral', not Literal`, so it is not flagged. A new spec can bypass the rule trivially by using backticks.
    • Non-page handles: many specs assign const p = await context.newPage() or destructure a page fixture under a different name; [callee.object.name='page'] won't match those, and worse, container.locator("div.foo") inside an accessible chain is intentionally allowed but somePage.locator("div.foo") (a raw page under a different name) silently passes. Consider matching [callee.property.name='locator'][arguments.0.value=/[.#\[]/] or at least covering TemplateLiteral args, and document that the page-name coupling is a known gap. The PR description's validation only probed the exact page.locator("div.foo") literal case, so these gaps are untested.

Nice-to-have

  • eslint.config.e2e-selectors.mjs:66 / package.json:91 — The lint script targets tests but the config files glob is tests/**/*.spec.ts. Non-.spec.ts test helpers under tests/ (e.g. page-object modules) that call page.locator("css") are not covered. If selector logic is factored into helpers, the rule is bypassed. Worth confirming this is intended.
  • eslint.config.e2e-selectors.mjs:26 — The grandfather list is a hardcoded array with no automated guard preventing additions or detecting stale entries (a listed file deleted/renamed leaves dead config). A small check (e.g. assert each path exists, and that the count only decreases) would make the "ratchet only shrinks" claim enforceable rather than convention.

Suggested next steps

  • Extend the AST selector to cover TemplateLiteral arguments so backtick CSS strings are caught, and decide how to handle page handles not literally named page.
  • Add a probe spec using a template-literal selector to the validation set before merge.
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.

Review comments:
From 6529bot general PR review on 6529-Collections/6529seize-frontend#3192 (2d78ea6f34d1):
**Verdict**: Needs changes

### Important

- `eslint.config.e2e-selectors.mjs:76` — The AST selector only matches `page.locator("...")` where the callee object is the literal identifier `page` and the argument is a `Literal`. This misses the common real-world patterns the policy claims to enforce:
  - Template-literal arguments: `page.locator(\`div.foo\`)` has `arguments.0.type === 'TemplateLiteral'`, not `Literal`, so it is not flagged. A new spec can bypass the rule trivially by using backticks.
  - Non-`page` handles: many specs assign `const p = await context.newPage()` or destructure a `page` fixture under a different name; `[callee.object.name='page']` won't match those, and worse, `container.locator("div.foo")` inside an accessible chain is intentionally allowed but `somePage.locator("div.foo")` (a raw page under a different name) silently passes. Consider matching `[callee.property.name='locator'][arguments.0.value=/[.#\[]/]` or at least covering `TemplateLiteral` args, and document that the `page`-name coupling is a known gap. The PR description's validation only probed the exact `page.locator("div.foo")` literal case, so these gaps are untested.

### Nice-to-have

- `eslint.config.e2e-selectors.mjs:66` / `package.json:91` — The lint script targets `tests` but the config `files` glob is `tests/**/*.spec.ts`. Non-`.spec.ts` test helpers under `tests/` (e.g. page-object modules) that call `page.locator("css")` are not covered. If selector logic is factored into helpers, the rule is bypassed. Worth confirming this is intended.
- `eslint.config.e2e-selectors.mjs:26` — The grandfather list is a hardcoded array with no automated guard preventing additions or detecting stale entries (a listed file deleted/renamed leaves dead config). A small check (e.g. assert each path exists, and that the count only decreases) would make the "ratchet only shrinks" claim enforceable rather than convention.

**Suggested next steps**
- Extend the AST selector to cover `TemplateLiteral` arguments so backtick CSS strings are caught, and decide how to handle page handles not literally named `page`.
- Add a probe spec using a template-literal selector to the validation set before merge.

@6529bot

6529bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

6529bot WCAG 2.2 AA analysis - 2d78ea6

Verdict: No WCAG findings

This PR only adds tooling: a new ESLint flat config (eslint.config.e2e-selectors.mjs), a package.json script entry, and a CI step. There is no user-facing UI, component, markup, ARIA, focus, or styling change in the diff, so there is no WCAG 2.2 AA surface to evaluate.

Note: this is a lint rule that encourages accessibility-tree selectors in e2e specs, which is a positive indirect signal, but it does not itself alter runtime accessibility. Correctness concerns about the rule's coverage are outside the WCAG lane and were already raised in the prior general review.

@6529bot

6529bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

6529bot i18n analysis - 2d78ea6

Verdict: No i18n findings

This PR only adds a dedicated ESLint flat config for e2e selector linting, a CI workflow step, and a package.json script. There is no user-facing React copy, accessible names, or locale-sensitive formatting touched. The lint messages in eslint.config.e2e-selectors.mjs are developer-facing tooling output, which is out of scope for the frontend i18n standard.

No changes needed for i18n.

@6529bot

6529bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

6529bot crypto security analysis - 2d78ea6

Verdict: No security findings

This PR is tooling-only: a new ESLint flat config (eslint.config.e2e-selectors.mjs), a package.json script entry (package.json:91), and a CI step (.github/workflows/app-pr-ci.yml:221). No wallet, auth, signature, token, or crypto/web3 runtime code is touched.

Notes within the crypto-security lane (no action required):

  • The lint config does not execute test code or fetch anything remote; it only parses tests/**/*.spec.ts for a no-restricted-syntax match. No SSRF/injection/secret-leak surface is introduced.
  • The CI step runs through ./bin/6529 run lint:e2e-selectors inside the existing installed-checks job under Socket Firewall (.github/workflows/app-pr-ci.yml:200-212), with no new secrets, tokens, or network egress.

Correctness/coverage gaps in the selector rule (template-literal args, non-page handles, helper files) were already raised in the prior general review and are outside this security lane, so they are not repeated here.

@6529bot

6529bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

6529bot general PR review - 2d78ea6

Verdict: Needs changes

The prior review's Important finding about the AST selector gaps remains fully valid and unaddressed in this head (eslint.config.e2e-selectors.mjs:76 still uses arguments.0.type='Literal' and callee.object.name='page'). I won't restate it in full per dedupe rules, but it still blocks the policy from being effective.

Important

  • eslint.config.e2e-selectors.mjs:76 — Beyond the template-literal/handle-name gaps already raised, the selector only checks arguments.0.type='Literal' without inspecting the literal's value. This flags every literal page.locator("...") call, including legitimate accessibility-adjacent uses like page.locator("body"), page.locator(":root"), or a role-based CSS-free string, while the message insists CSS is the anti-pattern. Conversely it does not distinguish CSS from XPath (page.locator("//div")) — both are equally caught here, but the value-blind match means the rule cannot be relaxed to "only flag CSS/XPath selectors" as the comment at lines 16–19 claims ("Literal CSS/XPath lookups"). Either constrain to [arguments.0.value=/[.#\[>]|^\/\//] or update the doc comment to state that all literal page.locator args are rejected regardless of content.

Nice-to-have

  • package.json:91 / eslint.config.e2e-selectors.mjs:66 — The lint:e2e-selectors script passes tests as the target while the config files glob restricts to tests/**/*.spec.ts. With --no-warn-ignored, non-spec files under tests/ (helpers, page objects, tests/support/*.cjs) are silently skipped. If a helper wraps page.locator("css") and specs call the helper, the policy is bypassed with no signal. Confirm this is intended, or widen the glob to cover helper modules.
  • eslint.config.e2e-selectors.mjs:26 — The grandfather ratchet is purely conventional: nothing prevents a future PR from adding an entry, and a renamed/deleted grandfathered file leaves a stale entry that silently re-exempts nothing. A tiny guard (assert each path exists; assert count is monotonically non-increasing vs the committed baseline) would make the "list only shrinks" claim in .github/workflows/app-pr-ci.yml:220 enforceable rather than documentation.

Resolved since last review

  • Nothing resolved; the head SHA is unchanged from the prior review (2d78ea6f34d1), so the earlier Important finding stands.

Suggested next steps

  • Decide whether the rule should match on selector value (CSS/XPath patterns) and align the AST selector with the doc comment either way.
  • Add template-literal coverage (from the prior review) plus a value-pattern constraint, and add probe specs covering backtick and non-page handle cases before merge.
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.

Review comments:
From 6529bot general PR review on 6529-Collections/6529seize-frontend#3192 (2d78ea6f34d1):
**Verdict**: Needs changes

The prior review's Important finding about the AST selector gaps remains fully valid and unaddressed in this head (`eslint.config.e2e-selectors.mjs:76` still uses `arguments.0.type='Literal'` and `callee.object.name='page'`). I won't restate it in full per dedupe rules, but it still blocks the policy from being effective.

### Important

- `eslint.config.e2e-selectors.mjs:76` — Beyond the template-literal/handle-name gaps already raised, the selector only checks `arguments.0.type='Literal'` without inspecting the literal's *value*. This flags **every** literal `page.locator("...")` call, including legitimate accessibility-adjacent uses like `page.locator("body")`, `page.locator(":root")`, or a role-based CSS-free string, while the message insists CSS is the anti-pattern. Conversely it does not distinguish CSS from XPath (`page.locator("//div")`) — both are equally caught here, but the value-blind match means the rule cannot be relaxed to "only flag CSS/XPath selectors" as the comment at lines 16–19 claims ("Literal CSS/XPath lookups"). Either constrain to `[arguments.0.value=/[.#\[>]|^\/\//]` or update the doc comment to state that *all* literal `page.locator` args are rejected regardless of content.

### Nice-to-have

- `package.json:91` / `eslint.config.e2e-selectors.mjs:66` — The `lint:e2e-selectors` script passes `tests` as the target while the config `files` glob restricts to `tests/**/*.spec.ts`. With `--no-warn-ignored`, non-spec files under `tests/` (helpers, page objects, `tests/support/*.cjs`) are silently skipped. If a helper wraps `page.locator("css")` and specs call the helper, the policy is bypassed with no signal. Confirm this is intended, or widen the glob to cover helper modules.
- `eslint.config.e2e-selectors.mjs:26` — The grandfather ratchet is purely conventional: nothing prevents a future PR from *adding* an entry, and a renamed/deleted grandfathered file leaves a stale entry that silently re-exempts nothing. A tiny guard (assert each path exists; assert count is monotonically non-increasing vs the committed baseline) would make the "list only shrinks" claim in `.github/workflows/app-pr-ci.yml:220` enforceable rather than documentation.

### Resolved since last review

- Nothing resolved; the head SHA is unchanged from the prior review (`2d78ea6f34d1`), so the earlier Important finding stands.

**Suggested next steps**
- Decide whether the rule should match on selector *value* (CSS/XPath patterns) and align the AST selector with the doc comment either way.
- Add template-literal coverage (from the prior review) plus a value-pattern constraint, and add probe specs covering backtick and non-`page` handle cases before merge.

@sonarqubecloud

sonarqubecloud Bot commented Jul 7, 2026

Copy link
Copy Markdown

@6529bot

6529bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

6529bot GLM Swarm Review

Verdict: Advisory only

This GLM swarm is advisory and complements, not replaces, existing tests and existing reviewbots.

Important

  • AST selector has bypasses (eslint.config.e2e-selectors.mjs:75-76): The no-restricted-syntax rule only matches page.locator('Literal'). Template literals (page.locator(\.foo`)), BinaryExpressionconcatenation,page.$/page.$$, frame.locator(...), and aliased page objects (const p = page; p.locator(...), this.page.locator`) all silently escape enforcement, undermining the "new specs must use accessibility-tree selectors" policy. Consider widening the matcher or documenting the intentional scope.
  • CI step is unconditional (.github/workflows/app-pr-ci.yml:221-222): Lint e2e selector usage runs on every PR with no if: guard, unlike lint:changed/typecheck:changed. A false positive or parser change would block all PRs with no quick bypass. Confirm this is intentional or gate on needs.plan.outputs.*_required.
  • Verify the script exists: The CI step assumes lint:e2e-selectors is registered in bin/6529 / package.json. A missing script would fail every PR. Run ./bin/6529 run lint:e2e-selectors on the PR head before merge.

Nice-to-have

  • Grandfathered list has no ratchet enforcement (eslint.config.e2e-selectors.mjs:26-62): The "only shrink, never grow" policy is comment-only. A maintainer can add entries to silence the rule on new code with nothing in CI catching growth. Consider a Jest test that snapshots the list length or contents.
  • tests/wcag-i18n/public-routes.spec.ts is grandfathered (eslint.config.e2e-selectors.mjs:61): The canonical a11y/i18n spec is itself exempt from the accessibility-selector rule, which weakens the WCAG-signal rationale. Track as a follow-up to migrate it off the list.
  • File glob may miss helpers (eslint.config.e2e-selectors.mjs:66): files: ["tests/**/*.spec.ts"] excludes .ts helper modules that may wrap selector utilities. Confirm whether selector helpers live in .spec.ts files; if not, widen the glob.

Testing feedback loop

  • Add a rule-level test (or fixture spec) asserting: (a) page.locator(".btn") is flagged, (b) page.getByRole("button") is allowed, (c) page.locator(\.btn`)` is currently NOT flagged — this documents the known gap and locks in behavior if the matcher is later widened.
  • Run ./bin/6529 run lint:e2e-selectors locally to confirm the new CI step is green and no existing non-grandfathered spec trips the rule.
  • No new Playwright e2e runs are required — this change is static lint only.

Partial reviewer output

One or more internal advisory reviewer slices were unavailable; the synthesis used the remaining reviewer output.

  • correctness-regression: empty_output

@github-actions github-actions Bot added risk:low Dependency update is low risk under the dependency governance policy. deps:mixed Dependency update contains mixed or nonstandard changes. auto-merge:blocked Dependency update is not eligible for auto-merge. labels Jul 7, 2026
@6529bot

6529bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

6529bot responsiveness review - 2d78ea6

Verdict: Responsive checks passed

Root Cause / Summary

All 40 checks passed with zero deterministic failures, zero blank screenshots, and contentReady=true on every capture. Every context activated its intended layout branch: WebLayout/sidebar at desktop, SmallScreenLayout on web-mobile (no bottom nav, hasCapacitorNativeClass=false), the native AppLayout with body.capacitor-native, viewport-fit=cover, and 64px bottom navigation, and the Electron renderer with electronDetected=true. No blocking issues were found. The only recurring items are simulation-boundary warnings and one screenshot-capture timeout that fell back cleanly.

Blocking Findings

None. There are no deterministic failures, no blank/near-white captures (screenshotBlankLike=false everywhere), no missing native shell contract, no Electron branch failure, and no Next.js overlay error. The Rendering . . . overlay text on electron-desktop /the-memes is expected transient media-render UI, not a Next.js error overlay (nextErrorOverlay=false), and the page still captured full content (visibleTextLength=2045, 132 interactive elements).

Non-Blocking Findings

  • native-mobile app-shell modal covers content on most routes (app-wide, simulation artifact). Across native-mobile /, /the-memes, /network, /meme-lab, /messages, /meme-calendar, /waves, /notifications, /open-mobile?path=%2Fwaves, the End User License Agreement gate is displayed over the page (e.g. native-mobile /the-memes, native-mobile /waves). This is the expected first-run native EULA and renders correctly and responsively within the AppLayout; content beneath (rememes grid, network leaderboard) is present and scrollable behind it. No layout breakage.
  • native-mobile Keyboard/App plugin shims unavailable (all 10 routes, expected). Every native route warns Keyboard plugin shim is unavailable and App plugin shim is unavailable plus 2 console errors. This is inherent to the browser-level Capacitor simulation — the real plugins are not present. androidKeyboardHeight=0px and the shell contract otherwise holds (native class, viewport-fit, bottom nav all correct).
  • web-mobile /the-memes full-page screenshot timeout (isolated, non-fatal). Full-page capture exceeded 20s after fonts loaded and fell back to viewport screenshot; the fallback rendered a clean, correct SmallScreenLayout grid (web-mobile /the-memes). This route was also the slowest overall (36s); worth watching for load-cost regression but not a layout defect.
  • electron-desktop /rememes 3 console errors (isolated). Page rendered correctly with full sidebar and card grid (electron-desktop /rememes); errors did not block content (contentReady=true, 22 interactive elements).
  • Low-content / gated routes look intentionally sparse. /waves and /messages//notifications on web-desktop and electron show connect-wallet gates or empty shells (e.g. web-desktop /waves, web-desktop /messages). These are access/auth-gated states, not render failures — the shell, sidebar, and nav are intact.

Platform Coverage

  • web-desktop (10/10, 0 warnings): WebLayout + collapsed sidebar rendered correctly at 1440px across memes, meme-lab, network table, and calendar. Strongest evidence set with no issues.
  • web-mobile (10/10, 1 warning): SmallScreenLayout confirmed (hasCapacitorNativeClass=false, bottomNavigationVisible=false, no native app class). Layouts adapt cleanly to narrow width; only the /the-memes capture timeout warning.

Screenshot evidence: native-mobile /rememes, native-mobile /the-memes, native-mobile /network, native-mobile /, native-mobile /meme-lab, native-mobile /messages, native-mobile /meme-calendar, native-mobile /waves, native-mobile /open-mobile?path=%2Fwaves, native-mobile /notifications, web-mobile /the-memes, electron-desktop /rememes and 28 more in the details.

Deterministic responsiveness details

Verdict: Responsive checks passed

  • Workflow: responsiveness-review #28906647251
  • Screenshot viewer: artifact index
  • Screenshots: responsiveness artifact
  • Contexts: web-desktop, web-mobile, native-mobile, electron-desktop
  • Routes: /, /waves, /messages, /network, /the-memes, /meme-lab, /rememes, /meme-calendar, /notifications, /open-mobile?path=%2Fwaves
  • Profile: 6529 Seize frontend
  • Checks completed: 40/40
  • Failures: 0
  • Warnings: 12
Responsiveness runner summary

6529bot Responsiveness Summary

Status: pass
Duration: 546.9s
Profile: 6529 Seize frontend
Contexts: web-desktop, web-mobile, native-mobile, electron-desktop
Routes: /, /waves, /messages, /network, /the-memes, /meme-lab, /rememes, /meme-calendar, /notifications, /open-mobile?path=%2Fwaves
Checks completed: 40/40
Failures: 0
Warnings: 12

Platform Context

  • web-desktop should exercise WebLayout/sidebar at 1440x900.
  • web-mobile should exercise SmallScreenLayout, not the native AppLayout.
  • native-mobile/native-ios/native-android are fast browser-level Capacitor simulations of AppLayout, bottom navigation, viewport-fit, keyboard/app/deep-link plugins, and body class.
  • electron-desktop is a fast browser-level Electron renderer simulation using the Electron user-agent branch; it is not a packaged desktop app launch.
  • Access/restricted pages intentionally bypass the standard app layout shell.

Platform Matrix

  • electron-desktop: 10 check(s), failures=0, warnings=1, avg=19.4s
  • native-mobile: 10 check(s), failures=0, warnings=10, avg=22.5s
  • web-desktop: 10 check(s), failures=0, warnings=0, avg=18.1s
  • web-mobile: 10 check(s), failures=0, warnings=1, avg=19.2s

Next.js Overlay Diagnostics

  • electron-desktop /the-memes: Rendering . . .

Warnings

  • electron-desktop /rememes: 3 console error(s)
  • native-mobile /meme-calendar: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /meme-lab: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /messages: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /network: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /notifications: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /open-mobile?path=%2Fwaves: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /rememes: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /the-memes: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • native-mobile /waves: 6529 native profile: Keyboard plugin shim is unavailable; 6529 native profile: App plugin shim is unavailable; 2 console error(s)
  • web-mobile /the-memes: full-page screenshot failed; used viewport fallback: page.screenshot: Timeout 20000ms exceeded. Call log: �[2m - taking page screenshot�[22m �[2m - waiting for fonts to load...�[22m �[2m - fonts loaded�[22m

Slowest Checks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto-merge:blocked Dependency update is not eligible for auto-merge. deps:mixed Dependency update contains mixed or nonstandard changes. risk:low Dependency update is low risk under the dependency governance policy.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant