Felt Dojo

Felt Dojo: Présentation du projet

Une plateforme d'entraînement au poker développée avec Claude Code. Ce que c'est, comment ça a été construit, et qui a fait quoi.

Traduit de la version anglaise.


En chiffres

Mesuré le 2026-08-23. Ces chiffres sont rafraîchis à la main de temps à autre : à lire comme un instantané récent plutôt que comme un compteur en temps réel ; c'est l'ordre de grandeur qui compte, pas le dernier chiffre.

Début2026-07-19, il y a cinq semaines
Commits827
Code de production~93 600 lignes : 47 100 en Java réparties sur 421 fichiers, 46 400 en TypeScript et React sur 193
Code de test~70 500 lignes réparties sur 308 fichiers
Tests automatisés2 654, tous au vert : 1 753 côté serveur, 901 côté interface
Migrations de base de données32
Documentation rédigée88 documents, ~402 000 mots

Trois de ces lignes disent quelque chose que les autres ne disent pas.

Il y a environ trois quarts de ligne de code de test pour chaque ligne de code de production. Ce rapport est voulu, et c'est lui qui rend vérifiables les affirmations du reste de ce document : le comportement des bots, la conservation des jetons, les paiements de tournoi et la garantie de déterminisme du poker en duplicate sont tous tenus par des tests qu'on a vus échouer avant de leur faire confiance.

Le nombre de tests a environ triplé en onze jours. Le 2026-08-12, le registre historique du projet notait 767 tests côté serveur et 96 côté interface ; le 2026-08-23, on est à 1 753 et 901. L'essentiel n'est pas constitué de nouvelles fonctionnalités ; c'est du comportement existant qu'on verrouille.

La documentation n'est pas un sous-produit. ~402 000 mots, c'est plus que le code lui-même, et elle existe parce que le projet est bâti avec un assistant IA qui commence chaque séance sans rien savoir : les notes d'architecture, le relevé des pièges déjà rencontrés et le raisonnement écrit derrière les décisions sont ce qui empêche de refaire deux fois la même erreur. Environ un tiers de tout ça, ce sont des devis de conception et des post-mortems qu'aucun utilisateur ne lira jamais.


L'outil

Felt Dojo est un endroit pour apprendre le poker en jouant au vrai poker. On y joue de vraies mains : vraies règles, vraies blindes, vrais pots secondaires, contre des bots conçus pour ressembler à de véritables adversaires plutôt qu'à des curseurs de difficulté, et on revoit ensuite ce qui s'est passé. Pas d'argent, pas de dépôt, pas d'inconnus.

À quoi ça sert, et ce que ce n'est pas

La thèse, dans les mots du propriétaire (2026-08-21) : « Mon objectif est de créer un moyen pour les nouveaux joueurs d'apprendre le jeu et d'y entrer de façon encadrée et interactive. Je crée un bac à sable où les gens peuvent jouer au vrai poker, mieux que sur les sites d'argent fictif ou les sites sociaux où les vrais joueurs humains s'en fichent et font n'importe quoi. Je veux permettre aux joueurs d'éviter de déposer de l'argent réel sur un site qu'ils ne connaissent pas et auquel ils ne font peut-être pas confiance, juste pour jouer aux micro-limites avec peu d'occasions d'apprendre. »

C'est ça, le produit. Entre les applications d'argent fictif (gratuites, mais les adversaires partent à tapis à chaque main et le produit tourne autour de l'achat de jetons) et les micro-limites en argent réel (du vrai poker, mais un dépôt sur un site qu'on ne connaît pas, et toujours rien qui enseigne), personne n'occupe la case « du vrai poker, en sécurité, avec une rampe d'accès ». Felt Dojo est construit pour cette case : le débutant complet, le curieux qui veut essayer sans déposer nulle part, le joueur qui revient après des années et veut se dérouiller, et, plus tard, des amis qui veulent une partie maison sans site d'argent réel entre eux.

Ce que ce n'est pas, dit clairement parce que le propriétaire l'a dit clairement : « Je ne peux pas prétendre être un expert du poker et je ne peux pas attendre du coaching par IA ni des bots qu'ils agissent en experts du poker. » Felt Dojo n'apprend à personne à gagner, ne revendique aucune autorité GTO ou de solveur, et n'entre pas en concurrence avec les sites de formation, les coachs ou les solveurs ; c'est l'endroit où l'on pratique ce qu'ils enseignent. Le site montre, compare et répète ; il ne juge pas. Chaque main est enregistrée et rejouable, vos stats et vos tendances sont les vôtres, le poker en duplicate vous compare à un ami sur des cartes identiques, et rien de tout ça ne vous dit ce qui était « correct », parce que rien ici n'a le droit de le faire. On ne peut jamais acheter de jetons, non plus.

