Releases: callstack/agent-device
Release list
v0.20.0: Redesigned Gestures, Broader Maestro Compatibility, and Repairable Scripts
Agent Device v0.20 gives coding agents a more dependable path from exploring an app to running the resulting workflow again. The release redesigns gesture execution, expands Maestro YAML compatibility, and turns .ad recordings into reusable scripts that agents can diagnose and repair when an interface changes.
One gesture system across every surface
Gestures now pass through one normalization and planning model across the CLI, Node.js client, MCP, replay, Android, and Apple platforms.
Pan, fling, swipe, pinch, rotate, transform, and two-finger pan use explicit, viewport-aware pointer trajectories. Agent Device validates every planned point before injection, preserves authored timing, and reports an actionable error when the requested motion cannot fit inside the active app.
Android gestures now run through the persistent automation helper, which owns snapshot capture, viewport resolution, and touch injection. iOS simulator multitouch consumes the same canonical plans through native XCTest synthesis.
The result is consistent gesture intent across live commands, .ad replay, and Maestro flows.
Maestro compatibility through a typed engine
Maestro YAML now runs through a source-preserving typed interpreter built directly into Agent Device. Commands retain their source paths and line numbers while the engine handles hooks, includes, environment values, conditions, repeat and retry blocks, observations, and gestures.
v0.20 also expands the supported Maestro subset:
- Numeric options accept
${VAR}lookup interpolation. optionalcomposes withscrollUntilVisibleandextendedWaitUntil.- Visibility assertions accept
childOfancestor scoping. scrollUntilVisibletargets the correct scroll container.- Maestro swipe behavior follows the redesigned gesture system on Android and iOS.
Compatibility is checked against generated, version-pinned Maestro fixtures. Unsupported syntax still fails explicitly, so agents do not mistake partial execution for a passing flow.
Reusable and fixable .ad scripts
Agents can turn a live exploration into a deterministic .ad script, replay it later, and repair it when the app drifts.
A replay divergence now includes a bounded screen report, ranked selector suggestions, and a plan-bound resume point. The agent can inspect the current state, perform the correct action, continue from the safe step, and publish the repaired script atomically. Earlier successful steps do not need to run again.
v0.20 also adds active-session publication:
agent-device open com.example.app --save-script=checkout.ad
# Navigate through the app
agent-device wait 'role="heading" label="Checkout"'
agent-device session save-scriptsession save-script publishes the recording without closing the app. The resulting script can recreate the journey from a cold start, stop at a verified destination, and return an active session for the agent’s next task.
Recorded input values are written literally to .ad files. Use non-secret fixture credentials until parameterized recording is available.
Migration notes
v0.20 removes several deprecated gesture forms:
- Use
orientationfor device rotation. The oldrotatealias has been removed. - Use
gesture rotatefor a two-finger rotation. - Use
gesture panwhen authored duration matters. Timedswipeandflinginputs have been removed. - Capture a fresh snapshot or use selectors between ref-based mutations. Session ref frames now expire after mutation to prevent stale
@refactions.
Validation: The claims above are grounded in the v0.20 tag and accepted architecture records. I treated this as release-highlight copy rather than a complete changelog and kept the three requested themes central.
What's Changed
- refactor: remove redundant facade exports by @thymikee in #1204
- feat: parse and preserve .ad target-v1 evidence (ADR 0012 migration step 3) by @thymikee in #1196
- fix: honor session metro hints and expo dev-client bundle urls by @thymikee in #1199
- fix: scope Android settle diffs to app content and collapse IME chrome by @thymikee in #1200
- feat: add Android test IME helper for deterministic text entry (#1198) by @thymikee in #1201
- feat(replay): ADR 0012 migration step 2 — structured replay divergence report by @thymikee in #1197
- refactor: keep command and daemon-route owner-file claims tooling-only (#1178) by @devin-ai-integration[bot] in #1192
- feat: disclose selector resolution in interaction responses by @thymikee in #1193
- refactor: consolidate architecture ownership and client results by @devin-ai-integration[bot] in #1210
- Project navigation contracts and add a network digest by @devin-ai-integration[bot] in #1208
- fix(macos): allow XCTest teardown before runner kill by @lott-ai in #1206
- fix: unbreak main — repoint relocated request-progress/cancel imports by @thymikee in #1215
- feat(replay): ADR 0012 migration steps 5+6 — resume + --update retirement by @thymikee in #1211
- chore: close out architecture experiments by @devin-ai-integration[bot] in #1213
- fix: preserve Maestro coordinate swipes on Android by @thymikee in #1207
- feat(replay): ADR 0012 migration step 4 — target-binding verification enforcement by @thymikee in #1209
- fix(mcp): advertise public Apple platform leaves in boot/shutdown/prepare output schemas by @devin-ai-integration[bot] in #1224
- fix: wrap replay selector-miss as REPLAY_DIVERGENCE (repair-loop regression) by @thymikee in #1223
- docs: ADR-0012 Decision 6 (agent-supervised re-record repair) by @thymikee in #1226
- feat(replay): ADR 0012 decision 6 — agent-supervised re-record repair by @thymikee in #1228
- docs: remove ready-for-human guidance by @thymikee in #1237
- fix: align layering claims, remove app-log ineffective dynamic import, refresh architecture records (#1222) by @devin-ai-integration[bot] in #1227
- feat: unify gesture planning and multi-touch execution by @thymikee in #1212
- fix: write Android debug_http_host to the RN default-preferences file by @thymikee in #1242
- fix: support physical iOS close with Xcode 26 by @thymikee in #1236
- docs: ADR-0012 Decision 6 — repair-transaction lifecycle (R7 + commit semantics) by @thymikee in #1234
- fix(record): validate finalized iOS device MP4 before reporting record stop success by @mvanhorn in #1238
- fix(daemon): isolate disconnect cancellation and resource teardown by @devin-ai-integration[bot] in #1225
- fix: reject stale iOS refs after navigation by @thymikee in #1241
- docs: define session ref-frame lifetime by @thymikee in #1247
- fix: remove Android ADB swipe fallbacks by @thymikee in #1243
- fix: exclude keyboard/IME chrome from replay divergence screen.refs by @thymikee in #1233
- fix: bound the iOS system-modal snapshot probe to the capture deadline (#1244) by @thymikee in #1248
- fix(replay): repair-transaction lifecycle — keep-alive, no-partial-emit, close-as-lifecycle, atomic publish by @thymikee in #1235
- fix(replay): resume.from now agrees with repairHint's record-and-heal continuation by @thymikee in #1260
- fix: Android status/nav-bar systemui chrome leaks into non-raw captures (#1251) by @thymikee in #1256
- refactor: rename
rotatecommand toorientation(rotate kept as deprecated alias) by @thymikee in #1252 - fix(ios): support remote-hosted alerts on physical devices by @knchst in #1232
- fix(replay): extend resume.from record-and-heal shape to caution/manual by @thymikee in #1267
- feat(daemon): ADR 0014 session ref-frame lifetime — full implementation by @thymikee in #1257
- fix: unify divergence screen capture with snapshot's full-window scope by @thymikee in #1265
- feat: --force/--overwrite for --save-script + arm-time EEXIST preflight by @thymikee in #1266
- fix(apple): avoid blocked interactions on physical iOS by @billsbooth in #1263
- fix: refresh Android snapshots after in-place ComposeView content swaps (#1254) by @Thy...
v0.19.3
What's Changed
- fix: guide agents past iOS keyboard dismissal and get-text guesses by @thymikee in #1173
- fix: make settle tail list real actionable targets by @thymikee in #1172
- feat: fix codex runner, add --override-doc grading, port skillgym quiz cases to help-conformance bench by @thymikee in #1176
- fix: add curated suggestions for open-url and close-session by @thymikee in #1175
- docs: ADR for interactive replay and resolution disclosure by @thymikee in #1177
- chore: add agent-efficiency regression guards by @devin-ai-integration[bot] in #1174
- refactor(daemon): route perf metrics sampling body through PlatformPlugin facet by @devin-ai-integration[bot] in #1191
- test(output-economy): add routine-workflow output-behavior oracle by @devin-ai-integration[bot] in #1190
- fix: align Maestro swipe semantics across platforms by @thymikee in #1179
- ci: ratchet against production-unused exports by @thymikee in #1202
- feat: add derived fail-open check:affected selector by @devin-ai-integration[bot] in #1195
- refactor: remove production-unused exports by @thymikee in #1203
Full Changelog: v0.19.2...v0.19.3
v0.19.2
What's Changed
- fix: read runner cache package version from project root by @thymikee in #1170
- fix: point unknown selector keys at role=/label= forms by @thymikee in #1165
- fix: reap idle daemons and take over stale runner leases by @thymikee in #1169
- fix: make manual-qa help self-sufficient and slim routine help paths by @thymikee in #1168
- fix: alias launch/relaunch to open and suggest canonical commands for unknown names by @thymikee in #1166
- feat: include unchanged interactive refs in settle output by @thymikee in #1167
- fix: stabilize android maestro gestures by @thymikee in #1171
Full Changelog: v0.19.1...v0.19.2
v0.19.1
Highlights
- TV remote control: Added
tv-remotefor Android TV and tvOS focus navigation. [#1147](#1147) - Session event timeline: Added
agent-device eventsandevents.ndjsonfor compact request/action history. [#1032](#1032) - Re.Pack support:
metro preparenow supports Re.Pack apps and auto-detects Re.Pack projects. [#1145](#1145) - Better visual evidence: iOS simulator screenshots now use logical 1x density by default, and recordings are app-scoped unless requested otherwise. [#1160](#1160), [#1163](#1163)
- More reliable iOS automation: Hardened iOS snapshots, drags, and XCTest recovery paths. [#1144](#1144), [#1148](#1148), [#1158](#1158)
- Clearer agent guidance: Help/docs now better explain
--settle,fillvstype,doctor, and Android IME handling. [#1154](#1157), [#1164](#1164)
What's Changed
- test: remove slow-test ratchet pins by @thymikee in #1143
- fix: soften recovered snapshot warning by @thymikee in #1146
- fix: omit interaction uptime from wire responses by @thymikee in #1142
- fix: keep XCTest tree snapshots on main by @thymikee in #1144
- feat: add TV remote command by @thymikee in #1147
- fix: keep iOS synthesized drags off AX by @thymikee in #1148
- feat: support Re.Pack dev server prepare by @thymikee in #1145
- fix: derive interaction response data transforms by @thymikee in #1149
- fix: improve settle observation guidance by @thymikee in #1154
- refactor: make iOS synthesized gesture policy explicit by @thymikee in #1152
- refactor: derive command identity from descriptors by @thymikee in #1151
- fix: handle Android IME overlays in snapshots by @thymikee in #1157
- fix: narrow client result contracts by @thymikee in #1155
- chore: migrate to TypeScript 7 by @thymikee in #1161
- fix: normalize iOS simulator screenshot density by @thymikee in #1160
- fix: harden iOS XCTest recovery paths by @thymikee in #1158
- feat: add session event timeline by @szdziedzic in #1032
- docs: clarify agent setup and text entry guidance by @thymikee in #1164
- fix: make record app-scoped by default by @thymikee in #1163
Full Changelog: v0.19.0...v0.19.1
v0.19.0
Highlights
- Act and observe in one step:
--settlenow returns a settled diff with fresh refs, backed bywait stableand optional--verifyevidence. - Safer refs, selectors, and taps:
tapaliasespress, stale/out-of-viewport refs get warnings, non-hittable targets include hints, and MCP can auto-pin snapshot refs. - Cleaner snapshot verification: snapshot output deduplicates inherited labels/identifiers, and
diff snapshotis promoted for compact before/after checks. - Better diagnostics for agents: typed errors, ADB timeout hints, stderr excerpts, and the new
capabilitiescommand make failures and platform support easier to act on. - More reliable iOS automation: capture stalls are bounded, runner recovery preserves sessions, text entry is faster, and main-thread timeout hints are clearer.
- More durable artifacts and recordings: artifacts have semantic types and deterministic downloads, and Android recordings can recover after daemon restarts.
What's Changed
- fix: hint @ref when a bare snapshot ref is passed as interaction target by @thymikee in #1039
- Surface targetHittable/hint for non-hittable press/fill targets (#1037) by @thymikee in #1040
- fix: report unknown command before flag-support validation by @thymikee in #1038
- feat: accept tap as an alias of press by @thymikee in #1053
- refactor: add shared TTL memo reset registry by @thymikee in #1060
- docs: document conservative revisit triggers by @thymikee in #1056
- refactor: centralize known CLI command checks by @thymikee in #1057
- fix: clarify prepare ios-runner timing overlap by @thymikee in #1058
- refactor: split runner xctestrun module by @thymikee in #1062
- feat(help): document behavioral guarantees in help workflow by @thymikee in #1054
- refactor: split oversized session and apple app files by @thymikee in #1061
- perf: smaller minified output and a lighter eager CLI startup path by @thymikee in #1065
- feat(snapshot): dedup inherited labels/identifiers in output; promote diff snapshot by @thymikee in #1063
- fix: surface stderr excerpts from hand-rolled exec failure wraps by @thymikee in #1072
- fix: make artifact inventory consumption deterministic on download by @thymikee in #1073
- fix: surface typed error codes for metro, MCP, and batch validation failures by @thymikee in #1070
- fix: accept selector-first
isform and print find action confirmations by @thymikee in #1068 - feat: add wait stable settle primitive by @thymikee in #1059
- fix: report expired daemon resources as expiry, not INVALID_ARGS by @thymikee in #1069
- feat(interaction): opt-in --verify evidence for press/click/fill by @thymikee in #1064
- feat: tag daemon artifacts with semantic types by @sjchmiela in #1066
- feat: classify adb failures with actionable hints at the executor level by @thymikee in #1067
- fix(errors): close call-site and consumer gaps around the central error system by @thymikee in #1071
- refactor: harden exec failure wrapping end to end by @thymikee in #1074
- fix: honor wait budgets, preserve the daemon on polling timeouts, refuse off-screen selector taps by @thymikee in #1075
- RFC: ADR 0011 — interaction guarantee contract (path × guarantee matrix) by @thymikee in #1080
- feat: preflight native-ref fast path with shared interaction guards (ADR 0011) by @thymikee in #1082
- refactor: single construction site for interaction responses (ADR 0011 Layer 2) by @thymikee in #1083
- refactor: declare command timeout policy on descriptors (ADR 0011) by @thymikee in #1084
- feat: warn on out-of-viewport coordinate taps (ADR 0011) by @thymikee in #1085
- feat: golden tap-point parity table for TS and the iOS runner (ADR 0011) by @thymikee in #1086
- build: migrate the library build from rslib to tsdown (Rolldown) by @thymikee in #1087
- chore: delete dead tap-by-text runner arm and settledAfterMs; hint on tiny stable trees by @thymikee in #1089
- feat: actionable hint for adb timeouts by @thymikee in #1090
- test: interaction contract suite with registry-driven coverage gate (ADR 0011 Layer 3) by @thymikee in #1092
- ci: drop duplicate unit-test run, cache Size base dist, typecheck with tsgo by @thymikee in #1094
- feat: direct iOS selector falls back to tree resolution on semantic failures (ADR 0011) by @thymikee in #1091
- feat: warn when @refs outlive the session snapshot they came from by @thymikee in #1093
- docs: native-ref dispatch path is web-only in production by @thymikee in #1095
- docs: refocus AGENTS.md on principles and enforcement gates by @thymikee in #1097
- test: slow-test ratchet and speed rules from measured experiments by @thymikee in #1099
- feat: versioned snapshot refs with MCP auto-pinning by @thymikee in #1096
- build: drop tsc entirely and fix sandbox-hostile tests by @thymikee in #1100
- test: split the args.test.ts aggregation along source topology by @thymikee in #1102
- docs: tighten agent operating guide by @thymikee in #1104
- fix: bound iOS capture stalls and make runner recovery session-preserving (#1105) by @thymikee in #1107
- build: support packaged CLI on Node 22.12 by @thymikee in #1116
- test: split interaction runtime tests by @thymikee in #1113
- ci: deepen Node 22 packaged CLI smoke by @thymikee in #1125
- fix: name split declaration chunks by @thymikee in #1127
- test: split the Android platform test aggregation and share the scripted adb stub by @thymikee in #1103
- fix: harden apple runner recovery by @thymikee in #1126
- build: strip runner unit-test blocks from package by @thymikee in #1128
- fix: recover Android recordings after daemon restart by @thymikee in #1129
- fix: reap managed web browser orphans by @thymikee in #1112
- refactor: extract host process primitives by @thymikee in #1134
- feat: add capabilities command by @thymikee in #1133
- feat: --settle returns the settled diff in the interaction response (#1101) by @thymikee in #1106
- refactor: derive command exposure lists from descriptors by @thymikee in #1137
- fix: speed up iOS text entry by @thymikee in #1139
- fix: hint on iOS runner main-thread timeouts by @thymikee in #1140
- fix: simplify Android recording recovery by @thymikee in #1135
- fix: normalize interaction response wire shapes by @thymikee in #1114
- fix: recover completed Android recording from pending-only manifest by @thymikee in #1141
New Contributors
- @sjchmiela made their first contribution in #1066
Full Changelog: v0.18.3...v0.19.0
v0.18.3
What's Changed
- feat: warm the iOS runner build cache from doctor and boot by @thymikee in #1033
- feat: expose daemon artifact inventory by @szdziedzic in #1020
- feat: list daemon artifacts through proxy sessions by @thymikee in #1027
- fix: capture ios device logs with devicectl console by @thymikee in #1026
New Contributors
- @szdziedzic made their first contribution in #1020
Full Changelog: v0.18.2...v0.18.3
v0.18.2
What's Changed
- refactor: collapse public Platform ios/macos into apple (#979) by @thymikee in #1002
- fix: project doctor output platform to the public leaf after the Platform collapse by @thymikee in #1004
- test: surface-wide guard that no command response emits the internal apple platform by @thymikee in #1005
- docs: retire plans/perfect-shape.md — roadmap complete by @thymikee in #1003
- fix: pin agent-cdp 1.6.1 by @thymikee in #1006
- feat: route recording + provider platform gates through PlatformPlugin facets by @thymikee in #1007
- docs: require provider-integration + coverage verification for platform/response changes by @thymikee in #1008
- feat: surface appleOs discriminant on public device output by @thymikee in #1009
- perf: cut iOS open --relaunch from 11s to 2.85s by @thymikee in #1010
- fix: reduce iOS runner keepalive log noise by @thymikee in #1017
- perf: overlap iOS runner prewarm, seed booted-memo, hand runners off across daemon restarts by @thymikee in #1011
- fix: stop retaining iOS runner for scoped and leased closes by @thymikee in #1021
- fix: clarify clean-xcuitest output by @thymikee in #1018
- feat: add opt-in exec command diagnostics by @thymikee in #1019
- fix: surface open timing in debug diagnostics by @thymikee in #1023
- fix: bound retained iOS runner lifetime with an idle stop by @thymikee in #1025
- perf: collapse iOS simulator relaunch into one simctl launch call by @thymikee in #1024
- fix(aws-device-farm): send requested platform in WebDriver capabilities by @devin-ai-integration[bot] in #1028
- fix(cloud-webdriver): extend remote lease TTL for cloud provider connections by @devin-ai-integration[bot] in #1029
- fix(cloud-webdriver): stop artifacts command from allocating a new provider session by @devin-ai-integration[bot] in #1030
New Contributors
- @devin-ai-integration[bot] made their first contribution in #1028
Full Changelog: v0.18.1...v0.18.2
v0.18.1
What's Changed
- refactor: type-safe recording backends + exhaustive capability gating by @thymikee in #894
- perf: reduce Apple runner build overhead by @thymikee in #898
- refactor: derive platform allow-lists from the canonical device tuples by @thymikee in #895
- feat: add AppleOS discriminant to the device model (additive) by @thymikee in #896
- refactor: validate JSON-RPC at the MCP/HTTP boundary by @thymikee in #897
- refactor: derive replay metadata platforms from the canonical selectors by @thymikee in #899
- refactor: remove shallow re-export modules and a dead branch by @thymikee in #901
- refactor: collapse duplicated batch-step validation to one schema by @thymikee in #902
- refactor: extract shared Android instrumentation-helper by @thymikee in #903
- refactor: dedup daemon handler capability/session/recordAction boilerplate by @thymikee in #904
- docs: ADR 0008 (command descriptor) + ADR 0009 (Apple consolidation) by @thymikee in #905
- feat: command-descriptor registry (additive, parity-tested) — Phase 1 step 1 by @thymikee in #906
- feat: build daemon command registry from descriptors, delete the hand table — Phase 1 step 2 by @thymikee in #907
- feat: build capability matrix from descriptors, delete the hand table — Phase 1 step 3 by @thymikee in #908
- feat: build batch allowlist from descriptors, delete the hand list — Phase 1 step 4 by @thymikee in #909
- feat: registry-driven exhaustive command dispatch — Phase 1 step 5 by @thymikee in #910
- feat: additive CommandResult type spine — Phase 1 step 6 by @thymikee in #911
- feat: derive the batch command union from the as-const registry (simplify #909) — Phase 1 step 7 by @thymikee in #912
- feat: PlatformDescriptor registry deriving the capability bucket — Phase 3 step 1 by @thymikee in #914
- feat: typed command results, batch 1 (Phase 2 typed-results) by @thymikee in #913
- docs: add cloud agents video by @thymikee in #915
- refactor: consolidate apple/mobile platform family-groupings via shared predicates — Phase 3 by @thymikee in #921
- feat: opt-in agent-cost wallClockMs behind --cost — Phase 4 slice 1 by @thymikee in #922
- feat: infer install target from artifact by @thymikee in #923
- perf: speed up iOS simulator screenshots by @thymikee in #918
- feat: opt-in agent-cost runnerRoundTrips — Phase 4 slice 2 by @thymikee in #925
- feat: expose opt-in agent-cost over MCP via includeCost — Phase 4 slice 2 by @thymikee in #924
- feat: add opt-in agent-cost nodeCount signal — Phase 4 slice 3 by @thymikee in #926
- perf: reuse Apple runner cache across version bumps by @thymikee in #900
- perf: reduce iOS simulator screenshot overhead by @thymikee in #927
- refactor: extract screenshot-diff domain out of utils — Phase 5 slice 1 by @thymikee in #928
- feat: support resumable proxy uploads by @thymikee in #919
- refactor: break snapshot.ts <-> snapshot-quality.ts type cycle — Phase 5 prep by @thymikee in #931
- refactor: seed src/kernel with snapshot.ts type module — Phase 5 slice 2 by @thymikee in #932
- feat: typed command results, batch 2 (home/back/rotate/app-switcher) — Phase 2 by @thymikee in #934
- feat: typed command results, batch 3 (clipboard, appstate) — Phase 2 by @thymikee in #937
- refactor: add provider device runtime foundation by @thymikee in #933
- feat: typed command results, batch 4 (keyboard) — Phase 2 by @thymikee in #938
- feat: typed errors — supportedOn + retriable signals — Phase 2 by @thymikee in #939
- feat: add replay test reporters by @thymikee in #936
- fix: clean up maestro test reporter output by @thymikee in #935
- feat: per-command MCP outputSchema — Phase 4 by @thymikee in #941
- refactor: move errors/redaction/device into src/kernel — Phase 5 slice 3 by @thymikee in #940
- fix: repoint MCP output-schemas import to kernel/device (unbreak main) by @thymikee in #943
- feat: leveled response views + --level knob with snapshot digest — Phase 4 by @thymikee in #942
- refactor: delete WaitCommandResult/AlertCommandResult mirror types — Phase 2c by @thymikee in #946
- refactor: extract metro/ folder — Phase 5 by @thymikee in #947
- feat: expose responseLevel over MCP — Phase 4 by @thymikee in #944
- feat: screenshot digest response-view — Phase 4 by @thymikee in #945
- refactor: move contracts.ts into src/kernel — Phase 5 by @thymikee in #950
- refactor: extract remote/ folder — Phase 5 by @thymikee in #951
- chore: exclude helper readmes from package by @thymikee in #954
- refactor: extract snapshot/ folder — Phase 5 by @thymikee in #953
- feat: find/get digest response-views + batch-step elision — Phase 4 by @thymikee in #955
- refactor: absorb CLI parser into cli/parser/ — Phase 5 by @thymikee in #958
- fix: avoid unsafe iOS keyboard dismissal by @thymikee in #957
- refactor: PlatformPlugin registry foundation (step a) — Phase 3 by @thymikee in #956
- refactor: extract client/ folder — Phase 5 by @thymikee in #960
- chore: prune public package exports by @thymikee in #961
- refactor: split daemon client driver into daemon/client/ — Phase 5 by @thymikee in #962
- refactor: route capability bucket through PlatformPlugin + pin supports() closures (Phase 3 step b) by @thymikee in #965
- fix: extend iOS physical install timeout by @thymikee in #964
- ci: automate iOS runner request-count gate for the Apple runner unwind (Phase 3 step c prep) by @thymikee in #966
- fix: respect prepare timeout for runner health checks by @thymikee in #967
- feat: support live replay test reporters by @thymikee in #959
- refactor: consolidate Apple platform internals by @thymikee in #968
- docs: fix stale platforms/ios paths after Apple consolidation (#968) + remaining-work plan by @thymikee in #969
- fix: restore runnerRoundTrips agent-cost field dropped in #968 by @thymikee in #970
- docs: distinguish removed request-count CI gate from restored cost.runnerRoundTrips (Phase 3 plan) by @thymikee in #971
- docs: retire phase3-platform-plugin-progress.md; track remaining work in issues (#972) by @thymikee in #982
- test: relocate Apple engine unit tests into platforms/apple/core (#980) by @thymikee in #983
- feat: enforce import-direction DAG (Phase-5 layering lint) by @thymikee in #984
- refactor: split daemon server runtime into daemon/server/ — Phase 5 by @thymikee in #985
- refactor: consolidate public SDK entry barrels into src/sdk/ — Phase 5 by @thymikee in #986
- fix: exempt sdk/ public barrels from R3 platforms-seam — unblock red main by @thymikee in #987
- test: r...
v0.18.0
What's Changed
- docs: clarify agent-device help entrypoint by @thymikee in #884
- feat: support cdp remote bridge sessions by @thymikee in #878
- refactor: tighten daemon output helpers by @thymikee in #892
- refactor: model recording backends by @thymikee in #893
- feat: expose web screen recording by @thymikee in #891
- feat: add integrated device leasing by @thymikee in #890
Full Changelog: v0.17.10...v0.18.0
v0.17.10
What's Changed
- docs: configure agent skill conventions by @thymikee in #871
- fix: avoid copying pnpm node_modules into worktrees by @thymikee in #872
- docs: clarify agent-device QA mental model by @thymikee in #875
- test: migrate Android recording sizing coverage by @thymikee in #876
- fix: refine Apple provider pressure reporting by @thymikee in #877
- test: migrate test app to expo dev client by @thymikee in #881
- fix: clarify proxy runner ownership by @thymikee in #882
- feat: add cdp command agent-cdp passthrough by @thymikee in #873
Full Changelog: v0.17.9...v0.17.10