The XCTest runner is sandboxed, causing Process-spawned apps to
inherit sandbox restrictions. The CI step now:
1. Builds for testing first (separate step)
2. Launches display helper and app from the shell (non-sandboxed)
3. Waits for app diagnostics and render stats
4. Writes manifests for the test to find the pre-launched state
5. Runs test-without-building
The test detects the pre-launch manifest and skips its own app launch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>