Prototype → production

Votre app vibe codée fonctionne. Maintenant, il faut pouvoir lui faire confiance.

Par Louis CassedanneProject lead & architecte data et IA

Publié le · 14 min de lecture

Vous avez construit une première version avec Lovable, Bolt, Cursor, Replit, Claude Code ou un autre agent de code. Elle fonctionne suffisamment bien pour démontrer l’usage, convaincre un client ou commencer à servir de vrais utilisateurs.

À ce stade, la question n’est plus vraiment de savoir comment le code a été produit. Le vrai sujet est de savoir si vous comprenez suffisamment le système pour lui faire confiance en production.

La provenance du code ne permet pas, à elle seule, de répondre à cette question. Un code généré par IA peut être correct ; un code écrit entièrement à la main peut être fragile. Ce que le vibe coding change surtout, c’est la vitesse à laquelle votre produit peut devenir fonctionnel sans que votre compréhension de son fonctionnement progresse au même rythme.

Vous pouvez alors vous retrouver avec une application presque terminée du point de vue métier, mais encore loin des garanties nécessaires à son exploitation : permissions, intégrité des données, gestion des erreurs, observabilité, maîtrise des coûts, capacité de reprise.

C’est ce décalage qui nous intéresse ici. Passer en production consiste moins à « nettoyer » le code qu’à transformer un système que vous connaissez imparfaitement en un système dont vous maîtrisez suffisamment les risques.

Le vrai sujet : la dette de compréhension

La dette technique n’est pas née avec les assistants IA. Vous pouvez déjà reprendre une codebase mal documentée, hériter du travail d’un prestataire ou découvrir des décisions que plus personne ne maîtrise complètement.

Le vibe coding accentue cependant un phénomène particulier : vous pouvez produire beaucoup plus vite que vous ne construisez un modèle mental du système.

Avec un développement plus traditionnel, une partie de cette compréhension se construit en écrivant le code. Quand vous demandez à un agent d’ajouter une authentification, un espace client et un système de paiement, vous pouvez obtenir rapidement une démonstration convaincante sans avoir nécessairement répondu à des questions comme :

  • où sont réellement vérifiées les permissions ?
  • un utilisateur peut-il accéder aux données d’une autre organisation en modifiant une requête ?
  • que se passe-t-il si un webhook arrive deux fois ?
  • une migration peut-elle rendre incohérentes des données existantes ?
  • quels services tiers ont été ajoutés ?
  • qu’arrive-t-il si un appel à un modèle prend trente secondes ou coûte cent fois plus que prévu ?

Ces questions ne signifient pas que votre prototype est mauvais. Elles étaient souvent simplement hors de son objectif initial.

GitHub formule la même prudence dans sa documentation sur Copilot : le code généré peut paraître valide tout en étant incorrect ou vulnérable, et doit être revu et testé avant d’être intégré (GitHub Docs).

Un prototype prouve un usage. La production demande des garanties.

Un prototype cherche d’abord à vérifier qu’un usage mérite d’exister. En production, vous devez aussi garantir que le produit continue à fonctionner lorsque les conditions deviennent moins favorables : plus d’utilisateurs, plus de données, un service externe indisponible, une erreur de manipulation ou un changement de version.

Mais ces garanties ne sont pas absolues. Un outil interne utilisé par cinq personnes identifiées n’a pas le même profil de risque qu’un SaaS multi-tenant ouvert au public. Le Secure Software Development Framework du NIST suit cette logique : les pratiques doivent être adaptées au contexte, à la tolérance au risque, aux ressources et au coût.

Votre prototype est surtout jugé sur ce qu’il montre. En production, vous êtes aussi jugé sur les garanties que votre produit continue de fournir lorsque les conditions se dégradent.
DimensionPrototypeProduit en production
UsageLe parcours principal fonctionneLes cas d’erreur importants sont maîtrisés
AccèsQuelques utilisateurs connusLes permissions sont explicites et testées
DonnéesElles sont stockéesElles sont protégées, migrables et récupérables
Services tiersIls répondent pendant la démoLeurs pannes et retries sont anticipés
ExploitationVous découvrez les problèmesVous pouvez les détecter et les diagnostiquer
RepriseLe créateur connaît le systèmeUne autre personne peut le comprendre et le maintenir

