Releases: callstack/agent-device
Release list
v0.20.5
Highlights
-
Restored npm installations. Fixes the 0.20.4 packaging regression that left private workspace imports in the published bundle, causing commands such as
npx agent-device devicesto fail with a missing@agent-device/ad-scriptpackage. -
Release integrity is now enforced. Packaging fails if any private
@agent-device/*import escapes into the built JavaScript or declarations, and CI runsdevices --jsonfrom the globally installed tarball before release. -
Replay internals have a durable package boundary. Native
.adreplay execution now lives in@agent-device/ad-replay, reducing daemon coupling while preserving the existing replay behavior and compatibility contract.
What's Changed
- refactor(daemon): extract native .ad replay to packages/ad-replay (#1478 P5) by @thymikee in #1555
- fix: prevent publishing unresolved workspace imports by @thymikee in #1577
Full Changelog: v0.20.4...v0.20.5
v0.20.4
Highlights
-
Continue interactively after replay. Native
.adreplays support--keep-sessionand SDKkeepSession, allowing agents to suppress a terminalcloseand take over the active session. -
More trustworthy replay execution. Replay gained stronger save-script validation, launch-time capture retries, session-lifecycle handling, post-gesture stability checks, off-screen verification, and divergence evidence.
-
Verify cloud access without allocating a device.
connectvalidates BrowserStack, AWS Device Farm, and Limrun credentials and resources, reports readiness, and provides exact next steps without creating a provider session. -
More capable BrowserStack sessions. Configure orientation, location, timezone, language, locale, networking, and app resigning; cloud orientation now uses valid WebDriver transports.
-
Faster and more reliable device automation. Android permission prompts, targeted text reads, and snapshot recovery are more dependable. Concurrent device discovery, usbmux-first physical iOS transport, and memoized snapshot occlusion reduce latency and prevent CPU stalls.
Security: Project-local configuration can no longer control credentials, remote endpoints, provider settings, headers, or other operator-sensitive values. Thanks to [@glmgbj233](https://github.com/glmgbj233) for responsibly reporting the issue. Action possibly needed: move sensitive or operator-specific values out of project-local agent-device.json files and into user configuration, explicitly selected configuration, environment variables, CLI arguments, or saved remote profiles.
What's Changed
- fix: resolve qs Dependabot alert #55 by @thymikee in #1493
- refactor: pnpm workspace + @agent-device/kernel pilot (#1490 W0) by @thymikee in #1494
- test(ios): fix nightly fixture selector drift by @thymikee in #1492
- refactor: consolidate daemon errors by @thymikee in #1496
- refactor: restore pngjs codec by @thymikee in #1498
- test: stabilize parallel provider scenarios by @thymikee in #1497
- Simplify screenshot diff output by @thymikee in #1495
- test(android): add comprehensive emulator E2E coverage by @thymikee in #1482
- docs: require complete change migrations by @thymikee in #1500
- refactor: extract contracts workspace package by @thymikee in #1499
- fix(daemon): reject unsupported raw --save-script flags at request ingress by @thymikee in #1501
- docs: organize navigation and Node.js integrations by @thymikee in #1503
- test: characterize replay-test reporter contract and extend R10 by @thymikee in #1505
- fix(ios): deny viewport during capability admission on Apple targets by @thymikee in #1507
- refactor: isolate maestro engine package by @thymikee in #1506
- test: add Android full emulator coverage by @thymikee in #1484
- refactor: isolate Limrun construction dependencies by @thymikee in #1502
- refactor(daemon): consolidate session-script test factories and drop saveScriptDefaultedHealedPath by @thymikee in #1508
- fix(ci): drop pipefail from the nightly Android emulator script by @thymikee in #1512
- feat(ios): usbmux runner route override + #1403 transport experiment evidence by @thymikee in #1510
- refactor(replay-test): neutralize the values crossing the scheduler seam (#1478 P3, part 1) by @thymikee in #1509
- refactor: extract WebDriver provider package by @thymikee in #1504
- fix(test): give the iOS scroll search a capture-sized wait budget by @thymikee in #1514
- fix(android): re-capture past a transient helper content verdict by @thymikee in #1513
- test(replay-test): pin the retry-path reporter hint by @thymikee in #1516
- feat(ios): reach physical devices through usbmux first, tunnel as fallback by @thymikee in #1517
- fix(ios): map usbmux connect result codes to the right verdict by @thymikee in #1523
- fix(device): state when nothing is claimed and reap dead claims by @thymikee in #1519
- perf(devices): probe platform inventories concurrently by @thymikee in #1524
- refactor: move Limrun provider behind package facade by @thymikee in #1518
- fix: normalize physical iOS landscape taps by @thymikee in #1520
- test: stop two tests failing on timing and megapixels by @thymikee in #1526
- test: narrow Limrun public type contract by @thymikee in #1528
- fix(ios): name Developer Mode and pairing as the real launch blockers by @thymikee in #1527
- test: fix Android observability scenario to Android contracts by @thymikee in #1531
- refactor(replay-test): extract packages/replay-test (#1478 P3b) by @thymikee in #1525
- fix(ios): diagnose a runner that cannot install, instead of blaming the screen by @thymikee in #1529
- fix: treat Android permission prompts as pending alerts, not tap escapes by @thymikee in #1530
- fix(cli): drop the removed durationMs positional from swipe help by @thymikee in #1534
- refactor(daemon): session script publication behind one capability (#1478 P4a) by @thymikee in #1532
- test(daemon): pin resolveScriptTarget's retention table directly by @thymikee in #1539
- fix(test): repair Android replay fixtures against live device reality by @thymikee in #1538
- refactor(daemon): serialize replay transactions behind a locked coordinator (#1478 P4b) by @thymikee in #1535
- fix: clear the polynomial-redos class across main by @thymikee in #1546
- docs(agents): a green check is evidence only once you have seen it red by @thymikee in #1547
- fix: memoize snapshot occlusion coverage checks to stop a daemon CPU-spin by @thymikee in #1541
- refactor: extract the .ad script codec into packages/ad-script (#1478) by @thymikee in #1536
- fix: restore scheduled workflow health by @thymikee in #1543
- refactor(ios): drop the transport seam usbmux-first made dead by @thymikee in #1540
- feat(cloud-webdriver): BrowserStack device-feature capabilities, and fix cloud orientation by @leovarmak in #1544
- test(replay-test): cover failFast, retry exhaustion, plan-prep failure, JUnit escaping by @thymikee in #1550
- refactor: tidy three post-extraction seams by @thymikee in #1551
- fix(test): tolerate dead session in iOS e2e full-tier cleanup by @thymikee in #1548
- feat(mutation): add target-annotation-serde + snapshot-occlusion kernels by @thymikee in #1553
- fix: clear the last polynomial-redos instance in swift-cache by @thymikee in #1549
- test: pin selector-port behavior ahead of the P5 extraction (#1478) by @thymikee in #1552
- test: make pid-liveness fixtures deterministic under load by @thymikee in #1556
- feat: keep replay session active on request by @thymikee in #1554
- fix(daemon): reject unarmed close --save-script before teardown by @thymikee in #1558
- fix(ios): keyboard-dismiss content settle race (#1542) — partial, defect 2 needs a decision by @thymikee in #1559
- fix: read Android get text from target field by @thymikee in #1561
- fix(ios): double-check off-screen click refusals against a direct element read by @thymikee in #1566
- fix(daemon): distrust post-gesture stability that matches the pre-gesture baseline by @thymikee in https://gith...
v0.20.3
Highlights
A focused reliability release for replay and iOS lifecycle handling.
- Safer replay references. Replay now publishes only element refs actually exposed in the response, keeping them session-bound and one-shot. [#1489](#1489)
- More reliable iOS launches. Clear-state behavior is preserved when opening with launch URLs, and simulator relaunches now use the URL as the atomic cold-launch trigger. [#1486](#1486), [#1483](#1483)
- Expanded Limrun session support. Reusable capabilities now cover app management, input, logs, recording, installation, Android port forwarding, and iOS simulator operations. [#1485](#1485)
What's Changed
- fix: relaunch iOS simulator app URLs atomically by @thymikee in #1483
- feat: expose Limrun device session capabilities by @thymikee in #1485
- test: add scroll-edge-state suite, close mutation gap (#1455) by @thymikee in #1474
- test: pin daemon modularity migration contracts by @thymikee in #1487
- fix: preserve clear state before iOS launch URLs by @thymikee in #1486
- perf: speed up unit tests and streamline checks by @thymikee in #1488
- refactor(kernel): relocate non-foundational stragglers before packaging (#1490 W-pre) by @thymikee in #1491
- fix: publish replay refs after response projection by @thymikee in #1489
Full Changelog: v0.20.2...v0.20.3
v0.20.2
Highlights
This release makes session cleanup safer, replay failures easier to understand, and the SDK more useful for integrations.
- No more leaked device claims after failed script saves — closing a session now releases the device and removes the session even when close-time
.adpersistence fails. - Clearer, safer Maestro failures — resolved target labels and
runFlowpaths appear in diagnostics, sensitiveinputTextremains redacted, and malformed environment entries return typedINVALID_ARGSerrors. - Public Limrun runtime — cloud and provider integrations can now import
LimrunRuntimefromagent-device/limrunwithout depending directly on@limrun/api. - Fail-closed CLI parsing — extra positional arguments are rejected instead of silently ignored, preventing malformed agent plans such as
open app url closefrom partially executing. - Runnable Node.js SDK examples — new examples cover client sessions, batch orchestration, Metro runtime resolution, contracts, and typed error handling.
- More stable replay progress output — terminal output remains intact when the viewport resizes or reflow ends.
- Stronger release confidence — expanded iOS simulator smoke coverage, replay-compat and mutation gates, property-based testing, concurrency checks, and narrowly controlled timeout-only CI retries.
Compatibility note
Commands with excess positional arguments now fail with INVALID_ARGS. Any scripts relying on previously ignored trailing arguments must use the command’s documented syntax.
What's Changed
- fix(android): stamp status-bar chrome during the walk instead of reconstructing it downstream (#1319) by @thymikee in #1359
- fix(apple): parse parenthesized xctrace physical device format by @devin-ai-integration[bot] in #1360
- Generalize subprocess stub tests to support multiple platforms by @thymikee in #1362
- chore: remove dead code and tune fallow's dead-code rules by @thymikee in #1363
- chore: remove dead type re-exports, prune stale suppressions, gate unused-types by @thymikee in #1364
- chore: remove verified dead code and migration scaffolding (~700 LOC) by @thymikee in #1367
- test: serialize client-metro and harden the unit suite against ambient daemon env by @thymikee in #1365
- chore(deps): resolve dependabot alerts by @thymikee in #1372
- refactor(cli): decompose runCli into explicit phase functions by @thymikee in #1373
- refactor(interaction): resolve the CapturedSnapshot name collision by @thymikee in #1371
- refactor(commands): derive pass-through command bindings with a generic BoundOf helper by @thymikee in #1368
- fix: select iOS simulator by installed app by @thymikee in #1376
- fix(android): preserve fixed siblings after snapshot filtering by @thymikee in #1378
- feat(events): enrich session event details by @szdziedzic in #1379
- fix: report bundle sizes with two decimal MB precision by @thymikee in #1382
- fix(interaction): direction-named, selector-first off-screen recovery hints (#1366) by @thymikee in #1374
- fix(daemon): explicit abort message on uncommitted repair close by @jibin7jose in #1383
- feat(replay): recorded landmark identity for wait, is coverage — read-only step identity (#1349) by @thymikee in #1381
- fix(daemon): keep an active replay session's daemon alive over the CLI path by @thymikee in #1390
- feat: parameterize sensitive recorded inputs by @thymikee in #1369
- feat: add WebView accessibility lab by @thymikee in #1397
- fix(cli): compact stale device status by @thymikee in #1388
- docs: restructure AGENTS.md and CONTEXT.md for progressive disclosure by @thymikee in #1402
- fix(replay): preserve cwd scope for opened sessions by @Bortlesboat in #1401
- feat: add first-class Vega VVD TV support by @thymikee in #1396
- docs(adr): rules-first ADR restructure + ADR 0017 proposal (unified event journal) by @thymikee in #1399
- feat(apple): injectable Apple runner transport seam for provider interactors by @thymikee in #1389
- fix(gestures): fail pre-removal gesture forms at .ad parse time (#1216) by @thymikee in #1393
- refactor(boundaries): put shared contracts below their consumers, gate the result by @thymikee in #1405
- feat: strengthen agent help benchmarks by @thymikee in #1404
- fix: select app-bearing simulator for replay by @thymikee in #1387
- fix: support xctrace-only iOS physical devices by @thymikee in #1375
- fix(replay): bounded retry on pre-dispatch capture racing app launch (#1385) by @thymikee in #1386
- feat(scripts): dependency-graph report over the layering gate's model by @thymikee in #1410
- feat(bench): renderer-pinned samples, topic-coverage gate, error-recovery quizzes; trim skillgym to agentic checks by @thymikee in #1411
- docs: architecture principles mapped to enforcing gates and open ledgers by @thymikee in #1428
- docs: bless the works-today iOS SpringBoard/widget workflow (#1296 PR A) by @thymikee in #1395
- fix: update vulnerable dependencies by @thymikee in #1434
- fix(daemon): keep close-time script-save failures from leaking the session/device claim by @thymikee in #1392
- test: property-based testing foundation (fast-check) over parse/print and geometry kernels by @devin-ai-integration[bot] in #1437
- refactor(contracts): declare shared vocabulary below its consumers, ratchet what remains by @thymikee in #1435
- fix(cli): reject excess positionals by @Bortlesboat in #1433
- test: frozen replay-compat corpus with expected verdicts (#1417) by @devin-ai-integration[bot] in #1436
- test: ratchet mutation score over enumerated decision kernels by @devin-ai-integration[bot] in #1441
- test(daemon): seeded concurrency torture lane for session/lease/lock invariants by @devin-ai-integration[bot] in #1439
- test: nightly parser fuzz lane — parser input fails as typed AppErrors, never hangs (#1414) by @devin-ai-integration[bot] in #1438
- fix(ci): upload hidden diagnostics by @thymikee in #1443
- test: gate public command surface against commands.md reference by @devin-ai-integration[bot] in #1446
- chore(deps): Renovate config, packageManager-derived pnpm in CI, repo-wide format by @devin-ai-integration[bot] in #1444
- test(ci): gate PRs on changed-line coverage (#1418) by @devin-ai-integration[bot] in #1447
- test: enumerate error-code recovery quizzes in a unit-lane gate by @devin-ai-integration[bot] in #1445
- test: smoke every package.json export subpath from the packed package by @thymikee in #1452
- fix(replay): resolve Maestro failures and resize progress by @thymikee in #1450
- test(replay): split session-replay-vars.test.ts by actual subject (#1460) by @thymikee in #1468
- refactor(daemon): table-ify handleSessionCommands by @thymikee in #1467
- build(android): unify the 4 helper build/package scripts behind one parameterized pair by @thymikee in #1466
- refactor(layering): declare R1-R3 as a policy table, and test them by @thymikee in #1449
- feat(scripts): blast-radius query — dependents, owning gates, live-coverage owners (#1425) by @devin-ai-integration[bot] in #1470
- test(apple): split the 3,487-line core index.test.ts along its import boundaries by @thymikee in #1472
- feat: expose Limrun runtime by @thymikee in https://github.com/cal...
v0.20.1
Highlights
This release expands platform coverage and makes recorded workflows safer and more reliable.
- Amazon Vega OS TV support — control apps in the Vega Virtual Device with discovery, lifecycle commands, navigation, and the complete TV remote surface.
- Broader physical iOS support — xctrace-only devices can now use XCTest-backed app automation through usbmux, including interactions, snapshots, and screenshots.
- Secret-safe replay recording —
fill --record-as <VAR>sends the real value to the app while storing only a${VAR}placeholder in the recorded.adscript. - Stronger replay verification — recorded
waitlandmarks now retain element identity, preventing same-label elements on changed screens from producing false-positive replays. - More resilient replay startup — bounded retries handle transient sparse captures while an app is launching, without masking permanent transport failures.
- Smarter device selection — replay can select the simulator containing the requested app and better preserves authored platform and deep-link intent.
- Better recovery guidance — off-screen interaction errors now recommend a direction, bounded movement, and selector-based retries.
- iOS system UI guidance — new help covers SpringBoard and simulator widget add, edit, and removal workflows.
- Improved diagnostics — richer, sanitized session-event details make automation failures easier to investigate.
- Stronger release confidence — substantially expanded registry-derived iOS simulator coverage, replay scenarios, architecture gates, and help-conformance checks.
Compatibility note
Legacy recorded gesture forms containing removed duration or velocity positionals now fail during .ad parsing with migration guidance. Convert timed movement to gesture pan or use the current canonical gesture syntax.
What's Changed
- fix(android): stamp status-bar chrome during the walk instead of reconstructing it downstream (#1319) by @thymikee in #1359
- fix(apple): parse parenthesized xctrace physical device format by @devin-ai-integration[bot] in #1360
- Generalize subprocess stub tests to support multiple platforms by @thymikee in #1362
- chore: remove dead code and tune fallow's dead-code rules by @thymikee in #1363
- chore: remove dead type re-exports, prune stale suppressions, gate unused-types by @thymikee in #1364
- chore: remove verified dead code and migration scaffolding (~700 LOC) by @thymikee in #1367
- test: serialize client-metro and harden the unit suite against ambient daemon env by @thymikee in #1365
- chore(deps): resolve dependabot alerts by @thymikee in #1372
- refactor(cli): decompose runCli into explicit phase functions by @thymikee in #1373
- refactor(interaction): resolve the CapturedSnapshot name collision by @thymikee in #1371
- refactor(commands): derive pass-through command bindings with a generic BoundOf helper by @thymikee in #1368
- fix: select iOS simulator by installed app by @thymikee in #1376
- fix(android): preserve fixed siblings after snapshot filtering by @thymikee in #1378
- feat(events): enrich session event details by @szdziedzic in #1379
- fix: report bundle sizes with two decimal MB precision by @thymikee in #1382
- fix(interaction): direction-named, selector-first off-screen recovery hints (#1366) by @thymikee in #1374
- fix(daemon): explicit abort message on uncommitted repair close by @jibin7jose in #1383
- feat(replay): recorded landmark identity for wait, is coverage — read-only step identity (#1349) by @thymikee in #1381
- fix(daemon): keep an active replay session's daemon alive over the CLI path by @thymikee in #1390
- feat: parameterize sensitive recorded inputs by @thymikee in #1369
- feat: add WebView accessibility lab by @thymikee in #1397
- fix(cli): compact stale device status by @thymikee in #1388
- docs: restructure AGENTS.md and CONTEXT.md for progressive disclosure by @thymikee in #1402
- fix(replay): preserve cwd scope for opened sessions by @Bortlesboat in #1401
- feat: add first-class Vega VVD TV support by @thymikee in #1396
- docs(adr): rules-first ADR restructure + ADR 0017 proposal (unified event journal) by @thymikee in #1399
- feat(apple): injectable Apple runner transport seam for provider interactors by @thymikee in #1389
- fix(gestures): fail pre-removal gesture forms at .ad parse time (#1216) by @thymikee in #1393
- refactor(boundaries): put shared contracts below their consumers, gate the result by @thymikee in #1405
- feat: strengthen agent help benchmarks by @thymikee in #1404
- fix: select app-bearing simulator for replay by @thymikee in #1387
- fix: support xctrace-only iOS physical devices by @thymikee in #1375
- fix(replay): bounded retry on pre-dispatch capture racing app launch (#1385) by @thymikee in #1386
- feat(scripts): dependency-graph report over the layering gate's model by @thymikee in #1410
- feat(bench): renderer-pinned samples, topic-coverage gate, error-recovery quizzes; trim skillgym to agentic checks by @thymikee in #1411
- docs: architecture principles mapped to enforcing gates and open ledgers by @thymikee in #1428
- docs: bless the works-today iOS SpringBoard/widget workflow (#1296 PR A) by @thymikee in #1395
- fix: update vulnerable dependencies by @thymikee in #1434
New Contributors
- @jibin7jose made their first contribution in #1383
- @Bortlesboat made their first contribution in #1401
Full Changelog: v0.20.0...v0.20.1
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