A Cauda do Lagarto

Na biologia, autotomy é quando um animal descarta uma parte do corpo que não é mais útil. Um lagarto solta a cauda para escapar de um predador. A cauda já foi útil, mas sobreviver exige deixá-la para trás. Depois, uma nova cresce.

É assim que você deveria pensar sobre refatorar um app React Native feito com vibe coding.

Nos primeiros MVPs feitos com IA, o primeiro fluxo de auth geralmente vai para produção mais rápido do que qualquer um esperava. O problema começa algumas semanas depois, quando o produto muda e o time tenta refatorar com cuidado um código que nunca chegou a desenhar de verdade. É aí que o login quebra, o estado do usuário deriva e a contagem de bugs sobe. Eles estão tentando preservar um código que deveria ter sido substituído.

Refatorar código gerado por IA é caro porque exige entender uma intenção que nunca foi sua. Claude Code criou abstrações que você não desenhou. Tomou decisões de acoplamento que você não aprovou. Refatorar esse código significa fazer engenharia reversa de decisões arquiteturais tomadas de forma probabilística, não intencional.

Substitua, Não Refatore

A alternativa: se um módulo satisfaz a mesma interface e passa nos mesmos testes, você pode trocá-lo sem entender a implementação antiga. O módulo antigo é apagado. O novo assume o lugar. O composition root é o único arquivo que sabe disso.

// Module A (Auth v1) -> Interface Contract -> Module A' (Auth v2)

// The old auth module. You don't need to understand it.
// Claude Code generated it. It worked. Now it's done.
class SupabaseAuthService implements AuthService {
  // ... implementation you inherited ...
}

// The new auth module. You designed it. Claude Code helps write it.
class CustomAuthService implements AuthService {
  // ... your clean implementation ...
}

// The composition root is the ONLY place that changes:
const auth: AuthService = useSupabase
  ? new SupabaseAuthService()
  : new CustomAuthService()

A tela de login não muda. Os route guards não mudam. Os hooks não mudam. Só o composition root sabe que houve uma troca. Esse é o poder de uma arquitetura orientada por interfaces quando você trabalha com código gerado por IA. As interfaces são a sua apólice de seguro contra dívida técnica.

Quatro Pré-requisitos para Apagar com Segurança

Isso só funciona se quatro coisas estiverem no lugar. Sem elas, você só está apagando código e torcendo. Com elas, você está operando com precisão:

  • Interfaces definidas — Todo módulo expõe um contrato. Tipos TypeScript, schemas de API, limites claros. Cursor gera em cima disso. Claude Code lê isso. A propriedade é sua.
  • Aplicação de fronteiras — Módulos não podem alcançar os internos uns dos outros. dependency-cruiser, ESLint ou convenção impedem isso.
  • Testes de contrato — Os testes verificam a interface, não a implementação. Se o módulo novo passa nos mesmos testes, ele é equivalente em comportamento.
  • Grafos de dependência limpos — Sem dependências circulares. Sem acoplamento implícito via globais. O grafo de imports é um DAG, não uma teia.

Trocando Analytics sem Encostar em uma Tela

Você começou com Segment porque Claude Code sugeriu. Agora precisa de PostHog. O módulo antigo é apagado. O novo implementa a mesma interface. Todo call site continua idêntico:

// Before
const analytics = new SegmentAnalytics(writeKey)

// After — same interface, different implementation
const analytics = new PostHogAnalytics(apiKey)

// Every call site stays the same.
// Cursor-generated screens don't change.
analytics.track('purchase_completed', { productId: '123' })
analytics.identify(userId, { plan: 'premium' })

O instinto de preservar é forte. Queremos levar o código adiante com cuidado, preservando cada comportamento. Mas, quando você trabalha com código gerado por IA, o caminho mais seguro muitas vezes é soltar. Escreva boas interfaces. Imponha fronteiras. Depois esteja disposto a apagar.

O Autotomy Expo Starter Pack foi construído em torno dessa filosofia: cada módulo é desenhado para substituição, não para preservação. Quando seu app feito com vibe coding bater no muro da escala, você não desembaraça as decisões arquiteturais do Claude Code. Você as substitui.