Prototype

Démontrer

« Est-ce que cet usage mérite d’exister ? »

Produit en production

Garantir

« Est-ce que ça tient quand les conditions se dégradent ? »

Le tableau ci-dessus détaille six dimensions ; elles disent toutes la même chose. Ce qui change en production n’est pas la quantité de travail, c’est la nature de ce que l’on vous demande de prouver.

En pratique — Themis-X / MyTravelConnect

Pour Themis-X, nous avons conçu et construit MyTravelConnect de bout en bout. Une première version designée et prototypée a été livrée en avril 2024, l’application complète était en ligne en mai, et la mission s’est poursuivie jusqu’en septembre avec un POC mené avec Aéroports de Paris puis une brique de recommandation.

Le produit n’était pas ouvert au public. Des acteurs identifiés de l’écosystème EONA-X y accédaient pour éprouver des usages précis. Cette exposition réelle, connue à l’avance, permettait de calibrer le niveau de garanties du premier déploiement.

Mais « exposition contrôlée » ne veut pas dire « garanties allégées partout », et c’est le point intéressant. Ce que ce contexte permettait de différer, c’était l’échelle : connecter l’ensemble des acteurs du voyage, l’onboarding autonome, la montée en charge. Ce qu’il ne permettait pas de différer, c’était le consentement et la protection des données — parce que c’était précisément ce que le produit devait démontrer.

Avant de refactorer, reconstruisez le modèle du système

Si vous récupérez une application que vous connaissez mal, votre premier réflexe sera souvent d’ouvrir le repository et de chercher ce qui semble « sale ». Ce n’est pourtant pas le meilleur point de départ.

Commencez plutôt par comprendre :

  • qui utilise le système et avec quels rôles ;
  • où vivent les données sensibles ;
  • quels services externes interviennent ;
  • quels traitements sont asynchrones ;
  • quelles actions sont coûteuses, irréversibles ou difficiles à rejouer ;
  • où le niveau de confiance change.

Cette dernière notion est importante. En threat modeling, OWASP recommande de représenter les flux de données, les acteurs externes et les frontières de confiance — les endroits où une donnée passe d’une zone où vous contrôlez ce qui se passe à une zone où vous ne le contrôlez plus — avant de raisonner sur les menaces.

Prenez une application SaaS avec un frontend, une API, PostgreSQL, Stripe et un modèle LLM externe. Le repository vous montre des modules. La cartographie des risques vous montre autre chose : les endroits où une donnée passe du navigateur vers l’API, d’un tenant à ses données, de votre backend vers Stripe ou de votre base vers un modèle externe.

Hors de votre contrôle

Utilisateur

Rôle et organisation à établir, jamais à croire

Navigateur

Tout ce qui vient d’ici est une hypothèse

Authentification

Votre application

Frontend

Aucune vérification ne peut s’arrêter ici

API

Où les permissions doivent réellement être vérifiées

Workers

Traitements asynchrones, rejouables

Autorisation par tenant

Vos données

PostgreSQL

Données personnelles, migrations, sauvegardes

Stockage fichiers

Accès direct à contrôler séparément

Secrets

Clés des services ci-dessous

Sortie de données

Services tiers

Paiement

Webhook entrant : à authentifier et rendre idempotent

Modèle LLM

Ce qui sort ne revient pas ; latence et coût variables

Email

Panne tolérable, à condition de le savoir

Une cartographie utile n’a pas besoin d’être exhaustive. Elle doit surtout montrer où une erreur peut avoir de vraies conséquences. Les deux bandes grisées sont celles que vous ne contrôlez pas : tout ce qui les sépare est l’endroit où une vérification peut exister.

C’est à ces frontières qu’il devient utile de demander quelles vérifications sont réellement effectuées et quelles hypothèses sont implicites. Une fonction de 80 lignes est rarement un risque en soi. Une règle d’autorisation implicite peut l’être.

Sécurisez les invariants qui comptent

