feat(gesture): add gesture tap with 2 to 5 simultaneous contacts

Merged
CA
12h ago
+2022-149

Summary

Adds gesture tap: 2–5 distinct contacts, --hold-ms (default 50), and optional --count/--pause-ms for touch-heavy apps.

agent-device gesture tap 80 300 200 450 310 600 --count 20 --pause-ms 100
client.interactions.tapGesture({ points: [{ x: 80, y: 300 }, { x: 200, y: 450 }] })
  • Renames topology two to multi; motion gestures retain two contacts.
  • Extends iOS runner and Android helper to 2–5 stationary contacts. WebDriver requires explicit tapGesture support.
  • Replans each repetition against a fresh viewport. Series must fit 60 seconds, including 500 ms overhead allowance per tap.
  • Shares tap/swipe repetition orchestration. Cancellation interrupts pauses, propagates the typed reason, and records no partial action.
  • Updates ADR 0013 and GestureLab contact counters.

74 files. Scope includes swipe pause cancellation. No linked issue.

Validation

  • Node 22: pnpm check:affected --run --head e86c9d5d805b67f27ee29d227eb0ac724b7dd411 passed; receipt run-zcsUeI, exactCommit=true. Fixture commits used process-scoped commit.gpgsign=false after a host GPG allocation failure reproduced on 58eeb1239; selector tests pass 79/79 on both SHAs with that setting.
  • Cancellation evidence and receipt: 16 focused tests pass. Removing either boundary guard fails its regression. Fresh iPhone 17 Pro simulator/iOS 26.1 runs confirm tap/swipe pause cancellation and no recorded action at this head.
  • Earlier GestureLab/contact-count runs on simulator, Android Seeker, and iPhone 12 remain at 7e653abd.
  • CI coverage, integration, and native lanes remain required. No fresh live Android ANR, iPadOS, Android emulator, or Limrun evidence. The 500 ms allowance remains an estimate.