feat(config): pin workspace devices with explicit selectors
Summary
Pin a workspace with an explicit selector in agent-device.json:
{ "devicePin": { "platform": "ios", "udid": "SIMULATOR-UDID" } }
agent-device boot
agent-device boot --platform apple
Both commands select within the pin. Conflicting CLI, MCP, and batch selectors return device_pin_conflict with the config source. Pins replace each other atomically across config layers. Ordinary defaults remain overridable.
Daemon and proxy lease admission enforce the selected device. Shared boundary parsing rejects malformed pins as INVALID_ARGS / invalid_device_pin across HTTP and socket transport. Pin code is removed from the generic option schema; the Boolean flag and provenance map are gone.
38 files changed. Scope includes daemon, contracts, and lease admission. Part of #2161; inventory pin markers remain follow-up work.
Validation
Tested SHA: 54ae02af9932a659d16ca6f497a9d2a7a9f4a33e.
AGENT_DEVICE_VITEST_MAX_WORKERS=1 pnpm check:affected --run --head 54ae02af99 passed: receipt run-9kFcYa, exactCommit: true; 42 checks passed, 25 skipped. Passed 19,176 unit tests (three skipped), 395 related tests, and 269 provider integration tests.
Base/head regression comparison, raw cold boots, raw HTTP/socket probes, receipt, and earlier timeout failures. Selector-free and Apple-family cold boots both selected the pinned simulator. Verification daemons stopped; device shut down and views closed.
Default-worker timeout causes remain unproven. This round was self-reviewed. GitHub-owned coverage, native builds, and device lanes remain separate obligations.