Une fois le système compris, relire toute la codebase avec la même intensité est rarement le meilleur usage du temps.

Il est plus utile de commencer par les invariants : les propriétés qui doivent rester vraies.

Dans un SaaS B2B :

Un utilisateur de l’entreprise A ne doit jamais pouvoir lire ou modifier les données de l’entreprise B.

Dans un système de paiement :

Recevoir deux fois le même événement ne doit jamais produire deux fois l’effet métier.

Pour une intégration externe :

Une panne du service tiers peut dégrader une fonctionnalité, mais ne doit pas rendre toute l’application inutilisable.

À partir de là, vous pouvez construire les contrôles qui apportent réellement de la confiance. Pour l’isolation entre tenants, par exemple, une matrice de tests explicite est souvent plus utile qu’un objectif abstrait de couverture :

Une matrice d’autorisation rend l’invariant testable : chaque ligne est un test d’intégration qui doit passer, y compris celles dont le résultat attendu est un refus.
ActeurRessourceActionRésultat attendu
Utilisateur AFacture ALireAutorisé
Utilisateur AFacture BLireRefusé
Admin AUtilisateur BModifierRefusé
AnonymeFacture ALireRefusé

Le contrôle d’accès cassé reste la première catégorie de l’OWASP Top 10 2025, et OWASP publie un guide spécifique sur les tests de régression d’autorisation.

Même logique pour l’idempotence : Stripe documente explicitement qu’un même événement webhook peut être reçu plusieurs fois et recommande de mémoriser les événements déjà traités (Stripe Docs).

La question n’est donc pas « avons-nous assez de tests ? », mais quelles propriétés importantes sommes-nous capables de défendre ?

Priorisez le risque, pas la propreté du code

Une codebase peut être imparfaite sans être dangereuse. À l’inverse, une application très propre peut cacher une hypothèse métier critique jamais testée.

Pour chaque zone sensible, regardez au moins cinq choses :

Ces cinq questions se posent ensemble : une probabilité faible et un impact large ne se traitent pas comme une probabilité forte et un impact réversible.
QuestionExemple
Quelle est la probabilité d’échec ?Service externe instable, migration jouée à la main
Quel serait l’impact ?Paiement dupliqué, fuite de données
Quelle est l’étendue de l’impact ?Un utilisateur, un tenant, tous les clients
À quelle vitesse le sauriez-vous ?Alerte immédiate ou plainte d’un client
Pouvez-vous récupérer ?Retry simple ou corruption difficilement réversible

La probabilité compte, mais elle ne décide pas seule : sur un invariant de sécurité, l’étendue prime souvent, parce qu’une probabilité faible mais non nulle appliquée à l’ensemble de vos clients reste inacceptable.

Une permission cross-tenant est mal vérifiée

À traiter immédiatement

Impact
Fuite de données d’un autre client
Étendue
Potentiellement tous les clients
Détection
Difficile — rien ne signale une lecture autorisée à tort

Un webhook de paiement s’exécute deux fois

Priorité élevée

Impact
Double débit, ou double livraison
Étendue
Un client à la fois
Détection
Moyenne — souvent par la réclamation

Un composant d’interface est dupliqué

Peut attendre

Impact
Incohérence visuelle
Étendue
Un écran
Détection
Facile — visible immédiatement
Trois défauts qu’une revue orientée « propreté du code » classerait dans l’ordre inverse : le troisième est le seul qui se voit en ouvrant le repository. Ce qui sépare les deux premiers n’est pas leur probabilité, c’est l’étendue de ce qu’ils touchent et le temps qu’il faut pour s’en apercevoir.

Avant la production, nous regardons presque toujours les autorisations, l’isolation des tenants, les secrets, les migrations, l’intégrité des données, l’idempotence, les dépendances externes, les sauvegardes, les coûts variables et l’observabilité.

À l’inverse, duplication non critique, conventions hétérogènes, nommage moyen ou refactorings purement esthétiques peuvent souvent attendre.

L’OWASP Top 10 2025 place aussi les Software Supply Chain Failures en troisième position, ce qui justifie de regarder sérieusement les dépendances et la chaîne de build sur un prototype assemblé rapidement.

