Skip to content

v0.21.0

Latest

Choose a tag to compare

@thymikee thymikee released this 08 Sep 20:09
· 24 commits to main since this release

Highlights

v0.21 makes device automation faster and easier to control.

  • iOS Simulator apps open faster. Cold opens took 27% to 40% less time across six benchmark screens. Snapshots are faster too, and cold-start commands respect the timeout you set.
  • Take over a remote device without ending the agent’s session. Pause its actions, handle a step yourself, then let it continue.
  • Agents get clearer results. Absence checks distinguish a missing element from a failed capture. Android snapshots expose field details such as whether an input is editable or showing placeholder text.
  • Testing takes fewer steps. Crop a screenshot to a selected element, clear a field with fill <target> "", or reset the whole Simulator keychain for a fresh-login test. Maestro gains more selectors and clearState support.
  • Remote runs are easier to debug. Cancellation reaches the daemon, failure logs are accessible through the proxy, and incompatible versions fail earlier.
  • Installation is smaller. Dependency bundling reduced the measured install size from 9.89 MB to 4.44 MB.

Under the hood, commands now use platform-owned runtimes and shared snapshot handling, with less duplicated logic.

Before upgrading (breaking changes): batch steps now use structured input; perf requires a specific operation such as frames or memory; the deprecated SDK rotate wrapper has been removed.

