v0.20.6
Highlights
- Faster, more reliable iOS automation — hostile-screen captures are up to 2× faster, deep private-AX snapshots recover more useful elements, and tap/text-entry handling is substantially more resilient on dynamic apps such as Bluesky.
- Evidence-based interaction outcomes — waits, taps, scrolls, swipes, and other gestures now distinguish confirmed effects from no-ops, surface ambiguity candidates, and explain when success could not be proven.
- Selector-targeted drag gestures — drag elements using selectors instead of brittle coordinates, with improved scroll-container selection across Android and Maestro paths.
- More control over captures and settling — scale screenshots directly and use
--settlewithscrollandbackfor more deterministic workflows. - Stronger recording and replay reliability — Android recording now survives static screens, slow video finalization, and dead processes, while replay artifacts use a single authoritative ledger.
- Safer remote connections — daemon bearer tokens are no longer persisted, and forced reconnects authenticate release requests correctly.
What's Changed
- fix: make wait verdicts evidence-based by @thymikee in #1570
- test(layering): pin exact façade symbols for all workspace packages by @thymikee in #1574
- refactor(replay): make the daemon's artifact set the run's one ledger (#1478 P5 follow-up) by @thymikee in #1575
- docs: remove superseded architecture proposals and design prototypes (#1478 P7) by @thymikee in #1580
- build: verify the published tarball instead of grepping the bundle by @thymikee in #1578
- fix(ios): preserve timed pan duration by @thymikee in #1572
- refactor: extract snapshot and replay identity semantics by @thymikee in #1582
- refactor(android): enforce transport lowering in the type system by @thymikee in #1583
- perf(ios): halve hostile-screen capture cost under the XCTest-channel penalty by @thymikee in #1587
- chore: scan packages/** with fallow instead of ignoring it by @thymikee in #1591
- refactor: move selector engine into workspace package by @thymikee in #1589
- fix(snapshot): one-shot recovered warning for internally armed penalties by @thymikee in #1590
- fix(ios): stop shipping runner unit tests in the npm package by @thymikee in #1594
- fix: surface AMBIGUOUS_MATCH candidates and name find's supported actions by @thymikee in #1602
- fix(daemon): surface proven no-effect gestures to the agent by @thymikee in #1601
- fix: flush stdout/stderr before every CLI process.exit() (#1596) by @thymikee in #1603
- fix(ios): give keyboard dismiss a safe-area-tap fallback (#1598) by @thymikee in #1606
- fix(maestro): unify the scrollable-ancestor walks and fix Android scroll-container selection by @thymikee in #1592
- fix(daemon): judge post-gesture movement by identity, not by the intersection by @thymikee in #1573
- fix(ios): harden Bluesky-class interaction reliability by @thymikee in #1588
- fix: stop the unit suite from leaking temp directories by @thymikee in #1593
- fix: prevent iOS text entry runner wedge by @thymikee in #1604
- feat: add selector-targeted drag gestures by @thiagobrez in #1567
- fix: stabilize Replay Nightly fixture boundaries by @thymikee in #1610
- docs: clarify iOS drag synthesis profiles by @thymikee in #1616
- refactor(daemon): give the Maestro fallback and ambiguous-match details real types by @thymikee in #1612
- refactor(ios): share one private-XCTest event bridge between gesture and text synthesis by @thymikee in #1608
- refactor(contracts): name façade exports explicitly and retire the pin table by @thymikee in #1614
- refactor(contracts): one viewport-root predicate for the whole repo by @thymikee in #1613
- build: eliminate tsdown bundle warnings by @thymikee in #1607
- fix(ios): never signal a recycled runner pid from a stale lease by @thymikee in #1621
- fix(ios): corroborate recorded tap outcomes by @thymikee in #1605
- fix: update MCP registry namespace by @thymikee in #1618
- fix: resolve Dependabot security alerts by @thymikee in #1623
- feat(ios): extend depth-capped private-AX captures via element-rooted requests by @thymikee in #1627
- refactor(daemon): one interface for the deferred interaction outcome by @thymikee in #1633
- refactor: sink backend.ts's cycle-closing types — R9 cycle 76 → 49 by @thymikee in #1636
- fix(ios): pin tap-outcome corroboration probes to the baseline's backend by @thymikee in #1634
- ci: remove package smoke workflow by @thymikee in #1624
- fix: stop the slow-snapshot warning from firing on a single cold start by @thymikee in #1628
- feat: add scale-only screenshot sizing by @szdziedzic in #1617
- fix: honest find contract — press/tap aliases, read-only list action, selector uniqueness by @thymikee in #1637
- refactor: import package types directly — no internal re-export laundering by @thymikee in #1640
- docs: pin the version-skew invariant and the four legitimate compat axes by @thymikee in #1643
- test: pin own-pid start time in device-claim tests to stop load flakes by @thymikee in #1642
- refactor(daemon): consolidate post-gesture surface-evidence helpers and their rationale by @thymikee in #1615
- fix: make Android record stop survive static screens, slow moov finalization, and dead-pid recovery by @thymikee in #1651
- feat: support --settle on scroll and back (#1638) by @thymikee in #1650
- perf(cli): route command aliases through the help fast path by @thymikee in #1641
- fix(daemon): say why a no-effect claim was withheld by @thymikee in #1655
- refactor: declare selector resolution policy as data by @thymikee in #1649
- refactor(ios): runner error classification as data; recovery tested at the transport seam by @thymikee in #1644
- fix(remote): stop persisting the daemon bearer token, and authenticate forced-reconnect release correctly by @thymikee in #1648
- fix(ios): keep the baseline presentation when a tap corroboration has no request flags by @thymikee in #1646
- fix(ios): synthesize hidden-keyboard text through responder by @thymikee in #1657
- fix(daemon): report the device claim retained by a failed close by @thymikee in #1647
Full Changelog: v0.20.5...v0.20.6