Skip to content

add host-target architecture and native harnesses - #587

Open
aidenybai wants to merge 21 commits into
mainfrom
codex/expo-native-test-harness
Open

add host-target architecture and native harnesses#587
aidenybai wants to merge 21 commits into
mainfrom
codex/expo-native-test-harness

Conversation

@aidenybai

@aidenybai aidenybai commented Jul 18, 2026

Copy link
Copy Markdown
Owner

What changed

  • add matching Expo and bare React Native fixture apps with a shared Detox/Jest behavior contract
  • add a renderer-neutral HostTarget capability model with opaque identity, geometry, descriptions, hierarchy, and optional React metadata
  • add a web adapter that keeps Element access behind the renderer boundary
  • add an experimental @react-grab/native package with explicit target registration, native measurement and hit testing, and a native selection overlay
  • prove native selection works without Fiber metadata in both fixture apps
  • add a macOS CI matrix with app-binary, CocoaPods, dependency, and Detox framework caching
  • configure bare React Native Metro and Xcode 26 compatibility for the pnpm monorepo

Architecture

Fiber is not the source of truth. Selection starts from renderer-owned host targets and the capabilities they support. React metadata is an optional enrichment layer that can be added later when a renderer exposes it safely.

The current DOM controller remains unchanged in this vertical slice. The new web adapter establishes the migration boundary; the native package proves the same target contract can drive measurement, hierarchy, hit testing, and presentation without a DOM or Fiber dependency.

Playwright cannot drive native iOS views directly. Reuse happens at the behavior-contract layer: Expo and bare React Native expose the same fixture IDs and run the same Detox spec, analogous to the existing shared web framework contract.

Validation

  • nr build
  • nr test: 1,068 passed, 24 skipped, 4 passed on retry under the saturated perf matrix
  • nr lint
  • nr typecheck
  • nr format
  • ni --frozen-lockfile
  • Expo nr bundle:ios
  • bare React Native nr bundle:ios
  • actionlint .github/workflows/test-native.yml
  • native registry unit tests and web adapter unit tests

GitHub Actions owns the final iOS simulator proof for both runtimes.


Note

Medium Risk
Large new packages, public API surface, and flaky-prone macOS/iOS CI; core web selection behavior is unchanged in this vertical slice, but the architectural direction affects future grab refactors.

Overview
This PR adds a renderer-neutral selection boundary so grab can work off opaque host targets instead of assuming DOM/Fiber. react-grab now exports a shared HostTarget capability contract (react-grab/targets) plus a web adapter (react-grab/web-target-adapter) that maps elements to targets while keeping Element access behind the adapter. The existing DOM grab controller is not rewired here; the adapter defines the migration edge.

It also ships an experimental @react-grab/native package: explicit ReactGrabTarget registration, native measurement/hit-testing via a registry adapter, stacking/parent hierarchy, and a modal Grab overlay (ReactGrabNative) that selects registered views without React metadata.

E2E and CI: matching Expo and bare React Native harness apps (shared counter fixture and test IDs) run the same Detox spec from packages/native-e2e. A new test-native GitHub Actions workflow builds both iOS sim apps (with Metro, CocoaPods, app-binary, and Detox framework caching) and runs the matrix on macOS.

Supporting changes include detox in pnpm onlyBuiltDependencies, unit tests for the web adapter and native registry, and monorepo Metro/Xcode tweaks for the bare RN app (e.g. fmt/Xcode 26 Podfile patch).

Reviewed by Cursor Bugbot for commit 0e24a15. Bugbot is set up for automated code reviews on this repo. Configure here.

@pkg-pr-new

pkg-pr-new Bot commented Jul 18, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@react-grab/cli@587
npm i https://pkg.pr.new/grab@587
npm i https://pkg.pr.new/react-grab@587

commit: 0e24a15

@github-actions

github-actions Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Performance report — this PR vs base branch

🔴 4 regressions · 🟢 3 improvements across 77 scenarios.

