Um guia para avaliar Expo UI, integração brownfield e flags experimentais com segurança - branches com tempo limitado, critérios de sucesso claros e resultados de ADR para que a exploração não se torne dívida de produção permanente.
Cartão de receita de referência rápida - pronto para copiar e colar.
# Bootstrap de Spike (nunca em main)git checkout main && git pull --ff-onlygit worktree add ../MyApp-spike-ui spike/expo-ui-tabscd ../MyApp-spike-uiEXPO_PACKAGER_PORT=8082 npx expo start
# docs/spikes/TEMPLATE.md - copiar por spike## Spike: <nome>- **Responsável:** @engenheiro(a)- **Tempo limite:** 3 dias (parada rígida)- **Hipótese:** <o que aprendemos>- **Critérios de sucesso:** <mensurável>- **Fora do escopo:** merge em produção, aprovação de performance, auditoria de a11y- **Resultado:** ADOTAR | ADIAR | REJEITAR + link para ADR
Ciclo de vida do Spike charter (30 min) → branch → tempo limite → demo → ADR → deletar branch ↓ nunca fazer merge sem ADR + flags + matriz de QA
Quando usar isso:
Avaliando Expo UI (interoperabilidade SwiftUI/Jetpack Compose) para uma nova classe de tela.
Viabilidade de integração Brownfield antes que a equipe nativa confirme alterações de CI.
Validação da Nova Arquitetura após adicionar um módulo nativo apenas com bridge.
APIs Experimentaisapp.config.ts ou Expo Router marcadas como instáveis na documentação.
Liderança pede PoC "neste sprint" sem critérios de sucesso - charter primeiro.
Quando evitar:
Correção de bug de produção - use branch fix/*, não spike/*.
Padrão já adotado (rotas de arquivo do Expo Router) - envie em branch de funcionalidade com QA normal.
Reavaliar ADR decidido sem novas restrições - leia docs/adr/ primeiro.
Avaliar se os componentes Expo UI podem substituir um chrome de abas nativo personalizado para layouts de tablet.
Passo 1 - Charter (antes do código)
## Spike: expo-ui-tablet-tabs- **Tempo limite:** 3 dias- **Hipótese:** Primitivos de aba do Expo UI reduzem PRs nativos para visualização dividida do iPad- **Sucesso:** Troca de aba < 100ms no iPad 10ª geração; tipos TypeScript compilam SDK 57- **Falha:** Crash na API 26 do Android ou requer edição manual de ios/ fora do CNG- **Documento de resultado:** docs/adr/0012-expo-ui-tabs.md
# ADR 0012: Expo UI para abas de tablet - ADIAR- **Motivo:** Lacunas de paridade Android; equipe carece de revisor SwiftUI- **Revisitar:** SDK 58 ou quando Expo UI atingir o status estável no changelog- **Branch deletado:** spike/expo-ui-tabs
PoC não faz merge no main do host até que a CI publique artefatos automaticamente - Brownfield CI/CD
Passo 2 - Critérios de sucesso
- [ ] Host inicia tela de checkout RN a partir de botão nativo- [ ] Inicialização a frio da superfície RN < 2s no Android de nível médio- [ ] Navegação de volta retorna ao nativo sem vazamento (Instruments / LeakCanary)- [ ] Token de autenticação passado via contrato de bridge v1 - documentar em ADR- [ ] Nenhuma cópia manual do bundle JS nos assets do host
Passo 3 - Versão do contrato da bridge
// Documentar em ADR - host e RN devem incrementar juntosexport const BRIDGE_CONTRACT_VERSION = "1.0.0-spike";
- [ ] ADR: Nova Arquitetura habilitada em todo o projeto- [ ] Todos os módulos nativos compatíveis com NA ou substituídos- [ ] Matriz de build de produção eas verde- [ ] 72h sem crash no canal de preview
// ❌ Nunca fazer merge para main sem ADRexport default { expo: { experiments: { // typedRoutes, reactCompiler, etc. - apenas spike até estabilizar }, },};
Leia a seção Experimental do changelog do Expo a cada atualização de SDK
Spike teve sucesso - podemos fazer merge na sexta-feira?
Apenas com ADR, flag desativada por padrão, evidência normal no template de PR, e sem hacks apenas de spike deixados em app.config.ts. Caso contrário, agende um sprint de PoC.
Quem aprova o merge do spike brownfield no repositório host?
Líder da plataforma nativa + líder mobile + proprietário da CI. A aprovação apenas de RN é insuficiente - o binário do host é enviado para as lojas.
Spike da Nova Arquitetura falhou - devemos bloquear o SDK 57?
Não - documente o plano de substituição do módulo. O SDK 57 / RN 0.86 ainda será lançado; o módulo falho receberá uma linha de EOL no registro e um cronograma de troca.