Conversation
A custom or legacy build location in Xcode settings redirected runner products outside -derivedDataPath, so the xctestrun was never found. Pass SYMROOT, OBJROOT, and SHARED_PRECOMPS_DIR explicitly in the daemon build and build-xcuitest-apple.sh.
There was a problem hiding this comment.
Copilot review overview
🟢 Approval recommended
The implementation and regression coverage are coherent; only a non-blocking stale documentation invariant remains.
Review effort: Balanced
Findings: 1
Open (1)
What changed in this PR
Pins Apple runner build outputs beneath DerivedData, preventing custom Xcode locations from breaking .xctestrun discovery and cache reuse.
Changes:
- Adds shared build-location settings to daemon builds.
- Pins equivalent roots in the standalone build script.
- Adds regression coverage for argument propagation and cache reuse.
| File | Description |
|---|---|
scripts/build-xcuitest-apple.sh |
Pins script build roots under DerivedData. |
scripts/__tests__/runner-isolation-diagnostics.test.ts |
Verifies pinned script arguments. |
packages/platform-apple/src/runner/runner-cache.ts |
Re-exports the location resolver. |
packages/platform-apple/src/runner/runner-cache-metadata.ts |
Defines pinned build-location settings. |
packages/platform-apple/src/runner/runner-artifact.ts |
Applies settings to daemon builds. |
packages/platform-apple/src/runner/__tests__/runner-artifact-build-location.test.ts |
Covers custom locations and cache reuse. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| SYMROOT="$DERIVED_PATH/Build/Products" \ | ||
| OBJROOT="$DERIVED_PATH/Build/Intermediates.noindex" \ | ||
| SHARED_PRECOMPS_DIR="$DERIVED_PATH/Build/Intermediates.noindex/PrecompiledHeaders" \ |
|
The PR is ready at 86fd3f4. Not blocking, and you can take or leave these: the script respells the build layout (Build/Products, Intermediates.noindex, PrecompiledHeaders) that the daemon takes from The Copilot thread on the stale script comment still applies: #3158 (comment). Smoke Tests (run 37122186426) was still running when I checked, so I can't call CI green yet. It builds the runner through |
…lugin * origin/main: (628 commits) fix(ios): pin runner build roots under derived data (callstack#3158) feat: add managed provider plugin infrastructure (callstack#3121) fix(ios): report keyboard focus from the AX bridge's is-editing trait (callstack#3163) feat(devices): report model and osVersion (callstack#3119) fix: guard alert deadline before native tap synthesis (callstack#3113) feat(install-source): accept archive URLs from any public host (callstack#3110) test: keep uptime responsive behind busy runner work (callstack#3114) fix(apple): read the launch confirmation whenever the open cannot see the app (callstack#3115) fix(host-kit): keep extracted directories owner-accessible (callstack#3111) fix(daemon): run Apple tools with the requesting client's DEVELOPER_DIR (callstack#3109) fix(daemon): fence daemon.json removal to its owning process (callstack#3102) fix(snapshot): stop sibling-sized chrome containers from covering their own region (callstack#2996) (callstack#3097) fix(ios): stop reading windows past the one the runner resolved (callstack#3103) refactor(daemon): apply one dispatch-disclosure rule to returned and thrown failures (callstack#3099) chore: drop unused production exports and suppress dynamic consumers (callstack#3100) docs(help): document wait readiness and restart exhaustion (callstack#3098) docs: simplify Host to fresh Simlock devices and lease recovery (callstack#3095) feat(capture): report the display rotation a screenshot was rendered in (callstack#3088) refactor(snapshot): preserve normalized node attributes through presentation (callstack#3092) refactor(help): colocate fold guidance and extract workflows (callstack#3093) ... # Conflicts: # README.md # package.json # packages/kernel/src/snapshot.ts # src/__tests__/eager-closure-budgets.ts # src/cli/commands/connection-presentation.ts # src/commands/schema/cli-help.ts # src/commands/schema/command-overrides.ts

Summary
From e2e feedback: on a host whose Xcode settings use a custom or legacy build location, the runner build failed with "Failed to locate .xctestrun after build".
-derivedDataPathalone does not override that preference, so products landed outside the runner cache directory.The daemon runner build and
scripts/build-xcuitest-apple.shnow passSYMROOT,OBJROOT, andSHARED_PRECOMPS_DIRpinned to the default layout under the derived path. These are location settings, not compiler recipe, so they stay out of the cache-identity build settings.6 files touched. Rebase onto main resolved conflicts with the
ARCHSresolver and thexcuitest-build-settings.tsrefactor; the new test's fake build now seeds a certifiable product bundle.Validation
Tested commit: 86fd3f4277d76d48b1fe1f8d9acd4ad6d0d7f3bc (on upstream/main 9a245d0).
runner-artifact-build-location.test.ts(fake xcodebuild honoring a custom build location): fails with the pin removed, passes with it; also asserts cache reuse without rebuild.scripts/__tests__/runner-isolation-diagnostics.test.ts: script passes the three pinned roots.pnpm check:affected --run --base upstream/main: all runnable checks passed (447 files / 3344 related tests, xctest-selection, packaged-runner-swift).IDEBuildLocationStyle=Custom: before, build failed to locate.xctestrun; after,tapworks, a second run reuses the cache, and the normal path still works.