Claude drafts these delta posts, I edit them. They’re primarily for my own consumption.
Xcode 27.1 beta 1 (27A9269) landed, so I re-ran the export for the snapshot repo. One skill changed (full commit), uikit-app-modernization, which is now app-resizability. The other twelve are byte for byte what 27.0 shipped, ios-dynamic-text included.
The export only overwrites, so the old folder is still in the repo and GitHub shows app-resizability as 1,688 new lines. Compared line by line, ignoring blank and very short lines, 67 of the old SKILL.md’s 81 lines carry over, the scene lifecycle reference is byte for byte identical, and the UIScreen and orientation references keep all but one line each. It’s a rename with additions, and the folder grows from 1,158 lines to 1,688.
The description now says the skill is for “preparing or optimizing an app for the foldable iPhone Duo, split-screen multitasking, or Stage Manager”. A new “When to Use” section says “iPhone Duo is the foldable iPhone, so treat questions about iPhone Duo or the foldable iPhone as the same request.” A Duo request runs every task in the skill, “because a screen that changes size exposes all of them at once.” “iPhone Duo” appears on three lines, all in SKILL.md.
SKILL.md also gets a Prerequisites section, three read-only checks the agent reports on before it edits anything. A missing launch screen gets flagged because “iOS 27 rejects the App Store upload with ITMS-90870”. An iPad orientation list missing any of the four orientations gets named. And UIRequiresFullScreen gets flagged because “iOS 27 ignores it and resizes the scene anyway”. The agent is told never to delete that key and never to add UIRequiresFullScreenIgnoredStartingWithVersion, since the version it takes “is the developer’s decision”.
The safe area reference goes from 87 lines to 266, and 14 of the old 57 survive. It introduces a vertical bar the system puts on the leading or trailing edge “on some devices, and in some configurations”. The system reports the bar as a horizontal safe area inset that lasts as long as the configuration does. “It is not a landscape condition, and it is not a sensor housing.” The reference says the inset “is also much larger than the horizontal insets of earlier devices”, and that “two physically different poses report the same orientation and the same geometry”, which I’d guess is the fold. Two APIs for finding the bar are marked iOS 27.1, traitCollection.verticalBarEdge in UIKit and @Environment(\.toolbarVerticalEdge) in SwiftUI. The new rules say never to store an inset or compute one from a width, since a horizontal inset can appear and disappear with no change in size, to use keyboardLayoutGuide rather than keyboard notifications, and to read insets from the view doing the layout rather than the window. A SwiftUI section covers safeAreaBar, scoping ignoresSafeArea to named edges, and not using GeometryReader to read insets.
idiom-task.md is new, 214 lines, and the only lines it shares with the whole 27.0 snapshot are six bits of boilerplate like the “Post-file Checklist” heading. It treats userInterfaceIdiom checks that decide layout as bugs and swaps them for size classes. “An iPad in a narrow Split View reports .compact horizontally, and a large iPhone in landscape reports .regular.” Checks that are about the idiom stay, but read the idiom from the local trait collection rather than UIDevice.current. A static let isPad helper gets deleted, since it evaluates once per process and can’t follow a resize.
The orientation reference adds a pattern for migrating the deprecated windowScene(_:didUpdate:interfaceOrientation:traitCollection:) to windowScene(_:didUpdateEffectiveGeometry:). It says expensive work in the new callback should wait until isInteractivelyResizing is false and only run when the stored size has changed, because the callback fires far more often than the size changes during a drag. It also rules out effectiveGeometry.interfaceOrientation as a replacement for statusBarOrientation, since “a scene reporting a landscape orientation can be taller than wide”. The UIScreen reference gains a Mac Catalyst section on saving a window’s position with effectiveGeometry.systemFrame.
The core principles go from 16 to 14. Two of the dropped ones were about deprecate-and-forward (keep the old method, mark it deprecated, and have it call the new one), and a third drops its sentence about the pattern. The rule for a method with no local object now says to add a parameter and “update its callers to pass one” rather than deprecate the old method. The UIScreen reference still uses deprecate-and-forward, and gains a paragraph saying the old declaration must never be removed.