From 8f06c97447381b018543b114b3d5fc364b1562c8 Mon Sep 17 00:00:00 2001 From: Ryanmello07 <67509637+Ryanmello07@users.noreply.github.com> Date: Tue, 8 Sep 2026 20:06:43 -0700 Subject: [PATCH] Pin CI to Xcode 26.3 CI has been compiling against the iOS 18 SDK while the app runs on iOS 26 devices. Anything that only exists, or only misbehaves, on the current SDK is invisible here, and that gap has started costing real time. Two cases from one week. App code merged to main needed an SDK symbol the 16.4 toolchain does not have, so it built green in CI and failed on a developer machine. And `ControlCenter` is absent from the macOS 15 SDK that 16.4 uses, which is the entire reason WidgetRefresh.reloadControl is walled off behind `#if os(iOS)` rather than shipping the Control Center toggle on macOS -- a workaround this bump makes unnecessary, though removing it is left to its own change. Still pinned to an exact path rather than to the image default or to "latest": the original pin's reasoning holds, only its target was stale. A runner-image bump must not move the toolchain, and with it the SDK the app is compiled against, without a commit that says so. 26.3 is the newest stable on the macos-15 image, which also carries 26.2, 26.1.1 and 26.0.1. Be clear about what this does NOT buy. The job builds and runs unit tests; it never launches the app, and `-only-testing:networkTests` excludes the ui tests entirely. A rendering fault that only appears on a current SDK still gets through -- one just did. Closing that needs the app actually run in CI, which is a separate and larger change. Two documents reasoned from the old pin and are corrected rather than left asserting something false, which is how the symbol-template constraint got lost the first time. The generated symbols stay at Template v6.0, but the reason changes: Xcode 26's actool would accept 7.0, so 6.0 is now kept for compatibility with anyone still on an Xcode 16 series rather than because CI rejects it. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01AWV4MaF9JBcQppSX9UxATa --- .github/workflows/build-and-test.yml | 24 ++++++++++++++----- QUICKCONNECT.md | 5 ++-- .../Assets.xcassets/gen_connector_symbols.py | 14 +++++++---- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 7e933faf..48da0ca8 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -86,13 +86,25 @@ jobs: echo 'func RenderPngV2(data []byte, size int) ([]byte, error) { return RenderPng(data, size) }' >> goidenticons/render_v2_ci_shim.go fi - # 16.4 is the macos-15 default and the series this project was written - # for (pbxproj objectVersion 77 / LastUpgradeVersion 1620). Pinned so a - # runner-image default bump cannot silently move the toolchain to - # Xcode 26 and with it the iOS SDK the app is compiled against. - - name: Select Xcode 16.4 + # Pinned to an exact path, not to the image default (16.4) and not to + # "latest": a runner-image bump must never move the toolchain, and with + # it the SDK the app is compiled against, without a commit saying so. + # + # 26.3 rather than 16.4 because the gap had become the problem. 16.4 + # compiles against the iOS 18 SDK while the app runs on iOS 26 devices, + # so anything that only exists -- or only misbehaves -- on the current + # SDK is invisible here. Two examples from one week: app code that needs + # a newer SDK symbol built fine in CI and failed on a developer machine, + # and `ControlCenter` is absent from the macOS 15 SDK 16.4 uses, which is + # the sole reason WidgetRefresh.reloadControl is walled off behind + # `#if os(iOS)`. + # + # This does NOT make CI able to catch runtime faults: the job builds and + # runs unit tests, it never launches the app. A rendering fault that only + # appears on a current SDK still gets through. + - name: Select Xcode 26.3 run: | - sudo xcode-select -s /Applications/Xcode_16.4.app + sudo xcode-select -s /Applications/Xcode_26.3.app xcodebuild -version xcrun simctl list runtimes | grep -i ios diff --git a/QUICKCONNECT.md b/QUICKCONNECT.md index fc58620e..82a58588 100644 --- a/QUICKCONNECT.md +++ b/QUICKCONNECT.md @@ -176,8 +176,9 @@ reconciler (the shared tunnel intent, section 3). The July draft in else, so `widgets/Assets.xcassets/gen_connector_symbols.py` rebuilds the connector mark analytically (a 128-unit square whose corners are five quarter-circle arcs of radius 8, alternating convex/concave) and emits two - Template v6 symbol SVGs (SF Symbols 6 / Xcode 16 -- CI pins Xcode 16.4 and - its actool rejects a newer template outright) with the interpolation + Template v6 symbol SVGs (SF Symbols 6 -- the floor every toolchain reads; a + 7.0 export is rejected outright by an Xcode 16 series actool) with the + interpolation sources Ultralight-S, Regular-S, Black-S and Regular-M. The outline variant is a true filled ring (lines inset by w, convex arcs shrunk to 8−w, concave arcs grown to 8+w), diff --git a/app/widgets/Assets.xcassets/gen_connector_symbols.py b/app/widgets/Assets.xcassets/gen_connector_symbols.py index 7caeb4c5..042029f9 100644 --- a/app/widgets/Assets.xcassets/gen_connector_symbols.py +++ b/app/widgets/Assets.xcassets/gen_connector_symbols.py @@ -14,11 +14,15 @@ 16) with the interpolation sources Ultralight-S, Regular-S, Black-S plus Regular-M. -The version has to stay at 6.0: CI pins Xcode 16.4, and its actool rejects a -newer template outright -- "Template format 7.0 is newer than the version that -this software supports (6.0)" -- before it reads any of the artwork. The SF -Symbols app on a current machine exports 7.0, so if you re-export from it, -re-apply the 6.0 changes here rather than committing its output. +The version stays at 6.0. It is the floor every toolchain we build with can +read, and nothing is gained by raising it: a 6.0 template renders identically +on a newer actool, while a 7.0 one is rejected outright by an older -- "Template +format 7.0 is newer than the version that this software supports (6.0)" -- +before it reads any of the artwork. CI has since moved to Xcode 26.3, whose +actool WOULD accept 7.0, so that error is no longer what enforces this; the +reason is now compatibility with anyone still building on an Xcode 16 series. +The SF Symbols app on a current machine exports 7.0, so if you re-export from +it, re-apply the 6.0 changes here rather than committing its output. TWO CATALOGS carry these symbols and both are subject to that rule: