From a5eba704d9f2bb3f56a059476c30f48495473633 Mon Sep 17 00:00:00 2001 From: Claude Fable 5 Date: Fri, 3 Jul 2026 03:12:40 -0700 Subject: [PATCH 1/4] test(#10722): rendered-geometry 44px tap-target gate + semantic-outcome 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 --- .../ui-smoke/all-views-interaction.spec.ts | 37 +- .../tap-target-geometry-all-views.spec.ts | 462 ++++++++++++++++++ packages/app/test/ui-smoke/view-routes.ts | 48 ++ 3 files changed, 511 insertions(+), 36 deletions(-) create mode 100644 packages/app/test/ui-smoke/tap-target-geometry-all-views.spec.ts create mode 100644 packages/app/test/ui-smoke/view-routes.ts diff --git a/packages/app/test/ui-smoke/all-views-interaction.spec.ts b/packages/app/test/ui-smoke/all-views-interaction.spec.ts index eaa97d1768395..a184eabfb5f09 100644 --- a/packages/app/test/ui-smoke/all-views-interaction.spec.ts +++ b/packages/app/test/ui-smoke/all-views-interaction.spec.ts @@ -11,6 +11,7 @@ import { openAppPath, seedAppStorage, } from "./helpers"; +import { VIEW_ROUTES } from "./view-routes"; /** * Generic per-view interaction coverage (#8796). @@ -27,42 +28,6 @@ import { * Clicks that navigate away are recovered by re-opening the route, so one * navigation doesn't end coverage of the rest of the page. */ -const VIEW_ROUTES: Array<{ id: string; path: string }> = [ - { id: "chat", path: "/chat" }, - { id: "phone", path: "/phone" }, - { id: "messages", path: "/messages" }, - { id: "contacts", path: "/contacts" }, - { id: "camera", path: "/camera" }, - { id: "tasks", path: "/apps/tasks" }, - { id: "browser", path: "/browser" }, - { id: "stream", path: "/stream" }, - { id: "apps", path: "/apps" }, - { id: "views", path: "/views" }, - { id: "character", path: "/character" }, - { id: "character-select", path: "/character/select" }, - { id: "automations", path: "/automations" }, - { id: "inventory", path: "/wallet" }, - { id: "documents", path: "/character/documents" }, - { id: "files", path: "/apps/files" }, - { id: "plugins", path: "/apps/plugins" }, - { id: "skills", path: "/apps/skills" }, - { id: "fine-tuning", path: "/apps/fine-tuning" }, - { id: "trajectories", path: "/apps/trajectories" }, - { id: "transcripts", path: "/apps/transcripts" }, - { id: "relationships", path: "/apps/relationships" }, - { id: "memories", path: "/apps/memories" }, - { id: "rolodex", path: "/rolodex" }, - { id: "voice", path: "/settings/voice" }, - { id: "runtime", path: "/apps/runtime" }, - { id: "database", path: "/apps/database" }, - { id: "desktop", path: "/desktop" }, - { id: "settings", path: "/settings" }, - { id: "tutorial", path: "/tutorial" }, - { id: "help", path: "/help" }, - { id: "logs", path: "/apps/logs" }, - { id: "background", path: "/background" }, -]; - // Bound per-view work so the suite stays under the playwright timeout while // still exercising a representative breadth of controls. const MAX_CLICKS = 24; diff --git a/packages/app/test/ui-smoke/tap-target-geometry-all-views.spec.ts b/packages/app/test/ui-smoke/tap-target-geometry-all-views.spec.ts new file mode 100644 index 0000000000000..183fde57f1405 --- /dev/null +++ b/packages/app/test/ui-smoke/tap-target-geometry-all-views.spec.ts @@ -0,0 +1,462 @@ +// Reusable rendered-geometry tap-target + role/DOM-coherence gate (#10722). +// +// The 44px Apple-HIG touch floor used to be enforced only as a CSS token +// (`--min-touch-target`) plus lint conventions — nothing measured what the +// browser actually laid out, so a control could regress below 44px (the +// ShellBackButton shipped at 36px; the spatial filter chips at ~34px) with the +// whole gate green. `tap-target-geometry.spec.ts` measures the two known +// regression surfaces; THIS spec generalizes that to a REUSABLE gate that walks +// the same canonical built-in view enumeration the interaction-coverage spec +// uses (`./view-routes`), measures REAL `getBoundingClientRect()` geometry for +// every standalone interactive control on a coarse-pointer Pixel-7 viewport, and +// asserts: +// +// 1. every STANDALONE interactive control (icon/label button, role=button/ +// tab/switch/menuitem, standalone link) renders a >=44x44 hit target, and +// 2. role<->DOM-node coherence: an ARIA role must not contradict the node's +// native semantics, a non-native role=button/link must be keyboard- +// focusable, and every interactive control must expose an accessible name. +// +// Legitimately-sub-44 controls (inline prose links, native checkbox/radio boxes +// whose