Scenario Metric Base → PR Verdict
drag-sweep-massive-grid Interaction latency (INP) 468ms → 748ms (+60%) 🔴 worse
drag-sweep-massive-grid Frame time (worst) 600ms → 858ms (+43%) 🔴 worse
heavy-table-filter-typing-passive Heap growth -2337KB → 2271KB (+197%) 🔴 worse
animation-scheduling-controls/infinite-stepped Graphics CPU over paused -0% → 2% (+16650%) 🔴 worse
heavy-table-hover-in-selection-mode GPU process CPU 45% → 35% (-23%) 🟢 better
heavy-table-sort-passive Frame time (p95) 83.3ms → 50.0ms (-40%) 🟢 better
heavy-table-sort-passive Heap growth 810KB → -138KB (-117%) 🟢 better

A metric counts as changed only past per-metric thresholds sized to measured shared-runner variance on identical code: interaction latency ±10% and 16ms (measured in 8ms steps), frame times ±30%, long-task/LoAF sums ±10% and 500ms, memory ±25% and 512KB / 60 nodes, process CPU ±20% and 10 points, GPU-process CPU ±20% and 3 points, animation ticks ±20% and 3/s, draws/tick ±20% and 0.05, hardware GPU ±20% and 10 points, compositor production ±20% and 3fps / 5 duty-cycle points, composited layers ±20% and 2 layers / 0.5 viewport areas, rendering stages ±20% and 1ms; any ms metric with a ≥100ms baseline needs ±30%.