What's Changed

  • refactor: migrate viewport to request runtime by @thymikee in #1864
  • refactor(daemon): admit-before-bind as an admitted-plan token; retire the R32 syntax policy by @thymikee in #1841
  • refactor: tighten viewport runtime facts by @thymikee in #1873
  • fix(layering): list the whole zone when R10's type-cycle ceiling is exceeded by @thymikee in #1852
  • fix(daemon): cap events.ndjson with cursor-safe rotation by @thymikee in #1867
  • fix(layering): resolve relative imports inside workspace packages referencing #1781 by @thymikee in #1872
  • fix(utils): throw AppError from app-log-files and verified-file guards by @thymikee in #1853
  • test: refuse foreign-pid signals from unit-test workers (Coverage fork death, #1824) by @thymikee in #1854
  • test: classify the runner XCTests — pure decisions to a macOS host lane, simulator semantics gated os(iOS) (#1781 A7) by @thymikee in #1861
  • docs: keep size review in CI and local feedback fast by @thymikee in #1842
  • fix: stabilize global flag declaration type by @kkkhs in #1879
  • fix(daemon,kernel): device-selection safety — identity conflicts and ambiguity fail instead of retargeting by @thymikee in #1880
  • refactor: migrate screenshot to request-bound runtime by @thymikee in #1878
  • refactor(daemon): one capture-input builder and one admit-then-bind step by @thymikee in #1876
  • ci: give check:affected real Apple ownership rules and route ios.yml on them (#1781 A9-2) by @thymikee in #1857
  • fix(android): warn when a permission revoke kills the session app by @thymikee in #1856
  • fix: surface remote install network causes by @thymikee in #1863
  • refactor(android): raw is the acquired tree; one presentation for dialog recovery; residues declared (#1832 C3) by @thymikee in #1865
  • test(fuzz): structured CLI/Maestro generators that reach command validation and assert error codes (#1781 B2) by @thymikee in #1866
  • feat(snapshot): move scope into presentation by @thymikee in #1855
  • fix(maestro): refresh targets after transient selector misses by @thymikee in #1886
  • test: make hard-coded caps overridable behind seams (#1781 B5) by @thymikee in #1858
  • test: catch daemon lifecycle and durable-state leaks (#1781 B1) by @thymikee in #1859
  • ci: bound the Linux apt install so a stalled mirror fails fast by @thymikee in #1887
  • fix(maestro): restore conformance invariants by @thymikee in #1889
  • refactor: reuse kernel uniqueStrings instead of local copies by @thymikee in #1892
  • test(bench): falsification fixtures for oracles + typed runner outcomes by @thymikee in #1893
  • docs: simplify AI SDK integration guide by @thymikee in #1891
  • refactor(maestro): remove obsolete presentation mapping by @thymikee in #1896
  • fix(maestro): make iOS presentation correspondence authoritative by @thymikee in #1899
  • fix(android): warn when recording readiness inspection fails open by @thymikee in #1898
  • fix: calibrate iOS scroll execution by @thymikee in #1905
  • refactor: migrate get to the request-bound device runtime by @thymikee in #1877
  • refactor: migrate wait to request-bound runtime by @thymikee in #1875
  • test: add web platform command coverage manifest by @thymikee in #1902
  • test: cover host runner tv remote and recording paths by @thymikee in #1903
  • perf(check-affected): stop running coverage locally, CI stays authoritative by @thymikee in #1908
  • docs(agents): restore and enforce progressive disclosure by @thymikee in #1888
  • fix(maestro): align label metadata ownership by @thymikee in #1909
  • feat(maestro): add recursive tree selectors by @thymikee in #1910
  • feat(maestro): add positional selectors by @thymikee in #1911
  • test: add filesystem boundary fault matrix by @thymikee in #1904
  • test(gesture): assert pan duration in the iOS gesture-lab replay by @thymikee in #1901
  • fix: make iOS scroll release controlled by @thymikee in #1906
  • docs: capture gesture verification lessons by @thymikee in #1913
  • feat(ios): split raw and regular snapshot projections behind one capture hint (#1797) by @thymikee in #1926
  • perf: reduce cold iOS runner startup latency by @thymikee in #1927
  • test: add tvOS platform command coverage manifest by @thymikee in #1919
  • test: add Linux platform command coverage manifest by @thymikee in #1921
  • docs: record visionOS/watchOS support decision by @thymikee in #1918
  • refactor(web): drop duplicate viewport facts spread in webRuntimeFacts by @thymikee in #1928
  • fix: preserve Maestro clickable-first ordering by @thymikee in #1917
  • test: complete boundary fault matrix by @thymikee in #1920
  • feat(ios): move the regular-projection clip fold into snapshot presentation (#1797) by @thymikee in #1929
  • feat(ios): publish effective snapshot geometry by @thymikee in #1931
  • refactor: migrate focus to the request-bound device runtime by @thymikee in #1925
  • chore: refresh root development dependencies by @thymikee in #1923
  • test: add macOS platform command coverage manifest by @thymikee in #1922
  • fix(ios): separate snapshot actionability from occlusion by @thymikee in #1933
  • ci: attribute native package size and trim Apple runner by @thymikee in #1934
  • feat(ios): add snapshot backend conformance by @thymikee in #1930
  • fix(ios): report an unobserved text commit instead of a partial success by @thymikee in #1924
  • refactor(apple): drop dead runner code and collapse duplicated helpers by @thymikee in #1936
  • fix(ios): make snapshot presentation construction private by @thymikee in #1937
  • refactor: migrate type to the request-bound device runtime by @thymikee in #1935
  • chore: ignore host-local workspace artifacts by @thymikee in #1942
  • fix(web): read enabled=false from the snapshot [disabled] annotation by @thymikee in #1940
  • refactor(recording): share the AVFoundation export pipeline between overlay and trim by @thymikee in #1943
  • refactor: complete the find cutover onto the request-bound runtime by @thymikee in #1944
  • refactor: derive every --settle surface from the descriptor trait (#1652) by @thymikee in #1945
  • fix: Linux input/a11y defects from #1935 (click miss, typed '=', GTK4 text) by @thymikee in #1949
  • perf(ios): build structural-identifier suppression child index once per pass by @thymikee in #1938
  • fix(ios): isolate snapshot acquisition timing from presentation by @thymikee in #1948
  • perf(ios): memoize simulator app url-scheme probes per bundle mtime by @thymikee in #1939
  • refactor: dedupe containsPoint and rectArea into @agent-device/kernel by @thymikee in #1953
  • docs: drop stale apps.ts over-budget warning from AGENTS.md by @thymikee in #1954
  • perf(typecheck): make the root tsc project incremental by @thymikee in #1957
  • refactor(daemon): lazy-load platform cleanup helpers in session teardown by @thymikee in #1950
  • fix(ios): enforce regular snapshot clip invariant by @thymikee in #1946
  • refactor(tests): replace the test-utils barrel with direct module imports by @thymikee in #1956
  • diagnose(1874): instrument the synthesized commit wait and add a dispatchable stall loop by @thymikee in #1941
  • fix(ios): preserve regular snapshot depth through structural wrappers by @thymikee in #1947
  • perf(contracts): granularize entry surfaces so hub importers stop evaluating the facade clump by @thymikee in #1969
  • dx(check): fail fast when node_modules lags the lockfile by @thymikee in #1967
  • fix(mutation): move the repo size ratchet where the lane cannot reach it by @thymikee in #1977
  • perf(find): reuse snapshot index once per ranking pass by @thymikee in #1971
  • feat(android): carry effective snapshot geometry by @thymikee in #1968
  • feat(android): bound snapshot presentation quality by @thymikee in #1972
  • test(snapshot): add cross-runtime presentation conformance by @thymikee in #1973
  • perf(android): keep the automation helper warm across fill and scroll by @thymikee in #1974
  • fix(web): scope disabled detection to the ref-bearing annotation group by @thymikee in #1951
  • fix(android): update snapshot quality lifecycle import by @thymikee in #1980
  • fix(macos): sign nested runner code so the host runner app can launch by @thymikee in #1979
  • refactor(recording): move gesture telemetry out of the daemon zone by @thymikee in #1985
  • perf(android): bound occlusion coverage memory by @thymikee in #1982
  • dx(test): opt-in worker-count override for solo local vitest runs by @thymikee in #1964
  • refactor: migrate back/home/orientation/tv-remote/keyboard to the request-bound device runtime by @thymikee in #1955
  • refactor(test): fold the last two coverage-summary copies into the shared builder by @thymikee in #1992
  • refactor(request): move the device-inventory context out of core by @thymikee in #1993
  • test(structure): per-package eager-closure budgets — the ADR-0019 loading-shape probe (#1739) by @thymikee in #1965
  • refactor(lint): retire the facade closure test for a budget row and a lint rule by @thymikee in #1990
  • fix(ios): verify fill's synthesized-replacement route before reporting success by @thymikee in #1995
  • refactor: move Wave 5 touch commands to platform runtime by @thymikee in #1987
  • refactor: migrate the gesture family to the request-bound device runtime by @thymikee in #1952
  • fix(test): drain session-event-log writes before rmSync cleanup in save-script transport tests by @thymikee in #1999
  • perf(selectors): resolve a recorded replay target in one matching pass by @thymikee in #1988
  • docs(agents): simplify testing and pull-request guidance wording by @thymikee in #1997
  • fix: stop replay retries after cleanup failures by @thymikee in #2001
  • ci: consolidate CI workflow from 15 jobs to 8 by @thymikee in #1996
  • fix(ci): run the fuzz corpus replay outside the coverage lane by @thymikee in #1994
  • fix(android): publish covered state from exact order evidence by @thymikee in #1981
  • refactor: make interaction response cleanup platform-neutral by @thymikee in #2002
  • refactor(snapshot): type the acquisition producer beside the platform channel by @thymikee in #2000
  • fix(ci): repair nightly XCTest and conformance lanes by @thymikee in #1989
  • chore(test): start the subprocess-stub kill-criterion experiment (#1823) by @thymikee in #2007
  • test(daemon): harden the timed-out wait decoration test against CI load by @thymikee in #2008
  • perf(selectors): collapse the double tree scan for disambiguate/fail-closed rows by @thymikee in #2009
  • feat(maestro): support assertTrue phase 1 - literal/${VAR} truthiness (#1295) by @thymikee in #2010
  • test: close web platform command-coverage gaps from #1426 by @thymikee in #2011
  • refactor(snapshot): establish presentation ownership boundary by @thymikee in #2005
  • feat: session-scoped echo protection for parameterized recorded inputs by @thymikee in #2013
  • fix(ci): make the two rg-based static checks actually run by @thymikee in #2006
  • feat: add Linux command evidence lane by @thymikee in #2017
  • Extract snapshot policy from daemon to host-side facet (#1983) by @thymikee in #2014
  • fix(daemon): close web sessions on daemon shutdown instead of leaking the browser fleet by @thymikee in #2012
  • fix: persist daemon-owned child process records by @thymikee in #2019
  • docs: define composable recorded fragments by @thymikee in #2018
  • perf(android): one dumpsys read per window question; batch text via the helper IME by @thymikee in #2003
  • refactor(android): admit text onto one resolved channel by @thymikee in #2030
  • feat: add deterministic device selection resolver by @thymikee in #2020
  • Harden the MCP surface: registry rug-pull fix, operator-only credentials/endpoints, device-shell argv gate, declared timeouts by @thymikee in #2023
  • perf(daemon): revalidate the source code-signature cache by stat instead of rereading the graph by @thymikee in #2004
  • fix(daemon): stop branch-named daemon before replacement by @thymikee in #2015
  • refactor(daemon): Wave 6 — migrate clipboard, app-switcher, trigger-app-event, settings, alert, react-native and capabilities onto request-bound runtimes (R55–R63) by @thymikee in #2021
  • fix(daemon): close no longer throws tenant-isolation error on a never-allocated lease by @thymikee in #2029
  • fix(web): launch npm and the managed backend through node, not .cmd shims by @thymikee in #2033
  • fix(ci): skip release instead of erroring when both fixtures are cached by @thymikee in #2036
  • Migrate audio probe to platform runtime with durable resource lifecycle by @thymikee in #2038
  • refactor(contracts): retire the platform/interaction compatibility façades by @thymikee in #2048
  • refactor(registry): flip react-devtools to none (Wave 6 residue, part of #2042) by @thymikee in #2047
  • test(perf): raise local Vitest worker cap to four by @thymikee in #2049
  • refactor: remove next-major compatibility surfaces by @thymikee in #2046
  • refactor(apple): colocate the XCUITest runner client into packages/platform-apple (#2040) by @thymikee in #2050
  • refactor(android): extract the adb executor and IME cluster into packages/platform-android (#2041) by @thymikee in #2044
  • fix(ios): grant the text-entry commit wait time against progress by @thymikee in #2035
  • perf(harmonyos): memoize gesture viewport dumps by @thymikee in #2051
  • refactor(android): one injectable host-adb transport for the remaining raw adb sites by @thymikee in #2052
  • perf(diagnostics): reuse redaction and directory work per scope by @thymikee in #2056
  • perf(apple): uninstall stale runner bundles concurrently by @thymikee in #2058
  • perf(apple): reuse booted simulator memo during open by @thymikee in #2060
  • fix(fuzz): run parser cases in a worker process, not the runner's thread (#2053) by @thymikee in #2055
  • refactor: migrate perf to device runtime by @thymikee in #2061
  • fix(daemon): reconcile device claims held by a replaced daemon by @thymikee in #2057
  • refactor(runtime): close residue execution units by @thymikee in #2054
  • fix(daemon): keep the recovery hint on Maestro replay errors by @thymikee in #2075
  • fix(ci): spawn the differential's agent-device CLI as argv, not one option by @thymikee in #2069
  • feat(interaction): accept fill <target> "" as the clear-field primitive by @NicolasBataille in #2066
  • fix(daemon): address cwd-scoped sessions by their store key, not their public name by @NicolasBataille in #2068
  • fix(cli): name --udid when a device identity is passed to --device by @NicolasBataille in #2065
  • fix(build): silence TS2883 dts noise in the Apple runner client shim by @thymikee in #2077
  • fix(mcp): admit a batch step's input against the nested command's own schema by @thymikee in #2076
  • docs(batch): name the step shape and the accepted commands in help batch and in its refusals by @NicolasBataille in #2067
  • refactor: move platform provider composition out of daemon by @thymikee in #2070
  • refactor: move Android system observation out of daemon by @thymikee in #2071
  • refactor: close the daemon platform boundary by @thymikee in #2072
  • ci: run coverage in one job again by @thymikee in #2079
  • refactor(commands): one audience table for common input fields by @thymikee in #2074
  • docs: reject explanatory implementation comments by @thymikee in #2087
  • refactor: retire ADR-0019 cutover scaffolding by @thymikee in #2081
  • test: derive unavailable runtime fixtures by @thymikee in #2084
  • refactor: remove retired capability matrix by @thymikee in #2089
  • refactor(test): derive provider gateway facts from runtime builder by @thymikee in #2093
  • refactor(layering): remove retired migration scaffolding by @thymikee in #2092
  • fix(test): settle the daemon's exit on its own deadline in the web shutdown lane by @thymikee in #2083
  • fix(ci): stop ten artifact uploads discarding their hidden paths by @thymikee in #2091
  • refactor: delete capabilities projection shell by @thymikee in #2094
  • fix(daemon): refuse host path install sources on the HTTP surface by @thymikee in #2102
  • refactor(substrate): split host mechanics into @agent-device/host-kit capability ports by @thymikee in #2088
  • refactor(platforms): break the four upward edges out of src/platforms by @thymikee in #2090
  • refactor(platforms): sink the shared src/platforms root files into their substrate homes by @thymikee in #2100
  • fix(daemon): dispose late durable capture authorities by @thymikee in #2107
  • fix(wait): surface runner restart timeout evidence by @kkkhs in #2113
  • refactor: sink package-closed src modules into existing packages by @thymikee in #2106
  • fix(daemon): let a retried open supersede the claim its aborted attempt abandoned by @thymikee in #2105
  • ci(1874): declare the diagnose lane and stop it misreading its own loop by @thymikee in #2059
  • chore: adopt shared oxlint config by @thymikee in #2115
  • fix(daemon): fail closed when the auth hook is silent about tenant by @thymikee in #2104
  • fix(daemon): enforce provider session artifact ownership by @thymikee in #2109
  • refactor: move W6 platform families behind package facades by @thymikee in #2116
  • refactor: move Android family behind package exports by @thymikee in #2117
  • refactor: move Apple platform family into package by @thymikee in #2118
  • fix(daemon): confine remote HTTP trust boundaries by @thymikee in #2111
  • feat: add human takeover controls by @szdziedzic in #2078
  • refactor: retire platforms source seam by @thymikee in #2119
  • refactor: prune platform split residue by @thymikee in #2123
  • refactor: contract Apple platform surface by @thymikee in #2125
  • test: characterize replay application behavior and coordinator ownership by @thymikee in #2137
  • refactor(layering): centralize architecture ownership by @thymikee in #2150
  • refactor(snapshot): move text-surface into snapshot presentation by @thymikee in #2152
  • fix: use canonical viewport fallback for rootless touch targeting by @thymikee in #2122
  • refactor: dissolve caller-side src/replay into command and CLI owners by @thymikee in #2151
  • feat: add symbol-aware depgraph authority overlay by @thymikee in #2157
  • feat: open Limrun uploaded apps by @thymikee in #2110
  • fix: improve ref-based interaction recovery by @thymikee in #2167
  • fix(maestro): measure settle outcomes directly by @thymikee in #2155
  • fix: reuse canonical Maestro visibility context by @thymikee in #2156
  • fix: keep named sessions visible in scoped inventory by @thymikee in #2164
  • feat(apple): reclaim retained runners under device-claim authority by @thymikee in #2160
  • feat: add stale device claim release and dead-end recovery guidance by @thymikee in #2162
  • docs+ux: make device ownership discoverable end to end by @thymikee in #2165
  • chore: remove stray validation recording by @thymikee in #2169
  • refactor: extract daemon replay behind one application facade by @thymikee in #2166
  • fix(apple): switch to manual code signing when a provisioning profile is set by @thymikee in #2172
  • fix(daemon): compose stale-claim recovery from the dead owner's state dir by @thymikee in #2171
  • refactor(recording): move Swift cache policy to recording ownership by @thymikee in #2179
  • refactor(snapshot): move snapshot policy utilities (#2135) by @thymikee in #2181
  • refactor(host-kit): move verified-file ownership by @thymikee in #2180
  • refactor: extract daemon session lifecycle inventory facade by @thymikee in #2183
  • refactor(snapshot): move Android helper presentation by @thymikee in #2184
  • refactor(recording): move video validation policy by @thymikee in #2186
  • refactor(app-log): move policy into daemon ownership by @thymikee in #2185
  • test(kernel): move source-value coverage beside kernel owner by @thymikee in #2187
  • refactor(cli): move update-check policy by @thymikee in #2194
  • refactor(cli): move process-exit lifecycle to CLI boundary by @thymikee in #2193
  • fix: address security scanner findings by @thymikee in #2182
  • refactor(daemon): move open lifecycle behind session facade by @thymikee in #2201
  • perf: retain iOS runner across physical relaunch by @thymikee in #2200
  • refactor(output): split presentation owners by @thymikee in #2202
  • refactor: move close lifecycle behind session facade by @thymikee in #2212
  • feat(daemon): establish interaction application facade by @thymikee in #2205
  • refactor(ios): define snapshot acquisition and presentation contracts by @thymikee in #2203
  • refactor(url): split client and Metro URL ownership by @thymikee in #2210
  • perf: avoid redundant physical iOS runner health check by @thymikee in #2215
  • refactor(ios): extract snapshot presenter by @thymikee in #2206
  • refactor(ios): implement snapshot engine by @thymikee in #2211
  • test(ios): add snapshot engine conformance gates by @thymikee in #2213
  • refactor(daemon): move session observability behind facade by @thymikee in #2216
  • fix: preserve physical iOS session health check by @thymikee in #2218
  • refactor(provision-kit): move install-source configuration to its owner by @thymikee in #2217
  • refactor(ios): integrate runner with snapshot engine by @thymikee in #2214
  • refactor(transport): move shared host mechanics by @thymikee in #2221
  • refactor: move utilities to owning modules by @thymikee in #2225
  • docs: clarify technical issue requirements by @thymikee in #2226
  • docs: adopt Simlock-backed Host device allocation by @thymikee in #2220
  • test(ios): establish snapshot convergence baselines and permanent evidence by @thymikee in #2204
  • refactor(ios): route Appium snapshots through engine by @thymikee in #2224
  • refactor(daemon): move interaction and find routes behind facade by @thymikee in #2228
  • refactor: enforce src/utils retirement (#2149) by @thymikee in #2229
  • refactor(ios): converge Limrun snapshots through engine by @thymikee in #2222
  • refactor(daemon): move shared snapshot execution out of handlers by @thymikee in #2232
  • refactor(ios): carry provider acquisitions through one presentation owner by @thymikee in #2233
  • fix(android): apply settings airplane through the connectivity service by @thymikee in #2234
  • fix(daemon): skip sessionless local host teardown for provider devices by @thymikee in #2235
  • chore(gates): drop the test-file size pin map, keep the merge-base ratchet by @thymikee in #2238
  • refactor(layering): one retired-paths rule for src/utils and src/replay by @thymikee in #2240
  • chore(depgraph): stop re-deriving the layering inversion baseline by @thymikee in #2241
  • test(remote-connection): extract shared fixtures from the connection suite by @thymikee in #2243
  • test(remote-connection): extract shared fixtures from the connection suite by @thymikee in #2252
  • test(daemon): extract shared fixtures from the snapshot handler suite by @thymikee in #2254
  • ci(ios): give the pan-duration replay a budget that absorbs a runner rebuild by @thymikee in #2250
  • feat: add strict native absence assertion by @thymikee in #2245
  • test(replay): extract shared fixtures from the target-verification suite by @thymikee in #2249
  • docs(layering): kill criteria on every rule module by @thymikee in #2244
  • fix(ci): fingerprint the test app from its own directory by @thymikee in #2256
  • feat: add strict wait absent polling (#2236) by @thymikee in #2264
  • test(daemon): session-relaunch-close through the request seam by @thymikee in #2262
  • test(android-e2e): make an alert-dismiss failure self-explaining by @thymikee in #2260
  • ci(android): wait for the producer's platform job and keep the fallback build alive by @thymikee in #2261
  • docs(adr): ADR-0019 end-state numbers for the daemon composition root by @thymikee in #2242
  • docs(agents): PR diff budget, move PRs, gates commit, validation lifecycle by @thymikee in #2247
  • test(platform): extract Apple perf and Android runtime fixtures by @thymikee in #2253
  • chore(bench): move iOS snapshot benchmark evidence to the evidence/ios-snapshot branch by @thymikee in #2251
  • test(vitest): retire the subprocess-stub kill-criterion experiment by @thymikee in #2255
  • fix(security): bump fast-uri override to 3.1.6 by @thymikee in #2267
  • fix(security): bump test-app overrides for xmldom, browserslist, decode-uri-component by @thymikee in #2268
  • chore(gates): eager-closure budgets ratchet against merge-base with per-category ceilings by @thymikee in #2257
  • feat(runtime): add managed-local ownership and the exact-only managed runtime by @thymikee in #2258
  • feat(daemon): add the allocator-held device claim kind by @thymikee in #2263
  • fix(remote): materialize test suite artifacts against a remote daemon by @thymikee in #2272
  • ci: enforce the image-size parser mitigation through a test-app gate by @thymikee in #2269
  • perf(ios): decide Simulator AX bridge viability (GO, Node-direct guest reader) by @thymikee in #2237
  • fix: encode the mcp subcommand in server.json package arguments by @thymikee in #2275
  • feat(screenshot): add --crop-on to crop captures to a selector frame by @thymikee in #2276
  • test(coverage): rename-only hunks owe no changed-line coverage by @thymikee in #2248
  • feat(ios): productionize Simulator AX snapshot bridge by @thymikee in #2277
  • fix(daemon): fence managed readiness behind runtime admission by @thymikee in #2280
  • feat(daemon): add managed allocation operation journal by @thymikee in #2284
  • refactor(cli): derive the common flag readers from the common-field table by @thymikee in #2292
  • refactor(contracts): build unavailable runtime facts once by @thymikee in #2291
  • feat(runtime): add contained transports for managed leases by @thymikee in #2285
  • refactor(commands): retire the navigation-only type projection by @thymikee in #2294
  • refactor(cli): let help resolve command aliases itself and retire R12 by @thymikee in #2293
  • docs: simplify agent context and resolve conflicting guidance by @thymikee in #2287
  • perf: bundle tar-stream to reduce install footprint by @thymikee in #2286
  • chore(layering): derive the contracts export inventory from package.json by @thymikee in #2297
  • test(daemon): one typed conformance helper for the daemon runtime suites by @thymikee in #2298
  • chore(gates): layering baselines ratchet against merge-base by @thymikee in #2299
  • test(daemon): session-devices-batch-runtime through the request seam by @thymikee in #2305
  • test(daemon): session-open-url-prewarm through the request seam by @thymikee in #2304
  • fix(web): preserve the backend ref so snapshot refs match actionable refs by @thymikee in #2283
  • ci: avoid unrelated Apple runner cache invalidation by @thymikee in #2303
  • perf: bundle runtime dependencies and report full install size by @thymikee in #2310
  • test(contracts): one typed conformance helper for the runtime-family suites by @thymikee in #2301
  • fix(apple-runner): never compare an unavailable toolchain probe; name the mismatching cache keys by @thymikee in #2306
  • spike(daemon): give the ADR-0014 ref frame private ownership by @thymikee in #2296
  • refactor(runtime): let platform runtimes list apps and read app state directly by @thymikee in #2295
  • refactor(daemon): inline the touch sub-switch into the interaction dispatcher by @thymikee in #2302
  • feat(ios): route Simulator snapshots through AX bridge by @thymikee in #2279
  • refactor(commands): author each executable command once in its facet by @thymikee in #2313
  • fix: stop stamping recovered iOS captures truncated; confirm Android alert dismissal by @thymikee in #2315
  • refactor(move): move managed device allocation into its own workspace package (#2316) by @thymikee in #2321
  • fix(android): preserve editable-field metadata in snapshots by @AdzeB in #2290
  • refactor(capture-kit): move durable-capture resource mechanics out of the daemon by @thymikee in #2320
  • fix(ios): avoid replaying alert mutations by @billsbooth in #2323
  • refactor: share daemon command and teardown budgets by @thymikee in #2307
  • feat: add fenced managed lease admission by @thymikee in #2308
  • fix: contain managed ADB transport to its lease target by @thymikee in #2311
  • feat: delegate reviewed managed automation by @thymikee in #2312
  • feat: admit managed requests within lease authority by @thymikee in #2319
  • refactor(contracts): own the daemon HTTP wire contract so clients stop importing src/daemon by @thymikee in #2322
  • fix(runtime): resolve each lazily imported platform module exactly once by @thymikee in #2327
  • fix: repair main after the managed-allocation move landed under stale PRs by @thymikee in #2328
  • fix(ios): confirm alerts without repeating activation by @billsbooth in #2326
  • refactor(commands): move commands-side rendering out of src/daemon and retire the doctor progress flag by @thymikee in #2349
  • fix(ios): stop charging every capture for a slow Simulator app discovery by @thymikee in #2331
  • refactor(daemon): move four pure leaves to their kits by @thymikee in #2347
  • refactor(daemon): split src/daemon/types.ts into request types and session state by @thymikee in #2346
  • test(android-e2e): record rotation state and logcat rotation decisions on a failed step by @thymikee in #2350
  • feat(wait): carry a per-poll timeline in timeout failures by @thymikee in #2344
  • feat(ios): support explicit iOS simulator keychain reset by @thymikee in #2345
  • refactor(core): move the command descriptor registry into its own workspace package by @thymikee in #2348
  • refactor(contracts): move single-owner modules out of @agent-device/contracts by @thymikee in #2357
  • refactor(daemon): relocate the daemon client out of src/daemon by @thymikee in #2360
  • refactor(daemon): extract the session event journal into a workspace package by @thymikee in #2361
  • test(android): reveal smoke canaries by visibility by @thiagobrez in #2369
  • perf(ios): derive runner demand for Simulator opens and stop observation from awaiting the runner by @thymikee in #2329
  • feat(remote): proxy parity for Simulator observation (#2198 slice B) by @thymikee in #2351
  • fix(android): return from orientation once the display reports the rotation by @thymikee in #2356
  • test(android-e2e): read the logcat tail for rotation evidence by @thymikee in #2359
  • fix(capture): export durable resource record type by @billsbooth in #2365
  • fix(ios): honor the startup budget through a cold Simulator boot by @PrinceD96 in #2325
  • fix(gates): stop an eager-closure approval from turning main red on merge by @thymikee in #2375
  • chore: drop the stale planned-operations closure approval by @thymikee in #2373
  • perf(cli): keep scroll vocabulary off gesture runtime by @dvd233 in #2378
  • refactor(cli): take the CLI's vocabulary off runtime barrels by @thymikee in #2379
  • refactor(move): move replay divergence vocabulary into @agent-device/ad-replay by @thymikee in #2384
  • fix(remote): let a plain-session client read its own failure diagnostics record by @thymikee in #2382
  • refactor(move): move the batch runner and batch policy into @agent-device/command-registry by @thymikee in #2388
  • refactor(ios): prune converged snapshot paths by @thymikee in #2383
  • fix(daemon): stop an attested tenant from downgrading its own isolation by @thymikee in #2386
  • test(remote): assert the proxied snapshot's whole wire conversation by @thymikee in #2387
  • fix(conformance): isolate post-tap settling from app launch by @thymikee in #2390
  • refactor(ios): delete the unused snapshot plan interface by @thymikee in #2392
  • refactor(capture-kit): complete ADR 0019 end state — relocate snapshot and recording zones by @thymikee in #2385
  • feat: support standalone Maestro clearState command by @Rohit3523 in #2366
  • perf(ios): settle the first interaction on a deadline, not a fixed sleep by @thymikee in #2395
  • test(capture): avoid coverage timeouts with a smaller crop fixture by @thymikee in #2399
  • chore(gates): classify #2278 daemon-platform-runtime edges and ratchet handler session authority by @thymikee in #2354
  • docs(adr): record the #2278 coupling audit and re-trace entry-to-platform hops by @thymikee in #2355

New Contributors

Full Changelog: v0.20.10...v0.21.0