<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Deep Cut Atlas - Diário de bordo - Imperfect Systems</title><description>Entradas do diário de bordo sobre Deep Cut Atlas.</description><link>https://imperfectsystems.com/</link><item><title>Controlando um iPhone bloqueado a partir de uma sessão de código</title><link>https://imperfectsystems.com/pt/blog/driving-locked-iphone-coding-session/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/driving-locked-iphone-coding-session/</guid><description>WebDriverAgent precisava de um telefone sempre desbloqueado na mesa. iPhone Mirroring e mirroir-mcp deixam um agente tocar e testar o MusicKit no escuro.</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>Parar diante de um aviso de &quot;tap não confiável&quot; do Homebrew para realmente auditar antes de confiar</title><link>https://imperfectsystems.com/pt/blog/homebrew-untrusted-tap-audit/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/homebrew-untrusted-tap-audit/</guid><description>A barreira de confiança existe porque um tap real foi comprometido. Vinte minutos lendo a fórmula, as permissões e o mantenedor venceram dez segundos rodando o 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>Limpar ferramentas abandonadas me ensinou duas coisas que npm e git não contam</title><link>https://imperfectsystems.com/pt/blog/abandoned-tooling-npm-git/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/abandoned-tooling-npm-git/</guid><description>Um npm uninstall que deixa um binário de 44MB para trás, e um stash cujo rótulo registra onde o HEAD estava apontando, não do que o diff trata.</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>Recuperei uma correção guardada no stash, e uma reprodução ao vivo no meu celular me mostrou um bug diferente</title><link>https://imperfectsystems.com/pt/blog/stashed-fix-live-repro-different-bug/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/stashed-fix-live-repro-different-bug/</guid><description>Um apply de stash limpo, uma regra do SwiftLint que compara sintaxe em vez de rastrear o consumo, e uma travada em três abas que não era o bug já corrigido.</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>Uma rejeição da App Store, uma pegadinha do MusicKit, e um trabalho que eu achei que tinha perdido</title><link>https://imperfectsystems.com/pt/blog/app-store-rejection-musickit-gotcha/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/app-store-rejection-musickit-gotcha/</guid><description>Autorização não é assinatura, um tipo de erro que não existe, e uma correção pronta ficando invisível no git stash enquanto eu a reconstruía a partir de anotações.</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>Um relato de bug de filtro que virou três issues separadas</title><link>https://imperfectsystems.com/pt/blog/filter-bug-three-issues/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/filter-bug-three-issues/</guid><description>O filtro relatado funcionava bem - o problema real era outro filtro, deliberadamente independente, e o fix certo foi uma terceira opção nunca cogitada.</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>Construindo um prompt de avaliação que eu tinha certeza que não ia renderizar no simulador</title><link>https://imperfectsystems.com/pt/blog/rating-prompt-simulator/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/rating-prompt-simulator/</guid><description>Um gate de três vitórias, uma chamada a requestReview(), e uma crença recebida sobre o comportamento do simulador que se provou errada quando eu realmente testei.</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>O bug que eu registrei estava errado, e a fixture que consertou ele quebrou quatro outros testes</title><link>https://imperfectsystems.com/pt/blog/bug-i-filed-was-wrong/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/bug-i-filed-was-wrong/</guid><description>O bug que registrei era uma proteção para algo impossível. A solução real foi uma exclusão em tempo de leitura, que quebrou outros quatro testes.</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>A playlist que já tinha o nome certo</title><link>https://imperfectsystems.com/pt/blog/playlist-already-had-right-name/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/playlist-already-had-right-name/</guid><description>Um artefato de renomeação, uma API sem campo de autor, e um teste em dispositivo real provando que o bug já tinha se corrigido sozinho, fechado como está.</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>Álbuns em destaque, dados reais do MusicKit, e um teste que mentiu sobre estar passando</title><link>https://imperfectsystems.com/pt/blog/featured-albums-test-that-lied/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/featured-albums-test-that-lied/</guid><description>Não existe flag isEssential - Essentials é só uma playlist. featuredAlbums é o sinal real, e um fixture mudado expôs um teste que ninguém rodou de novo.</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>Uma seção de tracklist, e por que levou 30 minutos</title><link>https://imperfectsystems.com/pt/blog/tracklist-section-thirty-minutes/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/tracklist-section-thirty-minutes/</guid><description>Um método de protocolo, um enum de estado reaproveitado, uma convenção de roteamento que se manteve, e um orçamento de lint que forçou uma divisão que valia a pena fazer de qualquer forma.</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>O scan de 8 segundos escondido em cada refresh</title><link>https://imperfectsystems.com/pt/blog/eight-second-scan-every-refresh/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/eight-second-scan-every-refresh/</guid><description>Medir no dispositivo encontrou um scan da biblioteca inteira rodando em cada lote do Discover - e uma armadilha de medição de 16x onde o cache HTTP favoreceu o caminho errado.</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? transformou uma interrupção em &quot;all caught up&quot;</title><link>https://imperfectsystems.com/pt/blog/try-turned-outage-into-all-caught-up/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/try-turned-outage-into-all-caught-up/</guid><description>Um try? ?? [] fazia uma falha de rede parecer indistinguível de &quot;sem lançamentos&quot;, o que deixou uma interrupção guardar em cache um feed vazio por cima de dados bons 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>A configuração que funcionava perfeitamente e parecia completamente quebrada</title><link>https://imperfectsystems.com/pt/blog/setting-worked-perfectly-felt-broken/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/setting-worked-perfectly-felt-broken/</guid><description>Um filtro só era aplicado ao reabrir o app, porque uma TabView mantém os view models vivos e seu estado semeado fica congelado. A correção apagou um conceito.</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>Uma base de conhecimento para todos os seus agentes de IA</title><link>https://imperfectsystems.com/pt/blog/one-knowledge-base-all-agents/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/one-knowledge-base-all-agents/</guid><description>CLAUDE.md serve para convenções estáveis, não para pegadinhas e lições aprendidas. Isso precisa de um cofre compartilhado único, não uma cópia 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>Lançando o Deep Cut Atlas: o que quebrou na minha primeira submissão à App Store</title><link>https://imperfectsystems.com/pt/blog/shipping-deep-cut-atlas-first-submission/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/shipping-deep-cut-atlas-first-submission/</guid><description>Um consumível que deveria ter sido não consumível, um product ID que você nunca pode reutilizar, um archive que silenciosamente não foi rebuildado, e um rename com um pavio de duas 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>Sincronização via iCloud restrita ao Pro para a lista &quot;Não Interessado&quot;</title><link>https://imperfectsystems.com/pt/blog/pro-gated-icloud-sync/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/pro-gated-icloud-sync/</guid><description>Um blob no KVS com tombstones em vez de CloudKit-em-tudo, um decorator que mantém usuários free longe do iCloud por completo, e provar que a sincronização funciona com só um 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>Uma decisão de UX que errei na primeira tentativa</title><link>https://imperfectsystems.com/pt/blog/ux-decision-wrong-first-try/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/ux-decision-wrong-first-try/</guid><description>A ação de adicionar à playlist combinava com o gesto irmão no mesmo card, e brigava com o resto do app. Escolher o ponto de referência errado 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>A aba Discover que ficou permanentemente presa cavando</title><link>https://imperfectsystems.com/pt/blog/discover-tab-stuck-digging/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/discover-tab-stuck-digging/</guid><description>Uma busca de artista que falhava nunca contava como checada, então um artista ruim se reselecionava para sempre - até um teste de várias rodadas achar a segunda proteção.</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>Uma varredura de documentação que encontrou duas alegações desatualizadas a mais do que o esperado</title><link>https://imperfectsystems.com/pt/blog/docs-sweep-two-more-stale-claims/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/docs-sweep-two-more-stale-claims/</guid><description>Seis itens de desvio já conhecidos, dois a mais encontrados ao rodar os comandos documentados, e uma correção de nome que a memória do projeto deixou mais restrita que um find-replace.</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>Fixando a versão do SwiftLint na CI quando o Homebrew não deixa</title><link>https://imperfectsystems.com/pt/blog/pinning-swiftlint-ci-homebrew/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/pinning-swiftlint-ci-homebrew/</guid><description>brew install swiftlint instala o que estiver estável hoje, e a CI de release é a mais exposta a essa deriva. A fixação é o binário portátil, não uma formula.</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>Fechando as lacunas de teste: lógica pura, um branch de mock inalcançável, e uma virada para Swift 6</title><link>https://imperfectsystems.com/pt/blog/closing-test-gaps-swift-6-flip/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/closing-test-gaps-swift-6-flip/</guid><description>Extraindo algoritmos para fora do alcance do MusicKit, um parâmetro de mock que era silenciosamente ignorado, e dois testes que vinham passando pelo motivo errado o tempo todo.</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>Um segfault que não era um bug, e a API que eu finalmente apaguei</title><link>https://imperfectsystems.com/pt/blog/segfault-wasnt-a-bug/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/segfault-wasnt-a-bug/</guid><description>Uma limpeza da camada de serviço do MusicKit em que apagar métodos mortos travou todos os testes de uma vez, e a solução foi um build limpo, não um debugger.</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>Consertando o load path da History, e me pegando comentando demais o ajuste</title><link>https://imperfectsystems.com/pt/blog/history-load-path-over-commenting/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/history-load-path-over-commenting/</guid><description>Três fetches sequenciais em que um nem era necessário de cara, dois recálculos quadráticos, e um linter que expôs por que eu estava realmente escrevendo todos aqueles comentários.</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>A armadilha do isolamento de actor em &quot;só tira isso da main thread&quot;</title><link>https://imperfectsystems.com/pt/blog/actor-isolation-trap-off-main-thread/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/actor-isolation-trap-off-main-thread/</guid><description>Conformidades a Codable sintetizadas pelo compilador também herdam o isolamento padrão em MainActor, e async let tem exigências mais rígidas que a task que você já tinha.</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>O scan da biblioteca inteira que eu achava que já tinha corrigido</title><link>https://imperfectsystems.com/pt/blog/whole-library-scan-thought-fixed/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/whole-library-scan-thought-fixed/</guid><description>Um padrão não se corrige de uma vez só. Mais um scan de biblioteca no main actor, escondido num caminho de escrita, e uma API em lote numa única direção.</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>Minha aba Discover estava vazia porque fiz a pergunta errada para o Apple Music</title><link>https://imperfectsystems.com/pt/blog/discover-tab-empty-wrong-question/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/discover-tab-empty-wrong-question/</guid><description>IDs de biblioteca usados em requisições de catálogo: dois sintomas, um bug só, uma correção verificada no dispositivo, e o número de 1.610 artistas que forçou um redesenho.</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>Quando um conjunto de filtros silenciosamente vira uma funcionalidade</title><link>https://imperfectsystems.com/pt/blog/filter-set-becomes-a-feature/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/filter-set-becomes-a-feature/</guid><description>O armazenamento de &apos;Não Tenho Interesse&apos; só guardava chaves. Depois ele precisou virar uma tela, e o modelo precisou carregar sua própria descrição.</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>Os botões não estavam quebrados: a main thread estava ocupada</title><link>https://imperfectsystems.com/pt/blog/buttons-werent-broken-main-thread-busy/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/buttons-werent-broken-main-thread-busy/</guid><description>118 testes verdes, uma passada limpa no simulador, e botões mortos num telefone de verdade. O bug era um serviço @MainActor fazendo trabalho 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>Correndo contra a main actor: quando o await é a condição de corrida</title><link>https://imperfectsystems.com/pt/blog/racing-the-main-actor-await/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/racing-the-main-actor-await/</guid><description>@MainActor elimina data races, não races de interleaving. Um token de geração, uma guarda contra falha desatualizada, e um teste de race determinístico.</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>Meus mocks não conseguiam falhar: injeção de erro e um crash de isolamento no Swift 6</title><link>https://imperfectsystems.com/pt/blog/mocks-couldnt-fail-error-injection/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/mocks-couldnt-fail-error-injection/</guid><description>Todo branch de catch era código morto nos testes. Uma costura de falha de 15 linhas resolveu isso, e depois uma suíte de testes sem anotação derrubou o runner inteiro.</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>Revisei meu próprio app iOS com cinco agentes em paralelo: veja o que eles encontraram</title><link>https://imperfectsystems.com/pt/blog/five-parallel-agents-ios-review/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/five-parallel-agents-ios-review/</guid><description>Cinco fatias de ~700 linhas, briefings que também perguntam o que está bem feito, e a etapa de verificação que separou bugs reais dos só plausíveis.</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 e CI do GitHub Actions para um app iOS (e o runner que mentiu)</title><link>https://imperfectsystems.com/pt/blog/swiftlint-github-actions-ci-ios/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/swiftlint-github-actions-ci-ios/</guid><description>Adotando um linter em um código que nunca teve um, um hook de pre-commit sem framework, e três coisas que o runner macOS fez que a documentação não mencionava.</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>Desbloqueio vitalício com StoreKit 2 num app SwiftUI em Swift 6: três coisas que me pegaram</title><link>https://imperfectsystems.com/pt/blog/storekit-2-lifetime-unlock-three-things/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/storekit-2-lifetime-unlock-three-things/</guid><description>A API de compra é a parte fácil. As junções entre StoreKit 2, isolamento do Swift 6 e observação do SwiftUI foram onde o tempo foi.</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>Construindo um player de música que eu não consigo ouvir</title><link>https://imperfectsystems.com/pt/blog/building-music-player-i-cant-hear/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/building-music-player-i-cant-hear/</guid><description>Mini-player para quando o MusicKit fica mudo no simulador: um protocolo de dois métodos, um indicador com uma mentira honesta, e um bug deixado de propósito.</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>O teste do SwiftData que falhou sem nenhuma mensagem de erro</title><link>https://imperfectsystems.com/pt/blog/swiftdata-test-crashed-no-error-message/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/swiftdata-test-crashed-no-error-message/</guid><description>Cinco testes reportando um «Crash» genérico: um helper bem-intencionado deixou o ModelContainer ser desalocado enquanto o store manteve seu context. Um context é algo emprestado.</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>Quando @MainActor e TaskGroup não combinam no Swift 6</title><link>https://imperfectsystems.com/pt/blog/mainactor-taskgroup-swift-6/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/mainactor-taskgroup-swift-6/</guid><description>O checker de isolamento baseado em regiões manda eu abrir um bug, e a Task não estruturada, hoje fora de moda, acaba sendo a ferramenta certa.</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>O Apple Music dá dois IDs diferentes para o mesmo álbum</title><link>https://imperfectsystems.com/pt/blog/apple-music-same-album-two-ids/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/apple-music-same-album-two-ids/</guid><description>Construindo o fluxo de adicionar à biblioteca, descobri que o MusicKit dá IDs diferentes para as cópias de biblioteca e catálogo do mesmo á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>Construindo uma interface para dados que ainda não consigo ver (agrupando por álbum uma playlist do MusicKit)</title><link>https://imperfectsystems.com/pt/blog/building-ui-for-data-i-cant-see-yet/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/building-ui-for-data-i-cant-see-yet/</guid><description>Construir uma tela de playlist agrupada por álbum antes de ter dados reais: detecção de EP e um teste que pegou um fixture desatualizado.</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>Construindo um app com MusicKit quando o MusicKit não roda no simulador</title><link>https://imperfectsystems.com/pt/blog/musickit-app-simulator-mock-service/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/musickit-app-simulator-mock-service/</guid><description>Um protocolo, um serviço real e um mock que registra suas escritas: tornando o simulador útil de novo, além do imprevisto com worktree e a armadilha do target recém-criado.</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>Synchronized groups do sistema de arquivos: como o Claude Code dirige o Xcode</title><link>https://imperfectsystems.com/pt/blog/claude-code-xcode-synchronized-groups/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/claude-code-xcode-synchronized-groups/</guid><description>Um agente não consegue clicar no assistente de New Project. Os file-system synchronized groups do Xcode 16 são a costura que permite a ele dominar cada arquivo de código-fonte mesmo assim.</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 o Claude Code para um projeto iOS</title><link>https://imperfectsystems.com/pt/blog/setting-up-claude-code-for-an-ios-project/</link><guid isPermaLink="true">https://imperfectsystems.com/pt/blog/setting-up-claude-code-for-an-ios-project/</guid><description>Escrevendo o CLAUDE.md de um app iOS antes de existir Swift: a armadilha do MusicKit no simulador e as regras do 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>