ci: bump to Xcode 26.3 and fix CalendarWatcher.stop race#4
Merged
Conversation
added 2 commits
May 11, 2026 18:57
The pinned mlx-audio-swift dependency declares `// swift-tools-version:6.2`, which SwiftPM enforces on the consumer side. The previous CI step selected Xcode 16 (Swift 6.0), so every build since PR #1 has failed with: package 'mlx-audio-swift' is using Swift tools version 6.2.0 but the installed version is 6.0.0 The macos-15 runner image ships Xcode 26.3 at /Applications/Xcode_26.3.app alongside the default Xcode 16.4. No runner change needed — just point xcode-select at the newer toolchain.
CI on macos-15 surfaced testStopCancelsPollLoop as flaky: after `await watcher.stop()`, the lookup callout occasionally fired one more time before the poll task actually exited. Locally on faster hardware the in-flight refreshNow() completed before the test reached its second sleep so the bug stayed hidden. The real cause is the previous sync `stop()` returning before the already-resumed poll iteration finished. Refactoring `stop()` to be async and `await task?.value` ensures any drained refresh completes before stop returns, so the test's "no more polls after stop" invariant holds across hardware. All five existing call sites already prefix with `await` (actor isolation), so no caller signature changes.
added 2 commits
May 11, 2026 19:20
The xcodebuild step still pointed at TranscriberApp/TranscriberApp.xcodeproj and scheme `TranscriberApp`, neither of which exist — the app project is `TranscriberApp/Scribe.xcodeproj` with scheme `Scribe`, per `scripts/dev-install.sh`. The previous compile failure masked this; once Build core and Test core started passing the Build app step exposed it.
After fixing the Swift 6.2 toolchain selection, swift build and swift test passed on macos-15. The xcodebuild step then failed at CompileAssetCatalogVariant: Xcode 26's `actool` invokes ibtoold, which links AVFCore privately and dyld-fails on macOS 15 with missing CoreMedia symbols (`_kFigCaptionRegionDisplayAlign_Before`, `_kFigCaptionRegionDisplayAlign_After`). Xcode 26's tools need their matching OS frameworks; macos-26 is the supported runner image for that combination.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
CI on
mainhas been red since PR #1. Two root causes; both fixed here.1. Swift version skew
mlx-audio-swiftdeclares// swift-tools-version:6.2while CI selectedXcode_16.app(Swift 6.0):The
macos-15runner already ships Xcode 26.3 at/Applications/Xcode_26.3.app. Switchingxcode-selectto it unblocksswift build(was failing before any tests ran).2. CalendarWatcher.stop() race surfaced by slower CI hardware
After step (1),
swift buildpassed buttestStopCancelsPollLoopfailed:Cause: the previous sync
stop()returned before the in-flightrefreshNow()had drained. Locally on Apple Silicon the refresh always finished inside the test's first sleep window, hiding the bug. On the slower macOS runner one extra callout slipped through afterstop()returned.Fix: make
stop()async andawait task?.value. All five call sites already prefix withawait(actor isolation), so no signature changes ripple out.Heads-up: Build app step still broken
The
Build appstep referencesTranscriberApp/TranscriberApp.xcodeprojwith schemeTranscriberApp, but the real artifact isTranscriberApp/Scribe.xcodeprojwith schemeScribe. Pre-existing stale config; out of scope for this PR.Test plan
Build coreandTest coreswift test --filter CalendarWatcherTestspasses (verified)Build appstep still fails on the stale project name — separate PR