Ce qui fonctionne aujourd'hui :

Ce qui est gratuit et ce qui est Plus. Le Hold'em, les parties cash à n'importe quelles blinds, les tournois jusqu'à 200 participants, deux structures de blinds, les adversaires Débutant et Intermédiaire, l'historique et les stats complets, et un vrai match duplicate compté : tout cela est gratuit. Plus ajoute le PLO/PLO5, les adversaires Avancés, les champs jusqu'à 10 000 joueurs, les trois autres structures de blinds, les tournois à bounty, les structures de blinds et de gains personnalisées, le mode étude qui révèle toutes les cartes, et les matchs duplicate plus longs et plus grands. Les paliers payants ne sont pas encore actifs ; la plomberie des droits l'est, et seul le compte opérateur en dispose.

Les bots, qui rendent le bac à sable réel

Un bac à sable ne vaut la peine qu'on s'y entraîne que si les adversaires se comportent comme des personnes. N'importe qui peut écrire un bot de poker qui couche sous un certain seuil. Le difficile, c'est des bots qui donnent l'impression d'être des personnes : des types de joueurs reconnaissables, mauvais de façon crédible, et qui deviennent réellement meilleurs à mesure qu'on monte les niveaux. L'affirmation, c'est crédibles, jamais bons : personne ne les a mesurés contre une vraie population à une vraie limite, et ces documents ne prétendent pas le contraire.

Les niveaux sont mesurés, pas affirmés. Un banc d'essai dédié joue des milliers de mains sans interface et rapporte les statistiques de chaque niveau face à des profils de joueurs réels, ainsi que les taux de gain en tête-à-tête, en grosses blinds par 100 mains, avec intervalles de confiance. La variance est maîtrisée par la donne en duplicate (les mêmes donnes jouées des deux côtés), de sorte que les comparaisons se résolvent sur un nombre de mains réaliste.

Le détail complet, y compris les faiblesses restantes de chaque niveau, est dans la présentation des bots.

La technologie

Back-end : Java 21, Spring Boot 4, PostgreSQL avec migrations Flyway, authentification JWT avec hachage argon2id, WebSockets pour l'état des tables en direct, Redis, Maven.

Front-end : React avec TypeScript, Vite, Vitest.

Infrastructure : Docker Compose sur une machine Hetzner derrière Caddy, intégration continue GitHub Actions qui exécute les deux suites de tests à chaque poussée, plus un travail sur un vrai PostgreSQL et un travail de comparaison au fichier de référence du comportement des bots ; sauvegardes nocturnes automatiques de la base avec copie hors site ; courriels transactionnels via Resend ; et suivi des erreurs via Sentry (délibérément sans rejeu de session, qui enverrait à un tiers l'enregistrement des cartes privatives d'un joueur). Les métriques d'engagement sont un agrégat nocturne plutôt qu'une requête en direct, précisément pour que les chiffres restent vrais une fois que la purge de l'historique commencera à supprimer les mains derrière eux.

Couverture de tests : 1 672 tests back-end et 642 tests front-end, tous au vert. Cela inclut des tests de propriétés, une vérification croisée de l'évaluateur de mains contre une implémentation indépendante, un test de fuzzing du moteur, un tournoi de 10 000 participants exécuté sans interface, des vecteurs de référence versionnés qui figent l'encodage de l'aléatoire du duplicate, et un travail d'intégration continue sur un vrai PostgreSQL pour la poignée de tests où le dialecte de la base est justement ce qui est testé.

Comment on a travaillé

De façon conversationnelle, dans Claude Code, sur de nombreuses sessions. Pas « génère-moi une application » : une véritable collaboration, avec un partage des rôles clair.

Ce que Marc a apporté :

Ce que Claude a apporté :

Ce que ce partage a réellement produit

Le motif intéressant, c'est la fréquence à laquelle les deux moitiés ont attrapé des choses différentes.

Les tests ont attrapé ce que les tests font bien. Quand une correction du jeu postflop du Débutant a été écrite, elle désactivait aussi la retenue au bluff multiway dans deux niveaux ; la suite existante l'a vu en quelques secondes. Quand la mémoire des bots a été rendue réellement adaptative, deux tests sont passés au rouge ; enquêter plutôt que les ajuster a montré que les bots s'étaient mis à relancer là où ils suivaient, ce qui était une amélioration que les tests comptaient comme une régression.

Les tests de jeu ont attrapé ce que les tests ne peuvent structurellement pas voir. Aucun test unitaire ne sait qu'un bot qui couche des rois a l'air absurde, qu'une table paraît trop lente entre les mains, ou qu'un panneau de débogage ment discrètement. Il fallait quelqu'un qui joue au poker pour s'asseoir et jouer.

