Prototype → production
Votre app vibe codée fonctionne. Maintenant, il faut pouvoir lui faire confiance.
Par Louis Cassedanne — Project 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.
| Dimension | Prototype | Produit en production |
|---|---|---|
| Usage | Le parcours principal fonctionne | Les cas d’erreur importants sont maîtrisés |
| Accès | Quelques utilisateurs connus | Les permissions sont explicites et testées |
| Données | Elles sont stockées | Elles sont protégées, migrables et récupérables |
| Services tiers | Ils répondent pendant la démo | Leurs pannes et retries sont anticipés |
| Exploitation | Vous découvrez les problèmes | Vous pouvez les détecter et les diagnostiquer |
| Reprise | Le créateur connaît le système | Une 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 ? »
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
Panne tolérable, à condition de le savoir
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 :
| Acteur | Ressource | Action | Résultat attendu |
|---|---|---|---|
| Utilisateur A | Facture A | Lire | Autorisé |
| Utilisateur A | Facture B | Lire | Refusé |
| Admin A | Utilisateur B | Modifier | Refusé |
| Anonyme | Facture A | Lire | Refusé |
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 :
| Question | Exemple |
|---|---|
| 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
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
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.
| Critère | Kyutai | Generous |
|---|---|---|
| Hypothèses produit du code existant | Toujours valables | Dépassées |
| Ce qui avait changé | L’usage visé : démonstrations, puis open source | L’objectif métier et l’expérience utilisateur |
| Décision | Conserver et augmenter | Repartir 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.

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 coding | Engineering assisté par IA |
|---|---|
| « Fais fonctionner cette feature » | « Modifie ce comportement sous ces contraintes » |
| Contexte partiel | Architecture et sources de vérité explicites |
| Validation surtout visuelle | Tests et invariants explicites |
| Grande liberté donnée à l’outil | Surface de changement limitée |
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.
- GitHub — Responsible use of Copilot agents
- GitHub — Review AI-generated code
- NIST — Secure Software Development Framework (SSDF)
- OWASP — Threat Modeling Cheat Sheet
- OWASP — Top 10:2025
- OWASP — Broken Access Control
- OWASP — Authorization Regression Testing
- Stripe — Webhook best practices
- Google SRE — Monitoring Distributed Systems
- Martin Fowler — Strangler Fig Application
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.
L’expertise derrière cet article
Architecture et engineering produitCe que nous avons construit
- Kyutai — Faire passer un prototype de recherche à un produit prêt à être présenté, diffusé et repris en open source, en moins de deux mois.
- Themis-X — Concevoir en quelques semaines une plateforme permettant aux voyageurs en situation de handicap de partager leurs besoins d’accessibilité de manière sécurisée tout au long de leur séjour.