feat(lease): name the iOS simulator mode in a proxy lease device spec
Summary
A proxy allocate can now ask for a slim or full iOS simulator. deviceMode joins osVersion, imageTag and physical as a device-spec key (ADR 0007, amended). The CLI's --device-mode, the SDK's leases.allocate({ deviceMode }) and MCP send it on agent_device.lease.allocate. A daemon refuses it with device-spec-unsupported, like the other keys, and it is excluded from env defaults.
Why: simlock leases slim simulators by default, and Apple Pay / Wallet (PassKit) flows need a full one. com.apple.passd is disabled on slim.
It is named deviceMode, not mode: mode is back --mode in-app|system, and a spec key named mode would make the daemon refuse those commands.
23 files. Backend side: callstackincubator/simlock#1225 (issue callstackincubator/simlock#1223).
agent-device open MyApp --platform ios --device-mode full
Validation
Tested SHA 21590b94705d74a807b92d604b194ea595d7a488, rebased on main 9cf8168a4.
check:affected --run --head 21590b947: stopped on thesmoke-daemon-cleanretirement flake (3 of 8 isolated failures on main), so no single receipt. The 14 checks before it and the 26 blocked ones, run throughpnpm gate, passed.97f95411chad a full passing receipt; only a test and help text changed since.- Live at
12580a6aa, the last production change, through a real gateway (transcript, RPC, Wallet): the allocate sendsdeviceMode: "full", the farm recordsmode: full,com.apple.passdruns. - The refusal is not reachable today. No gateway reports the mode yet: callstackincubator/simlock#1254 is an open draft and is not deployed. Its only coverage is unit tests and a stub gateway.
- Guarantee: slim reported for full is refused, full for slim is served, and a missing mode is accepted unconfirmed.
š¤ Generated with Claude Code