Skip to content

test(#10722): rendered-geometry 44px tap-target gate + semantic assertions - #11868

Merged
lalalune merged 4 commits into
developfrom
test/10722-tap-target-geometry-gate
Jul 3, 2026
Merged

lalalune merged 4 commits into
developfrom
test/10722-tap-target-geometry-gate

Conversation

@lalalune

@lalalune lalalune commented Jul 3, 2026

Copy link
Copy Markdown
Member

What

Adds a reusable rendered-geometry gate (tap-target-geometry-all-views.spec.ts, real-Chromium ui-smoke, Pixel-7 coarse-pointer viewport) that walks the canonical built-in view enumeration, measures real getBoundingClientRect() for every standalone interactive control, and asserts:

  1. every standalone interactive control renders a ≥44×44px hit target (Apple HIG floor), and
  2. role↔DOM-node coherence (ARIA role must not contradict native semantics; non-native role=button/link must be keyboard-focusable; every control exposes an accessible name).

Legitimately-sub-44 controls (inline prose links, native checkbox/radio whose <label> is the real tap surface, nested/off-screen/disabled) are excluded in-page with a documented reason and surfaced in the report, never silently dropped. all-views-interaction.spec.ts upgrades a subset of "no page error" assertions to semantic outcomes. Test-only — no product source changed.

⚠️ Status: pushed for review, NOT yet merged

This is salvaged from a rate-limited agent lane that did not get to run the gate. The gate is designed to FAIL on genuinely-under-44px controls (the sibling tap-target-geometry.spec.ts documents known regressions like a 36px ShellBackButton). Before merge it needs one real ui-smoke run to triage what it reports — any real violations get fixed at the source or added to DOCUMENTED_EXCEPTIONS with a written reason. Biome + structural typecheck are clean; the gate logic is complete.

Do not merge until the gate has been run green. Refs #10722.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: bb773ab0-d5ce-4f42-b122-0c07ff08b091

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch test/10722-tap-target-geometry-gate

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@greptile-apps greptile-apps Bot 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

claude added 2 commits July 3, 2026 03:15
…me upgrades

New real-Chromium ui-smoke gate tap-target-geometry-all-views.spec.ts asserts
every interactive element's rendered bbox meets the 44x44px minimum + role<->DOM
coherence across app views; all-views-interaction.spec.ts upgrades a subset of
'no page error' assertions to semantic outcomes. Test-only (no product source).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@lalalune
lalalune force-pushed the test/10722-tap-target-geometry-gate branch from c98431b to cbfd5f8 Compare July 3, 2026 10:35

@greptile-apps greptile-apps Bot 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@lalalune

lalalune commented Jul 3, 2026

Copy link
Copy Markdown
Member Author

I ran the new gate against current develop and pushed a follow-up commit (cbfd5f8770) with the fixes that were clearly shared/common:

  • allow valid role=combobox patterns on button/textarea so the gate does not false-positive Radix/select and slash-command combobox controls
  • treat visually-hidden color/file inputs as geometry exceptions when a visible proxy button is the actual tap target
  • raise shared tap targets: first-run welcome chips/dismiss, notification pull zone, workspace sidebar switcher, empty-state primary/recommendation buttons, logs filters, and background swatches/custom color trigger

Validation after the follow-up:

  • bunx @biomejs/biome check packages/app/test/ui-smoke/tap-target-geometry-all-views.spec.ts packages/ui/src/components/settings/BackgroundSettingsControls.tsx packages/ui/src/components/chat/widgets/ftu-welcome.tsx packages/ui/src/components/shell/HomeScreen.tsx packages/ui/src/components/workspace/AppWorkspaceChrome.tsx packages/ui/src/components/composites/chat/ChatEmptyStateWithRecommendations.tsx packages/ui/src/components/pages/LogsView.tsx
  • node scripts/run-ui-playwright.mjs --config playwright.ui-smoke.config.ts test/ui-smoke/tap-target-geometry-all-views.spec.ts --project=chromium ❌ still fails: 23 passed / 10 failed.

Remaining failing routes: browser, stream, automations, inventory, documents, files, plugins, fine-tuning, relationships, memories. The remaining failures are real geometry/name findings across plugin/app-specific controls, especially 40px form fields/buttons and smaller tab/filter/icon controls. This PR should still not merge until those are fixed or explicitly documented with justified exceptions.

@lalalune

lalalune commented Jul 3, 2026

Copy link
Copy Markdown
Member Author

Validation attempted on rebased branch against origin/develop.

Command:
node packages/app/scripts/run-ui-playwright.mjs --config playwright.ui-smoke.config.ts --project=chromium test/ui-smoke/tap-target-geometry-all-views.spec.ts

Result: failed. The app/view build completed and the new Chromium geometry gate ran across 33 routes: 23 passed, 10 failed.

Failing views: browser, stream, automations, inventory, documents, files, plugins, fine-tuning, relationships, memories.

Representative failures:

  • browser: unnamed input coherence violation.
  • stream: GO LIVE and Pop out stream view are 36px high/wide controls.
  • automations: New, filter chips, and Create your first automation are below 44px.
  • inventory: wallet/perps/predictions tabs, copy buttons, token tabs, hide buttons, and time range chips are below 44px.
  • fine-tuning: many form controls/buttons render at 40px, below the 43.5px floor used by the gate.
  • relationships: Platform filter select is 36px high.
  • memories: Feed Browse control is 32px high.

Leaving unmerged per the PR body requirement: run the gate and fix real violations or document intentional exceptions before merge.

@lalalune

lalalune commented Jul 3, 2026

Copy link
Copy Markdown
Member Author

HOLD — per your own do-not-merge note, plus one real defect. The gate itself is real (rendered geometry, no soft-pass paths, empty DOCUMENTED_EXCEPTIONS, vacuous-pass guard) and view-routes.ts matches develop's 33 routes. Blockers: (1) the gate has never run — it is not deny-listed, so all 33 view-tests will run in CI with a high first-red probability; (2) HomeScreen.tsx: the invisible notification pull-zone button grew +30px → +44px but the paired scroller reserve pt-[calc(...+30px)] ~30 lines below was not updated — a 14px band of launcher home content is now tap-shadowed by a touchAction:"none" button (regresses the #11829 gesture surface); the "30px grab margin" comment is stale and min-h-11 is redundant. (3) PR body says "test-only" but 6 packages/ui components change visibly (FTU chips → 44px line boxes, empty-state pills 28→44, swatches 36→48 wrap in max-w-sm) — needs the audit:app loop.

To merge: fix the paired pt- (both sides 44px) + stale comment, run the gate green, run audit:app for touched surfaces, correct the PR body. Nit: view-routes.ts doc comment names the wrong spec file.

…-role overrides + require visibility

Running the gate surfaced that the role<->DOM coherence check false-positived on
every ARIA composite/widget role (role=combobox on the chat composer textarea and
on the logs filter buttons), and ran against hidden 0x0 portal internals. ARIA
widget roles (combobox/searchbox/spinbutton/switch/menuitem/tab/option/…) are
DESIGNED to layer onto native interactive elements — only an interaction-model
swap (link<->button) or a non-interactive reclassification (heading/img/
presentation) is a real defect. Exempt the widget overrides and gate the
coherence check on isVisible().

With that fixed the gate reports only GENUINE geometry violations — a real sub-44px
a11y backlog (see PR/issue inventory).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@greptile-apps greptile-apps Bot 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@lalalune

lalalune commented Jul 3, 2026

Copy link
Copy Markdown
Member Author

Update — gate now RUNS and is CORRECT; it surfaced a real sub-44px a11y backlog

Got the gate running (the earlier "webServer won't boot" was a port-31337 collision with an adb-forward, unrelated to the gate). Two rounds:

Round 1 — fixed a gate false-positive. The role↔DOM coherence check flagged every ARIA composite/widget role — role=combobox on the chat composer <textarea> and on the logs filter <button>s (33 failures) — and measured hidden 0×0 portal internals. ARIA widget roles (combobox/searchbox/spinbutton/switch/menuitem/tab/option/…) are designed to layer onto native elements; only interaction-model swaps (link↔button) or non-interactive reclassification (heading/img/presentation) are real defects. Fixed: exempt the widget overrides + gate the check on isVisible(). (pushed)

Round 2 — the gate now reports only GENUINE geometry violations. 25 views fail on real sub-44px controls — a legitimate a11y backlog:

  • Shared 36×36 "Show left sidebar" toggle — appears across most views (dominates the 25 failures; one shared-component fix clears the majority).
  • Background view: 13 color swatches at 36×36 ("Set background to Orange/Amber/…").
  • Welcome card: text-style prompt buttons 20–30px ("Recap my day" 101×20, "What can you do?" 129×20, "Summarize my day" 137×20, "Dismiss welcome" 52×20, "Open notifications" 396×30).
  • Database: "Open SQL editor" 142×36, "Search memories" 141×28.
  • Logs: filter dropdowns 160×40 (just under the 43.5 floor).

Disposition — do NOT merge as a blocking gate yet

The gate is correct and valuable, but the app has a real touch-target backlog. Making it green requires an a11y sizing pass across those shared components (sidebar toggle, swatch buttons, welcome-card actions, log filters), and every one of those is a UI change that needs the audit:app visual-review loop (raising a 36px button to 44px can shift layouts) — that's a scoped follow-up, not something to rush into this test-infra PR. The alternative is landing it as a baselined regression-ratchet (existing violations allow-listed, new ones blocked). Recommend the a11y fix pass; keeping this PR open as the correct gate + the tracked inventory. Refs #10722.

@greptile-apps greptile-apps Bot 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.

Your trial has ended. Reactivate Greptile to resume code reviews.

@lalalune

lalalune commented Jul 3, 2026

Copy link
Copy Markdown
Member Author

Updated the branch with commit 8384a1e (fix(ui): finish tap target geometry gate).\n\nValidation run from /tmp/eliza-11868-pr/packages/app:\n\n\nnode scripts/run-ui-playwright.mjs --config playwright.ui-smoke.config.ts test/ui-smoke/tap-target-geometry-all-views.spec.ts --project=chromium\n\n\nResult: 33 passed (Chromium Pixel 7 geometry gate).\n\nI also hardened the gate to wait for at least one visible interactive control before collecting geometry, after seeing a transient blank database-view load return zero controls.,

@lalalune
lalalune merged commit e078acf into develop Jul 3, 2026
48 of 80 checks passed
@lalalune
lalalune deleted the test/10722-tap-target-geometry-gate branch July 3, 2026 11:20
0xSolace added a commit that referenced this pull request Jul 3, 2026
…ch-action (#11853 sibling) (#11904)

The existing *-gate.test.ts files are all STYLE gates. Two production UI
bugs slipped past every one of them plus manual QA because they were
MECHANICS bugs (the pixels looked right, the interaction was dead):

  (a) drawer-not-scrollable: a clamped-height (max-h-[..vh]) + flex-col +
      overflow-hidden shell with no inner overflow-y-auto scroll body —
      taller content is dead-clipped and unreachable.
  (b) broken-swipe: a useHorizontalPager surface with no explicit
      touch-action — the browser default (auto) steals the horizontal pan
      and fires pointercancel, so the flick never commits on touch.

Adds a static (no-browser) vitest gate scoped to the real drawer/pager
surfaces (McpDetailDrawer, Launcher, HomeLauncherSurface). Comments are
stripped before scanning and the drawer scroll-body triad is checked
per-element (not per-file) so a comment mention or a decoy scroller can't
mask a regression. Self-tests plant each bug shape (incl. the exact
false-negatives codex flagged) and assert the detector fires.

Green against develop; fails on both planted real-bug shapes. This is the
MECHANICS gap not covered by #11868 (44px tap-target), #11877 (focus
order), or #11898 (test-red clearing). Enforcement is #11853's job.

— [sol-orch]

Co-authored-by: wakesync <shadow@shad0w.xyz>
lalalune pushed a commit that referenced this pull request Jul 3, 2026
lalalune pushed a commit that referenced this pull request Jul 3, 2026
…fix selectors/roles/report path + real 44px component fixes (review salvage)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Claude encountered an error —— View job


I'll analyze this and get back to you.

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

LifeOps Benchmark — eliza

Run ID: lifeops-eliza-28657157612

LifeOps Benchmark

Model: gemma-4-31b
Judge: claude-opus-4-7
Scenarios: 25
pass@1: 0.000
pass@k: 0.000
Total cost: $0.0000

Full artifacts: see the lifeops-run-eliza-28657157612 upload on this run.

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

❌ PR title does not match the required pattern. Please use one of these formats:

  • 'type: description' (e.g., 'feat: add new feature')
  • 'type(scope): description' (e.g., 'chore(core): update dependencies')
    Valid types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert, release

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants