Las notas de versión de Xcode 27.2 no lo mencionan, pero el comando para exportar las skills de Apple devuelve una lista distinta. Xcode 27.0 traía 10. Xcode 27.2 trae 11:
xcrun agent skills export ~/ruta/temporal
| Cambio | Skill | Para qué sirve |
|---|---|---|
| Nueva | xctrace | Grabar y leer trazas de Instruments desde la terminal |
| Nueva | app-resizability | Preparar una app para ventanas que cambian de tamaño, incluido iPhone Duo |
| Ya no aparece | uikit-app-modernization | Modernizar apps UIKit para varias ventanas |
Si llegas nuevo a este tema, empieza por qué son las agent skills. Este post cuenta lo que cambió.
xctrace: Instruments desde la terminal
xctrace es la interfaz de línea de comandos de Instruments, y existe desde hace años. Lo nuevo es la skill: le enseña a un agente a usarla, para que pueda grabar una traza y leerla sin que abras la interfaz gráfica.
Es pequeña: un archivo de entrada y dos referencias. Una explica cómo está organizada una traza y cómo leerla, y la otra cómo investigar bloqueos de la interfaz (hangs). Se activa cuando pides algo de rendimiento, por ejemplo por qué una app va lenta, consume mucha CPU o memoria, o deja de responder.
El flujo que enseña
Grabar:
xcrun xctrace record --template 'Time Profiler' --instrument Hangs \
--device "Mi iPhone" --attach MiApp --time-limit 30s --no-prompt --output app.trace
Leer, de lo general a lo particular:
# Qué contiene la traza
xcrun xctrace toc app.trace
# El árbol de llamadas, con el camino más pesado marcado
xcrun xctrace show app.trace --track "Time Profiler" --calltree "Profile" --format markdown
# Resumen de bloqueos, con lo que hacía el hilo principal
xcrun xctrace triage app.trace --style hangs --format markdown
La skill le pide al agente que primero consulte xctrace help, porque los comandos pueden cambiar entre versiones. Conviene hacer lo mismo con estos ejemplos, que probé en Xcode 27.2. Una salida de show puede ocupar cientos de kilobytes, así que es mejor filtrarla o guardarla en un archivo que leerla en la terminal.
Para comparar un cambio, --append-run agrega una corrida nueva a la misma traza y --run-name le pone nombre: una antes y otra después.
Lo más útil para entender un bloqueo
Cinco niveles de gravedad. triage --style hangs clasifica cada bloqueo por duración:
| Nivel | Duración |
|---|---|
| Potential Interaction Delay | Más de 33 ms |
| Brief Unresponsiveness | Más de 100 ms |
| Microhang | Más de 250 ms |
| Hang | Más de 500 ms |
| Severe Hang | Más de 2 s |
Ocupado o bloqueado. Antes de leer el árbol de llamadas, la skill pide distinguir dos casos:
- Hilo ocupado: usa mucha CPU mientras la interfaz no responde. Hay que mirar el perfil de tiempo.
- Hilo bloqueado: usa poca CPU porque está esperando algo. Hay que mirar las llamadas al sistema.
Un bloqueo puede tener partes de los dos, pero identificar cuál domina evita buscar donde no está el problema.
Lo que no cubre
triage necesita que la traza incluya los instrumentos Hangs y Time Profiler, y no detecta saltos en animaciones o scroll. Para eso está la plantilla Animation Hitches de Instruments.
También hay un límite físico: una app inactiva casi no deja muestras, así que hay que usarla mientras se graba. Y los tiempos que valen salen de un dispositivo real; el simulador sirve para encontrar problemas, no para medirlos.
Todavía no la he usado para resolver un problema real en una app. Cuando lo haga, lo cuento con datos en otro post.
app-resizability: preparar una app para iPhone Duo
Es la que Apple tiene en mente cuando recomienda pedirle al asistente de Xcode “get my app ready for iPhone Duo”. La frase no necesita tecnicismos: pedir que la app funcione en el teléfono plegable basta para activarla.
Se enfoca en apps UIKit, en Swift y en Objective-C, y busca código que asume que el tamaño de la pantalla no cambia:
| Busca | Por qué es un problema |
|---|---|
UIScreen.main | Una ventana ya no equivale a la pantalla |
interfaceOrientation | La forma de la ventana no depende de la orientación |
userInterfaceIdiom | Un iPhone Duo abierto puede usar un layout de ancho regular |
| Safe areas simétricas | Las barras pueden cambiar mientras la app corre |
Ciclo de vida de UIApplicationDelegate | Hay que migrar al de escenas |
Antes de tocar código hace tres revisiones, porque según la skill una app que falla en alguna no se puede redimensionar, sin importar cómo esté el resto:
- Pantalla de lanzamiento. Si no declaras una, iOS 27 rechaza la subida a la App Store con el error
ITMS-90870(TN3208). - Orientaciones en iPad. Revisa que estén declaradas las cuatro.
UIRequiresFullScreen. iOS 27 ignora esta clave y redimensiona la escena de todos modos (TN3192).
Estas revisiones solo leen y reportan. La skill es explícita en no borrar ni agregar esas claves por su cuenta, porque hacerlo puede volver redimensionable una app cuyos layouts todavía no están listos.
También está escrita para no quedarse a medias: si un archivo contiene la API que busca, debe reemplazarla o explicar por qué no, preguntar antes de hacer un cambio riesgoso y no tocar nada fuera de esas líneas.
Es grande: más de 1,600 líneas contando sus referencias. Conviene leerla antes de usarla, como cualquier skill. Si tu app es 100% SwiftUI, buena parte no te aplica; para SwiftUI, Apple recomienda en su guía de iPhone Duo medir con GeometryReader u onGeometryChange.
¿Qué pasó con uikit-app-modernization?
Ya no aparece en el export de Xcode 27.2, y Apple no lo explica en las notas de versión. Todo indica que app-resizability la reemplaza: tiene el mismo propósito y las mismas cuatro referencias (pantalla, orientación, ciclo de vida y safe areas), más una nueva sobre userInterfaceIdiom. Es una deducción mía, no algo que Apple haya confirmado.
Si la tenías instalada, seguirá en tu carpeta de skills hasta que la borres: exportar no limpia nada de lo que ya copiaste. Lo recomendable es reemplazarla.
Cuándo instalar cada una
| Skill | Cómo instalarla |
|---|---|
xctrace | Global, si mides rendimiento de vez en cuando. Es pequeña y sirve en cualquier proyecto |
app-resizability | Por proyecto, en apps UIKit que vayas a preparar para iPhone Duo |
Copia solo la carpeta que necesitas:
xcrun agent skills export /tmp/apple-skills
cp -R /tmp/apple-skills/xctrace ~/.claude/skills/
cp -R /tmp/apple-skills/app-resizability ~/ruta/a/tu-app/.claude/skills/
Si usas Codex o Cursor, cambia ~/.claude/skills/ por ~/.agents/skills/.
Una nota si usas swiftui-expert-skill, de la que hablé en el set esencial: también analiza trazas, así que las dos se pueden activar con un archivo .trace. Un reparto razonable es usar xctrace para grabar y diagnosticar en general, y la otra para interpretar lo específico de SwiftUI.
Revisa tus skills cada vez que actualices Xcode
Esto confirma lo que recomendaba en esa serie: las skills de Apple cambian con cada versión de Xcode, y a veces sin aviso. Después de actualizar, exporta a una carpeta temporal y compara con lo que tienes:
xcrun agent skills export /tmp/apple-skills
diff -rq /tmp/apple-skills/modernize-tests ~/.claude/skills/modernize-tests
Cuando lo hice con mis tres skills de Apple instaladas desde Xcode 27.0, modernize-tests y device-interaction seguían iguales, y swiftui-whats-new-27 solo corregía una errata en un ejemplo de código.
Fuentes
- Xcode 27.2 Release Notes — Apple Developer
- Three steps to make your app shine on iPhone Duo — Apple Developer
- TN3208: Preparing your app’s launch screen to meet App Store requirements
- TN3192: Migrating your app from the deprecated UIRequiresFullScreen key
- Contenido de las skills
xctraceyapp-resizability, exportadas conxcrun agent skills exporten Xcode 27.2 (27B52)