La queue du lézard

En biologie, l’autotomie, c’est lorsqu’un animal abandonne une partie de son corps qui n’est plus utile. Un lézard lâche sa queue pour échapper à un prédateur. Cette queue a été utile à un moment, mais survivre exige de la laisser partir. Une nouvelle repousse.

C’est ainsi qu’il faut penser le refactor d’une app React Native vibe codée.

Dans les premiers MVP codés par IA, le premier flow d’auth part généralement en prod plus vite que tout le monde ne l’imagine. Les problèmes commencent quelques semaines plus tard, quand le produit change et que l’équipe essaie de refactorer avec précaution un code qu’elle n’a jamais vraiment conçu. C’est là que le login casse, que l’état utilisateur dérive et que le nombre de bugs augmente. Ils essaient de préserver un code qui aurait dû être remplacé.

Refactorer du code généré par IA coûte cher parce que cela exige de comprendre une intention que vous n’avez jamais eue. Claude Code a créé des abstractions que vous n’avez pas conçues. Il a pris des décisions de couplage que vous n’avez pas validées. Refactorer ce code revient à rétroconcevoir des décisions d’architecture prises de façon probabiliste, pas intentionnelle.

Remplacer, ne pas refactorer

L’alternative : si un module satisfait la même interface et passe les mêmes tests, vous pouvez l’échanger sans comprendre l’ancienne implémentation. L’ancien module est supprimé. Le nouveau prend sa place. Le composition root est le seul fichier au courant.

// 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()

L’écran de login ne change pas. Les route guards ne changent pas. Les hooks ne changent pas. Seul le composition root sait qu’un échange a eu lieu. C’est la puissance d’une architecture pilotée par interface quand vous travaillez avec du code généré par IA. Les interfaces sont votre police d’assurance contre la dette technique.

Quatre prérequis pour supprimer en sécurité

Cela ne marche que si quatre éléments sont déjà en place. Sans eux, vous ne faites que supprimer du code en espérant que tout ira bien. Avec eux, vous faites de la chirurgie :

  • Interfaces définies : chaque module expose un contrat. Types TypeScript, schémas d’API, frontières claires. Cursor génère contre ces contrats. Claude Code les lit. Vous en êtes propriétaire.
  • Application des frontières : les modules ne peuvent pas aller fouiller dans les internals des autres. dependency-cruiser, ESLint ou de simples conventions l’empêchent.
  • Tests de contrat : les tests vérifient l’interface, pas l’implémentation. Si le nouveau module passe les mêmes tests, il est équivalent du point de vue comportemental.
  • Graphes de dépendances propres : pas de dépendances circulaires. Pas de couplage implicite via des globals. Le graphe d’import est un DAG, pas une toile d’araignée.

Remplacer l’analytics sans toucher à un écran

Vous avez commencé avec Segment parce que Claude Code l’a suggéré. Maintenant vous devez passer à PostHog. L’ancien module est supprimé. Le nouveau implémente la même interface. Tous les call sites restent identiques :

// 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' })

L’instinct de préservation est puissant. On veut transporter son code avec précaution, préserver chaque comportement. Mais quand vous travaillez avec du code généré par IA, le chemin le plus sûr consiste souvent à lâcher prise. Écrivez de bonnes interfaces. Faites respecter les frontières. Puis acceptez de supprimer.

L’Autotomy Expo Starter Pack est construit autour de cette philosophie : chaque module est conçu pour être remplacé, pas préservé. Quand votre app vibe codée frappe le mur de l’échelle, vous ne démêlez pas les décisions d’architecture de Claude Code. Vous les remplacez.