Les tests automatisés révèlent le code SaaS IA récupérable
Utilisez des tests automatisés pour SaaS IA afin d’évaluer revenus, droits, intégrité des données et déploiement avant toute réparation.

Les tests automatisés peuvent dire si un SaaS créé par IA mérite d’être récupéré, mais seulement s’ils mesurent les règles métier qui justifient son exploitation. Cent tests de composants au vert ne disent pas si un client peut payer une seule fois, ne voir que ses données, supporter une nouvelle tentative et retrouver la même application après un déploiement propre.
J’ai vu des équipes prendre une suite de tests générée pour un vote de confiance envers du code généré. C’est inverser la charge de la preuve. Le code existant ne gagne aucun crédit parce qu’il est facile à tester. Il mérite un budget de réparation lorsqu’il produit un petit ensemble de preuves reproductibles sur les revenus, les droits, les données et les versions.
Ces preuves doivent rester assez simples pour être comprises par une personne fondatrice et assez strictes pour éveiller la méfiance d’une personne technique. Elles doivent aussi échouer pour des raisons utiles. Si chaque test en échec finit en délai dépassé inexpliqué, vous aurez peu appris. Si un test montre qu’un second webhook a créé une seconde commande payée ou qu’un membre a lu la facture d’un autre client, il révèle à la fois un défaut et la limite de la réparation.
Le but n’est pas de prouver que le SaaS n’a aucun bug. Aucune suite pratique ne le prouve. Il faut décider si le comportement utile du produit peut être isolé, spécifié, réparé et déployé sans payer pour redécouvrir l’application écran après écran.
Une suite au vert ne vaut que si elle protège une règle
Un test réussi compte quand vous pouvez nommer la promesse qu’il protège, l’échec qu’il détecterait et la pièce qu’il laisse à examiner. Sans ces trois éléments, le vert tient souvent du rituel.
Les créateurs d’applications IA génèrent volontiers des tests sur le comportement visible, car il est facile à décrire : une page se charge, un bouton répond, une fenêtre se ferme. Ces tests repèrent des régressions, mais disent peu sur la cohérence du modèle métier. Une page de paiement peut afficher un succès pendant que le gestionnaire de webhook crée des abonnements en double. Un bouton d’administration peut disparaître alors que son endpoint accepte la requête d’un membre. Un formulaire peut afficher la nouvelle adresse alors que la base n’en a enregistré qu’une partie.
Utilisez un ensemble de preuves en quatre parties. Chacune répond à une question différente sur la récupération :
- Flux de revenus : l’état financier avance-t-il exactement une fois, y compris lors des reprises et des échecs ?
- Droits : le serveur impose-t-il les limites de rôle et de client aux actions autorisées comme interdites ?
- Intégrité des données : les écritures restent-elles valides après un échec partiel, des accès concurrents et des requêtes répétées ?
- Reproductibilité du déploiement : un environnement vide peut-il devenir une version fonctionnelle par un seul chemin documenté ?
La distinction entre suite de régression et suite de récupération est importante. La première protège un comportement connu après que l’équipe fait confiance à l’architecture. La seconde cherche s’il existe assez de comportement stable pour justifier la réparation d’une architecture encore suspecte. Réutiliser les tests existants convient, mais les assertions héritées ne méritent aucun privilège. Reliez chacune à une règle ou retirez-la de la décision.
L’Application Security Verification Standard d’OWASP fait une séparation utile. Il distingue l’authentification, le contrôle d’accès, la logique métier, la protection des données, les API et la configuration. Cette structure vaut mieux qu’une affirmation vague selon laquelle l’application serait « sûre », mais appliquer toutes les exigences ASVS avant une décision de récupération noierait celle-ci sous le travail. Servez-vous des exigences pertinentes pour préciser les tests de frontière, puis gardez l’ensemble d’approbation lié aux risques réels du produit.
Un bon nom de test ressemble à une règle. second_paid_webhook_does_not_create_another_entitlement en dit plus que payment_test_03. Quand une personne non technique lit le rapport, le nom doit lui dire ce qui a tenu et ce qui a cédé.
Définissez la décision avant de réparer le code
Écrivez le seuil de récupération avant que quiconque corrige le premier test. Sinon, chaque réparation déplace la norme et le coût déjà engagé commence à dicter la décision.
Le seuil exige des résultats, des preuves et des conditions d’arrêt. Il n’exige pas de prévision fondée sur des points techniques devinés. Pour chaque domaine, consignez un parcours critique, l’état qui doit rester vrai, la preuve observable et le résultat qui arrêterait la réparation. Gardez ce document avec les tests afin de distinguer un échec métier d’un échec de l’outillage.
Un fichier compact peut porter ce contrat :
salvage_gate:
revenue:
journey: paid checkout plus duplicate webhook
invariant: one charge maps to one entitlement
proof: order row, entitlement row, provider event id
stop_if: duplicate processing cannot be made atomic
permissions:
journey: member requests another tenant's invoice
invariant: server denies the request without revealing existence
proof: 404 response and unchanged audit record
stop_if: tenant ownership is absent from the data model
data_integrity:
journey: two workers claim the same queued job
invariant: one worker owns the job
proof: one claim token and one completed result
stop_if: authoritative state exists only in browser storage
deployment:
journey: empty environment to smoke-tested release
invariant: migrations and configuration are deterministic
proof: commit id, migration log, smoke-test report
stop_if: production requires an undocumented manual edit
La syntaxe exacte importe peu. La précision importe. « Les paiements marchent » laisse l’équipe montrer le chemin le plus facile. « Un webhook payé en double laisse un seul droit » oblige le test à traverser une frontière d’échec courante et produit un état vérifiable.
Choisissez des conditions d’arrêt qui révèlent des fondations absentes, pas des défauts ordinaires. Une mauvaise condition se répare. L’absence de propriété client dans toutes les tables peut transformer une petite intervention en reconstruction du modèle de données. Une migration qui échoue à cause d’une valeur par défaut reste une tâche bornée. Si le schéma de production diffère de tous les fichiers de migration, le dépôt n’est pas la source de vérité.
Fixez une durée pour rassembler les preuves, sans faire du temps écoulé le verdict. Un environnement de test lent peut en dire plus sur le déploiement que sur la qualité du code. Consignez les tests bloqués séparément des réussites et des échecs. Un test de revenus bloqué parce que personne ne connaît le secret du webhook constitue une preuve de déploiement, pas une omission neutre.
L’approbation doit prendre l’un de trois états : réparer, reconstruire un sous-système borné, ou arrêter et redéfinir le produit. Évitez le score en pourcentage. Les scores cachent les veto. Un produit peut réussir neuf contrôles mineurs et rester dangereux parce que l’isolation entre clients échoue.
Les tests de revenus doivent suivre l’état
Un test de revenus doit prouver toute la transition commerciale, y compris les chemins difficiles après le message de succès du navigateur. Le navigateur participe à la transaction, mais il en est rarement l’autorité.
Commencez par le plus petit parcours qui crée ou préserve le revenu : le client lance le paiement, le prestataire confirme un événement, l’application inscrit l’achat et le client reçoit le bon droit. Rejouez ensuite le même événement. La seconde livraison doit produire le même état métier sans seconde commande, crédit, trace d’e-mail ou droit.
Ne terminez pas le test à la réception d’un statut de succès. Capturez une preuve à chaque frontière faisant autorité :
- L’identifiant d’événement du prestataire est stocké sous une contrainte d’unicité.
- La commande et le droit désignent le même client et la même organisation.
- Une reprise renvoie un résultat stable au lieu de répéter les effets.
- Une action ultérieure en échec peut reprendre sans rejouer la transition de paiement.
- Un remboursement ou une résiliation retire uniquement l’accès prévu par la politique du produit.
C’est ici que les applications générées révèlent souvent une autorité morcelée. Le navigateur écrit paid=true, une fonction sans serveur écrit une commande et un webhook écrit un abonnement. Chaque chemin paraît raisonnable seul. Ensemble, ils autorisent des états contradictoires. Les tests ne révèlent le partage que lorsqu’ils vérifient les trois stockages et désignent l’enregistrement qui détient la vérité.
Déroulez un échec en détail. Envoyez l’événement evt_test_42 et forcez l’échec de l’insertion du droit après celle de la commande. Rejouez le même événement sans la panne. Le résultat acceptable contient une commande et un droit liés à evt_test_42. Deux commandes révèlent l’absence d’idempotence. Une commande sans droit révèle un trou de transaction ou de reprise. Un nouvel essai toujours rejeté indique que le code termine l’événement trop tôt.
Le rapport doit afficher une sortie métier plutôt qu’un mur d’assertions :
REVENUE_GATE duplicate_webhook
provider_event=evt_test_42
orders=1 entitlements=1 notifications=1
first_attempt=rolled_back retry=completed
result=PASS
N’utilisez pas une vraie carte et ne dépendez pas d’un compte de production. Utilisez le mode de test du prestataire ou un adaptateur contrôlé, tout en gardant la persistance et l’idempotence réelles de l’application dans le parcours. Simuler toute la frontière de paiement prouve seulement que la simulation est d’accord avec elle-même.
Une recommandation répandue consiste à commencer par des tests de bout en bout pour chaque tarif. Elle semble complète et produit de beaux rapports. C’est un mauvais premier investissement si le modèle de revenus peut être cassé. Prouvez un tarif représentatif face aux reprises, à la résiliation et à la récupération. Élargissez quand la transition a un seul propriétaire.
Les droits exigent deux clients et des refus volontaires
Les tests de droits doivent prouver que le serveur refuse l’accès interdit même si l’appel contourne l’interface. Cacher un bouton relève de la présentation, pas de l’autorisation.
Créez deux clients avec des données stables. Donnez au premier un propriétaire et un membre, puis au second un enregistrement dont le premier peut deviner ou obtenir l’identifiant. Envoyez des requêtes directes de lecture et d’écriture. Le membre du premier client ne doit pas lire, modifier, supprimer, exporter ni rattacher des données à l’enregistrement du second.
Testez aussi les actions permises. Une suite de refus peut réussir parce que tous les endpoints sont cassés. Chaque opération protégée exige une paire : le bon rôle réussit sur son objet, le mauvais rôle ou client échoue sur la même route. Contrôlez la base après les deux requêtes. Un serveur qui renvoie 403 après l’écriture reste compromis.
Décidez si l’application renvoie 403 ou 404 pour les objets d’un autre client et appliquez la règle partout. Le 404 évite souvent de confirmer l’existence d’un enregistrement. Le statut ne suffit pas. Comparez la forme de la réponse, le délai avec une tolérance raisonnable et les effets pour que le gestionnaire d’erreur ne révèle ni titre, ni propriétaire, ni chemin de stockage.
OWASP ASVS sépare le contrôle d’accès de la logique métier, et cet avertissement est utile. Une personne peut être autorisée à rembourser tout en enfreignant une règle en remboursant deux fois ou en approuvant sa propre demande. Le rôle répond « cet acteur peut-il appeler l’opération ? ». La règle métier répond « cette opération valide peut-elle changer cet objet maintenant ? ». Une suite de récupération a besoin des deux.
Le code généré disperse souvent les rôles entre gestionnaires de routes, conditions d’interface et requêtes de base. Ne transformez pas immédiatement ces chaînes en élégante couche de politiques. Cartographiez d’abord l’endroit réel du contrôle avec les tests. Si une frontière serveur peut devenir l’autorité, la réparation peut rester bornée. Si chaque requête croit un tenantId fourni par le client, prévoyez plus profond.
Traitez les rôles de service et les tâches de fond comme des acteurs de la même matrice. Un worker doté d’un accès illimité à la base peut effacer les garanties testées par l’API. Donnez à une tâche un élément de chaque client et vérifiez que sa sélection comme sa mise à jour préservent la propriété.
Un refus qui échoue interdit la mise en production, mais pas forcément la récupération. Il faut demander si le modèle contient les faits de propriété nécessaires. Si chaque facture référence un client fiable, la réparation a une base. Si la propriété se déduit d’adresses e-mail modifiables, le test a trouvé une frontière de reconstruction.
L’intégrité apparaît quand les requêtes se heurtent
Les tests d’intégrité doivent pousser l’application dans les états que les chemins heureux évitent. Reprises, écritures concurrentes, arrêt de processus et pannes partielles montrent si la base protège les règles ou stocke seulement ce que l’application lui envoie.
Commencez par écrire chaque règle importante comme un fait de base de données. Un jeton d’invitation se consomme une fois. Un e-mail appartient au plus à un compte actif dans la portée choisie. Une tâche a un propriétaire courant. Le total d’une facture correspond à ses lignes selon la règle d’arrondi. Cherchez ensuite la couche la plus basse capable d’imposer chaque fait. Préférez unicité, clé étrangère, contrôle ou transaction lorsque la base sait exprimer la règle.
Les contrôles applicatifs du type « chercher puis insérer si absent » sont vulnérables à deux requêtes simultanées. Un test déterministe rend la course visible : mettez les deux requêtes en pause après leur constat d’absence, relâchez-les ensemble et inspectez les lignes. Si la contrainte rejette une insertion et que l’application transforme ce rejet en réponse prévue, la règle tient. Si deux lignes existent, répéter le test ne remplace pas la contrainte.
La documentation PostgreSQL explique que l’isolation détermine quels changements concurrents une transaction peut voir. Les équipes citent parfois les niveaux comme si un nom plus fort résolvait chaque course. Ce n’est pas le cas. L’application a toujours besoin d’une bonne frontière transactionnelle, de contraintes et d’une réponse voulue aux erreurs de sérialisation ou d’unicité. Un gestionnaire généré qui ouvre sa transaction après sa première écriture a déjà perdu la frontière utile.
Testez la reprise comme un état, pas seulement un code d’erreur. Arrêtez un worker après la prise d’une tâche mais avant l’inscription du résultat. Avancez le bail ou l’horloge de reprise avec une horloge injectée, lancez un autre worker et vérifiez qu’un seul résultat final existe. Cela sépare la livraison au moins une fois, qui autorise plusieurs tentatives, des effets métier doubles que l’application doit empêcher.
N’utilisez pas des instantanés complets de la base pour chaque cas. Ils rendent importants des champs anodins et cachent la règle dans le bruit. Interrogez les enregistrements qui portent la décision et imprimez un petit écart avant-après. Rendez déterministes les dates, identifiants aléatoires et ordres générés lorsque le comportement le permet.
Si les tests exigent des scripts globaux qui vident les tables entre les cas, examinez cette dépendance. Elle peut cacher des filtres client absents et un ordre implicite. Une meilleure donnée de test crée des identifiants isolés, fonctionne à côté d’une autre et ne supprime que ses propres lignes. Les pannes en parallèle sont souvent des preuves d’architecture déguisées en problème de runner.
Les échecs d’intégrité fixent la taille de la réparation. Des contraintes absentes autour d’un schéma cohérent se réparent souvent. Plusieurs identifiants concurrents pour le même utilisateur, des blobs sérialisés sans version ou un état métier uniquement dans le navigateur indiquent une reconstruction bornée. Notez cette frontière au lieu d’ajouter du montage de test pour imiter la cohérence.
Un déploiement reproductible part de rien
Un déploiement reproductible signifie qu’une commande documentée transforme un environnement propre et une configuration déclarée en la même application testée. Redéployer la machine de production déjà fonctionnelle ne le prouve pas.
Utilisez une base vide et un environnement neuf. Figez la révision et le fichier de verrouillage des dépendances. Fournissez la configuration par le mécanisme documenté, exécutez les migrations dans l’ordre du dépôt, construisez, démarrez et lancez un parcours de contrôle par domaine de preuve. Conservez ensemble journal de migration, sortie de construction, identifiant de version et résultats.
La première exécution compte, la seconde révèle la non-reproductibilité cachée. Détruisez l’environnement et recommencez depuis la même révision. Comparez schéma, données de référence, ressources générées et configuration observable. Une version qui ne réussit qu’après une modification manuelle en console a échoué même si elle répond finalement.
Ne copiez pas les secrets de production. La preuve attendue est que chaque secret requis possède un nom déclaré, une source responsable et un mode d’échec lorsqu’il manque. Un contrôle au démarrage doit signaler la configuration absente avant de servir du trafic. Un secret dans le code est à la fois une faille et la preuve que les environnements ne se recréent pas sûrement.
La documentation GitHub Actions indique que les règles de protection d’environnement peuvent bloquer une tâche et retenir les secrets jusqu’à validation. C’est un contrôle utile, mais il ne répare pas une construction impossible à reproduire. Placez l’approbation après la création de preuves inspectables. Une approbation manuelle devant des scripts opaques formalise seulement une supposition.
La documentation Playwright recommande d’enregistrer les traces à la première reprise d’un test en échec dans l’intégration continue. L’intention est bonne : la trace conserve captures, instantanés du DOM et activité réseau d’un échec intermittent. Pour la récupération, gardez aussi les pièces du premier échec et ne laissez jamais la reprise remplacer le résultat initial. Un test qui échoue puis réussit donne une preuve instable.
Intégrez la récupération au test de version lorsque les migrations changent les données client. Vous découvrirez peut-être qu’il faut déployer en avant un code compatible plutôt qu’inverser une migration destructive. C’est acceptable si le manuel le dit et si le test le prouve. Une migration down imaginaire vaut moins qu’un plan honnête de récupération en avant.
Les échecs de déploiement tranchent souvent plus vite que les plaintes de style. Si le dépôt contient son schéma, ses entrées de construction et son contrat de configuration, l’équipe peut réparer vers une version connue. Si le seul système fonctionnel dépend de changements en console, de fonctions non suivies et de l’environnement local d’une personne, chiffrez d’abord l’exploration. L’archive de code n’est pas tout le produit.
La forme de l’échec révèle la frontière
Le motif des échecs compte plus que leur nombre. Dix échecs causés par une seule frontière d’autorisation peuvent coûter moins cher à réparer que deux issus de sources de vérité contradictoires.
Classez chaque échec par propriété. Un échec localisé possède un composant responsable et un enregistrement faisant autorité. Un échec transversal traverse plusieurs couches mais garde un propriétaire clair. Un échec de fondation n’a pas d’autorité fiable, par exemple un abonnement commandé séparément par le navigateur, une table de webhooks et une dérogation administrative sans priorité.
Examinez ensuite le déterminisme. Un échec déterministe est utile : l’équipe peut le reproduire et prouver la correction. Un échec intermittent exige des pièces sur l’ordonnancement, l’état, les entrées et l’environnement. Si une course devient déterministe grâce à des barrières ou une horloge injectée, le système devient plus récupérable avant même de changer le code.
Ne récompensez pas les corrections faciles pendant l’évaluation. Corriger la syntaxe, mettre à jour les dépendances et ajuster les sélecteurs fait vite monter le compteur vert. Ces changements peuvent attendre sauf s’ils débloquent un parcours critique. La décision a d’abord besoin d’informations sur l’incertitude coûteuse.
Tenez un registre de réparation en quatre champs : règle en échec, autorité supposée, plus petite frontière de réparation et preuve attendue. N’estimez rien tant que l’autorité supposée n’est pas crédible. « Réparer la facturation » n’est pas une frontière si la vérité vit dans quatre tables et deux stockages du navigateur. « Rendre uniques les événements traités et valider le droit dans la même transaction » est assez testable pour être estimé.
L’outillage de test peut aussi échouer à l’évaluation. Surveillez les données qui appellent la production, les assertions dépendantes de l’heure, les reprises qui effacent l’échec, les comptes partagés et les simulations qui recopient l’implémentation. Réparez l’outillage juste assez pour obtenir une preuve fiable. Un cadre impeccable autour d’un produit incohérent reste un coût perdu.
La décision devient favorable quand les échecs se regroupent autour de quelques frontières, que le modèle contient les faits nécessaires aux règles et que les déploiements propres reproduisent les résultats. Elle devient défavorable lorsque chaque test demande une nouvelle interprétation de l’état métier. La réparation inclurait alors la redécouverte de la spécification pendant sa modification.
L’approbation exige des veto et des responsables
Approuvez la réparation lorsque chaque domaine critique réussit ou présente un échec borné, un responsable, un plan et un test qui prouvera la correction. Ne l’approuvez pas à partir d’un taux global.
Revenus en double, accès entre clients, corruption irrécupérable et production impossible à recréer méritent un veto explicite. Un veto peut conduire à reconstruire un sous-système plutôt qu’à annuler, mais quelqu’un doit nommer ce périmètre avant le travail. Si l’équipe ne s’accorde pas sur l’état faisant autorité, le périmètre n’est pas prêt pour un engagement ferme.
Demandez un dossier de preuves, pas une présentation. Il doit contenir le fichier de seuil, la révision exacte, la commande de test, la description des données, les pièces du premier échec, les écarts de base pour les contrôles d’état, les journaux de déploiement et le registre de réparation. Une autre personne technique doit pouvoir le rejouer sans consignes orales.
Le dossier doit aussi consigner ce qui n’a pas pu être testé. L’absence d’accès à un bac à sable de paiement, une migration de production inconnue ou un secret de signature indisponible change le niveau de confiance. Une frontière non testée n’est pas un échec, mais elle ne peut pas réussir en silence. Donnez un responsable et une date à chaque manque, puis décidez s’il bloque ou augmente la réserve d’exploration.
Les propriétaires non techniques examinent les noms des règles et les résultats métier, tandis que l’équipe technique examine isolation, données et pièces. Cette répartition ne demande pas à une personne fondatrice de juger le SQL ni à un développeur d’inventer la politique commerciale. Elle révèle tôt les désaccords. Si la résiliation conserve l’accès jusqu’à la fin de la période, écrivez-le avant qu’un test code une autre réponse.
FixMyMess associe diagnostic du code, vérification experte et outils assistés par IA pour évaluer ce type d’application héritée. Un audit gratuit peut déterminer si les échecs appellent une réparation logique, un durcissement de sécurité, une refactorisation, une préparation du déploiement ou une reconstruction, mais l’approbation doit toujours reposer sur le dossier de preuves.
Chiffrez ouvertement l’incertitude. Une réparation d’autorisation bornée peut avoir un test d’acceptation clair. Un schéma de production inconnu, une configuration prestataire absente ou un modèle de propriété manquant exige une réserve d’exploration ou une décision de reconstruction séparée. Cacher l’incertitude dans une estimation confiante crée le pire projet : celui qui reste presque fini pendant que chaque chemin réparé révèle une autre vérité.
Les tests automatisés méritent leur place lorsqu’ils permettent de refuser. Si les preuves ne peuvent pas arrêter la réparation après des revenus doublés, une fuite entre clients, des reprises corruptrices ou un déploiement irréproductible, elles ne sont qu’un argument commercial. Construisez le petit seuil, gardez ses échecs et ne financez que les frontières qu’il rend visibles.
Questions Fréquentes
Les tests automatisés peuvent-ils prouver qu’un SaaS IA est sûr en production ?
Aucune suite ne prouve une sécurité complète. Elle peut fournir des preuves crédibles que des règles précises de revenus, droits, intégrité et déploiement tiennent, tout en rendant explicites les risques non testés.
Combien de tests faut-il pour décider d’une récupération ?
Utilisez le plus petit ensemble qui couvre chaque frontière métier critique et ses principaux modes d’échec. Une douzaine de tests formulés comme des règles peut mieux guider la décision que des centaines de contrôles d’interface superficiels.
Faut-il garder les tests générés par le créateur d’application ?
Gardez tout test relié à une règle nommée et qui échoue quand elle casse. Réécrivez ou retirez ceux qui confirment seulement du texte affiché, des détails d’implémentation ou une simulation sans valeur décisionnelle.
Quel test de paiement faut-il écrire en premier ?
Rejouez le même événement réussi et vérifiez que l’application conserve une commande et un droit. Forcez ensuite une panne partielle et prouvez que la reprise termine le travail manquant sans répéter les effets déjà accomplis.
Comment tester l’isolation entre clients dans un SaaS ?
Créez deux clients et envoyez au serveur des lectures et écritures directes qui traversent la frontière. Associez chaque refus à une requête autorisée, puis inspectez l’état persistant pour confirmer l’absence d’effet interdit.
Un taux élevé de réussite signifie-t-il que le code est récupérable ?
Non. Un taux mélange les contrôles graves et mineurs dans un chiffre trompeur, si bien qu’une fuite entre clients peut disparaître derrière de nombreux tests de composants réussis.
Quand un échec conseille-t-il de reconstruire plutôt que réparer ?
Une frontière de reconstruction apparaît lorsque l’application n’a pas de source faisant autorité pour un état important ou pas de données de propriété pour appliquer la règle. Une condition locale ou une contrainte absente indique plutôt une réparation.
Un test instable doit-il compter comme preuve réussie ?
Non. Conservez le premier échec et classez le résultat comme instable jusqu’à ce que l’équipe explique et maîtrise sa cause ; une reprise réussie ne doit pas effacer l’incertitude.
Qu’est-ce qui prouve qu’un déploiement est reproductible ?
Créez deux fois un environnement propre depuis la même révision, configuration déclarée, verrouillage et migrations. Les deux versions doivent produire le même schéma et réussir les mêmes parcours sans modification en console.
Qui doit approuver la réparation d’un SaaS créé par IA ?
Le propriétaire du produit approuve les règles métier et les frontières de reconstruction, tandis qu’une personne technique approuve les preuves et leur reproduction. Aucun ne doit remplacer des veto explicites par un pourcentage.