Skip to content

chore: upgrade to Xcode 26.3 and iOS 26.3#209

Merged
BrunoCerberus merged 10 commits intomasterfrom
chore/upgrade-xcode-26.3
Mar 11, 2026
Merged

chore: upgrade to Xcode 26.3 and iOS 26.3#209
BrunoCerberus merged 10 commits intomasterfrom
chore/upgrade-xcode-26.3

Conversation

@BrunoCerberus
Copy link
Owner

Summary

  • Update deployment targets from iOS 26.2 to iOS 26.3 across project.yml and all targets
  • Update Xcode version from 26.2 to 26.3 in project.yml, Makefile, and CI workflows
  • Update simulator OS destinations from 26.2 to 26.3 in Makefile, ci.yml, and scheduled-tests.yml

Test plan

  • Verify project generates and builds locally with make clean && make setup && make build
  • Run unit tests with make test-unit
  • Confirm CI pipeline passes on macos-26 with Xcode 26.3

🤖 Generated with Claude Code

Update deployment targets, Xcode version, and simulator OS across
project.yml, Makefile, and CI workflows to use Xcode 26.3 / iOS 26.3.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 1m 32s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and understand the changes
  • Review project.yml changes
  • Review Makefile changes
  • Review CI workflow changes (ci.yml, scheduled-tests.yml)
  • Verify consistency across all files
  • Post final review

Review Summary

Approved — Clean, consistent version bump from 26.2 → 26.3 across all 4 changed files.

Changes verified:

File Changes Status
project.yml Deployment target + Xcode version (9 replacements) ✅ Consistent
Makefile Simulator OS destinations + echo strings (15 replacements) ✅ Consistent
ci.yml Xcode setup + simulator destinations (6 replacements) ✅ Consistent
scheduled-tests.yml Xcode setup + simulator destinations (7 replacements) ✅ Consistent

Minor nit: README.md and Pulse/Documentation.docc/GettingStarted.md still reference 26.2 for Xcode/iOS requirements. Since the deployment target is now 26.3, these should be updated to stay accurate. See inline comment.

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Clean and consistent version bump across all 4 files. All references to 26.2 have been properly updated to 26.3 in project.yml, Makefile, ci.yml, and scheduled-tests.yml. Minor nit: README.md and Pulse/Documentation.docc/GettingStarted.md still reference 26.2 — see inline comment.

deploymentTarget:
iOS: "26.2"
xcodeVersion: "26.2"
iOS: "26.3"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: The deployment target is now 26.3, but a couple of documentation files still reference 26.2:

  • README.md (lines 302-303): Xcode 26.2+ / iOS 26.2+
  • Pulse/Documentation.docc/GettingStarted.md (lines 12-13): Xcode 26.2 or later / iOS 26.2 SDK

Since the minimum deployment target is now 26.3, these should be updated to match. Not blocking, but worth a follow-up.

Fix this →

@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 1m 30s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and review updated changes
  • Review all changed files for consistency
  • Check documentation files for version references
  • Post final review

Review Summary

Approved — Clean, consistent version bump across all 4 files. The new commit (5b3eb42) correctly updates simulator OS destinations from 26.3 to 26.3.1 to match the actual simulator runtime shipped with Xcode 26.3.

Commit breakdown:

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all files
5b3eb42 Fix simulator OS destinations to 26.3.1 (the specific runtime version)

Changes verified:

File Changes Status
project.yml Deployment target 26.226.3, xcodeVersion 26.226.3 ✅ Consistent
Makefile Simulator OS 26.226.3.1, echo strings updated ✅ Consistent
ci.yml Xcode 26.226.3, simulator OS 26.226.3.1 ✅ Consistent
scheduled-tests.yml Xcode 26.226.3, simulator OS 26.226.3.1 ✅ Consistent

The distinction between deployment target (26.3 in project.yml) and simulator runtime (26.3.1 in Makefile/CI) is correct — the deployment target is the minimum supported version while the simulator destination needs to match the exact runtime available.

Nit (still applies from previous review): README.md (lines 302-303) and Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still reference 26.2. Worth a follow-up to keep docs accurate.

Fix this →

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Clean and consistent version bump. Deployment target correctly set to 26.3 in project.yml, simulator destinations updated to 26.3.1 in Makefile and CI workflows. Minor nit: README.md and GettingStarted.md still reference 26.2 — worth a follow-up.

