feat(perf): time every Android command against the fixture app

Merged
TH
17h ago
+1103-784

Summary

Android now runs the iOS command suite against the fixture app. One shared suite.ts holds the steps, and platform deltas are data (only, on.android). One harness, suite-harness.ts, owns rounds, sessions, and daemon restarts. The Settings tour is removed. 30 files changed.

  • Platform-only steps: Android has hardware-button, push, and telephony. iOS has action-button, prepare, clipboard, and home-reads/snapshot-forced-tree.
  • Heavy feed: raw depth must be ≥56. snapshot-raw-one-shot restarts the daemon with AGENT_DEVICE_ANDROID_SNAPSHOT_HELPER_SESSION=0 and must be served by instrumentation (ADR 0002).
  • Profiles: each Android helper capture timer records its typed transport, and the session timer also records answered. profile.ts reads these fields and no longer infers the transport from event order.
  • Nightly: Android runs on schedule and uploads summary and raw artifacts. perf:compare gains --platform.

Validation

  • At 1fddbe9d0f, heavy-feed ran twice on an API 35 emulator (3 rounds + 1 warmup), with 0 failed samples. In run 2, the session steps were served by persistent-session ×3 and the one-shot step by instrumentation ×3. In every sample, the profile matches the response.
  • At 70faef463c, Android heavy-feed,automation and iOS home-reads,heavy-feed ran clean, apart from the 3 known iOS heavy-feed gaps.
  • vitest scripts/perf passed 45/45. The platform-android snapshot* tests passed 190/190.
  • pnpm check:affected --run --head 1fddbe9d0f passed (exactCommit: true, 37 passed, 22 GitHub-authoritative skips).
  • Risk: the nightly Android route runs only on schedule or workflow_dispatch.

🤖 Generated with Claude Code