Et la catégorie de défaut la plus coûteuse était invisible pour les deux. Le poker en duplicate a livré neuf jalons avec les deux moitiés de l'enregistrement des mains construites, tous les tests au vert, et rien qui les relie : le côté écriture et le côté lecture ont été bâtis dans des jalons différents et personne ne possédait la jointure. Chaque test était satisfait par sa propre moitié : les tests de verrouillage écrivaient leurs données de test à la main et prouvaient sincèrement que le verrou tenait, sur des lignes que rien en production ne produisait. C'est apparu quand Marc a ouvert la page de résultats et trouvé un panneau vide. La règle qui en est sortie est maintenant écrite : pour toute paire « A écrit / B lit » construite dans des jalons distincts, un test doit exécuter A pour de vrai et vérifier ce que B renvoie réellement.

La même forme est réapparue dans le navigateur. Un visiteur qui revenait continuait de recevoir la version précédente, parce que les fichiers statiques étaient servis sans aucun en-tête de cache et que les navigateurs se rabattent alors sur des suppositions, donc chaque correction du front-end atteignait les nouveaux visiteurs et personne d'autre, silencieusement, pendant des jours. Rien ne signale ça : le déploiement réussit, les fichiers sur le disque sont corrects, et curl montre la nouvelle version parce que curl n'a pas de cache.

Où ça en est

La plateforme est en ligne sur feltdojo.com et fonctionne de bout en bout : s'inscrire ou jouer en invité, s'asseoir à une table cash, lancer un tournoi jusqu'à dix mille joueurs, défier un ami sur une série de mains identique, et revoir chaque main ensuite. 1 672 tests back-end et 642 tests front-end passent.

La capacité est mesurée plutôt qu'estimée. En montée en charge sur la machine de production, aucune limite fonctionnelle n'est apparue jusqu'à environ 150 joueurs simultanés ; le plafond configuré est de 40 par choix, pas par limite, pour garder de la marge aux tournois, aux sauvegardes et aux déploiements. Les grands tournois coûtent peu parce que seule la table où un humain est assis joue de vraies mains ; le reste du champ est simulé contre la vraie structure de blinds, ce qui fait qu'un tournoi de 10 000 participants se résout en six secondes environ plutôt que jamais. Cette mesure a corrigé deux croyances tenues avec assurance et fausses : que le niveau de bot le plus fort était le plus coûteux à faire tourner (c'est le moins cher, parce qu'il couche davantage et réfléchit moins souvent), et qu'un premier passage de banc d'essai voulait dire quoi que ce soit avant que le compilateur à la volée ne soit chaud. Les sauvegardes tournent chaque nuit, se copient hors site, et envoient un courriel en cas d'échec. La disponibilité est surveillée de l'extérieur.

Ce n'est pas terminé, et les points ouverts sont écrits aussi honnêtement que les points finis :

La suite

La liste priorisée vit dans priorities.md ; la version courte, dans l'ordre :

1. Confirmer la correction de l'Intermédiaire en jeu réel, et pas seulement au banc d'essai : le dernier point ouvert côté bots. 2. Finir le cours pour débutants. Le « pari plus gros » que cette liste décrivait comme indécis a été tranché en le faisant : un cours complet pour apprendre à jouer est construit sur dix-huit chapitres sur vingt et un, et testé de bout en bout. Il reste les trois derniers chapitres et les points d'entrée, gardés pour la fin exprès ; le cours reste inaccessible tant qu'il n'est pas fini. 3. Une revue de code en profondeur sur les chemins jamais revus : la seule barrière dure qui reste avant d'annoncer le site publiquement, exécutée en dernier exprès, une fois que le travail sur les fonctionnalités cesse de déplacer le code qu'elle relirait. 4. Ensuite, le plan de lancement : annoncer gratuit d'abord, et ne fixer un prix et construire la facturation que contre un usage réel : on ne peut pas donner un prix à ce que personne n'a utilisé.

La couche d'analyse et les exercices restent entièrement spécifiés et prêts à démarrer, au niveau que le positionnement permet : les exercices ont déjà tranché pour résultat et fréquences, sans verdict en v1, et la couche d'analyse commence par des miroirs plutôt que par des notes. Trois des gros chantiers candidats veulent d'abord la même chose : un modèle ICM, ce qui rend un conseil juste à l'approche des places payées, et il est délibérément planifié comme une pièce autonome plutôt que construit trois fois à l'intérieur de trois fonctionnalités.

Voir docs/roadmap.md, plan.md et priorities.md, qui listent les deux moitiés.