Skip to content

v0.20.6

Choose a tag to compare

@thymikee thymikee released this 07 Aug 11:45
· 639 commits to main since this release

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 --settle with scroll and back for 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