The macos-26 runner with Xcode 26.3 doesn't bundle the iOS simulator
runtime. Add xcodebuild -downloadPlatform iOS step and use OS=latest
for simulator destinations to avoid version mismatches.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 1m 36s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and understand the changes
  • Review latest commit changes (ac18357)
  • Review all changed files for consistency
  • Check documentation files for version references
  • Post final review

Review Summary

Approved — The latest commit (ac18357) correctly addresses the CI simulator runtime issue. All changes are clean and consistent.

Commit breakdown:

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all files
5b3eb42 Fix simulator OS destinations to 26.3.1 in Makefile
ac18357 Install iOS simulator runtime on CI + switch to OS=latest

Latest commit analysis (ac18357):

The macos-26 runner with Xcode 26.3 doesn't bundle the iOS simulator runtime. This commit adds:

  1. xcodebuild -downloadPlatform iOS step before simulator usage in CI
  2. OS=latest for simulator destinations in CI (instead of hardcoded version)

This is applied consistently across all jobs that need a simulator:

File Jobs with simulator runtime install Status
ci.yml build, tests
scheduled-tests.yml build, tests, auto-fix-tests

Design decision — OS=latest vs OS=26.3.1:

  • CI workflows use OS=latest — correct, since the downloaded runtime version may vary and latest picks whatever is available
  • Makefile keeps OS=26.3.1 — correct for local development where the exact runtime is known

The code-quality job correctly omits the simulator runtime step since it only runs linting.

Nit (still applies): README.md (lines 302-303) and Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still reference 26.2. Worth a follow-up to keep docs accurate.

Fix this →

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! The latest commit correctly addresses the CI simulator runtime issue. Using OS=latest in CI with explicit xcodebuild -downloadPlatform iOS is a solid approach, and the Makefile keeps the specific 26.3.1 version for local reproducibility. Clean and well-structured changes.

- FeedUITests.testSourceArticleNavigation: replace waitForExistence
  with safeWaitForExistence to avoid Xcode 26 C++ exception SIGABRT
- HomeUITests.testHomeContentInteractionsAndSettingsFlow: add
  coordinate-based tap for settings back button, recovery via Home
  tab if navigation fails, and use safeWaitForExistence for scroll
  assertion to prevent flaky failures on CI

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 1m 51s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and review all commits since last review
  • Review new UI test changes (bc92ff8)
  • Review CI workflow changes
  • Check consistency across all files
  • Post final review

Review Summary

Approved — All 4 commits are clean and well-structured. The latest commit (bc92ff8) makes targeted fixes to resolve UI test crashes and flaky assertions specific to CI environments running Xcode 26.3.

Commit Breakdown

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all config files
5b3eb42 Fix simulator OS destinations to 26.3.1 in Makefile
ac18357 Install iOS simulator runtime on CI + OS=latest for CI destinations
bc92ff8 Fix UI test crashes and flaky assertions on CI

Latest Commit Analysis (bc92ff8)

FeedUITests.swift — Replaces 4 waitForExistence() calls with safeWaitForExistence() in testSourceArticleNavigation(). This is the right call — the safe variant avoids the Xcode 26 C++ exception SIGABRT that occurs when snapshot evaluation times out in XCTest's internal loop.

HomeUITests.swift — Three improvements to testHomeContentInteractionsAndSettingsFlow:

  1. Back button discovery (line 197-199): Adds "News" as a fallback label for the settings back button. iOS 26 Liquid Glass can label back buttons with the previous view's title instead of "Back" — good defensive fix.

  2. Coordinate-based tap (lines 205-207): Uses coordinate(withNormalizedOffset:) instead of direct .tap() for the settings back button. This matches the pattern already used throughout BaseUITestCase for iOS 26 Liquid Glass reliability.

  3. Navigation recovery (lines 215-223): If the back navigation doesn't land on Home, falls back to navigateToTab("Home"). The wait(for: 1.0) before checking gives the animation time to settle on CI. Good pattern — fail gracefully rather than crash.

  4. Scroll assertion (lines 262-265): Adds wait(for: 0.5) after swipeUp() and uses safeWaitForExistence for the responsive-after-scroll check.

Observation

There are still 24 waitForExistence() calls remaining in HomeUITests.swift and 8 in FeedUITests.swift that haven't been migrated to safeWaitForExistence(). The commit only targets the specific calls that were causing CI failures, which is a reasonable scoped approach. If additional crashes surface from the remaining calls, those can be migrated incrementally in follow-up PRs.

Previous Nit (still applies)

README.md (lines 302-303) and Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still reference 26.2 for Xcode/iOS requirements. Worth a follow-up to keep docs accurate.

