<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Deep Cut Atlas - Bitácora - Imperfect Systems</title><description>Entradas de la bitácora sobre Deep Cut Atlas.</description><link>https://imperfectsystems.com/</link><item><title>Controlar un iPhone bloqueado desde una sesión de código</title><link>https://imperfectsystems.com/es/blog/driving-locked-iphone-coding-session/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/driving-locked-iphone-coding-session/</guid><description>WebDriverAgent exigía un teléfono siempre desbloqueado en el escritorio. iPhone Mirroring y mirroir-mcp dejan que un agente toque y pruebe MusicKit a oscuras.</description><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>musickit</category><category>automation</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Detenerme ante un aviso de &quot;tap no confiable&quot; de Homebrew para auditar antes de confiar</title><link>https://imperfectsystems.com/es/blog/homebrew-untrusted-tap-audit/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/homebrew-untrusted-tap-audit/</guid><description>La barrera de confianza existe porque un tap real fue comprometido. Veinte minutos leyendo la fórmula, los permisos y al mantenedor le ganaron a diez segundos de correr el comando sugerido.</description><pubDate>Mon, 21 Sep 2026 00:00:00 GMT</pubDate><category>Development</category><category>security</category><category>macos</category><category>tooling</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Limpiar herramientas abandonadas me enseñó dos cosas que npm y git no dicen</title><link>https://imperfectsystems.com/es/blog/abandoned-tooling-npm-git/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/abandoned-tooling-npm-git/</guid><description>Un npm uninstall que deja atrás un binario de 44MB, y un stash cuya etiqueta registra dónde apuntaba HEAD, no de qué trata el diff.</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><category>Development</category><category>git</category><category>npm</category><category>tooling</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Recuperé un fix guardado en el stash, y una reproducción en vivo en mi teléfono me mostró un error distinto</title><link>https://imperfectsystems.com/es/blog/stashed-fix-live-repro-different-bug/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/stashed-fix-live-repro-different-bug/</guid><description>Un stash apply limpio, una regla de SwiftLint que compara sintaxis en vez de rastrear consumo, y un bloqueo en tres pestañas que no era el error ya arreglado.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>debugging</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Un rechazo de App Store, una trampa de MusicKit, y un trabajo que creí haber perdido</title><link>https://imperfectsystems.com/es/blog/app-store-rejection-musickit-gotcha/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/app-store-rejection-musickit-gotcha/</guid><description>Autorización no es lo mismo que suscripción, un tipo de error que no existe, y una solución ya terminada escondida en git stash mientras yo la reconstruía a partir de notas.</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>app-store</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Un reporte de bug de filtro que se convirtió en tres issues separados</title><link>https://imperfectsystems.com/es/blog/filter-bug-three-issues/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/filter-bug-three-issues/</guid><description>El filtro reportado funcionaba bien: el problema real era otro filtro, deliberadamente independiente, y la solución fue una tercera opción no considerada.</description><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swiftui</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Construir un prompt de calificación que estaba seguro de que no se renderizaría en el simulador</title><link>https://imperfectsystems.com/es/blog/rating-prompt-simulator/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/rating-prompt-simulator/</guid><description>Un umbral de tres logros, una llamada a requestReview(), y una creencia recibida sobre el comportamiento del simulador que resultó ser falsa al probarla de verdad.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>app-store</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>El error que reporté estaba mal planteado, y el fixture que lo corrigió rompió otras cuatro pruebas</title><link>https://imperfectsystems.com/es/blog/bug-i-filed-was-wrong/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/bug-i-filed-was-wrong/</guid><description>El error que reporté era una protección para algo imposible. La solución real fue una exclusión en tiempo de lectura, que rompió otras cuatro pruebas.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>testing</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>La lista de reproducción que ya tenía el nombre correcto</title><link>https://imperfectsystems.com/es/blog/playlist-already-had-right-name/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/playlist-already-had-right-name/</guid><description>Un artefacto del cambio de nombre, una API sin campo de autor, y una prueba en dispositivo que mostró que el error ya se había arreglado solo, cerrado así.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Álbumes destacados, datos reales de MusicKit y una prueba que mintió al pasar</title><link>https://imperfectsystems.com/es/blog/featured-albums-test-that-lied/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/featured-albums-test-that-lied/</guid><description>No existe un flag isEssential: Essentials es solo una playlist. featuredAlbums es la señal real, y un fixture cambiado expuso un test sin re-ejecutar.</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Una sección de tracklist, y por qué tomó 30 minutos</title><link>https://imperfectsystems.com/es/blog/tracklist-section-thirty-minutes/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/tracklist-section-thirty-minutes/</guid><description>Un método de protocolo, un enum de estado reutilizado, una convención de enrutamiento que se mantuvo, y un límite de lint que forzó una división que valía la pena hacer de todos modos.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>El escaneo de 8 segundos escondido en cada refresco</title><link>https://imperfectsystems.com/es/blog/eight-second-scan-every-refresh/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/eight-second-scan-every-refresh/</guid><description>Medir en el dispositivo encontró un escaneo de la biblioteca completa corriendo en cada lote de Discover, y una trampa de medición de 16x donde la caché HTTP favorecía la ruta equivocada.</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>performance</category><category>musickit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>try? convirtió una interrupción en &quot;todo al día&quot;</title><link>https://imperfectsystems.com/es/blog/try-turned-outage-into-all-caught-up/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/try-turned-outage-into-all-caught-up/</guid><description>Un try? ?? [] hizo que un fallo de red fuera indistinguible de «no hay lanzamientos», lo que permitió que una interrupción cacheara un feed vacío sobre datos buenos durante 24 horas.</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>error-handling</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>La configuración que funcionaba perfecto y se sentía completamente rota</title><link>https://imperfectsystems.com/es/blog/setting-worked-perfectly-felt-broken/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/setting-worked-perfectly-felt-broken/</guid><description>Un filtro solo se aplicaba tras reabrir la app, porque un TabView mantiene vivos los view models y congela el estado sembrado. La solución eliminó un concepto.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swiftui</category><category>ux</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Una sola base de conocimiento para todos los agentes de IA</title><link>https://imperfectsystems.com/es/blog/one-knowledge-base-all-agents/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/one-knowledge-base-all-agents/</guid><description>CLAUDE.md sirve para convenciones estables, no para trucos y lecciones aprendidas. Eso necesita un repositorio compartido único, no una copia por repo.</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ai</category><category>claude-code</category><category>knowledge-management</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Lanzar Deep Cut Atlas: qué se rompió durante mi primer envío a la App Store</title><link>https://imperfectsystems.com/es/blog/shipping-deep-cut-atlas-first-submission/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/shipping-deep-cut-atlas-first-submission/</guid><description>Un consumible que debía ser no consumible, un ID de producto que nunca se puede reutilizar, un archivo que en silencio no se reconstruyó, y un cambio de nombre con una mecha de dos semanas.</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>app-store</category><category>storekit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Sincronización con iCloud limitada a Pro para la lista de &quot;No me interesa&quot;</title><link>https://imperfectsystems.com/es/blog/pro-gated-icloud-sync/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/pro-gated-icloud-sync/</guid><description>Un blob de KVS con tombstones en vez de CloudKit para todo, un decorador que mantiene a los usuarios gratis fuera de iCloud, y cómo probar la sincronización con un solo dispositivo.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>icloud</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Una decisión de UX que hice mal la primera vez</title><link>https://imperfectsystems.com/es/blog/ux-decision-wrong-first-try/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/ux-decision-wrong-first-try/</guid><description>La acción de agregar a lista de reproducción calzaba con su gesto hermano en la misma tarjeta, y peleaba con el resto de la app. Elegir el punto de referencia equivocado para «consistente.»</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>ux</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>La pestaña Discover que quedó atascada excavando para siempre</title><link>https://imperfectsystems.com/es/blog/discover-tab-stuck-digging/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/discover-tab-stuck-digging/</guid><description>Una búsqueda de artista fallida nunca contaba como revisada, así que un artista problemático se reelegía para siempre - hasta que una prueba de varias rondas detectó la segunda protección.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Una revisión de documentación que encontró dos afirmaciones obsoletas más de lo esperado</title><link>https://imperfectsystems.com/es/blog/docs-sweep-two-more-stale-claims/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/docs-sweep-two-more-stale-claims/</guid><description>Seis puntos de desactualización ya conocidos, dos más hallados al ejecutar los comandos documentados, y una corrección de nombre más acotada de lo esperado, según la memoria del proyecto.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>documentation</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Fijar la versión de SwiftLint en CI cuando Homebrew no lo permite</title><link>https://imperfectsystems.com/es/blog/pinning-swiftlint-ci-homebrew/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/pinning-swiftlint-ci-homebrew/</guid><description>brew install swiftlint instala lo que sea estable hoy, y el CI de release es el más expuesto a esa deriva. El anclaje es el binario portátil, no una fórmula.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>ci</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Cierre de las brechas de pruebas: lógica pura, una rama simulada inalcanzable y un cambio a Swift 6</title><link>https://imperfectsystems.com/es/blog/closing-test-gaps-swift-6-flip/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/closing-test-gaps-swift-6-flip/</guid><description>Extracción de algoritmos fuera del alcance de MusicKit, un parámetro simulado que se ignoraba en silencio, y dos pruebas que habían estado pasando por la razón equivocada todo este tiempo.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>testing</category><category>swift-concurrency</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Un segfault que no era un error, y la API que finalmente eliminé</title><link>https://imperfectsystems.com/es/blog/segfault-wasnt-a-bug/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/segfault-wasnt-a-bug/</guid><description>Una limpieza de la capa de servicio de MusicKit donde eliminar métodos muertos hizo fallar todas las pruebas a la vez - y la solución fue una compilación limpia, no un depurador.</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>testing</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Arreglar el load path de History, y sorprenderme comentando de más el arreglo</title><link>https://imperfectsystems.com/es/blog/history-load-path-over-commenting/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/history-load-path-over-commenting/</guid><description>Tres fetches secuenciales donde uno ni siquiera se necesitaba al principio, dos recálculos cuadráticos, y un linter que expuso por qué en realidad estaba escribiendo todos esos comentarios.</description><pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>performance</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>La trampa de aislamiento de actores en &quot;simplemente sácalo del hilo principal&quot;</title><link>https://imperfectsystems.com/es/blog/actor-isolation-trap-off-main-thread/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/actor-isolation-trap-off-main-thread/</guid><description>Las conformidades Codable sintetizadas también heredan el aislamiento MainActor por defecto, y async let tiene exigencias más estrictas que la tarea que ya tenías.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swift-concurrency</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>El escaneo de biblioteca completa que creí haber corregido</title><link>https://imperfectsystems.com/es/blog/whole-library-scan-thought-fixed/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/whole-library-scan-thought-fixed/</guid><description>Un patrón no se corrige una sola vez. Otro escaneo de biblioteca en el main actor, escondido en una ruta de escritura, y una API por lotes en una sola vía.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>performance</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Mi pestaña Discover estaba vacía porque le hice la pregunta equivocada a Apple Music</title><link>https://imperfectsystems.com/es/blog/discover-tab-empty-wrong-question/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/discover-tab-empty-wrong-question/</guid><description>IDs de biblioteca usados en solicitudes de catálogo: dos síntomas, un solo error, una solución verificada en dispositivo, y el número de 1.610 artistas que obligó a un rediseño.</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Cuando un conjunto de filtro se convierte en silencio en una función</title><link>https://imperfectsystems.com/es/blog/filter-set-becomes-a-feature/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/filter-set-becomes-a-feature/</guid><description>El almacén de No me interesa solo guardaba claves. Después tuvo que convertirse en una pantalla, y el modelo necesitó cargar su propia descripción.</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swiftdata</category><category>cloudkit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Los botones no estaban rotos: el hilo principal estaba ocupado</title><link>https://imperfectsystems.com/es/blog/buttons-werent-broken-main-thread-busy/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/buttons-werent-broken-main-thread-busy/</guid><description>118 pruebas en verde, una corrida limpia en el simulador, y botones muertos en un teléfono real. El bug era un servicio @MainActor haciendo trabajo síncrono entre awaits.</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swiftui</category><category>performance</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Carreras en el main actor: cuando await es la condición de carrera</title><link>https://imperfectsystems.com/es/blog/racing-the-main-actor-await/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/racing-the-main-actor-await/</guid><description>@MainActor elimina las condiciones de carrera de datos, no las de intercalado. Un token de generación y una prueba de carrera determinista sin sleeps.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swift-concurrency</category><category>swift-testing</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Mis mocks no podían fallar: inyección de errores y un crash de aislamiento en Swift 6</title><link>https://imperfectsystems.com/es/blog/mocks-couldnt-fail-error-injection/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/mocks-couldnt-fail-error-injection/</guid><description>Cada rama catch era código muerto en las pruebas. Una costura de fallas de 15 líneas resolvió eso, y luego una sola suite de pruebas sin anotar tumbó todo el runner.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swift-testing</category><category>testing</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Revisé mi propia app de iOS con cinco agentes en paralelo: esto fue lo que encontraron</title><link>https://imperfectsystems.com/es/blog/five-parallel-agents-ios-review/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/five-parallel-agents-ios-review/</guid><description>Cinco fragmentos de ~700 líneas, instrucciones que también piden qué está bien hecho, y el paso de verificación que separó los errores reales de los plausibles.</description><pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>claude-code</category><category>code-review</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Configurando SwiftLint y CI de GitHub Actions para una app de iOS (y el runner que mintió)</title><link>https://imperfectsystems.com/es/blog/swiftlint-github-actions-ci-ios/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/swiftlint-github-actions-ci-ios/</guid><description>Adoptar un linter en código que nunca tuvo uno, un hook de pre-commit sin depender de ningún framework, y tres cosas que hizo el runner de macOS que la documentación no mencionaba.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swiftlint</category><category>github-actions</category><category>ci</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Desbloqueo de por vida con StoreKit 2 en una app SwiftUI de Swift 6: tres cosas que me mordieron</title><link>https://imperfectsystems.com/es/blog/storekit-2-lifetime-unlock-three-things/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/storekit-2-lifetime-unlock-three-things/</guid><description>La API de compra es la parte fácil. Las costuras entre StoreKit 2, el aislamiento de Swift 6, y la observación de SwiftUI son donde se fue el tiempo.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>storekit</category><category>swiftui</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Construyendo un reproductor de música que en realidad no puedo escuchar</title><link>https://imperfectsystems.com/es/blog/building-music-player-i-cant-hear/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/building-music-player-i-cant-hear/</guid><description>Mini-reproductor para cuando MusicKit queda mudo en el simulador: un protocolo de dos métodos, un indicador con una mentira honesta, y un bug dejado adentro.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>La prueba de SwiftData que falló sin ningún mensaje de error</title><link>https://imperfectsystems.com/es/blog/swiftdata-test-crashed-no-error-message/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/swiftdata-test-crashed-no-error-message/</guid><description>Cinco pruebas que reportaban un simple «Crash»: un helper prolijo dejó que el ModelContainer se liberara mientras el store conservaba su contexto. Un contexto es algo prestado.</description><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swiftdata</category><category>swift-testing</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Cuando @MainActor y TaskGroup no se llevan bien en Swift 6</title><link>https://imperfectsystems.com/es/blog/mainactor-taskgroup-swift-6/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/mainactor-taskgroup-swift-6/</guid><description>El verificador de aislamiento basado en regiones me dice que reporte un bug, y el Task no estructurado, pasado de moda, resulta ser la herramienta correcta.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>swift-concurrency</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Apple Music le da dos IDs distintos al mismo álbum</title><link>https://imperfectsystems.com/es/blog/apple-music-same-album-two-ids/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/apple-music-same-album-two-ids/</guid><description>Construyendo el flujo de agregar a la biblioteca, descubrí que MusicKit da IDs distintos y sin relación a las copias de biblioteca y catálogo del mismo álbum.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Construir una interfaz para datos que todavía no puedo ver (agrupar por álbum una playlist de MusicKit)</title><link>https://imperfectsystems.com/es/blog/building-ui-for-data-i-cant-see-yet/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/building-ui-for-data-i-cant-see-yet/</guid><description>Construir una pantalla de playlist agrupada por álbum antes de tener datos reales: detección de EP y una prueba que atrapó un fixture desactualizado.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Construir una app con MusicKit cuando MusicKit no corre en el simulador</title><link>https://imperfectsystems.com/es/blog/musickit-app-simulator-mock-service/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/musickit-app-simulator-mock-service/</guid><description>Un protocolo, un servicio real y un mock que registra sus escrituras: hacer que el simulador vuelva a ser útil, más el percance con el worktree y la trampa del target recién nacido.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>swift-testing</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Grupos sincronizados del sistema de archivos: cómo Claude Code maneja Xcode</title><link>https://imperfectsystems.com/es/blog/claude-code-xcode-synchronized-groups/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/claude-code-xcode-synchronized-groups/</guid><description>Un agente no puede hacer clic en el asistente de New Project. Los grupos sincronizados con el sistema de archivos de Xcode 16 le permiten controlar cada archivo fuente igual.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>xcode</category><category>claude-code</category><category>dev-log</category><category>deep-cut-atlas</category></item><item><title>Configurando Claude Code para un proyecto de iOS</title><link>https://imperfectsystems.com/es/blog/setting-up-claude-code-for-an-ios-project/</link><guid isPermaLink="true">https://imperfectsystems.com/es/blog/setting-up-claude-code-for-an-ios-project/</guid><description>Escribiendo el CLAUDE.md de una app iOS antes de que exista Swift: la trampa de MusicKit en el simulador y las reglas de CloudKit para SwiftData.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><category>Development</category><category>ios</category><category>swift</category><category>musickit</category><category>claude-code</category><category>dev-log</category><category>deep-cut-atlas</category></item></channel></rss>