Skip to content

0.0.86

Choose a tag to compare

@github-actions github-actions released this 16 Oct 13:02
· 2761 commits to main since this release

Changed

  • Split src/utils/android-cmdline-tools/EmulatorLauncher.ts below the 1,000-line cap (#12677)
  • Split src/server/observeWaitEvaluation.ts below the 1,000-line cap (#12676)
  • build(android): set targetSdk 37 and Build-Tools 37 (#12276) (android)
  • ctrlproxy: audit Android 17 behaviour changes for targetSdk 37 (#12274) (android)
  • refactor(ios xctestrunner): share JSON-RPC encode/extract helpers between the two MCP clients (#11893) (ios)
  • refactor(ios control-proxy): collapse repeated failure-response construction in the SDK-backed handlers (#11892) (ios)
  • refactor(ios sdk): split SdkHierarchyServer into an HTTP reader and a route table (#11891) (ios, sdk)
  • refactor(ios xctestrunner): replace 1,303 lines of hand-rolled YAML scanning (#11889) (ios, needs-decision)
  • refactor(ios control-proxy): retire the Rewrite name and the reference-implementation narrative (#11888) (ios)
  • chore(ios control-proxy): delete dead code left by the rewrite migration (#11887) (ios, dead-code)
  • refactor(ios control-proxy): split the 3,372-line GesturePerformer by concern (#11884) (ios)
  • chore(android): delete verified-dead code in junit-runner, control-proxy and the root build script (#11880) (android, dead-code)
  • chore(scripts): one prepush dispatcher that selects gates from changed paths (#11873) (devxp)
  • chore(test): remove raw NUL bytes from two test sources and guard against them (#11869) (testing)
  • refactor(db): load the main migration set from static imports, as the slot registry does (#11861) (database)
  • chore(deps): drop tsx and ts-prune, and reconcile knip with the pinned runtime graph (#11855) (dependencies)
  • refactor(ctrlproxy): separate process-wide APK/bundle prefetch state from the per-device managers (#11852)
  • refactor(device-state): split DeviceState.ts by sub-state (#11842)
  • chore(tools): one registerAllTools list instead of five hand-copied ones (#11829)
  • refactor(devicePool): derive device availability from one function returning a typed hold reason (#11803) (daemon)
  • refactor(db): make DeviceSessionPersistence methods required, with one complete in-memory fake (#11801) (testing, database, daemon)

Fixed

  • killDevice: fail closed when the emulator process table is unreadable instead of reporting 'not running' (#12772)
  • Session broker: post-activation receipt read failure destroys a committed grant (#12771) (database, daemon)
  • Session broker: final ownership hold ignores preparation deadline and cancellation (#12770) (daemon)
  • Terminal release generation guard: withheld-settlement race can still drop a legitimate terminal write (#12547) (daemon)
  • session broker: fence broker session owners by process start identity (PID reuse) (#12491) (daemon)
  • emulator output redaction: multi-byte character split across chunks can defeat credential redaction (#12467)
  • getAppPermissions (iOS): photos-add reports denied from a stale TCC row after revoke then full grant (#12462) (ios)
  • ci: npm unpacked size 22.36 MB exceeds the 21 MiB threshold, failing Node Checks on every TS PR (#12457) (ci)
  • Database health: slow probe-worker startup repeatedly consumes the 1s query deadline (#12455) (database, needs-device-verify, daemon)
  • Session broker: retryable preparation failures become nonretryable session_preparation_failed (#12452) (android, daemon)
  • Session broker: recovery sweep destroys resources during recoverable device-restart handoff (#12451) (android, daemon)
  • ci: Node Unit Tests (ubuntu-latest) hit the 720 s shard budget on both attempts on a starved runner; same-runner retry cannot recover (#12237) (ci)
  • serial-reuse handoff: release listeners and in-flight releases still send device commands to the serial now running another AVD (#12063) (android, daemon)
  • libwebp cache ignores AUTOMOBILE_DATA_DIR; /proc process-table reader tested with a non-captured fixture (#11998)
  • CI: the nightly randomized unit lane fails every night on order-dependent tests (#11614) (testing)
  • session persistence: the activity stale guard compares wall stamps, so a backward wall-clock step drops genuine activity (#11497) (daemon, needs-decision)

Security

  • feat(ci-attestation): GitHub App as transport between CI and the attestation service (#11981) (enhancement, ci)
  • refactor(utils): one path-containment helper and one cached-download-and-verify workflow (#11857) (maintenance)

Other

  • ci: decide contended-runner reruns inside the unit job instead of a workflow_run trigger on every run (#12758) (ci)
  • main red: On Merge continuously failing 24h+ with deterministic non-flake test failures (structured-output audit + BATS) the PR gate isn't catching (#12755) (bot-filed, needs-human, routine:flake-sentinel)
  • sendKeys cancel still splices on API 36 after #12576 (host adb client exits before the app has consumed the typed events) (#12599)
  • sendKeys cancel still splices follow-up text on API 36 after #12545 (guest settlement waits on a dead cmd client) (#12566)
  • sendKeys cancel: follow-up text still garbles because the guest 'input text' process outlives the killed adb client (#12506 not effective) (#12524)
  • Terminal release write carries no row generation and can land on a re-upserted row (#12515)
  • Terminal-release journal: record() swallows append failure, no dir fsync on create, silent mid-file corruption (#12514)
  • bug(session): re-issue of a device-restart row ignores a lapsed recovery window for an in-flight caller (#12502)
  • DB health probe reuses a dead worker after a clean (code 0) exit (#12500)
  • Flaky (unnamed) failure in restartEndToEnd: twoDaemon harness leaks a wedged tracked DB write into the shared barrier (#12499)
  • session broker: delegate timing, shared-process test classification and PR-body corrections before shipping (#12492) (daemon)
  • getAppPermissions reports photos-add granted after a full photos grant on iOS 26.5, where PhotoKit says not authorized (#12486)
  • iOS prototype onDoubleTap still never fires: host double tap lands outside the agent's 0.35 s window (#12485)
  • CtrlProxy pushes no device_state transitions on Pixel Fold emulator after WindowInfoTracker switch (#12460)
  • iOS prototype onDoubleTap never fires; double tap arrives as two onTap events (#12459)
  • prototype(ios): Swift menus / pager-options / emit-context validators don't walk stack screens (#12414) (ios, bot-filed, routine:tracker-hygiene)
  • MCP tools/call cancel after dispatch frees the per-device forward key while the tool may still be writing (InputText) (#12393)
  • test(lint): oxlintConfigScoping.integration.test.ts can hang under load and leaves oxlint-scoping-* temp dirs in src/ and test/ (#12346)
  • testing: keep Robolectric suites working when targetSdk is 37 (SDK pins, Robolectric SDK 37 support) (#12272) (android, testing, dependencies)
  • Live Idle Release nightly is failing (#12250) (live-idle-release-nightly)
  • manual-test harness: no host power/sleep preflight and all roles boot at once — batch 20261013a was cut by two clamshell sleeps and a load-172 spike (#12212) (testing)
  • perf(ctrlproxy): own-window accessibility events cost two binder calls on the UI thread each, and nothing limits their volume (#12134) (android, performance, a11y)
  • Managed slots: qualify and publish the hardened package with native recovery evidence (#12060) (release engineering, testing, daemon)
  • test(ios ctrlproxy): close the wire-contract gaps between the Swift runner and the TS client (#11890) (ios, testing)
  • docs(android): state the DI position for in-scope modules (#11883) (documentation, android)
  • test(protocol): guard field-level and response-level wire parity between Kotlin and TypeScript with shared fixtures (#11879) (android, testing)
  • docs(agents): move dated and hand-counted facts out of CLAUDE.md and AGENTS.md (#11875) (documentation, devxp)
  • test(db): check that the hand-written Database interface matches the migrated schema (#11860) (testing, database)
  • hitTest: out-of-bounds error names tapAt instead of hitTest (#11662) (bot-filed, routine:exploratory)
  • cli: displayConfig --fontScale is rejected as a string, so a numeric font scale cannot be set from the CLI (#11661) (bot-filed, routine:exploratory)
  • displayConfig (Android): density has no upper bound; 100000 is applied and puts system_server into an ANR (#11660) (bot-filed, routine:exploratory)
  • pinchOn (Android): gestures stall for the full 8 s idle timeout when the foreground package's gfxinfo has no frame stats (#11659) (bot-filed, routine:exploratory)

CtrlProxy APK

SHA256 Checksum: 49ce5a2cc5cbc6f1cf5d05652793707d17ac795383f054296f9fe2777309300d

Download the APK from the release assets below.

CtrlProxy iOS IPA

SHA256 Checksum: 95e1619c2b9c2de8125f30ac741bc584d82452ad07636a0aba0204cbb9e6502f

Download the IPA from the release assets below.

video-server jar

SHA256 Checksum: 943adc314a3a573108619cba3326b2a07ae42c9d631b15bb284e480115e639ab

Download automobile-video.jar from the release assets below.

macOS screen-capture-helper

SHA256 Checksum: 369d76f31b01eb9a4b3423749680e9e29b625a7437f18eb3b41a9c23a3321aa5

Download screen-capture-helper-macos-universal.zip from the release assets below.

iOS simulator prototype agent

SHA256 Checksum: a7566c028ddc75d621096ebee255a9d040c75f638d65d542376578e109e5cd21

Download AutoMobilePrototypeAgent.dylib (universal arm64 + x86_64, ad-hoc signed) from the release assets below.

iOS simulator prototype viewer

SHA256 Checksum: 7d96eb2096c9783d98693aafa54d6b956d89a66bfbd8b34bee7c7742946cd5c6

Download AutoMobilePrototypeViewer.zip (universal arm64 + x86_64, ad-hoc signed) from the release assets below.

macOS network-filter

SHA256 Checksum: d711d57ddd831477c9f08164954b7605e7f77027959e24eca282f95e396401ac

Download automobile-network-filter-macos-universal.zip from the release assets below.

Desktop App

Native installers are attached below: macOS .dmg (signed & notarized), Windows .msi, and Linux .deb.