Domaine métier en français (modèles, champs, messages, tests) : Inscription, solde_restant, test_une_bourse_ne_sert_qu_une_fois. C'est la langue des utilisateurs et des messages d'erreur affichés.
Termes techniques génériques en anglais acceptés (serializer, queryset, payload).
Messages d'erreur destinés à l'utilisateur : phrase complète en français, qui dit quoi faire (« Le récapitulatif ne peut être clôturé qu'à partir du dernier jour du mois. »).
Composants fonctionnels + hooks ; une page = page.js dans src/app/....
Tout appel réseau passe par src/services/api/services.js.
Formulaires : react-hook-form + yup quand le formulaire dépasse quelques champs.
Libellés d'interface en français, cohérents avec le guide utilisateur (si vous renommez un bouton, mettez à jour docs/guide/).
Pas de alert() pour une erreur serveur : Snackbar + getApiErrorMessage.
npm run lint doit passer sans erreur. Configuration : frontend/eslint.config.mjs (eslint-config-next) ; react/no-unescaped-entities est désactivée (apostrophes françaises) et react-hooks/set-state-in-effect est en avertissement, le temps de migrer les composants concernés : ne pas ajouter de nouveaux avertissements.