All 73 standard scenarios (full numbers)
Scenario Interaction latency (INP) Main-thread blocking (long tasks) Janky frames (LoAF total) Frame time (p95) Frame time (worst) Heap growth Leaked DOM nodes Browser process CPU GPU process CPU Renderer process CPU Animation ticks Active animation timeline duty Animation-attributable renderer CPU Animation-attributable GPU-process CPU Animation-attributable graphics CPU Hardware GPU busy Compositor frame production Compositor production duty cycle Composited content layers Composited surface area Painted area Paint work CSS selector matching CSS selector attempts Compositor work
activate-deactivate-dense-animations 0.0ms → 0.0ms (0%) 20756ms → 20030ms (-3%) 19567ms → 18740ms (-4%) 583ms → 575ms (-1%) 642ms → 617ms (-4%) 161KB → 164KB (+2%) 0 → 0 (0%) 173% → 172% (-1%) 36% → 36% (0%) 137% → 136% (-1%)
activate-large-dom-sparse-animations 0.0ms → 0.0ms (0%) 444ms → 348ms (-22%) 1273ms → 1237ms (-3%) 83.3ms → 75.0ms (-10%) 108ms → 108ms (0%) 159KB → 158KB (-1%) 0 → 0 (0%) 172% → 173% (+1%) 81% → 82% (+2%) 89% → 89% (0%)
activate-with-many-animations 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 25.0ms (+50%) 25.1ms → 33.3ms (+33%) 168KB → 164KB (-2%) 0 → 0 (0%) 213% → 210% (-1%) 133% → 131% (-2%) 77% → 77% (0%)
arrow-navigation-storm 40.0ms → 32.0ms (-20%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 133KB → 127KB (-5%) 0 → 0 (0%) 87% → 80% (-8%) 34% → 29% (-16%) 50% → 49% (-3%)
context-menu-arrow-navigation 40.0ms → 40.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 256KB → 207KB (-19%) 1 → 1 (0%) 171% → 174% (+2%) 130% → 132% (+1%) 38% → 39% (+3%)
context-menu-open-close-cycle 32.0ms → 32.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 277KB → 278KB (0%) 1 → 1 (0%) 110% → 110% (-1%) 76% → 76% (-1%) 29% → 29% (0%)
copy-multi-element-batch 44.0ms → 44.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 278KB → 286KB (+3%) 1 → 1 (0%) 96% → 96% (0%) 30% → 30% (0%) 63% → 63% (-1%)
copy-then-deactivate-stress 64.0ms → 56.0ms (-12%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 33.4ms → 33.3ms (0%) 118KB → 104KB (-12%) 0 → 0 (0%) 180% → 176% (-2%) 120% → 118% (-2%) 55% → 54% (-2%)
copy-under-saturated-network 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 389KB → 349KB (-10%) 2 → 2 (0%) 107% → 106% (-1%) 88% → 87% (-1%) 19% → 18% (-3%)
copy-under-saturated-network (sourceResolveMs) 8006ms → 8010ms (0%)
deactivate-with-many-frozen-elements 60.0ms → 48.0ms (-20%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 25.0ms → 16.8ms (-33%) 474KB → -22KB (-105%) 0 → 0 (0%) 117% → 110% (-6%) 43% → 37% (-13%) 71% → 69% (-3%)
deep-element-stack-hover 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 105KB → 106KB (+1%) 0 → 0 (0%) 131% → 132% (0%) 97% → 98% (+1%) 30% → 31% (+1%)
dom-rerender-during-selection 36.0ms → 32.0ms (-11%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 25.1ms → 25.0ms (0%) 143KB → 190KB (+33%) 7 → -7 (-200%) 160% → 158% (-1%) 90% → 88% (-2%) 58% → 57% (-1%)
drag-commit-massive-grid 1604ms → 1604ms (0%) 6642ms → 6731ms (+1%) 6687ms → 6701ms (0%) 558ms → 558ms (0%) 1567ms → 1567ms (0%) 463KB → 287KB (-38%) 14 → 1 (-93%) 115% → 115% (0%) 7% → 7% (0%) 107% → 107% (0%)
drag-freeze-animation-storm 904ms → 916ms (+1%) 2973ms → 2607ms (-12%) 3221ms → 2840ms (-12%) 150ms → 150ms (0%) 850ms → 875ms (+3%) 336KB → 332KB (-1%) 0 → 0 (0%) 153% → 154% (+1%) 29% → 30% (+1%) 120% → 120% (0%)
drag-rapid-zigzag 48.0ms → 48.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 178KB → 174KB (-2%) 4 → 4 (0%) 66% → 65% (-2%) 22% → 21% (-2%) 34% → 34% (-1%)
drag-selection-sweep 40.0ms → 48.0ms (+20%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 196KB → 168KB (-14%) 4 → 0 (-100%) 33% → 32% (-3%) 10% → 10% (0%) 19% → 18% (-7%)
drag-sweep-massive-grid 468ms → 748ms (+60%) 🔴 worse 9979ms → 11083ms (+11%) 9853ms → 10987ms (+12%) 450ms → 583ms (+30%) 600ms → 858ms (+43%) 🔴 worse 724KB → 633KB (-13%) 8 → 8 (0%) 107% → 107% (0%) 8% → 6% (-22%) 93% → 96% (+4%)
drag-with-autoscroll 64.0ms → 56.0ms (-12%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 33.4ms → 33.3ms (0%) 216KB → 157KB (-27%) 19 → 18 (-5%) 50% → 44% (-12%) 16% → 13% (-16%) 27% → 25% (-7%)
heavy-all-activate-toggle 0.0ms → 0.0ms (0%) 55.0ms → 58.5ms (+6%) 1286ms → 1150ms (-11%) 66.7ms → 58.3ms (-12%) 83.3ms → 91.7ms (+10%) 166KB → 134KB (-19%) 0 → 0 (0%) 156% → 155% (-1%) 41% → 38% (-8%) 113% → 115% (+2%)
heavy-all-copy-cross-section 152ms → 144ms (-5%) 433ms → 435ms (0%) 457ms → 457ms (0%) 91.7ms → 83.3ms (-9%) 100ms → 100ms (0%) 338KB → 223KB (-34%) -5 → -5 (0%) 127% → 125% (-2%) 22% → 22% (-4%) 103% → 102% (-2%)
heavy-all-drag-sweep 236ms → 220ms (-7%) 383ms → 327ms (-15%) 432ms → 407ms (-6%) 33.4ms → 25.1ms (-25%) 192ms → 192ms (0%) 266KB → 318KB (+20%) 0 → 3 (was 0) 110% → 107% (-2%) 21% → 20% (-3%) 77% → 74% (-4%)
heavy-all-scroll-during-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 33.3ms → 33.4ms (0%) 5630KB → 5493KB (-2%) 0 → 0 (0%) 118% → 119% (+1%) 42% → 43% (+3%) 73% → 72% (-1%)
heavy-charts-activate-cycle 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 33.4ms (+99%) 48KB → 43KB (-10%) 0 → 0 (0%) 109% → 113% (+4%) 24% → 23% (-3%) 84% → 88% (+6%)
heavy-charts-drag-select 72.0ms → 72.0ms (0%) 0.0ms → 0.0ms (0%) 59.2ms → 55.1ms (-7%) 16.8ms → 16.8ms (0%) 49.9ms → 33.3ms (-33%) 139KB → 195KB (+40%) 0 → 7 (was 0) 74% → 73% (-1%) 18% → 17% (-6%) 48% → 48% (-1%)
heavy-charts-hover-in-selection-mode 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 77KB → 78KB (+1%) 0 → 0 (0%) 32% → 31% (-2%) 10% → 10% (-2%) 20% → 20% (-2%)
heavy-charts-tooltip-sweep-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) -407KB → -404KB (+1%) 0 → 0 (0%) 81% → 77% (-5%) 8% → 7% (-6%) 69% → 66% (-5%)
heavy-dashboard-drag-sweep 56.0ms → 56.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 33.3ms → 33.3ms (0%) 241KB → 293KB (+22%) 1 → 7 (+600%) 57% → 55% (-3%) 17% → 17% (+1%) 30% → 29% (-4%)
heavy-dashboard-hover-sweep 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 124KB → 126KB (+2%) 4 → 4 (0%) 74% → 74% (-1%) 36% → 36% (0%) 35% → 35% (-2%)
heavy-dashboard-selection-under-rerender 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 104KB → 97KB (-7%) 0 → 0 (0%) 14% → 14% (-1%) 7% → 7% (0%) 7% → 7% (-5%)
heavy-heatmap-crosshair-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 33.4ms → 33.4ms (0%) -409KB → -402KB (+2%) 0 → 0 (0%) 126% → 126% (0%) 11% → 11% (+1%) 110% → 110% (0%)
heavy-heatmap-hover-in-selection-mode 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) -242KB → -255KB (-5%) 0 → 0 (0%) 78% → 80% (+2%) 33% → 34% (+2%) 41% → 42% (+2%)
heavy-table-drag-select-rows 72.0ms → 64.0ms (-11%) 0.0ms → 0.0ms (0%) 54.5ms → 52.8ms (-3%) 16.8ms → 16.8ms (0%) 33.3ms → 33.3ms (0%) 170KB → 171KB (+1%) 2 → 4 (+100%) 70% → 64% (-8%) 19% → 18% (-7%) 38% → 36% (-6%)
heavy-table-expand-rows-passive 112ms → 120ms (+7%) 772ms → 712ms (-8%) 797ms → 741ms (-7%) 50.0ms → 50.0ms (0%) 83.4ms → 83.4ms (0%) -428KB → 78KB (+118%) 0 → 0 (0%) 70% → 72% (+3%) 6% → 6% (+1%) 60% → 62% (+3%)
heavy-table-filter-typing-passive 212ms → 192ms (-9%) 1485ms → 1367ms (-8%) 2045ms → 1720ms (-16%) 66.7ms → 50.0ms (-25%) 183ms → 183ms (0%) -2337KB → 2271KB (+197%) 🔴 worse 1 → 1 (0%) 104% → 95% (-9%) 3% → 3% (+1%) 98% → 89% (-9%)
heavy-table-hover-in-selection-mode 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 71KB → 65KB (-8%) 4 → 4 (0%) 100% → 84% (-17%) 45% → 35% (-23%) 🟢 better 52% → 46% (-11%)
heavy-table-multi-select-copy 72.0ms → 64.0ms (-11%) 0.0ms → 0.0ms (0%) 33.0ms → 36.8ms (+11%) 16.8ms → 16.8ms (0%) 33.4ms → 33.3ms (0%) -382KB → -360KB (+6%) -143 → -143 (0%) 85% → 84% (-2%) 25% → 25% (+2%) 58% → 55% (-4%)
heavy-table-paginate-passive 160ms → 160ms (0%) 1526ms → 1516ms (-1%) 1631ms → 1624ms (0%) 83.4ms → 83.4ms (0%) 117ms → 117ms (0%) -443KB → 27KB (+106%) 0 → 0 (0%) 80% → 79% (-2%) 4% → 4% (-7%) 72% → 70% (-2%)
heavy-table-sort-passive 272ms → 264ms (-3%) 3688ms → 3028ms (-18%) 4258ms → 3938ms (-8%) 83.3ms → 50.0ms (-40%) 🟢 better 233ms → 233ms (0%) 810KB → -138KB (-117%) 🟢 better 0 → 0 (0%) 79% → 84% (+7%) 3% → 3% (+4%) 71% → 76% (+7%)
heavy-virtual-hover-sweep 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 81KB → 85KB (+5%) 4 → 4 (0%) 56% → 57% (+2%) 25% → 26% (+2%) 28% → 27% (-2%)
heavy-virtual-scroll-during-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 232KB → 231KB (0%) 0 → 0 (0%) 102% → 103% (+1%) 42% → 42% (+1%) 57% → 58% (+1%)
heavy-virtual-scroll-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) -127KB → -430KB (-239%) 0 → 0 (0%) 87% → 87% (0%) 18% → 18% (0%) 64% → 65% (0%)
hover-deep-nested-dom 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 99KB → 99KB (0%) 0 → 0 (0%) 126% → 127% (+1%) 91% → 91% (+1%) 33% → 34% (+2%)
hover-dense-flat-dom 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 59KB → 54KB (-8%) 0 → 0 (0%) 184% → 185% (0%) 130% → 129% (0%) 51% → 52% (+1%)
hover-in-selection-mode 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 138KB → 155KB (+12%) 0 → 0 (0%) 63% → 61% (-3%) 28% → 28% (-2%) 32% → 30% (-4%)
hover-over-animated-elements 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 50KB → 54KB (+8%) 0 → 0 (0%) 92% → 92% (-1%) 74% → 73% (-2%) 16% → 16% (0%)
idle-after-activation 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 124KB → 124KB (0%) 0 → 0 (0%) 105% → 105% (0%) 87% → 86% (-1%) 18% → 18% (+3%) 162/s → 180/s (+11%) 0% → 0% (0%) -0% → -1% (-8%) -1% → 0% (+152%) -1% → -0% (+95%) 10fps → 10fps (0%) 19% → 17% (-13%) 0 → 0 (0%) 0.0× → 0.0× (0%) 0.0× → 0.0× (0%) 25.4ms → 26.4ms (+4%) 0.0ms → 0.0ms (0%) 0 → 0 (0%) 1653ms → 1778ms (+8%)
interference-canvas-hover-markers 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 60KB → 49KB (-18%) 0 → 0 (0%) 78% → 70% (-10%) 41% → 36% (-12%) 33% → 32% (-3%)
interference-canvas-paint-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 1KB → 1KB (0%) 0 → 0 (0%) 45% → 45% (-1%) 22% → 21% (-2%) 23% → 23% (0%)
interference-editor-hover-with-swallowed-pointermove 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 45KB → 49KB (+9%) 0 → 0 (0%) 44% → 44% (0%) 25% → 26% (+3%) 17% → 17% (0%)
interference-editor-typing-passive 24.0ms → 24.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) -47KB → -48KB (-2%) 0 → 0 (0%) 76% → 75% (-1%) 7% → 7% (+3%) 62% → 61% (-2%)
interference-gauntlet-activate-toggle 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 25.0ms → 16.8ms (-33%) 25.1ms → 25.0ms (0%) 172KB → 201KB (+17%) 12 → 12 (0%) 185% → 185% (0%) 55% → 57% (+2%) 127% → 126% (-1%)
interference-gauntlet-drag-sweep 104ms → 108ms (+4%) 177ms → 183ms (+3%) 189ms → 193ms (+2%) 16.8ms → 16.8ms (0%) 66.7ms → 75.0ms (+12%) 495KB → 475KB (-4%) 65 → 65 (0%) 196% → 190% (-3%) 61% → 57% (-6%) 108% → 106% (-2%)
interference-gauntlet-hover-sweep 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 79KB → 77KB (-3%) 0 → 0 (0%) 165% → 156% (-5%) 65% → 60% (-8%) 97% → 93% (-4%)
interference-hijacked-scroll-during-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 114KB → 97KB (-15%) 0 → 0 (0%) 62% → 55% (-11%) 29% → 27% (-7%) 31% → 26% (-16%)
interference-hijacked-scroll-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 72KB → 65KB (-10%) 0 → 0 (0%) 51% → 45% (-13%) 28% → 24% (-15%) 22% → 19% (-12%)
interference-kanban-app-drag-passive 24.0ms → 24.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 88KB → 89KB (+1%) 0 → 0 (0%) 58% → 60% (+3%) 3% → 4% (+19%) 48% → 49% (+3%)
interference-kanban-grab-drag-select 56.0ms → 56.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 33.3ms → 33.2ms (0%) 169KB → 168KB (-1%) 4 → 4 (0%) 66% → 65% (-2%) 15% → 15% (0%) 30% → 29% (-5%)
interference-kanban-hover-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 46KB → 45KB (-2%) 0 → 0 (0%) 70% → 70% (-1%) 37% → 35% (-7%) 31% → 32% (+5%)
interference-raf-mutator-hover 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) -432KB → -443KB (-3%) 0 → 0 (0%) 115% → 115% (0%) 52% → 52% (0%) 61% → 61% (0%)
interference-toast-hover-churn 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 26KB → 83KB (+219%) 0 → 0 (0%) 87% → 87% (0%) 57% → 58% (+1%) 27% → 26% (-4%)
interference-toast-storm-idle-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 28KB → 15KB (-46%) 0 → 0 (0%) 14% → 13% (-6%) 9% → 9% (-4%) 4% → 4% (-8%)
interference-waapi-freeze-cycle 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 52KB → 53KB (+2%) 0 → 0 (0%) 152% → 154% (+1%) 51% → 52% (+3%) 99% → 97% (-1%)
interference-waapi-hover-sweep 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) -447KB → -451KB (-1%) 0 → 0 (0%) 117% → 117% (0%) 52% → 53% (+1%) 62% → 62% (0%)
keyboard-rapid-arrows 40.0ms → 40.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 45KB → 45KB (0%) 0 → 0 (0%) 169% → 171% (+1%) 116% → 117% (0%) 50% → 51% (+3%)
large-drag-selection 56.0ms → 56.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 51.2ms (was 0) 16.8ms → 16.8ms (0%) 33.3ms → 33.3ms (0%) -84KB → 159KB (+289%) 1 → 1 (0%) 58% → 58% (0%) 14% → 14% (+1%) 31% → 31% (-1%)
pointermove-storm-synthetic 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 33.4ms → 33.4ms (0%) 50.0ms → 33.4ms (-33%) 76KB → 43KB (-43%) 0 → 0 (0%) 127% → 124% (-2%) 23% → 22% (-4%) 105% → 100% (-5%)
prompt-mode-typing 32.0ms → 32.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 185KB → 185KB (0%) 1 → 1 (0%) 124% → 122% (-2%) 77% → 76% (-2%) 42% → 41% (-2%)
rapid-toggle-active-inactive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 169KB → 169KB (0%) 0 → 0 (0%) 164% → 167% (+2%) 101% → 102% (+1%) 60% → 62% (+4%)
scroll-during-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 140KB → 140KB (0%) 0 → 0 (0%) 152% → 156% (+2%) 116% → 117% (+1%) 34% → 35% (+1%)
toolbar-collapse-expand-cycle 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 110KB → 109KB (-1%) 0 → 0 (0%) 122% → 123% (+1%) 88% → 88% (+1%) 33% → 34% (+1%)
toolbar-drag-to-edges 52.0ms → 48.0ms (-8%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) -119KB → -124KB (-4%) 0 → 0 (0%) 132% → 133% (+1%) 92% → 92% (0%) 35% → 36% (+1%)
viewport-resize-during-selection 0.0ms → 0.0ms (0%) 186ms → 25.5ms (-86%) 0.0ms → 0.0ms (0%) 66.7ms → 50.0ms (-25%) 83.3ms → 66.7ms (-20%) 59KB → 56KB (-5%) 0 → 0 (0%) 156% → 167% (+7%) 76% → 85% (+12%) 77% → 80% (+3%)
All 5 animation scheduling controls (full numbers)
Control Active graphics-pipeline CPU Graphics CPU over paused Animation ticks Draws per animation tick Compositor frame production Compositor production duty cycle Active animation timeline duty
animation-scheduling-controls/finite-static-holds 99% → 100% (0%) 1% → 1% (-46%) 173/s → 168/s (-3%) 0.1× → 0.0× (-32%) 14fps → 14fps (-4%) 24% → 23% (-4%) 23% → 22% (-5%)
animation-scheduling-controls/infinite-stepped 80% → 80% (0%) -0% → 2% (+16650%) 🔴 worse 169/s → 166/s (-2%) 0.0× → 0.0× (0%) 4fps → 4fps (0%) 7% → 7% (+2%) 100% → 100% (0%)
animation-scheduling-controls/legacy-one-indicator 77% → 78% (+1%) 3% → 3% (-2%) 156/s → 155/s (-1%) 0.3× → 0.3× (-2%) 59fps → 60fps (+1%) 100% → 100% (0%) 100% → 100% (0%)
animation-scheduling-controls/animations-paused 180/s → 180/s (0%) 0.0× → 0.0× (0%) 0fps → 0fps (0%) 0% → 0% (0%) 0% → 0% (0%)
animation-scheduling-controls/legacy-production-count 101% → 103% (+1%) 8% → 7% (-12%) 163/s → 157/s (-3%) 0.3× → 0.3× (-2%) 60fps → 60fps (0%) 100% → 100% (0%) 100% → 100% (0%)

