Claude Code / Codex
Prompts d'instructions et collection de modèles
30 modèles CLAUDE.md / AGENTS.md / Cursor Rules. Collez un prompt dans le chat pour les faire générer, ou collez directement un fichier prêt à l'emploi. Les deux fonctionnent.
Les agents de codage IA (Claude Code, OpenAI Codex, Cursor et d'autres) lisent le fichier d'instructions situé à la racine de votre dépôt (CLAUDE.md / AGENTS.md) pour apprendre « les règles de ce projet ». Mais quand ces instructions sont vagues, l'IA les ignore allègrement. Un fichier d'instructions efficace ressemble à ceci : des phrases impératives courtes, des interdictions explicites et une « définition de terminé » claire avec des étapes de vérification.
Pour comprendre pourquoi elles sont ignorées et comment y remédier, voir « Pourquoi l'IA ignore vos règles .md, et comment y remédier » .
Collez simplement le prompt directement dans la zone de chat de Claude Code / Codex / Cursor. L'IA inspecte votre dépôt et rédige un fichier d'instructions contenant vos vraies commandes.
Presque aucune modification manuelle nécessaire. Utilisez aussi cette méthode pour auditer et améliorer des fichiers d'instructions existants, ou les convertir au format AGENTS.md / Cursor.
Copiez un fichier d'instructions prêt à l'emploi et enregistrez-le sous le nom CLAUDE.md à la racine de votre dépôt. Remplacez juste quelques espaces réservés comme <name> par les valeurs de votre environnement.
Pour celles et ceux qui veulent comprendre et gérer le contenu eux-mêmes, ou qui veulent un modèle de départ pour un langage/framework spécifique.
À coller simplement dans le chat (prompts de génération et d'amélioration)
Générer un fichier d'instructions de zéro (CLAUDE.md / AGENTS.md, inspecte le dépôt automatiquement)★
L'option la plus simple. Collez-le dans le chat et l'IA inspecte votre dépôt puis rédige un fichier d'instructions contenant vos vraies commandes. Presque aucune modification manuelle nécessaire.
Inspecte l'intégralité de ce dépôt et crée, à la racine, le fichier d'instructions
que toi (cet agent) charges automatiquement
(Claude Code utilise `CLAUDE.md`, Codex utilise `AGENTS.md`, Cursor utilise `.cursor/rules/`).
À inclure :
- Présentation du projet (ce que fait l'application, la stack technique)
- Commandes (serveur de dev / build / test / lint). Identifie les vraies commandes
à partir des fichiers réels comme package.json ou Makefile (ne devine pas)
- Conventions de code (respecte le style réel que tu lis dans le code existant)
- Règles absolues : ne jamais committer de secrets ou de .env / ne jamais reformater
des lignes sans rapport / ne jamais push sauf instruction explicite
- Définition de terminé : ne pas signaler « terminé » tant que lint et test ne passent pas
(inclure les vrais noms de commandes)
Ne comble pas les lacunes par des suppositions ; pose-moi la question quand quelque chose n'est pas clair.
Pour finir, écris le tout sous forme du fichier d'instructions décrit ci-dessus.
Pourquoi ça marche :Faire lire et écrire votre propre dépôt par l'IA est la voie la plus rapide. Laisser le nom de fichier au choix de l'outil (CLAUDE.md / AGENTS.md, etc.) garantit que cela fonctionne tel quel aussi bien dans Claude que dans Codex. Et comme cela fixe les commandes et les chemins à partir de vos fichiers réels, aucune modification manuelle n'est nécessaire.
Auditer un fichier d'instructions existant et le réécrire sous une forme « efficace »
Pour quand vous avez déjà un fichier d'instructions (CLAUDE.md / AGENTS.md) mais que l'IA ne le suit pas. Faites-lui pointer les points faibles, puis réécrire le tout avec un phrasé impératif et des étapes de vérification.
Lis le fichier d'instructions que toi (cet agent) charges (CLAUDE.md / AGENTS.md, etc.),
pointe les points faibles que les agents IA ont tendance à ignorer, puis réécris-le
sous une forme efficace.
Points à examiner :
- Transformer les formulations vagues en impératifs (toujours faire X / ne jamais faire Y)
- Ajouter une « définition de terminé » et des étapes de vérification (exécution de lint / test)
- Rendre les interdictions concrètes jusqu'à la cible (noms de répertoires, noms de commandes)
- Si c'est trop long, le réduire au seul noyau que tu veux faire appliquer
Liste d'abord les points faibles sous forme de puces, puis produis la version
réécrite complète et applique-la à ce fichier d'instructions.
Pourquoi ça marche :Un « fichier d'instructions inefficace » est généralement vague, sans étapes de vérification, et ne nomme les interdictions que de façon abstraite. Faire énoncer les points faibles par l'IA elle-même avant de les corriger rend les améliorations concrètes.
Ajouter une « définition de terminé » adaptée à votre dépôt actuel
Ajoutez le bloc le plus important, avec vos vraies commandes, pour empêcher l'IA d'abandonner alors qu'elle croit seulement avoir terminé.
Après avoir identifié les vraies commandes build / test / lint de ce dépôt,
ajoute une section « Définition de terminé » au fichier d'instructions que tu charges
(CLAUDE.md / AGENTS.md, etc.).
Exigences :
- En faire une liste de contrôle sous la forme « ne pas signaler terminé tant que tout ce qui suit n'est pas satisfait »
- Indiquer explicitement les vraies commandes de lint et de test
- Inclure : ne laisser aucun TODO ni log de débogage dans les fichiers modifiés, et relire ton propre diff
Ne casse pas le contenu existant ; ajoute uniquement la section.
Pourquoi ça marche :Quand les critères d'achèvement sont vagues, l'IA s'arrête par autosatisfaction. Le simple ajout d'une liste de contrôle avec les vraies commandes met en route la boucle d'autovérification. Préciser « ajouter, ne pas casser le contenu existant » est l'approche sûre.
Détecter automatiquement le langage/framework et ajouter des règles
Faites-lui détecter la stack et ajouter les bonnes règles, par exemple les frontières Server/Client pour Next.js.
Détecte automatiquement le langage et le framework de ce dépôt, et ajoute les
règles de bonnes pratiques correspondantes au fichier d'instructions que tu charges
(CLAUDE.md / AGENTS.md, etc.).
Exemples :
- Next.js : frontière Server/Client (par défaut Server, garder use client au minimum)
- Laravel : validation via les Form Requests, conventions de migration
- Python : annotations de type, ne jamais écraser ni fabriquer les données brutes
Ajoute une note d'une ligne sur la base de ta détection (à partir de quels fichiers tu as jugé)
avant d'ajouter. Ne duplique rien de ce qui est déjà écrit.
Pourquoi ça marche :Les points de défaillance diffèrent selon le langage. Faire détecter automatiquement par l'IA et ajouter uniquement les règles pertinentes est plus précis qu'un modèle générique, et plus facile à maintenir.
Ajouter des règles absolues pour la sécurité / Git / les tests
Ajoutez un ensemble de « règles absolues » qui préviennent les accidents irréversibles.
Ajoute les « règles absolues » suivantes au fichier d'instructions que tu charges
(CLAUDE.md / AGENTS.md, etc.), adaptées à la configuration de ce dépôt.
- Ne jamais committer de secrets, de .env ou d'identifiants
- Ne jamais push / force-push sauf instruction explicite
- Valider les entrées à la frontière / ne jamais assouplir de toi-même l'authentification ou l'autorisation
- Ne jamais exécuter de commandes destructrices (DROP / TRUNCATE / migrate:fresh, etc.) sur la base de production
- Chaque fois que tu changes le comportement, toujours ajouter ou mettre à jour les tests
Si des règles similaires existent déjà, ne les duplique pas ; comble seulement ce qui manque.
Pourquoi ça marche :Les accidents se concentrent autour des « secrets divulgués, push non sollicités, opérations destructrices sur la BDD ». Les ajouter comme règles absolues nommées empêche l'IA de dérailler dès le point d'entrée.
Convertir CLAUDE.md au format AGENTS.md (Codex)
Recréez le même contenu pour Codex. Pour celles et ceux qui utilisent plusieurs outils IA ensemble.
Convertis le contenu de ce `CLAUDE.md` au format `AGENTS.md` pour
OpenAI Codex et écris-le.
- Conserve le sens, mais remets-le en forme dans une structure facile à lire
pour Codex (titres, puces)
- Conserve telles quelles les commandes, les règles absolues et la définition de terminé
- Produis-le sous le nom `AGENTS.md` à la racine
Pourquoi ça marche :CLAUDE.md et AGENTS.md partagent la quasi-totalité de leur contenu. Traiter l'un comme la source de vérité et convertir à partir de lui réduit l'effort de maintenir deux fichiers.
Convertir au format Cursor Rules (.mdc)
Vers le format Project Rules de Cursor. Produit séparément les règles toujours appliquées et les règles limitées à un type de fichier.
Convertis le contenu de ce `CLAUDE.md` au format Project Rules de Cursor
(fichiers `.mdc` sous `.cursor/rules/`).
- Découpe les règles en unités significatives
- Sépare les règles qui doivent toujours s'appliquer de celles qui ne s'appliquent
qu'à des types de fichiers spécifiques
- Définis les conditions d'application appropriées (globs, etc.) en tête de chaque fichier
Pourquoi ça marche :Cursor fonctionne mieux avec des fichiers .mdc découpés par finalité qu'avec une seule grande feuille de règles. Laisser les décisions de découpage à l'IA est aussi plus rapide.
Générer des fichiers d'instructions découpés pour un monorepo
Distribue automatiquement les règles communes à la racine et les règles spécifiques à la stack dans chaque paquet.
Inspecte la structure de ce monorepo et crée les fichiers d'instructions que toi
(cet agent) charges (Claude Code utilise CLAUDE.md, Codex utilise AGENTS.md, etc.),
découpés comme suit.
- À la racine : les règles communes à tout le dépôt
(conventions de commit, protection des secrets, la définition de terminé globale)
- Dans chaque répertoire de paquet/application : seulement les règles et les commandes spécifiques à cette stack
Évite la duplication, et ajoute dans chaque paquet une note d'une ligne disant « suivre les
règles communes à la racine ». À la fin, rends compte sous forme de liste de ce que tu as placé dans quel répertoire.
Pourquoi ça marche :Un monorepo s'effondre sous un fichier d'instructions unique et géant. Découper les règles communes à la racine et les règles spécifiques dans chaque paquet permet à l'IA de lire les bonnes règles selon le contexte où elle se trouve.
Fichiers prêts à coller - Bases et règles
Base universelle (pour tout projet)
Votre premier fichier. Une configuration minimale avec présentation du projet, commandes, conventions et règles absolues. En cas de doute, partez de là et ajoutez ou retirez.
# Projet : <name>
## Qu'est-ce que c'est
Une présentation de l'application en un paragraphe. Ce qu'elle fait, qui l'utilise, et la
stack technique (langage, framework, BDD, runtime).
## Commandes
- Serveur de dev : `npm run dev`
- Build : `npm run build`
- Test : `npm test`
- Lint : `npm run lint`
## Conventions
- Le langage est TypeScript (strict). Ne pas utiliser `any`.
- Respecter le style du fichier en cours d'édition. Toujours passer le Lint avant de terminer.
- Garder les changements minimes ; ne pas toucher aux lignes sans rapport (pas de reformatage sans rapport).
## Règles absolues (strictement appliquées)
- Avant de signaler terminé, toujours exécuter les tests et le Lint ci-dessus et les faire passer.
- Ne jamais, au grand jamais, committer de secrets, de .env ou d'artefacts de build.
- Préférer la modification de fichiers existants à la création de nouveaux.
- Quand les exigences sont vagues, poser exactement une question de clarification avant un changement important.
## Hors limites (sauf instruction contraire)
- Configuration CI, versions des dépendances, configuration de l'infrastructure.
Pourquoi ça marche :Placer « Commandes » en premier donne à l'IA un moyen de vérifier son travail. Écrire les règles absolues sous forme d'impératifs courts (toujours / jamais) les rend plus difficiles à ignorer. La section « hors limites » bloque d'emblée les changements incontrôlés.
Bloc « définition de terminé » qui fait respecter les règles★
Le plus important. Empêche l'IA d'abandonner alors qu'elle croit seulement avoir terminé. Un bloc générique à coller dans n'importe quel fichier d'instructions.
## Définition de terminé (toujours lire avant de rendre compte)
Considère le travail comme « terminé » uniquement quand tout ce qui suit est satisfait :
1. `npm run lint` passe avec le code de sortie 0
2. `npm test` passe avec le code de sortie 0
3. Aucun TODO / FIXME / log de débogage n'est laissé dans les fichiers modifiés
4. Tu as relu ton propre diff et confirmé qu'il correspond à la demande
Si ne serait-ce qu'un point n'est pas satisfait, continue le travail. Ne signale pas « terminé ».
## Règles absolues (strictement appliquées)
- Ne pas éditer les fichiers sous `legacy/` ou `vendor/`.
- Ne pas ajouter, retirer ni mettre à jour de dépendances.
- Ne pas reformater des lignes que tu n'as pas modifiées.
- Ne pas supprimer ni désactiver des tests juste pour faire passer le build.
## En cas de doute
Ne pas avancer sur des suppositions ; poser exactement une question concise.
Un changement important et erroné est bien pire qu'une question de clarification.
Pourquoi ça marche :Quand les « critères d'achèvement » sont vagues, l'IA s'arrête par autosatisfaction. En faire une liste de contrôle et préciser « si ce n'est pas satisfait, continue ; ne dis pas terminé » met en route la boucle d'autovérification. Nommer les interdictions jusqu'au chemin fonctionne.
Version minimale (juste quelques lignes)
Pour les projets qui n'aiment pas les longs fichiers d'instructions. Le noyau minimal qui réduit pourtant nettement le taux d'accidents.
# <name>
- Stack : <ex. Next.js + TypeScript + PostgreSQL>
- Toujours exécuter avant de terminer : `npm run lint` et `npm test` (les deux doivent passer)
- Respecter le style existant. Ne pas reformater les lignes sans rapport.
- Ne pas committer de secrets ni de .env. Ne pas push avant d'en recevoir l'instruction.
- En cas d'imprécision, ne pas deviner ; poser exactement une question.
Pourquoi ça marche :Plus long ne veut pas dire meilleur pour un fichier d'instructions. Le réduire au seul noyau que vous voulez faire appliquer (vérification, retenue sur le reformatage, protection des secrets, pas de push, poser des questions) permet à l'IA de le retenir jusqu'au bout.
Fichiers prêts à coller - Par langage et framework
Next.js / TypeScript
Suppose l'App Router. Fixe pour l'IA la frontière Server/Client et le style de récupération des données.
# Next.js (App Router) + TypeScript
## Stack
Next.js (App Router), TypeScript strict, Tailwind CSS, <your-ORM>
## Commandes
- Dev : `npm run dev`
- Build : `npm run build` # doit passer sans erreur de type
- Lint : `npm run lint`
- Test : `npm test`
## Règles d'architecture
- Par défaut, des Server Components. N'ajouter "use client" que lorsque l'état, les effets ou
les API du navigateur sont nécessaires. Garder les Client Components petits et aux feuilles.
- Récupérer les données dans les Server Components ou les Route Handlers.
Ne pas récupérer les données initiales dans useEffect.
- Co-localiser les composants avec leur segment de route. L'UI partagée va dans `components/`.
- Toujours valider par schéma les entrées externes à la frontière (ex. Zod).
## Conventions
- Pas de `any`. Donner des types de retour explicites aux fonctions publiques.
- Utiliser les design tokens / classes Tailwind existants. Ne pas ajouter de couleurs de toi-même.
- Garder `page.tsx` mince ; pousser la logique dans des fonctions et des composants.
## Définition de terminé
`npm run build`, `npm run lint` et `npm test` passent tous avec le code de sortie 0.
Pas de `any`, pas d'exports inutilisés, aucun console.log oublié.
Pourquoi ça marche :Next.js est l'exemple type où l'IA se trompe sur la « décision Server vs Client ». Énoncer « par défaut Server, garder use client au minimum » réduit considérablement les accidents.
React (Vite) SPA
Pour les SPA basées sur Vite. Fixe l'approche de gestion de l'état et de conception des composants.
# React (Vite) + TypeScript
## Commandes
- Dev : `npm run dev`
- Build : `npm run build`
- Lint : `npm run lint`
- Test : `npm test` (Vitest + Testing Library)
## Règles
- Composants fonctionnels et Hooks uniquement. Ne pas utiliser de composants de classe.
- Garder l'état au minimum, dans l'ordre « local -> Context -> bibliothèque d'état ».
Ne pas remonter l'état au niveau global inutilement.
- Confiner les effets de bord à useEffect, et écrire correctement le tableau de dépendances.
- Séparer l'UI de la logique. Regrouper la récupération des données dans des hooks dédiés (useXxx).
- Accessibilité : donner aux éléments interactifs des rôles et un fonctionnement clavier appropriés.
## Conventions
- Pas de `any`. Définir les props avec des types.
- Respecter le style des composants et styles existants.
## Définition de terminé
`npm run build`, `npm run lint` et `npm test` passent avec le code de sortie 0.
Pourquoi ça marche :En React, les accidents classiques sont « remonter l'état au global trop tôt » et « mauvaises dépendances de useEffect ». Énoncer l'ordre de remontée et la règle du tableau de dépendances assure la stabilité.
API Node.js (Express / Hono)
Pour les API backend. Pose des garde-fous pour la validation, la gestion des erreurs et la gestion des secrets.
# API Node.js (Express / Hono) + TypeScript
## Commandes
- Dev : `npm run dev`
- Build : `npm run build`
- Test : `npm test`
- Lint : `npm run lint`
## Règles
- Valider par schéma toutes les entrées (body, query, params, headers) à la frontière.
- Ne pas avaler les erreurs. Les renvoyer typées via un gestionnaire d'erreurs central.
- Lire les secrets depuis les variables d'environnement. Ne pas les coder en dur dans le code.
- Stratifier l'accès à la BDD (route -> service -> repository).
- Renvoyer une forme JSON cohérente (unifier la forme du succès et de l'échec).
## Règles absolues
- Ne pas contourner ni assouplir de toi-même la logique d'authentification / autorisation.
- Toujours vérifier l'autorisation en ajoutant un endpoint exposé publiquement.
- Ne pas logger d'informations personnelles, de jetons ni de mots de passe.
## Définition de terminé
`npm test` (cas nominal + cas d'erreur) et `npm run lint` passent.
Pourquoi ça marche :Pour les API, les trois grandes causes d'accident sont « entrées non validées », « erreurs avalées » et « secrets dans les logs ». Faire de la validation à la frontière et de la vérification d'autorisation des règles absolues les rend plus susceptibles d'être respectées.
Laravel / PHP
Habitue l'IA à un framework qui privilégie les conventions : Eloquent, migrations et conventions.
# Laravel + PHP
## Commandes
- Serveur : `php artisan serve`
- Migrer : `php artisan migrate`
- Test : `php artisan test`
- Format : `./vendor/bin/pint` # exécuter avant de terminer
## Conventions (suivre la manière Laravel)
- Utiliser les relations Eloquent. Éviter le SQL brut sans raison claire.
- Valider les entrées dans des classes Form Request. Ne pas le faire dans les contrôleurs.
- Garder les contrôleurs minces. Pousser la logique métier vers des Services / Actions.
- Chaque changement de schéma reçoit une nouvelle migration. Ne pas éditer celles déjà exécutées.
- Utiliser les routes nommées et le route model binding.
## Règles absolues
- Ne jamais, au grand jamais, committer `.env` ou de vrais identifiants.
- Ne pas exécuter de commandes destructrices comme `migrate:fresh` sur la base de production.
- Chaque fois que tu changes le comportement, toujours ajouter ou mettre à jour les tests (`php artisan test`).
## Définition de terminé
`php artisan test` et `./vendor/bin/pint --test` passent tous les deux.
Pourquoi ça marche :Pour un framework « qui privilégie les conventions », énoncer « suivre les conventions du framework » et interdire les commandes destructrices est le bon réflexe. Interdire l'édition des migrations déjà exécutées compte aussi.
Python / analyse de données
Met l'accent sur les types, les environnements virtuels et la reproductibilité. Place en premier les règles « ne pas casser ni fabriquer les données ».
# Python / analyse de données
## Environnement
- Utiliser le venv du projet `.venv`. Ne pas installer globalement.
- Installation : `pip install -r requirements.txt`
- Exécution : `python -m src.main`
- Test : `pytest`
- Format : `ruff check .` et `ruff format .`
## Conventions
- Ajouter des annotations de type à chaque signature de fonction. Exécuter `mypy src` si configuré.
- Ne pas mettre de logique dans les notebooks. Le code réutilisable va dans `src/`.
- Fixer la graine (seed) pour tout ce qui utilise de l'aléatoire, afin que les résultats soient reproductibles.
## Règles absolues sur les données (les plus importantes)
- Ne pas combler ni fabriquer silencieusement les valeurs manquantes. S'il y a des valeurs
manquantes, les signaler et confirmer comment les traiter.
- Ne pas écraser les fichiers de données brutes. Écrire la sortie dans `data/processed/`.
- Documenter toutes les hypothèses (filtres, lignes exclues, unités) dans les commentaires du code.
## Définition de terminé
`pytest` passe, `ruff check .` est propre, et les résultats se reproduisent depuis un état propre.
Pourquoi ça marche :En analyse, les plus grosses erreurs de l'IA sont « combler silencieusement les valeurs manquantes » et « écraser les données brutes ». Interdire explicitement cela rend les résultats bien plus dignes de confiance.
Go
Amène l'IA à suivre la manière Go, qui valorise la simplicité et la gestion explicite des erreurs.
# Go
## Commandes
- Build : `go build ./...`
- Test : `go test ./...`
- Format : `gofmt -w .` et `go vet ./...`
## Conventions
- Ne pas avaler les erreurs. Toujours les gérer avec `if err != nil`, et les renvoyer
avec du contexte (`fmt.Errorf("...: %w", err)`).
- Garder l'imbrication peu profonde grâce aux retours anticipés.
- N'utiliser la concurrence que lorsque c'est nécessaire. Surveiller les fuites de goroutine et les races
(faire passer `go test -race`).
- Commenter les symboles exportés. Préférer la bibliothèque standard.
## Règles absolues
- Ne pas ajouter d'abstractions ou d'interfaces inutiles (les créer quand le besoin survient).
- Avant d'ajouter une dépendance, vérifier d'abord si la bibliothèque standard suffit.
## Définition de terminé
`go build ./...`, `go vet ./...` et `go test -race ./...` passent tous.
Pourquoi ça marche :En Go, la « sur-abstraction » et les « erreurs avalées » sont les sources d'accidents. Énoncer les retours anticipés, le wrapping %w et -race produit un code Go sûr et idiomatique.
Rust
Prévient l'usage abusif de unwrap et unsafe, et fait gérer correctement Result/Option.
# Rust
## Commandes
- Build : `cargo build`
- Test : `cargo test`
- Lint : `cargo clippy -- -D warnings`
- Format : `cargo fmt`
## Conventions
- Ne pas utiliser à la légère `unwrap()` / `expect()` dans le code de production.
Gérer `Result` / `Option` correctement avec `?` ou match.
- `unsafe` est interdit par principe. Si c'est vraiment nécessaire, en indiquer la raison dans un commentaire.
- Suivre le compilateur sur l'emprunt et les durées de vie. Repenser la conception avant
de s'échapper avec `clone()`.
- Rendre les types d'erreur significatifs avec `thiserror` / `anyhow`, etc.
## Définition de terminé
`cargo build` et `cargo test` passent, et
`cargo clippy -- -D warnings` ne signale aucun avertissement.
Pourquoi ça marche :En Rust, quand l'IA est bloquée, elle a tendance à s'échapper avec `unwrap()` et `clone()`. Décourager ces pratiques et faire passer clippy avec -D warnings préserve la qualité.
Ruby on Rails
Gardez-le « sur les rails ». Évitez les modèles/contrôleurs surchargés et suivez les conventions.
# Ruby on Rails
## Commandes
- Serveur : `bin/rails server`
- Migrer : `bin/rails db:migrate`
- Test : `bin/rails test` (ou `bundle exec rspec`)
- Format : `bundle exec rubocop -A`
## Conventions (suivre la manière Rails)
- Respecter « la convention plutôt que la configuration » ; ne pas inventer sa propre structure.
- Éviter les contrôleurs / modèles surchargés. Pousser la logique dans des Services / Concerns.
- Restreindre les entrées avec les strong parameters.
- Éviter les N+1 (utiliser `includes`).
- Les changements de schéma reçoivent une nouvelle migration. Ne pas éditer celles déjà exécutées.
## Règles absolues
- Ne jamais, au grand jamais, committer `.env` ou des identifiants.
- Ne pas exécuter de commandes destructrices sur la base de production.
- Quand tu changes le comportement, ajouter ou mettre à jour les tests.
## Définition de terminé
Les tests et `bundle exec rubocop` passent.
Pourquoi ça marche :Rails devient vite impossible à maintenir dès qu'on s'écarte des conventions. Énoncer « rester sur les rails », « éviter la surcharge » et « éviter les N+1 » préserve les idiomes Rails.
SQL / migrations de BDD
Ne cassez pas les données ; seulement des changements réversibles. Garde-fous de sécurité pour les migrations.
# SQL / migrations de base de données
## Règles absolues (la protection des données passe en premier)
- Ne pas exécuter de toi-même d'opérations destructrices sur les données de production
(DROP / TRUNCATE / DELETE ou UPDATE sans condition).
- Les migrations doivent fournir une procédure de rollback, pas seulement le sens avant.
- Ne pas éditer les migrations déjà exécutées. Toujours en ajouter de nouvelles.
- Supprimer ou renommer les colonnes par étapes (« ajouter -> migrer -> retirer ») ; ne pas le faire d'un seul coup.
## Conventions de requête
- Éviter `SELECT *` ; spécifier les colonnes nécessaires.
- Vérifier que les conditions WHERE / JOIN peuvent utiliser un index.
- Découper les grosses mises à jour en lots pour garder le temps de verrou court.
- Pour les requêtes de vérification destructrices, confirmer d'abord le nombre de lignes concernées avec un `SELECT` avant d'exécuter.
## Définition de terminé
L'application et le rollback réussissent tous deux dans un environnement équivalent à la
préproduction, et tu as confirmé l'absence de changements non voulus sur les données existantes.
Pourquoi ça marche :La BDD est le domaine le plus « irréversible » de tous. Énoncer une interdiction des opérations destructrices, des changements de schéma par étapes et des rollbacks obligatoires est la bouée de sauvetage.
Fichiers prêts à coller - Par flux de travail
Développement piloté par les tests (TDD)
Impose « ne pas remettre les tests à plus tard » et « ne pas faire passer en supprimant des tests ».
# Approche pilotée par les tests
En changeant le comportement, suivre cette boucle à chaque fois :
1. Écrire d'abord un « test qui échoue » exprimant le comportement souhaité.
2. Exécuter le test et confirmer qu'il échoue pour la bonne raison.
3. Écrire le minimum de code nécessaire pour faire passer le test.
4. Exécuter toute la suite de tests et confirmer que tout est vert.
5. Refactoriser en restant au vert.
## Règles absolues
- Ne pas supprimer ni ignorer des tests pour faire passer la suite.
- Ne pas affaiblir les assertions pour passer au vert.
- Si un test est vraiment faux, expliquer pourquoi avant de le modifier.
- Du code nouveau sans tests n'est pas « terminé ».
## Définition de terminé
Toute la suite passe, la couverture n'a pas baissé, et revenir en arrière sur
l'implémentation fait échouer le nouveau test (c'est-à-dire que c'est un test significatif).
Pourquoi ça marche :Quand elle est bloquée, l'IA supprime parfois des tests et dit « c'est passé ». Écrire « ne pas supprimer, ne pas affaiblir, confirmer l'échec après revert » ferme les échappatoires.
Axé sur le débogage
Prévient les corrections au petit bonheur. Impose la discipline d'identifier la cause racine puis une correction minimale.
# Approche de débogage
Procéder dans cet ordre. Ne pas corriger en devinant :
1. Établir les étapes de reproduction (comment déclencher le bug).
2. Écrire le comportement attendu et le comportement réel, une phrase chacun.
3. Formuler une hypothèse. La vérifier avec des logs ou une repro minimale avant de corriger.
4. Une fois la cause identifiée, appliquer la correction minimale.
5. Après correction, confirmer que le bug a disparu via les étapes de repro et que les tests existants passent.
6. Si possible, ajouter un test de régression qui capture ce bug.
## Règles absolues
- Ne pas changer plusieurs endroits à la fois tant que la cause est inconnue.
- Ne pas s'arrêter à « ça marche pour l'instant ». Expliquer pourquoi c'est corrigé.
- Ne pas mêler de refactorisation sans rapport au débogage.
Pourquoi ça marche :Bloquée sur un bug, l'IA a tendance à réécrire plusieurs endroits à la fois et à empirer les choses. Imposer l'ordre « reproduire -> émettre une hypothèse -> vérifier -> correction minimale -> test de régression » le corrige de façon fiable.
Axé sur la refactorisation
Fait de « ne pas changer le comportement » la condition absolue. Amélioration sûre garantie par des tests au vert.
# Approche de refactorisation
## Principe fondamental
Ne pas changer le comportement observable de l'extérieur. Ne pas changer les sorties ni les
effets de bord pour aucune entrée.
## Étapes
1. Confirmer d'abord que des tests existent pour la zone visée et qu'ils sont verts.
Sinon, écrire d'abord des tests de caractérisation qui fixent le comportement actuel.
2. Changer par petites étapes uniques, en exécutant les tests après chaque étape.
3. Garder un commit = un type d'amélioration.
## Règles absolues
- Ne pas mêler ajouts de fonctionnalités ou corrections de bugs à la refactorisation (en faire un travail séparé).
- Si un test passe au rouge, s'arrêter sur-le-champ. Ne pas continuer.
- Ne pas changer de toi-même les signatures d'API publiques (confirmer d'abord si nécessaire).
## Définition de terminé
Tous les tests restent verts, et le code est plus lisible avec moins de duplication.
Pourquoi ça marche :Pour la refactorisation, « ne pas changer le comportement » est primordial. Sans en faire le principe fondamental ni l'adosser à des tests verts, l'IA cassera allègrement des fonctionnalités. Interdire d'y mêler des ajouts de fonctionnalités compte aussi.
Rédaction de specs / documents de conception
Ne le laissez pas implémenter tout de suite ; faites-lui d'abord rédiger la conception en prose. Réduit drastiquement les retours en arrière.
# Comment rédiger un document de conception
Avant d'implémenter, rédige d'abord ce qui suit en prose (ne pas écrire de code) :
## 1. Objectif
Le problème à résoudre, et les conditions permettant de le considérer atteint (critères de réussite).
## 2. État actuel et contraintes
La configuration existante, les dépendances et les contraintes à respecter (performance, compatibilité, échéance).
## 3. Proposition de conception
- L'approche choisie, et les approches envisagées puis rejetées (et pourquoi).
- Le flux de données, les interfaces clés et les fichiers à modifier.
## 4. Risques et questions ouvertes
Ce qui pourrait casser, les hypothèses à confirmer et les points nécessitant une décision.
## 5. Plan
Découper l'implémentation en petites étapes, ordonnées en unités vérifiables.
## Règles
- Ne pas commencer à implémenter tant que cette conception n'est pas approuvée.
- Lister les inconnues sous « questions ouvertes » ; ne pas les combler par tes propres hypothèses.
Pourquoi ça marche :L'IA se jette tout de suite sur l'implémentation et produit en masse de mauvaises orientations. Le simple fait d'insérer « rédiger d'abord la conception, ne pas implémenter avant approbation » réduit drastiquement les retours en arrière.
Échelonner les changements importants
Prévient un changement géant en une fois. Le fait découper en petites unités revisibles.
# Comment réaliser des changements importants
## Principe fondamental
Éviter un changement géant. Le découper pour que chaque étape soit indépendamment revisible,
testable et (idéalement) déployable.
## Étapes
1. Décomposer les changements menant à la forme finale en une séquence de petites étapes
indépendantes, et la présenter.
2. Pour chaque étape, écrire « quoi / pourquoi / portée de l'impact » en 1-2 lignes.
3. Après chaque étape, exécuter toute la suite de tests et confirmer le vert avant de continuer.
4. Avancer en préservant la rétrocompatibilité (ajouter -> migrer -> retirer l'ancien chemin).
## Règles absolues
- Ne pas réécrire une large zone en une fois et « tout tester ensemble plus tard ».
- Si une étape devient trop importante, la découper davantage.
- Garder chaque étape à une granularité réversible.
## Définition de terminé
Les tests sont verts une fois toutes les étapes terminées, et chaque commit intermédiaire n'est pas cassé non plus.
Pourquoi ça marche :L'IA a tendance à faire les grandes refontes en « tout réécrire d'un coup », et quand ça casse, isoler la cause devient impossible. Découper en étapes et imposer le vert à chacune permet de faire de grandes refontes en toute sécurité.
Fichiers prêts à coller - Exploitation et gouvernance
Spécialisé revue de code
Prévient un déluge de remarques triviales ; le fait rendre compte par ordre de gravité. Fixe les critères de revue.
# Instructions de revue de code
Passe en revue les changements, regroupe-les par gravité, et rends compte dans cet ordre :
1. CRITICAL - failles de sécurité, perte de données, plantages, authentification cassée
2. HIGH - bugs de logique, conditions de course, gestion d'erreurs manquante
3. MEDIUM - problèmes de performance, tests manquants, nommage déroutant
4. LOW - remarques de style mineures (seulement s'il n'y a aucun problème de niveau supérieur)
## Comment rendre compte
- Pour chaque constat : fichier:ligne / ce qui ne va pas / pourquoi c'est important / une correction concrète.
- Ne citer que le plus petit extrait pertinent. Ne pas coller le fichier entier.
- Si un changement est correct, le dire explicitement. Ne pas fabriquer de problèmes.
## Choses à ne pas faire
- Ne pas enterrer de vrais bugs sous une pile de remarques LOW.
- Ne pas réécrire des fichiers entiers. Proposer le plus petit diff.
- Sauf préjudice réel, ne pas signaler de lignes hors de la portée du diff.
## Sortie
Terminer par un verdict en une ligne : APPROVE / REQUEST CHANGES / BLOCK, avec une raison.
Pourquoi ça marche :Livrée à elle-même, une IA de revue produit en masse des remarques triviales. Spécifier l'ordre de gravité, plus « dis-le s'il n'y a pas de problème » et « ne fabrique pas », supprime le bruit et la rend utilisable.
Règles d'exploitation des commits / PR
Prévient les push non sollicités, les commits géants et les secrets divulgués. Garde-fous de sécurité pour les opérations Git.
# Règles Git / PR
## Commits
- Utiliser Conventional Commits : `type(scope): résumé`
type : feat, fix, refactor, test, docs, chore.
- Un commit = un changement logique. Le garder petit et revisible.
- Dans le corps, écrire le « pourquoi » plutôt que le « quoi ».
## Règles absolues
- Ne pas faire `git push` sauf instruction explicite.
- Ne pas force-push, rebase ni amend sur les branches partagées / main.
- Ne pas committer de secrets, de .env, d'identifiants ni de gros binaires.
- Ajouter les fichiers par nom. Ne pas tout balayer avec `git add -A`.
## Pull requests
- Titre en 70 caractères maximum. Le corps est « Résumé » + « Plan de test (liste de contrôle) ».
- Signaler tout changement cassant.
- Ne pas merger. Créer la PR et rendre compte de l'URL.
Pourquoi ça marche :Les opérations Git sont sujettes aux « accidents irréversibles ». Nommer et interdire les push, les force-push et les fuites de secrets avec « ne jamais faire X » est ce qui fonctionne.
Spécialisé revue de sécurité
Le fait balayer les vulnérabilités par catégorie. Privilégie l'évitement des oublis aux faux positifs.
# Instructions de revue de sécurité
Vérifie les changements dans l'ordre selon les angles suivants, et rends compte de tout
problème trouvé avec une note de gravité :
- Validation des entrées manquante (injection : SQL / commande / XSS / SSRF)
- Lacunes d'authentification/autorisation (vérifications de permission manquantes, élévation de privilèges)
- Exposition de secrets (clés/jetons codés en dur, sortie dans les logs)
- Réglages par défaut non sûrs (exposition excessive, CORS laxiste, redirections non validées)
- Vulnérabilités connues dans les dépendances, usage de crypto / RNG non sûr
## Comment rendre compte
- Pour chaque constat : emplacement / scénario d'attaque (comment cela pourrait être exploité) / une correction concrète.
- Signaler les soupçons dont tu n'es pas certain comme « à confirmer » (ne pas les ignorer silencieusement).
- S'il n'y a pas de problème, indiquer « aucun problème » ainsi que les angles que tu as vérifiés.
## Choses à ne pas faire
- Ne pas générer de code d'attaque réel ni d'étapes d'exploitation (montrer uniquement les corrections).
Pourquoi ça marche :En sécurité, un « oubli » coûte le plus cher. Lister les angles et dire « signaler les soupçons comme à confirmer » empêche le comportement consistant à rester silencieux par peur des faux positifs.
Garde-fous Docker / infrastructure
Prévient les accidents irréversibles dans les opérations sur les conteneurs et l'infrastructure.
# Règles de travail Docker / infrastructure
## Règles absolues (prévenir la destruction passe en premier)
- Ne pas exécuter de toi-même de commandes destructrices sur les environnements de production ou partagés
(`docker system prune`, suppression de volumes, `down -v`, etc.).
- Épingler les images à des tags fixes. Ne pas dépendre de `latest`.
- Passer les secrets via les variables d'environnement / la gestion des secrets.
Ne pas les graver dans le Dockerfile ou l'image.
- Garder les ports exposés et les privilèges (privileged, etc.) au minimum nécessaire.
## Conventions
- Garder les Dockerfiles petits avec des builds multi-étapes, en tenant compte du cache de couches.
- Tourner en utilisateur non-root.
- Après modifications, builder et démarrer en local pour vérifier avant de rendre compte.
## Définition de terminé
`docker build` passe, le conteneur démarre, et le health check / le fonctionnement de base
peut être confirmé.
Pourquoi ça marche :L'infrastructure est un domaine où l'on peut détruire un environnement d'un seul coup. Énoncer une interdiction des commandes destructrices, éviter la dépendance à latest et ne pas graver les secrets forme les garde-fous de sécurité.
Règles de mise à jour des dépendances
Prévient les ajouts de dépendances et les mises à jour majeures non autorisés. Resserre le point d'entrée de la chaîne d'approvisionnement.
# Règles sur les dépendances
## Règles absolues
- Avant d'ajouter une dépendance, vérifier si la bibliothèque standard ou une dépendance
existante suffit.
- En ajoutant une nouvelle dépendance, ajouter une note d'une ligne sur son but, ses alternatives
et son état de maintenance.
- Ne pas monter de versions majeures de toi-même (seulement sur instruction).
- Ne pas régénérer les fichiers de verrouillage (package-lock.json, etc.) de toi-même.
- Éviter les paquets d'origine douteuse ou avec extrêmement peu d'étoiles ou une mauvaise maintenance.
## Étapes
1. Indiquer la raison de l'ajout ou de la mise à jour.
2. Après l'ajout, confirmer que le build et les tests passent.
3. Confirmer que la licence n'entre pas en conflit avec ton cas d'usage.
## Définition de terminé
Le build et les tests passent après le changement de dépendance, et tu peux expliquer le diff dans le fichier de verrouillage.
Pourquoi ça marche :Les ajouts de dépendances négligents et les mises à jour majeures sont le point d'entrée des ruptures de build et des accidents de chaîne d'approvisionnement. « Vérifier d'abord si les existantes suffisent » et « pas de mise à jour majeure non sollicitée » fonctionnent.
Si vous avez l'impression que votre fichier d'instructions « ne fonctionne pas »
Quand l'IA refuse toujours de suivre les règles même après l'ajout d'un modèle, la cause tient souvent à l'emplacement, à la granularité ou à la priorité. Nous expliquons les solutions selon la cause.
Lire : pourquoi l'IA ignore vos règles .md et comment y remédier* Les prompts sont en français ; les commandes et les chemins à l'intérieur des modèles de fichiers restent en anglais (ils dépendent de l'environnement). Dernière mise à jour : 2026-05