Fix this →


Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! The latest commit correctly fixes UI test crashes and flaky assertions on CI. The targeted migration to safeWaitForExistence(), coordinate-based taps for Liquid Glass, and navigation recovery patterns are all well-implemented. Clean and consistent across all 6 changed files.

xcodebuild -downloadPlatform iOS fails with "Unable to connect to
simulator" on fresh macos-26 runners. Initialize the CoreSimulator
service first with xcrun simctl list runtimes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 2m 27s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and review latest commit (57a67fa)
  • Review all changed files for consistency
  • Check for any remaining issues
  • Post final review

Review Summary

Approved — All 5 commits are clean and well-structured. The latest commit (57a67fa) correctly addresses the CoreSimulator initialization issue on fresh macos-26 runners.

Commit Breakdown

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all config files
5b3eb42 Fix simulator OS destinations to 26.3.1 in Makefile
ac18357 Install iOS simulator runtime on CI + OS=latest for CI destinations
bc92ff8 Fix UI test crashes and flaky assertions on CI
57a67fa Initialize CoreSimulator service before downloading iOS runtime

Latest Commit Analysis (57a67fa)

The xcodebuild -downloadPlatform iOS command can fail with "Unable to connect to simulator" on fresh macos-26 runners because the CoreSimulator service isn't initialized. This commit adds a xcrun simctl list runtimes call + sleep 5 before the download to warm up the service.

Applied consistently across all 5 jobs that need a simulator:

File Jobs Status
ci.yml build, tests
scheduled-tests.yml build, tests, auto-fix-tests

The code-quality job in ci.yml correctly omits this step since it only runs linting.

Overall Verification

Check Status
project.yml deployment target 26.3, xcodeVersion 26.3
Makefile simulator OS 26.3.1 (all 15 replacements)
CI workflows Xcode 26.3 + OS=latest + CoreSimulator init
UI test fixes (safeWaitForExistence, coordinate taps, nav recovery)
All 5 simulator runtime install blocks are identical

Nit (carried over from previous reviews)

README.md (lines 302-303) and Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still reference 26.2 for Xcode/iOS requirements. Worth updating to stay accurate.

Fix this →

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! The latest commit correctly initializes the CoreSimulator service before downloading the iOS runtime — solid fix for the fresh runner issue. All 5 commits are clean and consistent. Minor nit: README.md and GettingStarted.md still reference 26.2.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 1m 29s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and review all commits since last review
  • Review latest commit changes (85b8485)
  • Review all changed files for consistency
  • Check documentation files for version references
  • Post final review

Review Summary

Approved — All 6 commits are clean and well-structured. The latest commit (85b8485) addresses the README documentation nit from previous reviews.

Commit Breakdown

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all config files
5b3eb42 Fix simulator OS destinations to 26.3.1 in Makefile
ac18357 Install iOS simulator runtime on CI + OS=latest for CI destinations
bc92ff8 Fix UI test crashes and flaky assertions on CI
57a67fa Initialize CoreSimulator service before downloading iOS runtime
85b8485 Update README requirements to Xcode 26.3 and iOS 26.3

Latest Commit Analysis (85b8485)

Updates README.md lines 302-303 from Xcode 26.2+ / iOS 26.2+ to Xcode 26.3+ / iOS 26.3+. This addresses the documentation nit raised in all previous reviews.

Overall Verification

Check Status
project.yml deployment target 26.3, xcodeVersion 26.3
Makefile simulator OS 26.3.1 (all 15 replacements)
CI workflows Xcode 26.3 + OS=latest + CoreSimulator init
UI test fixes (safeWaitForExistence, coordinate taps, nav recovery)
All 5 simulator runtime install blocks are identical
README.md updated to 26.3
No remaining 26.2 references in config/build/CI files

Remaining Nit

Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references Xcode 26.2 / iOS 26.2 SDK. Worth a follow-up to stay fully consistent. See inline comment.

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Clean and consistent version bump across all 7 files. The latest commit correctly updates README.md to reference Xcode 26.3 and iOS 26.3. Minor nit: GettingStarted.md still references 26.2 — see inline comment.


- Xcode 26.2+
- iOS 26.2+
- Xcode 26.3+
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (carried over): Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references 26.2:

- Xcode 26.2 or later
- iOS 26.2 SDK

Worth updating to 26.3 to stay consistent with the README and project.yml.

Fix this →

