## callstack/agent-device — v0.21.16…v0.21.17

_51 commits._

### Features
- **feat(daemon): report the host CPU architecture in /health (#3048)** (811c3e3)
- **feat: add daemon policy to confine devices, commands, and device shutdown (#3064)** (e0474a0)
- **feat(snapshot): carry the presenter's platform-neutral role on nodes (#3045)** (c0e1a7c)

### Fixes
- **fix(ios): write the simulator clipboard from the runner (#3065)** (44e4ec5)
- **fix(daemon-client): a client whose daemon lost the start race adopts the winner (#3057)** (df9f8a4)
- **fix(android): honor boot --timeout as the emulator boot deadline (#3059)** (e323ddf)
- **fix(apple-runner): a penalized snapshot plan falls back to the bounded XCTest probe (#3051)** (1df5a7a)
- **fix(daemon-client): a restart probe cut short by the RPC deadline reports the timeout (#3056)** (0903e3d)
- **fix(ios): give boot a --timeout startup budget (#3008)** (289871b)
- **fix(ios): restore a legacy XCTestDevices redirect before the daemon serves requests (#2980)** (657a6fc)
- **perf(daemon-client): cache remote health by daemon identity (#3015)** (1433e11)
- **fix(platform-apple): put --payload-url before the bundle ID on devicectl launch (#3017)** (d3c9d05)

### Backend
- **0.21.17** (3c39f2b)

### Tests
- **test(web): wait for the killed fake daemon to be reaped before asserting it is gone (#3066)** (ab68e04)
- **test(daemon-client): a restart probe that fails outright near the RPC deadline reports the daemon unavailable (#3058)** (8a62b37)
- **test(ios-smoke): wait once more when the runner is still starting behind a deep link (#3063)** (5bb104d)
- **test(apple-runner): scope home directory per worker so cache locks stay hermetic (#3049)** (d85e0e7)
- **test(apple-runner): pin exchange session view and accounting (#3006)** (8fe03de)
- **test(ios-smoke): answer deep-link prompt after readiness exhaustion (#3044)** (62ea6da)
- **test(settings): include all in permission vocabulary property (#3039)** (4bbbfb7)
- **test(ios-smoke): budget cold runner readiness (#3026)** (c8c28b0)
- **test(ios-snapshot): cover runner-presented interactive pipeline (#3009)** (5861d3d)

### Chore
- **refactor(contracts): drop unused FOLD_SCREEN_COORDINATE_SPACE mirror from fold-runtime (#3054)** (8b90931)
- **refactor(platform-android)!: report changed permission ids, not a joined string (#3023)** (dbf113a)
- **refactor(mcp): project diff family output schema from its owning module (#3042)** (cb867ba)
- **refactor(mcp): project doctor family output schema from its owning module (#3040)** (7c235bf)
- **refactor(mcp): project prepare family output schema from its owning module (#3038)** (7d198b7)
- **refactor(mcp): project wait family output schema from its owning module (#3036)** (0c4625c)
- **refactor(mcp): project viewport family output schema from its owning module (#3033)** (14f280d)
- **refactor(mcp): project recording family output schemas from their owning module (#3031)** (99e4860)
- **refactor(mcp): project push management family output schemas from their owning module (#3029)** (a007145)
- **refactor(mcp): project device management family output schemas from their owning module (#3027)** (03df0e8)
- **refactor(mcp): project interaction family output schemas from their owning module (#3025)** (fd3173d)
- **refactor(mcp): project system family output schemas from their owning module (#3014)** (3d903d4)
- **refactor(apple-runner): move command exchange out of session owner (#3012)** (7a5a55e)
- **refactor(apple-runner): isolate startup budget mechanics (#3011)** (6542226)
- **chore(gates): move remaining replay health baselines (#3046)** (80f3f56)
- **refactor(apple): give snapshot and fold one native-build owner (#3018)** (3fe2e69)
- **refactor(move): complete replay port package extraction (#3041)** (798f839)
- **refactor(move): relocate remaining daemon replay test fixtures (#3037)** (8c3ffd7)
- **refactor(move): relocate replay runtime and divergence tests (#3035)** (ea3f158)
- **refactor(move): relocate daemon Maestro replay tests (#3034)** (7260fda)
- **refactor(move): relocate replay repair and suite integration tests (#3032)** (192ac0b)
- **refactor(move): relocate replay resume and failure responses (#3030)** (2138bec)
- **refactor(replay): move adapter leaves into replay-port (#3028)** (70278a8)
- **refactor(replay): move test outcomes and support into replay-port (#3024)** (0387485)
- **refactor(replay): move dispatch projections into replay-port (#3022)** (4bb674f)
- **refactor(replay): move command types into replay-port (#3019)** (f20d241)
- **refactor(replay): move target classification into replay-port (#2663) (#3016)** (16041a2)
- **refactor(replay): move source and target decisions into replay-port (#2663) (#3007)** (36e0cff)
- **refactor(platform-android): classify pm refusals on typed reasons (#2700) (#3010)** (a212d9a)

_Recap by [Repo Wrapped](https://repowrapped.com/gh/callstack/agent-device?utm_source=github-action)._