build: make iOS 26 the platform baseline - #1
Merged
Merged
Conversation
Raise the deployment floor to iOS 26.0 / macOS 26.0, pin the test runtime to iOS 26.5 or newer, and make both contracts enforceable rather than assumed. Deployment floor: - project.yml declares iOS 26.0 and macOS 26.0, and drops the duplicate MACOSX_DEPLOYMENT_TARGET from settings.base so options.deploymentTarget is the single source of truth for the macOS floor. - Every availability gate is now unconditionally true, so the Liquid Glass paths in LiquidGlassGroup.swift and ViewModifiers.swift call the API directly and the macOS/iOS arms collapse into one. No #available or @available checks remain in the codebase. - 26.0 rather than a point release: nothing in the app needs a 26.x point API, so a higher floor would delete the same code and support fewer devices. SDK contract: - Scripts/verify-build-sdk.sh asserts the active toolchain's SDK major matches the branch contract (26), so a machine carrying an Xcode beta cannot silently produce a beta-SDK submission build. CI hard-fails; Scripts/verify-macos.sh warns, since developing on a beta is fine. Test runtime: - Scripts/resolve-ios-simulator.sh takes a minimum runtime (26.5 by default, CHEATSHEET_MIN_IOS_RUNTIME to override) and fails with a per-runtime breakdown rather than falling back below the floor. A green suite that ran on an unsupported runtime certifies nothing. - It matches device family on deviceTypeIdentifier instead of the display name; renamed simulators were being skipped entirely. Ranking now prefers stock-named devices so the pick is reproducible. Enforcement and CI: - Scripts/verify-project-config.sh asserts the deployment floors, so a regression fails CI instead of shipping. - CI moves to the macos-26 runner: a macOS 26 app cannot run on a macOS 15 host, and macos-26 also carries an SDK and simulator runtime satisfying both floors. Xcode selection prefers a versioned Xcode 26 bundle but defers to the SDK check as the real gate, since a bundle name cannot guarantee an SDK version. Docs/os-support-policy.md records the policy, the branching model for iOS 27 adoption, and the measured iOS 27 readiness result. Verified locally: 55 tests in 5 suites pass on both the iOS simulator and macOS, iOS Release builds clean, 0 warnings. The iOS 26 SDK itself is not installed on this machine, so CI remains the authority for the shipping SDK. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
simctl keeps listing the iOS 27.0 beta runtime as available after switching back to the release Xcode, so "newest wins" sent shipping test runs onto the beta OS. Under Xcode 26.6 the resolver picked an iOS 27.0 iPhone rather than the 26.5 one. Exclude runtimes whose major exceeds the active simulator SDK. The toolchain now sets the ceiling, so the iOS 27 readiness branch needs no special case: selecting Xcode 27 raises it automatically. Major-level rather than exact, so a 26.6 runtime under a 26.5 SDK stays usable. Verified under Xcode 26.6 (SDK 26.5): the resolver returns the iOS 26.5 iPhone 17 Pro (9C915472), and the diagnostic marks 27.0 runtimes as newer than the active SDK. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
What changed
Makes iOS 26 the platform baseline, in three parts.
Deployment floor → iOS 26.0 / macOS 26.0.
project.ymldeclares both, and the duplicateMACOSX_DEPLOYMENT_TARGETinsettings.baseis gone sooptions.deploymentTargetis the single source of truth. Every availability gate became unconditionally true, soLiquidGlassGroup.swiftandViewModifiers.swiftnow call the Liquid Glass API directly and their macOS/iOS arms collapse into one. No#availableor@availablechecks remain in the codebase.Floor is 26.0, not a point release: nothing in the app needs a 26.x point API, so a higher floor would delete the same code while supporting fewer devices.
Test runtime → iOS 26.5 or newer.
Scripts/resolve-ios-simulator.shtakes a floor (CHEATSHEET_MIN_IOS_RUNTIME, default 26.5) and fails with a per-runtime breakdown rather than silently selecting an older runtime.Contracts are now enforced, not assumed.
Scripts/verify-build-sdk.shasserts the toolchain SDK major so an Xcode beta cannot produce a beta-SDK submission build.Scripts/verify-project-config.shasserts the deployment floors so a regression fails CI.Two bugs found along the way
QR-floor-265,WoW-iOS26-verify, …) and were invisible to it. Masked today only because iOS 27.0 happens to be installed with stock-named devices; pinned to the 26 line, the pool would have gone empty with conforming devices sitting right there. Now matches ondeviceTypeIdentifier.CI
Moves to the
macos-26runner. A macOS 26 app cannot run on a macOS 15 host, so the macOS test job would not have launched.macos-26(GA since Feb 2026, Xcode 26.6) also carries an SDK and simulator runtime satisfying both floors. Xcode selection now prefers a versionedXcode_26*bundle but defers to the SDK check as the real gate, since a bundle name cannot guarantee an SDK version.Verification
55 tests in 5 suites pass on both the iOS simulator and macOS; iOS Release builds clean; 0 warnings.
Not verified locally: the iOS 26 SDK is not installed on this machine (only Xcode 27 beta), so the build was compiled against the iOS 27 SDK with the 26.0 floor. CI remains the authority for the shipping SDK — please watch this PR's first run, particularly the
macos-26runner label and the 26.5 simulator floor.🤖 Generated with Claude Code