The CI UI tests failed with "Failed to terminate" when app.launch()
tried to kill a lingering app instance from the previous test. This
adds explicit termination in tearDown (safe with continueAfterFailure=true)
and a retry mechanism in setUp if the first launch fails.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 1m 42s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and review all commits since last review
  • Review latest commit changes (f516abc)
  • Review all changed files for consistency
  • Check documentation files for version references
  • Post final review

Review Summary

Approved — All 7 commits are clean and well-structured. The latest commit (f516abc) correctly addresses the UI test lifecycle issue where a lingering app instance from the previous test would prevent app.launch() from reaching foreground.

Commit Breakdown

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all config files
5b3eb42 Fix simulator OS destinations to 26.3.1 in Makefile
ac18357 Install iOS simulator runtime on CI + OS=latest for CI destinations
bc92ff8 Fix UI test crashes and flaky assertions on CI
57a67fa Initialize CoreSimulator service before downloading iOS runtime
85b8485 Update README requirements to Xcode 26.3 and iOS 26.3
f516abc Add explicit app termination in tearDown and launch retry in setUp

Latest Commit Analysis (f516abc)

BaseUITestCase.swift — tearDown (lines 111-122): Reverses the previous "don't terminate" approach. Now explicitly calls app.terminate() when the app is still running. The comment correctly explains why this is safe: with continueAfterFailure = true (set in setUp), any C++ exception from Xcode 26's accessibility queries during termination is recorded as a non-fatal issue rather than crashing the runner. This prevents "Failed to terminate" errors in the next test's setUp.