Installez trois types de garde-fous : empêcher, voir, récupérer

Une fois les risques prioritaires identifiés, les garde-fous deviennent beaucoup plus simples à choisir.

Empêcher

  • Tests sur les invariants
  • CI et type checking
  • Règles d’accès explicites
  • Migrations versionnées

Voir

  • Logs structurés
  • Error tracking
  • Métriques
  • Alertes actionnables

Récupérer

  • Rollback
  • Sauvegardes testées
  • Feature flags
  • Retries et désactivation
La production readiness ne consiste pas à rendre la panne impossible. Elle consiste aussi à la rendre visible et récupérable.

Empêcher

CI, type checking, tests sur les invariants, analyse statique, secret scanning, migrations versionnées, règles d’accès explicites.

Le but n’est pas d’empêcher tout bug, mais d’éviter les erreurs déjà suffisamment prévisibles.

Voir

Logs structurés, error tracking, métriques et alertes réellement actionnables.

Google SRE propose quatre signaux utiles pour les systèmes exposés aux utilisateurs : latence, trafic, erreurs et saturation (Google SRE). Sur un produit IA, vous pouvez y ajouter les timeouts, retries ou le coût moyen d’un parcours.

Récupérer

Rollback, feature flags, sauvegardes testées, retries et possibilité de désactiver rapidement une intégration.

Réécrire ou stabiliser ? Regardez si les hypothèses de départ sont encore bonnes.

La question de la réécriture revient presque systématiquement quand vous reprenez un prototype. Notre position n’est pas « il ne faut jamais réécrire ».

Deux missions Vezero montrent les deux réponses possibles.

Ce qui sépare les deux décisions n’est pas l’état du code, mais ce que le produit était devenu entre-temps.
CritèreKyutaiGenerous
Hypothèses produit du code existantToujours valablesDépassées
Ce qui avait changéL’usage visé : démonstrations, puis open sourceL’objectif métier et l’expérience utilisateur
DécisionConserver et augmenterRepartir sur une base adaptée

Kyutai : conserver ce qui avait déjà de la valeur

Sur Invincible Voice, la codebase existante encodait les bonnes hypothèses : le cœur fonctionnel correspondait bien au produit que Kyutai voulait diffuser. Nous n’avions donc pas de raison de le reconstruire.

Le travail a consisté à l’augmenter vers deux échéances : des démonstrations à court terme, puis une publication en open source — ce qui déplace nettement le curseur, parce qu’un code publié doit pouvoir être repris par des développeurs extérieurs. Sécurité et authentification, tests, capacité de reprise et nettoyage des dépendances au contexte initial relevaient de ce second objectif.

L’interface de conversation Kyutai livrée en production.
Sur Kyutai, le cœur fonctionnel a été conservé et augmenté ; rien de ce qui marchait n’a été réécrit.

Un exemple concret du type de décision que cela implique : les flux audio étaient chargés en prefetch, ce qui convenait parfaitement à un prototype de recherche mais pesait sur la réactivité perçue de l’interface. Nous les avons repassés en streaming. Ce genre d’arbitrage n’apparaît pas en lisant le code à la recherche de ce qui est « sale » — il vient de l’usage visé.

Deux mois après le début de l’intervention, le projet pouvait être publié.

Generous : repartir parce que le produit avait changé

Sur Generous, la situation était différente. Un premier prototype existait, mais l’objectif métier et l’expérience utilisateur visés avaient évolué depuis sa construction.

Conserver l’existant revenait donc en partie à conserver des hypothèses devenues obsolètes — ce qui est précisément le cas où une réécriture se justifie. Nous sommes repartis sur une base adaptée au produit réellement visé : deux mois pour obtenir une V1 démontrable, puis deux mois supplémentaires pour atteindre un support complet en production.

Continuez à utiliser l’IA, mais changez son espace de décision

Passer en production ne signifie pas qu’il faut arrêter d’utiliser Cursor, Claude Code ou d’autres agents. Ce qui change, c’est la nature des instructions que vous leur donnez.

Pendant le prototypage :

