simdrive 1.0.0a8 — device session usable on real hardware
Pre-release
Pre-release
[1.0.0a8] — 2026-05-06 (alpha — device session usable on real hardware)
First end-to-end real-device dogfood (a7, iPhone 17 Pro Max "Moes Max",
iOS 26.3.1, 2026-05-06) catalogued 12 device-session bugs in
simdrive/docs/DOGFOOD_FEEDBACK_2026_05_06_MOES_MAX.md. a8 fixes 11 of
12; the twelfth (D6, empty idevicesyslog output) ships as
investigation-only because the original simctl diagnosis was wrong and
the right fix differs by root cause — see
simdrive/docs/D6_LOGS_INVESTIGATION.md.
Net effect: a7 = "WDA bootstraps but MCP can't drive it"; a8 = "MCP
device session is usable end-to-end". Suite went 678 → 711 passed.
Fixed — priority unlock (turns "unusable" into "usable")
- D3
device.launch_appno longer passes--start-stopped=false—
modern devicectl rejected the flag, blocking everysession_start
withapp_bundle_id. - D2
session_start target=devicenow opens a default WDA test
session unconditionally (with or withoutapp_bundle_id); input verbs
no longer hitwda_session_not_open. - D1
observegatesscreenshot_b64behind a new
include_screenshot_b64param (defaultfalse). The unconditional
101k-char b64 payload was overflowing the MCP token budget on real
devices.screenshot_pathis still returned by default.
Fixed — daemonization
- B3
bootstrap-devicenow passesstart_new_session=Trueto the
xcodebuild Popen and redirects stdout/stderr to
~/.simdrive/wda/<udid>.log; PID written to
~/.simdrive/wda/<udid>.pid. WDA survives bootstrap exit; users no
longer need a manualnohupworkaround. - B3 new CLI:
simdrive wda-up <udid>(relaunch from registry
without rebuilding) andsimdrive wda-down <udid>(SIGTERM via
pidfile).
Fixed — simctl-leak cluster (device sessions stop using simctl)
- D4 Device-launch failure raises
device_launch_failedwith a
devicectl-aware recovery hint instead ofno_devicewith a simctl
hint. - D5
tool_appsfortarget=devicenow queries
xcrun devicectl device info apps --device <udid> --json-output -
instead of returning{apps: []}from a simctl-only call. - D7
tool_app_statefortarget=devicenow queries
xcrun devicectl device info processes ...instead of leaking
simctl's "Invalid device" error string. - New helper
simdrive.diagnostics._devicectl_info_jsonunderlies both.
Fixed — bootstrap polish
- B1
verify_xcode_account_for_team(team_id)now scans the parsed
plist output ofdefaults read com.apple.dt.Xcode DVTDeveloperAccountManagerAppleIDListsfor an actual team binding
(teamID/teamIDs/DVTDeveloperAccountTeamID) instead of grepping
for the literal substring"identifier"(which matched any non-empty
account list and let bootstraps proceed when no account was bound to
the requested team). - B2 When multiple Apple Development certs share the requested
team_id, the most-recently-issued cert is auto-picked instead of
raisingwda_signing_ambiguous. Ambiguity is still raised when
team_idwas not provided. - B4 When
xcodebuild build-for-testingemits aBUILD FAILED
before its-allowProvisioningUpdatesretry succeeds, the FAILED line
is logged at DEBUG with a single INFO-level summary
("First attempt failed pending provisioning fetch; retry succeeded
…expected"). Stops scaring users on first-run bootstraps.
Fixed — session metadata
- D8
bootstrap-devicenow captures device name from
xcrun devicectl device info detailsand iOS version from WDA
/status;~/.simdrive/wda/<udid>.jsoncarriesdevice_nameand
os_versionkeys;tool_session_startreturns these instead of
device: "Real Device",os_version: "".
Investigated (not fixed — gated to a9)
- D6
tool_logsreturns empty on real devices. The original a7
report blamed simctl, but the device path actually uses
idevicesyslog. Five candidate root causes ranked
(1s-warmup-too-short → broken brew binary → over-aggressive predicate
→ DEVNULL'd stderr → Developer Mode regression) in
simdrive/docs/D6_LOGS_INVESTIGATION.md. a9 will pick the right fix
after Lyrasis dogfood capturesidevicesyslog -u <udid> 2>&1against
Palace on a real device.
Tests
- 33 new tests across the four fix waves (1.0.0a7 baseline 678 →
1.0.0a8 711 passing, 1 skipped). - D5/D7 verified live against an iPad on iOS 26 / Xcode 26 (devicectl
JSON shape confirmed).
Known
- CHANGELOG history for a3 → a7 not yet backfilled (gap pre-dates a8).
- Pre-existing iOS 26 simulator TextField-focus timing flake in
test_e2e_testkit.py::test_type_text_followed_by_submit_produces_result
can intermittently fail on busy hosts; passes on isolated rerun and
full suite re-runs.