Commit 0e24a15 · full reports in the perf-bench-587 artifact.

@vercel

vercel Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
react-grab-storybook Ready Ready Preview, Comment Jul 24, 2026 3:09am
react-grab-website Ready Ready Preview, Comment Jul 24, 2026 3:09am

@aidenybai aidenybai changed the title add Expo native test harness add Expo and React Native test harnesses Jul 18, 2026
@aidenybai aidenybai changed the title add Expo and React Native test harnesses add host-target architecture and native harnesses Jul 18, 2026
@aidenybai
aidenybai marked this pull request as ready for review July 23, 2026 06:57
Comment thread packages/react-grab/src/web-target-adapter.ts
Comment thread packages/react-grab-native/src/react-grab-native.tsx
Comment thread packages/react-grab-native/src/react-grab-native.tsx
Comment thread packages/react-grab/src/web-target-adapter.ts Outdated
Comment thread packages/react-grab/src/web-target-adapter.ts Outdated
Comment thread packages/react-grab-native/src/react-grab-native.tsx
Comment thread packages/native-e2e/tests/native-smoke.spec.ts
Comment thread packages/react-grab/src/web-target-adapter.ts Outdated
Comment thread packages/react-grab/src/web-target-adapter.ts
Comment thread packages/react-grab-native/src/native-target-registry.ts Outdated
Comment thread .github/workflows/test-native.yml Outdated
Comment thread packages/react-grab/src/web-target-adapter.ts
Comment thread packages/react-grab-native/src/react-grab-native.tsx

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f326b12. Configure here.

Comment thread packages/react-grab-native/src/native-target-registry.ts Outdated
Comment thread packages/react-grab-native/src/react-grab-target.tsx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant