XcodeAgent SkillsAIInstrumentsiOS

Xcode 27.2 trae skills nuevas: xctrace para Instruments y app-resizability para iPhone Duo

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
CambioSkillPara qué sirve
NuevaxctraceGrabar y leer trazas de Instruments desde la terminal
Nuevaapp-resizabilityPreparar una app para ventanas que cambian de tamaño, incluido iPhone Duo
Ya no apareceuikit-app-modernizationModernizar 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:

NivelDuración
Potential Interaction DelayMás de 33 ms
Brief UnresponsivenessMás de 100 ms
MicrohangMás de 250 ms
HangMás de 500 ms
Severe HangMá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:

BuscaPor qué es un problema
UIScreen.mainUna ventana ya no equivale a la pantalla
interfaceOrientationLa forma de la ventana no depende de la orientación
userInterfaceIdiomUn iPhone Duo abierto puede usar un layout de ancho regular
Safe areas simétricasLas barras pueden cambiar mientras la app corre
Ciclo de vida de UIApplicationDelegateHay 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:

  1. Pantalla de lanzamiento. Si no declaras una, iOS 27 rechaza la subida a la App Store con el error ITMS-90870 (TN3208).
  2. Orientaciones en iPad. Revisa que estén declaradas las cuatro.
  3. 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

SkillCómo instalarla
xctraceGlobal, si mides rendimiento de vez en cuando. Es pequeña y sirve en cualquier proyecto
app-resizabilityPor 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