Module 02 · Leçon 8 sur 10
Les pièges de l’IA
Repère les API inventées et le code obsolète, les failles de sécurité typiques du code généré, protège tes secrets et respecte les règles de Roblox et d’Anthropic.
- ⏱️ 40 min
- 📝 Quiz de 6 questions
- 🔄 Vérifié le 24 octobre 2026
Sur cette page
- Piège 1 : les API inventées (hallucinations)
- Comment les détecter
- Piège 2 : le code obsolète
- Piège 3 : les failles de sécurité du code généré
- Piège 4 : dépendre de l’IA sans comprendre
- Piège 5 : coller des secrets
- Où ranger une clé, alors ?
- Les règles de Roblox sur l’IA
- Les conditions d’utilisation (Terms of Use)
- La page « Games with Generative AI »
- Claude Code et l’âge minimal
- Quiz de fin de leçon
🎯 Dans cette leçon, tu vas apprendre à…
- Reconnaître une API Roblox inventée ou obsolète et la vérifier avec luau-lsp et la référence officielle
- Repérer les failles de sécurité typiques du code généré par IA (confiance au client, prix venant du client, absence de cadence, loadstring, clés dans le code)
- Protéger ses secrets (clés d’API, cookie, webhooks, mots de passe) dans les prompts, le code et Git
- Connaître les règles officielles de Roblox sur l’IA et l’âge minimal pour utiliser Claude Code
Une IA de code écrit vite et avec assurance. C’est justement le piège : un code faux est présenté avec le même aplomb qu’un code juste. Dans la leçon 6, tu as appris à relire ; dans la leçon 7, à déboguer. Ici, on fait le tour des pièges qu’on retrouve le plus souvent dans du code Roblox généré par IA, puis des règles à respecter pour tes secrets, pour Roblox et pour Anthropic.
Piège 1 : les API inventées (hallucinations)
Une hallucination, c’est quand l’IA invente quelque chose qui n’existe pas, avec un nom qui paraît logique. Pour Roblox, ça donne trois familles d’erreurs :
- une méthode ou une propriété inventée :
Players:GetPlayerByName("Bob"),humanoid:SetWalkSpeed(32)… ; - un mélange avec un autre moteur : des habitudes de Unity (
GetComponent,transform.position) ou d’autres moteurs de jeu ; - un mélange avec le Lua standard : Luau descend de Lua 5.1, mais Roblox ne fournit pas la bibliothèque
io(pas d’accès aux fichiers) etosy est très réduite (pas deos.execute).
-- Code VOLONTAIREMENT FAUX, typique d'une hallucination : ne pas copier
local Players = game:GetService("Players")
local joueur = Players:GetPlayerByName("Bob") -- n'existe pas : Players:FindFirstChild("Bob")
print(joueur)
Players.PlayerAdded:Connect(function(player: Player)
player.CharacterAdded:Connect(function(personnage: Model)
local humanoid = personnage:WaitForChild("Humanoid") :: Humanoid
humanoid:SetWalkSpeed(32) -- n'existe pas : humanoid.WalkSpeed = 32
end)
end)
Comment les détecter
1. luau-lsp, en mode strict. L’extension luau-lsp (leçon 2) connaît toutes les classes Roblox. Mais attention, nous l’avons testé (luau-lsp 1.70.1, octobre 2026) : sur l’extrait ci-dessus, dans le mode par défaut, elle ne signale rien. En mode strict, elle souligne les deux méthodes inventées :
TypeError: Key 'GetPlayerByName' not found in external type 'Players'
TypeError: Key 'SetWalkSpeed' not found in external type 'Humanoid'
Pour activer le mode strict sur un fichier suspect, ajoute --!strict en toute première ligne. Pour tout le projet, crée à la racine un fichier .luaurc (dans VS Code : clic droit dans la zone vide de l’explorateur › New File, comme à la leçon 2, sans oublier le point au début du nom) :
{
"languageMode": "strict"
}
Le mode strict signale aussi d’autres problèmes de types : c’est un bon filet, à condition de lire les messages au lieu de les faire taire.
2. La référence officielle. Toute classe Roblox a sa page sur create.roblox.com/docs/reference/engine : méthodes, propriétés, événements, et une mention Deprecated quand c’est obsolète. Si une méthode n’y est pas, elle n’existe pas.
3. Demander la source. Demande à l’IA « donne-moi le lien de la page de référence pour chaque API Roblox que tu utilises », puis ouvre les liens. Avec le MCP de Studio, Claude Code dispose d’un outil http_get qui lit la documentation Roblox : tu peux exiger qu’il vérifie lui-même. Et ton CLAUDE.md peut contenir la règle : « si tu n’es pas sûr qu’une API Roblox existe, dis-le au lieu de l’inventer ».
Piège 2 : le code obsolète
Les IA ont appris sur des années de tutoriels, dont beaucoup sont anciens. Elles proposent donc souvent des API dépréciées : elles marchent parfois encore, mais Roblox demande de ne plus les utiliser pour du nouveau code. Voici une liste vérifiée sur la référence officielle (octobre 2026) :
| Obsolète (marqué Deprecated dans la référence) | À utiliser |
|---|---|
wait(), spawn(), delay() |
task.wait(), task.spawn(), task.delay() |
Player:LoadCharacter() |
Player:LoadCharacterAsync() |
Humanoid:LoadAnimation() |
Animator:LoadAnimation() |
BodyVelocity, BodyPosition, BodyGyro, BodyForce, BodyAngularVelocity |
LinearVelocity, AlignPosition, AlignOrientation, VectorForce, AngularVelocity |
BasePart.Velocity |
BasePart.AssemblyLinearVelocity |
MarketplaceService:GetProductInfo() |
MarketplaceService:GetProductInfoAsync() |
Model:SetPrimaryPartCFrame() |
PVInstance:PivotTo() |
Instance:Remove() |
Instance:Destroy() |
game.workspace (propriété en minuscules) |
game:GetService("Workspace") |
TeleportService:Teleport() |
TeleportService:TeleportAsync(), appelé par le serveur |
service Chat (ancien chat) |
TextChatService |
Voici à quoi doit ressembler du code moderne :
-- LocalScript « AnimationVictoire » dans StarterPlayer > StarterCharacterScripts
-- Version moderne : Animator:LoadAnimation et task.delay, aucune API dépréciée
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local personnage = script.Parent
local humanoid = personnage:WaitForChild("Humanoid") :: Humanoid
-- L'Animator est l'objet qui joue les animations du Humanoid
local animator = humanoid:WaitForChild("Animator") :: Animator
local victoire = ReplicatedStorage:WaitForChild("Remotes"):WaitForChild("Victoire") :: RemoteEvent
local animation = Instance.new("Animation")
animation.AnimationId = "rbxassetid://0" -- remplace 0 par l'ID de ton animation publiée (module 5)
local piste = animator:LoadAnimation(animation)
victoire.OnClientEvent:Connect(function()
piste:Play()
-- task.delay, jamais delay : on arrête l'animation au bout de 3 secondes
task.delay(3, function()
piste:Stop()
end)
end)
Ce que les outils détectent, ou pas. Dans nos tests (octobre 2026), luau-lsp signale wait, spawn, delay et LoadCharacter comme dépréciés, même hors mode strict. Humanoid:LoadAnimation n’a été signalé qu’en mode strict, et rien n’a été signalé pour un Instance.new("BodyVelocity") ni pour GetProductInfo dans un fichier non strict. selene 0.32.0, lui, a signalé game.workspace mais pas wait. Conclusion : les outils aident, la liste ci-dessus et la référence restent indispensables. Ton CLAUDE.md (leçon 3) dit déjà « toujours task.wait, jamais wait » ; tu peux y ajouter « aucune API marquée Deprecated dans la référence ».
Piège 3 : les failles de sécurité du code généré
Avec un prompt vague, une IA écrit souvent un code qui marche dans Studio… et qui laisse le client décider. Tu as vu au module 4 pourquoi c’est grave. Les failles qui reviennent le plus :
- la confiance au client : un RemoteEvent
DonnerPiecesqui ajoute la somme que le client envoie, unValiderCheckpointsans vérifier la distance ni l’ordre des étapes ; - le prix envoyé par le client : le client dit « j’achète, ça coûte 0 » ;
- l’absence de cadence : aucune limite au nombre de demandes par seconde, donc un tricheur peut envoyer la même demande des centaines de fois par seconde (le « spam » d’un RemoteEvent) ;
loadstring: cette fonction exécute du texte comme du code. Elle est désactivée par défaut (ServerScriptService.LoadStringEnabledvautfalse) et la documentation recommande de la laisser désactivée, car mal utilisée elle ouvre la porte à l’exécution de code à distance. Si une IA te propose de l’activer, refuse ;- les clés dans le code : une clé d’API écrite en clair dans un script pour appeler un service web avec
HttpService.
Compare ces deux versions d’un achat :
-- VERSION DANGEREUSE (fréquente avec un prompt vague) : ne pas copier
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local acheterObjet = ReplicatedStorage:WaitForChild("Remotes"):WaitForChild("AcheterObjet") :: RemoteEvent
acheterObjet.OnServerEvent:Connect(function(player, idObjet, prix)
local pieces = player.leaderstats.Pieces
if pieces.Value >= prix then -- prix choisi par le CLIENT : un tricheur envoie 0 ou -1000
pieces.Value -= prix
player:SetAttribute("Possede_" .. idObjet, true) -- n'importe quel texte accepté
end
end)
-- Script « Boutique » (src/ServerScriptService/Boutique.server.luau) : extrait SÛR et simplifié
-- (la version complète, avec l'inventaire sauvegardé, est au module 5)
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerScriptService = game:GetService("ServerScriptService")
local Catalogue = require(ReplicatedStorage:WaitForChild("Modules"):WaitForChild("Catalogue"))
local Validation = require(ServerScriptService:WaitForChild("Validation"))
local acheterObjet = ReplicatedStorage:WaitForChild("Remotes"):WaitForChild("AcheterObjet") :: RemoteEvent
local peutAcheter = Validation.creerCooldown(1) -- cadence : une demande par seconde et par joueur
-- Le client envoie SEULEMENT l'identifiant de l'objet, jamais un prix
acheterObjet.OnServerEvent:Connect(function(player: Player, idObjet: unknown)
if typeof(idObjet) ~= "string" or #idObjet > 50 or not peutAcheter(player) then
return
end
local objet = Catalogue[idObjet] -- l'objet et son prix viennent du catalogue DU SERVEUR
local leaderstats = player:FindFirstChild("leaderstats")
local pieces = leaderstats and leaderstats:FindFirstChild("Pieces")
if objet == nil or not (pieces and pieces:IsA("IntValue")) then
return
end
if player:GetAttribute("Possede_" .. idObjet) or pieces.Value < objet.prix then
return
end
pieces.Value -= objet.prix
player:SetAttribute("Possede_" .. idObjet, true)
end)
La rubrique Sécurité de tes prompts (leçon 4) sert exactement à éviter la première version : « le client envoie seulement l’identifiant ; le serveur vérifie le type, la cadence, l’existence dans Catalogue, la possession et le solde ; le prix est lu dans Catalogue ».
Piège 4 : dépendre de l’IA sans comprendre
C’est le piège le plus discret. Si tu acceptes chaque proposition sans la lire, tout va bien… jusqu’au jour où un tricheur trouve la faille, où une sauvegarde efface la progression de tes joueurs, ou où l’IA tourne en rond sur un bug que tu ne sais pas décrire.
Le message honnête de cette formation : tu n’as plus besoin de tout taper, mais tu dois comprendre assez le code pour le relire. Concrètement, pour chaque script produit, tu dois pouvoir dire : où il s’exécute (serveur ou client), ce que le client peut envoyer, ce que le serveur vérifie, et ce qui se passe si un appel réseau échoue. C’est pour ça que le module 3 t’apprend à lire Luau. On n’apprend plus à tout écrire : on apprend à lire, diriger et vérifier.
Piège 5 : coller des secrets
Tout ce que tu écris dans un prompt part chez le fournisseur de l’IA. Avec le MCP, les résultats des outils (scripts, console, captures) sont aussi envoyés à l’IA. Et tout ce qui est dans ton dépôt Git peut finir sur GitHub. Règle absolue : aucun secret dans un prompt, dans le code ou dans Git.
| Secret | Pourquoi c’est grave |
|---|---|
| Clé d’API Open Cloud | la documentation Roblox la compare à un mot de passe et demande de ne jamais la stocker dans le code, dans un système de versions ou dans un script |
Cookie .ROBLOSECURITY |
c’est ta session Roblox : qui l’a peut agir sur ton compte. L’aide Roblox dit de ne jamais partager mot de passe, cookies, codes de vérification en deux étapes ni codes de secours |
| URL de webhook Discord | selon la documentation de Discord, un webhook s’utilise sans authentification : qui a l’URL peut poster dans ton salon |
| Mots de passe, codes 2SV (vérification en deux étapes) | évident, mais ça arrive : « voici mon compte pour que tu testes » |
Où ranger une clé, alors ?
Dans le jeu, pour appeler un service web externe depuis un Script serveur, Roblox fournit un magasin de secrets par expérience : Creator Hub, ton jeu, Secrets › Create Secret (tu donnes un nom, la valeur et le domaine du service autorisé à la recevoir). Il faut aussi activer Allow HTTP Requests (File › Experience Settings › Security). Le code ne contient alors que le nom du secret :
-- Script serveur (ServerScriptService) : utiliser une clé SANS l'écrire dans le code
local HttpService = game:GetService("HttpService")
-- "cle_service_stats" est le NOM du secret créé dans le Creator Hub, pas sa valeur
local cle = HttpService:GetSecret("cle_service_stats")
print(cle) --> affiche Secret(cle_service_stats) : la valeur n'est jamais imprimable
-- On construit l'URL sans jamais voir la clé ; elle s'utilise ensuite avec HttpService:RequestAsync
local url = cle:AddPrefix("https://api.exemple.com/stats?cle=")
print(url)
D’après la documentation, ces secrets ne sont disponibles que sur les serveurs en ligne (et en test collaboratif). En test local, tu définis des Local Secrets dans File › Experience Settings › Security. Les secrets ne sont jamais accessibles depuis un script client.
Sur ton PC, si un outil en ligne de commande te demande un jour une clé (par exemple une clé Open Cloud pour publier depuis le terminal), mets-la dans un fichier .env à la racine du projet, et ajoute ces lignes dans ton .gitignore avant le premier commit :
# .gitignore : ne jamais versionner les secrets
.env
.env.*
Pour Claude Code, tu peux interdire la lecture de ces fichiers avec des règles deny dans .claude/settings.json. Exemple tiré de la documentation officielle :
{
"permissions": {
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)"
]
}
}
La documentation précise ses limites : ces règles bloquent les outils de fichiers de Claude et les commandes qu’il reconnaît (cat, head…), mais pas une commande qui lit des fichiers sans les nommer (comme grep -r) ni un programme qui lirait le fichier lui-même. Un fichier .claudeignore n’a aucun effet. La meilleure protection reste de ne pas laisser de secret là où il n’a rien à faire.
Les règles de Roblox sur l’IA
Voici ce que disent les textes officiels au moment de la rédaction (octobre 2026), sans rien ajouter.
Les conditions d’utilisation (Terms of Use)
La section « AI Features » des conditions d’utilisation (mise à jour le 7 octobre 2026) s’applique aux outils d’IA de Roblox, comme l’Assistant ou les générateurs :
- tu es responsable de ton usage des fonctions d’IA, de tes prompts et de l’usage que tu fais des résultats (« You, not Roblox, are responsible… ») ;
- les résultats peuvent contenir des erreurs : tu dois les évaluer et les vérifier ;
- les droits : entre toi et Roblox, tu conserves les droits que tu as sur tes prompts et sur les résultats, mais tu accordes à Roblox une licence pour les utiliser, y compris pour entraîner des modèles (sans changer tes préférences de partage de données) ;
- interdits, entre autres : mettre des informations sensibles, confidentielles ou personnelles dans un prompt ; faire croire qu’un résultat a été créé par un humain ; retirer les marqueurs de provenance d’un résultat ; neutraliser les filtres de sécurité ou de confidentialité.
Les Creator Terms ajoutent, pour l’IA dans un jeu (un PNJ, c’est-à-dire un personnage non joueur, qui discute, par exemple) : informer clairement les joueurs que l’IA n’est pas humaine, que ses réponses sont générées et peuvent être fausses, et qu’ils parlent à un chatbot dès le début de l’échange (« before or at the commencement »). Roblox peut aussi restreindre certains outils d’IA selon l’âge des joueurs.
La page « Games with Generative AI »
La documentation créateur précise les règles pour l’IA dans un jeu :
- tout contenu généré doit respecter les Community Standards (règles de la communauté) ;
- avec les API de Roblox (
GenerationService,TextGenerator), entrées et sorties sont modérées ; avec un outil tiers, tu es responsable de ce que voient les joueurs, et le texte doit passer parTextChatService; - toute interaction des joueurs avec une IA générative se déclare dans le questionnaire Content Maturity ; les interactions prolongées (conversation sans fin, mémoire d’une session à l’autre) imposent le label Restricted, donc un jeu réservé aux 18 ans et plus ;
- un avertissement visible est obligatoire, par exemple « This is an AI-powered conversation, not human. It may make mistakes. »
Les Community Standards elles-mêmes ne contiennent pas de section propre à l’IA : leurs règles générales s’appliquent, dont le respect de la propriété intellectuelle des autres. Pour les assets (modèles, textures, images) générés par IA, voir la leçon 9.
Claude Code et l’âge minimal
Claude Code est réservé aux personnes de 18 ans et plus (conditions d’utilisation d’Anthropic, octobre 2026). Si tu as moins de 18 ans, ne crée pas de compte et n’utilise pas seul celui d’un parent. Tu peux : travailler avec un adulte (parent, enseignant) qui utilise Claude Code avec son propre compte ; utiliser l’Assistant intégré à Roblox Studio, soumis aux règles de Roblox ; ou suivre la formation en lisant et en tapant toi-même — les prompts et la méthode de relecture restent utiles.
Les conditions grand public d’Anthropic (section 2) indiquent en effet : « You must be at least 18 years old to use the Services », et l’aide officielle de Claude précise que les comptes qui montrent des signes d’activité de mineurs sont désactivés.
Ce qu’il faut retenir
- Les IA inventent des API au nom crédible : vérifie chaque nom inconnu dans la référence officielle, active le mode strict de luau-lsp (
--!strictou.luaurc) et demande la source. - Le code obsolète est fréquent (
wait,Humanoid:LoadAnimation,BodyVelocity,GetProductInfo…), mais tout n’est pas déprécié :workspacereste valide. - Failles typiques : confiance au client, prix envoyé par le client, absence de cadence,
loadstring, clés dans le code. Le serveur lit le prix dansCatalogue, toujours. - Aucun secret (clé Open Cloud, cookie
.ROBLOSECURITY, webhook, mot de passe) dans un prompt, le code ou Git : magasin de secrets de Roblox,.envignoré par Git, règlesdenyde Claude Code. - Roblox te rend responsable de ce que tu fais avec l’IA ; une IA dans un jeu doit être annoncée comme telle, déclarée dans le questionnaire de maturité, et Restricted si les échanges sont prolongés.
- Claude Code est réservé aux 18 ans et plus.
Sources et pour aller plus loin
- Engine API reference — documentation Roblox
- Globals Roblox (wait, spawn, delay dépréciés ; workspace) — référence de l’API
- Humanoid — référence de l’API (LoadAnimation déprécié)
- BodyVelocity — référence de l’API (déprécié, remplacé par LinearVelocity)
- MarketplaceService — référence de l’API (GetProductInfo déprécié)
- ServerScriptService — référence de l’API (LoadStringEnabled)
- Secrets stores — documentation Roblox
- API keys — documentation Open Cloud (bonnes pratiques de sécurité)
- Keep Your Account Safe — aide Roblox
- Session Management — aide Roblox (se déconnecter des autres sessions)
- Roblox Studio agent plugin — dépôt officiel (résultats des outils MCP envoyés au fournisseur d’IA)
- Webhook — documentation Discord
- Configure permissions — documentation Claude Code (règles Read deny, .claudeignore)
- Settings reference — documentation Claude Code (permissions.deny)
- Roblox Terms of Use — section AI Features et Creator Terms
- Games with Generative AI — documentation Roblox
- Community Standards — Roblox
- Updates to the Roblox Terms of Use (November 2026) — annonce officielle sur le DevForum
- Roblox is Updating our Terms of Use — texte applicable au 1er novembre 2026
- TeleportService — référence de l’API (Teleport déprécié, TeleportAsync)
- Chat — référence de l’API (classe dépréciée, remplacée par TextChatService)
- Consumer Terms of Service — Anthropic (section 2, âge minimal)
- Age assurance on Claude — aide officielle de Claude