BaseUITestCase.swift — setUp (lines 57-71): Adds a retry mechanism — if app.wait(for: .runningForeground) fails after the first launch (e.g., previous instance didn't terminate cleanly), it creates a fresh XCUIApplication instance and retries. The launch environment/arguments are duplicated from the initial setup, which is correct since app is reassigned to a new instance.

Observation on duplication (lines 59-68): The retry block duplicates the launch configuration from lines 37-53. This is acceptable since extracting a helper would add complexity for a single retry path, and the values must match exactly. If the launch config changes in the future, both blocks need updating — but the duplication is localized and well-commented.

Overall Verification

Check Status
project.yml deployment target 26.3, xcodeVersion 26.3
Makefile simulator OS 26.3.1 (all 15 replacements)
CI workflows Xcode 26.3 + OS=latest + CoreSimulator init
UI test fixes (safe waits, coordinate taps, nav recovery)
All 5 simulator runtime install blocks are identical
README.md updated to 26.3
tearDown termination + setUp retry logic

Nit (carried over)

Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references Xcode 26.2 / iOS 26.2 SDK. Worth updating to stay fully consistent.

Fix this →

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! The latest commit correctly addresses the UI test tearDown/setUp lifecycle issue. All 7 commits are clean and consistent. Minor nit: GettingStarted.md still references 26.2 — see inline comment from previous review.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 2m 22s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and review all commits since last review
  • Review latest commit changes (e05688c)
  • Review new scripts/boot-simulator.sh script
  • Review all changed files for consistency
  • Post final review

Review Summary

Approved — All 8 commits are clean and well-structured. The latest commit (e05688c) replaces the naive xcrun simctl boot with a robust pre-boot script that addresses iOS 26.3 simulator flakiness on CI.

Commit Breakdown

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all config files
5b3eb42 Fix simulator OS destinations to 26.3.1 in Makefile
ac18357 Install iOS simulator runtime on CI + OS=latest for CI destinations
bc92ff8 Fix UI test crashes and flaky assertions on CI
57a67fa Initialize CoreSimulator service before downloading iOS runtime
85b8485 Update README requirements to Xcode 26.3 and iOS 26.3
f516abc Add explicit app termination in tearDown and launch retry in setUp
e05688c Pre-boot simulator to prevent iOS 26.3 CI flakiness

Latest Commit Analysis (e05688c)

scripts/boot-simulator.sh — New script that replaces the simple xcrun simctl boot "iPhone Air" with a multi-step boot process:

  1. Shutdown all — Clean slate for a fresh boot
  2. UDID lookup — JSON-based device discovery via python3 (available on macOS runners)
  3. Erase — Pristine simulator state (prevents stale state from previous runs)
  4. Boot + bootstatus — Waits for full boot completion rather than fire-and-forget
  5. Warmup sleep — Configurable via argument (default 30s) for accessibility services to stabilize
  6. Verification — Lists booted devices to confirm success

The script uses set -euo pipefail for proper error handling, with || true on shutdown/erase commands that may fail on first run. Good defensive scripting.

CI workflow changes — Both ci.yml and scheduled-tests.yml replace:

# Before
echo "Pre-booting simulator..."
xcrun simctl boot "iPhone Air" || echo "Simulator already booted or unavailable"

# After
chmod +x scripts/boot-simulator.sh
./scripts/boot-simulator.sh "iPhone Air" 30

Applied consistently across all 4 jobs that pre-boot simulators (2 in ci.yml, 2 in scheduled-tests.yml).

Security Note

The embedded Python script in boot-simulator.sh uses string interpolation for DEVICE_NAME inside the Python code (line 31: if d['name'] == '${DEVICE_NAME}'). This is safe in context since the script is only called with hardcoded values from CI workflows ("iPhone Air"), but worth noting that arbitrary input could break the Python parsing. Not a concern for this use case.

Overall Verification

Check Status
project.yml deployment target 26.3, xcodeVersion 26.3
Makefile simulator OS 26.3.1 (all destinations)
CI workflows Xcode 26.3 + OS=latest + CoreSimulator init
Pre-boot script used consistently across all CI simulator jobs
UI test fixes (safe waits, coordinate taps, nav recovery, tearDown/setUp)
README.md updated to 26.3
boot-simulator.sh has executable permission (100755)

Nit (carried over from previous reviews)

Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references Xcode 26.2 / iOS 26.2 SDK. Worth updating to stay fully consistent. See inline comment.

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! The latest commit adds a robust simulator pre-boot script that replaces the simple xcrun simctl boot with a full lifecycle (shutdown → UDID lookup → erase → boot → warmup → verify). Applied consistently across all CI jobs. All 8 commits are clean and well-structured. Minor nit: GettingStarted.md still references 26.2 — worth a follow-up.


- Xcode 26.2+
- iOS 26.2+
- Xcode 26.3+
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (carried over from previous reviews): Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references 26.2:

- Xcode 26.2 or later
- iOS 26.2 SDK

Worth updating to 26.3 to stay consistent with the README and project.yml.

Fix this →

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 1m 51s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and review all commits since last review
  • Review latest commit changes (fb49f82)
  • Review all changed files for consistency
  • Check documentation files for version references
  • Post final review

Review Summary

Approved — All 9 commits are clean and well-structured. The latest commit (fb49f82) correctly hardens the simulator pre-boot script with timeout protection to prevent CI hangs.

Commit Breakdown

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all config files
5b3eb42 Fix simulator OS destinations to 26.3.1 in Makefile
ac18357 Install iOS simulator runtime on CI + OS=latest for CI destinations
bc92ff8 Fix UI test crashes and flaky assertions on CI
57a67fa Initialize CoreSimulator service before downloading iOS runtime
85b8485 Update README requirements to Xcode 26.3 and iOS 26.3
f516abc Add explicit app termination in tearDown and launch retry in setUp
e05688c Pre-boot simulator to prevent iOS 26.3 CI flakiness
fb49f82 Add timeout to simulator pre-boot to prevent CI hang

Latest Commit Analysis (fb49f82)

scripts/boot-simulator.sh — Two improvements to prevent CI hangs:

  1. Boot timeout (line 50): Wraps xcrun simctl boot with timeout 30 so a stuck boot command doesn't block the CI job indefinitely.

  2. Polling-based boot status (lines 53-70): Replaces xcrun simctl bootstatus "$UDID" -b (which can hang indefinitely on iOS 26.3) with a polling loop that checks xcrun simctl list devices booted every 5 seconds with a 120-second hard timeout. If the simulator doesn't boot within the timeout, it logs available devices and exits with an error — much better than an infinite hang.

  3. Warmup reduction (line 13): Default warmup reduced from 30s to 20s. The CI workflows still pass 30 explicitly via ./scripts/boot-simulator.sh "iPhone Air" 30, so this only affects local usage where 20s is sufficient.

Overall Verification

Check Status
project.yml deployment target 26.3, xcodeVersion 26.3
Makefile simulator OS 26.3.1 (all destinations)
CI workflows Xcode 26.3 + OS=latest + CoreSimulator init
Pre-boot script with timeout protection across all CI jobs
UI test fixes (safe waits, coordinate taps, tearDown/setUp)
README.md updated to 26.3
boot-simulator.sh has executable permission (100755)

Nit (carried over)

Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references Xcode 26.2 / iOS 26.2 SDK. Worth updating to stay fully consistent. See inline comment.

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! All 9 commits are clean and well-structured. The latest commit correctly adds timeout protection to the simulator pre-boot script. All version references are consistent across project config, Makefile, and CI workflows. Minor nit: GettingStarted.md still references 26.2 — worth a follow-up.


- Xcode 26.2+
- iOS 26.2+
- Xcode 26.3+
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (carried over from previous reviews): Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references 26.2:

- Xcode 26.2 or later
- iOS 26.2 SDK

Worth updating to 26.3 to stay consistent with the README and project.yml.

Fix this →

…ript

macOS does not include the GNU `timeout` command. Use a background
process with polling loop instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@claude
Copy link

claude bot commented Mar 10, 2026

Claude finished @BrunoCerberus's task in 2m 54s —— View job


PR Review: Upgrade to Xcode 26.3 and iOS 26.3

  • Gather context and review latest commit (eea863c)
  • Review all changed files for consistency
  • Check documentation files for version references
  • Post final review

Review Summary

Approved — All 10 commits are clean and well-structured. The latest commit (eea863c) correctly replaces the GNU timeout command with a POSIX-compatible background-process-based timeout, fixing portability on macOS CI runners.

Commit Breakdown

Commit Changes
3259bc3 Initial 26.2 → 26.3 bump across all config files
5b3eb42 Fix simulator OS destinations to 26.3.1 in Makefile
ac18357 Install iOS simulator runtime on CI + OS=latest for CI destinations
bc92ff8 Fix UI test crashes and flaky assertions on CI
57a67fa Initialize CoreSimulator service before downloading iOS runtime
85b8485 Update README requirements to Xcode 26.3 and iOS 26.3
f516abc Add explicit app termination in tearDown and launch retry in setUp
e05688c Pre-boot simulator to prevent iOS 26.3 CI flakiness
fb49f82 Add timeout to simulator pre-boot to prevent CI hang
eea863c Replace GNU timeout with POSIX-compatible alternative in boot script

Latest Commit Analysis (eea863c)

scripts/boot-simulator.sh — Replaces timeout 30 xcrun simctl boot "$UDID" with a POSIX-compatible background-process pattern:

xcrun simctl boot "$UDID" &
BOOT_PID=$!
# Poll until process exits or 30s elapses
while kill -0 "$BOOT_PID" 2>/dev/null && [ "$BOOT_WAIT" -lt 30 ]; do
    sleep 1
    BOOT_WAIT=$((BOOT_WAIT + 1))
done
# Kill if still running
if kill -0 "$BOOT_PID" 2>/dev/null; then
    kill "$BOOT_PID" 2>/dev/null || true
    echo "ERROR: simctl boot timed out after 30s"
    exit 1
fi
wait "$BOOT_PID" || true

This is the right fix — GNU timeout is not available on macOS (even on GitHub-hosted macos-26 runners), while this kill -0 polling pattern works on any POSIX shell. The wait "$BOOT_PID" || true at the end correctly reaps the child process and ignores non-zero exit codes (which simctl boot may return if the device is already booted).

Overall Verification

Check Status
project.yml deployment target 26.3, xcodeVersion 26.3
Makefile simulator OS 26.3.1 (all destinations)
CI workflows Xcode 26.3 + OS=latest + CoreSimulator init
Pre-boot script POSIX-compatible with timeout protection
UI test fixes (safe waits, coordinate taps, tearDown/setUp)
All 4 CI simulator boot invocations use identical script call
README.md updated to 26.3
boot-simulator.sh has executable permission (100755)
No remaining 26.2 references in config/build/CI files

Nit (carried over from previous reviews)

Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references Xcode 26.2 / iOS 26.2 SDK. Worth updating to stay fully consistent. See inline comment.


- Xcode 26.2+
- iOS 26.2+
- Xcode 26.3+
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit (carried over from previous reviews): Pulse/Documentation.docc/GettingStarted.md (lines 12-13) still references 26.2:

- Xcode 26.2 or later
- iOS 26.2 SDK

Worth updating to 26.3 to stay consistent with the README and project.yml.

Fix this →

Copy link

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! All 10 commits are clean and well-structured. The latest commit correctly replaces GNU timeout with a POSIX-compatible background-process timeout pattern that works on macOS CI runners. All version references are consistent across project config, Makefile, and CI workflows. Minor nit: GettingStarted.md still references 26.2 — worth a follow-up.

@BrunoCerberus BrunoCerberus merged commit b01707c into master Mar 11, 2026
7 checks passed
@BrunoCerberus BrunoCerberus deleted the chore/upgrade-xcode-26.3 branch March 11, 2026 00:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant