You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* fix(rn-fast-runner): cold start persists a reusable .xctestrun (#424)
xcodebuild's bare 'test' action never writes a .xctestrun to Build/Products,
so a self-built runner stayed permanently 'not prebuilt' — every runner death
paid another multi-minute cold build. The cold path is now two-phase:
build-for-testing (awaited to exit, 360s budget, persists the artifact with
the same shape as the documented manual prebuild) followed by the standard
test-without-building launch (30s ready window). resolveRunnerXcodebuildArgs
is replaced by resolveRunnerStartPlan, which encodes the ordered invocations;
the gh-424 unit test supersedes rn-fast-runner-build-args.test.js whose cold
assertion pinned the buggy bare-test behavior. The #418 rebuild tier funnels
through the same path and is fixed by the same change.
Closes#424
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(device_screenshot): iOS pixels route to simctl — caller path honored (#422)
The rn-fast-runner screenshot verb writes into its own sandbox tmp/ and
returns a relative path; the caller's path is structurally droppable at three
layers (argv translation, RunIOSArgs wire shape, Swift handler), so with a
device session open the observe UI got a dimensionless unservable asset and
sips resize read the wrong file (reason: no-dimensions). iOS now routes to
the already-path-honoring raw simctl capture even when the platform is
inferred — simctl was already the flow-active and runner-down backend, this
makes it the sole iOS pixel path per the D1249 'pixels → simctl' doctrine.
Android keeps its runner path (outPath honored host-side via base64).
Defense-in-depth: the observe recorder now rejects relative screenshot paths
instead of resolving them against the bridge cwd (silent stat-miss blanked
the panel; a cwd file sharing the name would have been misread).
Per-edit review hardening: flow-lease acquisition asserted in gh-210 tests;
stale GH #136/A2 routing comments updated to the new contract.
Closes#422
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(cdp_run_action): CDP/JS fallback probe retries + surfaced skip reasons (#423)
Field root-cause chain (differs from the issue's framing): the park that the
issue presumed missing exists and works — cdp_run_action shares
createMaestroRunHandler → runFlowParked → stopFastRunner with maestro_run,
and a live experiment showed SIGTERM to the xcodebuild host tears down the
sim-side XCUITest runner in ~400ms. The actual dead end: WDA died at launch
(iOS 26.x, #317 family), the CDP/JS replay fallback was eligible (UNKNOWN is
in its trigger) but its single tree probe ran while CDP was mid-reconnect
after the flow's app relaunch, catch(() => null) swallowed it, and the
fallback silently skipped — surfacing an unexplained UNKNOWN after ~50s.
- probeTreeWithRetry: bounded retry (default 3×1.5s, clamped) until the probe
testID is PRESENT — tolerates both a reconnecting CDP and a still-mounting
app (per-edit review upgrade over tree-readable-only).
- Every skip is typed in meta.cdpJsFallback { attempted:false, reason:
no-replay-deps | no-probe-testid | cdp-unreachable | testid-not-in-tree }.
- cdp-unreachable appends actionable guidance (cdp_status, reconnect, stop
foreign XCUITest automation).
GH #422 hardening bundled from per-edit review (raw is now the primary iOS
pixel path, so its resolution rules tightened): simctl parsers only count iOS
runtimes (booted paired watch can't poison the pick), raw captures bind to
the open session's UDID, no-session resolution refuses on multi-sim
ambiguity instead of first-pick, capturer exceptions honor the
RawScreenshotResult contract, and the observe live panel binds to the
session device too. parseSimctlBootedUDID removed (single-pick semantics
were the hazard); parseSimctlBootedAll is the sole parser.
Closes#423
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* style: oxfmt reflow of gh-422/423/424 files (pre-push format gate)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
? `No booted ${platform==='ios' ? 'iOS Simulator' : 'Android emulator'}detected by ${cli}. Boot one and retry; if your emulator is in 'offline' or 'unauthorized' state, restart it.`
296
+
? `No booted ${platform==='ios' ? 'iOS Simulator' : 'Android emulator'}was unambiguously resolvable by ${cli} — none booted, or several booted with no open device session. Boot exactly one, or open a session (device_snapshot action=open) to bind the target; if your emulator is 'offline'/'unauthorized', restart it.`
291
297
: `Capture command failed (${cli}). The device may be transitioning state (booting, OOM, locked). Retry once it stabilizes.`;
0 commit comments