« Construis-moi un espace client avec authentification et gestion des organisations. »

Une fois le système critique :

« Voici le modèle de données actuel. Voici l’invariant d’isolation entre tenants. Voici les tests d’intégration qui l’encodent. Modifie uniquement le module d’autorisation. Liste les migrations nécessaires et les tests manquants avant d’écrire le code. »

Dans le premier cas, vous demandez à l’outil de produire une fonctionnalité. Dans le second, vous lui demandez de produire un changement sous contraintes.

GitHub recommande une approche similaire : utiliser tests et analyses automatisées, vérifier que le changement respecte l’architecture du projet et fournir à l’IA des sources de vérité comme la documentation ou les conventions du repository (GitHub Docs).

Vibe codingEngineering assisté par IA
« Fais fonctionner cette feature »« Modifie ce comportement sous ces contraintes »
Contexte partielArchitecture et sources de vérité explicites
Validation surtout visuelleTests et invariants explicites
Grande liberté donnée à l’outilSurface de changement limitée
Le sujet n’est pas de moins utiliser l’IA, mais de mieux définir ce qu’elle a le droit de décider.

Trois questions pour savoir où vous en êtes

Il n’existe pas de score universel de production readiness. Mais sur un périmètre donné, vous devriez pouvoir répondre à trois questions :

Qu’est-ce qui peut casser ? Comment le saurez-vous ? Que ferez-vous quand cela arrivera ?

Elles recouvrent exactement les trois garde-fous précédents : empêcher, voir, récupérer.

Si vous savez y répondre pour vos zones critiques, et que ces réponses sont testées plutôt que supposées, votre produit peut être prêt même si son code contient encore des imperfections. À l’inverse, un repository impeccable ne suffit pas si personne ne sait y répondre.

Questions fréquentes

Faut-il auditer chaque ligne de code générée par IA avant la production ?

Non. Commencez par comprendre l’architecture, identifier les flux critiques et formaliser les invariants qui ne doivent jamais être violés.

La revue de code et les outils d’analyse peuvent ensuite être concentrés là où une erreur aurait de vraies conséquences.

Le code généré par IA est-il moins sûr que du code écrit à la main ?

Sa provenance ne suffit pas à répondre à la question. Les outils génératifs peuvent produire du code incorrect ou vulnérable, mais un code écrit à la main peut présenter les mêmes défauts.

Pour une mise en production, il est plus utile d’évaluer les contrôles, les dépendances et le comportement réel du système.

Comment savoir s’il faut réécrire ou conserver le prototype ?

Regardez d’abord les hypothèses qu’il matérialise. Si le besoin métier, l’UX et les contraintes fondamentales restent valables, stabiliser l’existant est souvent rationnel.

Si ces hypothèses ont changé en profondeur, conserver le code peut coûter plus cher que repartir sur une base adaptée.

Combien de temps faut-il pour passer un prototype en production ?

Il n’existe pas de durée universelle, mais l’exposition réelle du produit change fortement le problème.

Dans nos propres projets, nous avons eu deux mois pour rendre Invincible Voice publiable en open source chez Kyutai, quatre mois pour amener Generous d’un prototype repris à un support complet en production, et environ deux mois pour mettre en ligne l’application complète de MyTravelConnect dans un contexte de production contrôlé.

Ces durées ne constituent pas des benchmarks : elles montrent surtout pourquoi il faut d’abord comprendre le niveau de garanties attendu avant de chiffrer le travail.

Méthode et sources

Cet article s’appuie sur notre expérience de reprise et de mise en production de produits existants — notamment Kyutai, Generous et Themis-X / MyTravelConnect — ainsi que sur plusieurs référentiels et documentations techniques externes.

Votre prototype fonctionne. Reste à savoir ce qu’il lui manque pour tenir en production.

Nous reprenons l’existant, identifions les risques qui comptent réellement et déterminons ce qui doit être stabilisé, renforcé ou remplacé.

L’objectif n’est pas de refaire votre produit « proprement » par principe, mais de conserver ce qui repose encore sur de bonnes hypothèses et de ne remplacer que ce qui le justifie.

Passer votre prototype en production