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 andclearStatesupport. - 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
--udidwhen a device identity is passed to--deviceby @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 batchand 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
- @kkkhs made their first contribution in #1879
- @NicolasBataille made their first contribution in #2066
- @AdzeB made their first contribution in #2290
- @PrinceD96 made their first contribution in #2325
- @dvd233 made their first contribution in #2378
- @Rohit3523 made their first contribution in #2366
Full Changelog: v0.20.10...v0.21.0