Skip to content

ci: build and test on Xcode 27 / Swift 6.4 - #27

Merged
3lvis merged 3 commits into
mainfrom
ci/xcode-27
Sep 15, 2026
Merged

3lvis merged 3 commits into
mainfrom
ci/xcode-27

Conversation

@3lvis

@3lvis 3lvis commented Sep 15, 2026

Copy link
Copy Markdown
Owner

CI now runs on the same toolchain as local: the xcode-27 runner image with Xcode_27.0.app (Swift 6.4), replacing macos-15 / Xcode 26.3. Pinwheel did not work on Xcode 27 before this, so two real fixes came with it.

The Demo target stopped compiling. The package defaults its isolation to MainActor, which made UIFontExtensions MainActor-isolated — but PinwheelFontProvider is deliberately nonisolated and Sendable, and Swift 6.4 rejects that call where earlier compilers allowed it. UIFont+Pinwheel.swift sitting beside it was already nonisolated; these helpers are descriptor math with no shared state, so they are too.

Three capture tests went red, and the cause is one field. SwiftUI's private FixedRoundedRect carried cornerSize: CGSize through iOS 26 and carries radii: Radii from iOS 27. Reading only cornerSize returned nil on 27, so a card lost its radius and its radius token — and worse, a pill whose radius went missing took the rasterizing path, which dissolved the SALE badge's capsule and left white text on a light card. The engine now reads whichever field the OS supplies, and answers nil for an .uneven radii rather than inventing a single corner for it. Reading both keeps iOS 18-26 working.

A throwaway probe dumping Path.storage found it; it left with the fix.

Verified on Xcode 27.0 (27A266a) from a worktree, on an iOS 27 simulator: unit 213/213, hosted 16/16, and the warnings gate's own build clean of first-party warnings.

Actions is still paused, and this does not change that. The pause had two reasons — a runner-only crash in hostless XCTest, and scarce Actions minutes. I dispatched this workflow manually on the branch to see whether the new image fixes the first one; the second is a cost call that is yours. The triggers stay commented out and the local green-commit gate stays as it is.

The package defaults its isolation to MainActor, so UIFontExtensions became
MainActor-isolated while PinwheelFontProvider is deliberately nonisolated and
Sendable — Swift 6.4 rejects the call where earlier compilers allowed it, and
the Demo target stopped building. UIFont+Pinwheel.swift beside it was already
nonisolated; these are descriptor math with no shared state, so they are too.

Tests: unit 213/213 + hosted 16/16 green (local xcodebuild)
SwiftUI's FixedRoundedRect carried `cornerSize: CGSize` through iOS 26 and
carries `radii: Radii` from iOS 27, so reading only cornerSize returned nil on
27: a card lost its radius and its radius token, and a pill whose radius went
missing took the rasterizing path, dissolving the SALE badge's capsule and
leaving white text on a light card. Read either, and answer nil for an `.uneven`
radii rather than inventing a single corner for it.

Guarded by the three tests this went red on: CaptureFidelityTests'
testCardKeepsItsRadiusToken and testCornerAndSpacingReferenceDesignTokens, and
SalePillCaptureTests' testSalePillFillSurvivesCapture.

Tests: unit 213/213 + hosted 16/16 green (local xcodebuild)
Tests: unit 213/213 + hosted 16/16 green (local xcodebuild)
@3lvis
3lvis marked this pull request as ready for review September 15, 2026 06:33
@3lvis
3lvis merged commit f325768 into main Sep 15, 2026
1 of 2 checks passed
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