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ébut | 2026-07-19, il y a cinq semaines |
| Commits | 827 |
| 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és | 2 654, tous au vert : 1 753 côté serveur, 901 côté interface |
| Migrations de base de données | 32 |
| Documentation rédigée | 88 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 :
- Trois variantes : No-Limit Hold'em, Pot-Limit Omaha et PLO à 5 cartes, chacune avec son propre évaluateur de mains et ses propres règles d'enchères. Le Hold'em est gratuit ; le PLO et le PLO5 sont derrière l'étiquette Plus tant que leur réalisme n'est pas vérifié, pour qu'un inconnu qui découvre le site ne tombe pas sur une variante que personne n'a validée.
- Parties cash : blinds, taille de table, caves, rake et composition des adversaires configurables. Quitter une table la met en pause avec vos jetons dessus, ce qui permet d'y revenir ; seul « Terminer la partie » encaisse vos jetons.
- Tournois : multi-tables jusqu'à 10 000 participants, équilibrage automatique des tables, montée des blinds, inscription tardive, réentrée, formats à bounty (régulier et progressif), structures de blinds et grilles de gains personnalisées, plus une pause/reprise qui survit à un redémarrage du serveur. Cinq structures de blinds intégrées, dont la véritable structure du Main Event des WSOP 2025, transcrite palier par palier depuis la feuille officielle.
- Poker en duplicate : deux joueurs ou plus jouent la série de mains identique et sont comparés dans des conditions appariées. C'est la fonctionnalité la plus récente et la plus distinctive ; elle a sa propre présentation. On invite les joueurs par courriel ou par un lien de partage, et personne ne voit les cartes, la progression ni les résultats des autres avant la clôture du match.
- Trois niveaux d'adversaires : Débutant, Intermédiaire et Avancé, décrits plus bas et dans la présentation des bots.
- Historique et rejeu des mains : chaque main jouée est enregistrée comme la vraie séquence d'états de jeu et rejouée à partir de cet enregistrement, sans reconstruction. Les comptes gratuits voient exactement ce qu'ils auraient vu en direct ; Plus ajoute une option qui révèle toutes les cartes privatives, pour l'étude.
- Statistiques : VPIP, PFR, facteur d'agressivité, taux de gain, calculés à partir des données par main.
- Comptes : y compris un mode invité qui vous assoit à une table sans inscription, et qui se convertit plus tard en vrai compte sans perdre ni bankroll ni historique. L'inscription envoie un vrai courriel de bienvenue et ouvre une courte visite guidée, que l'on peut sauter.
- Une page Aide et un panneau « Nouveautés », tenus à la main et gardés à jour : chaque changement visible par un joueur reçoit une entrée le jour où il est livré.
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.
- Le Débutant joue comme un débutant, délibérément : il suit beaucoup trop large après le flop, chasse les tirages avec les mauvaises cotes, n'arrive pas à coucher des valets face à un tapis, et dimensionne ses mises d'une façon qui trahit sa main.
- L'Intermédiaire comprend la position, les cotes du pot, la texture du board et les schémas de mise. Il tilte, il perd sa concentration à l'occasion, et il se construit des lectures sur les adversaires qui misent gros à répétition.
- L'Avancé modélise ses adversaires comme des ranges pondérées plutôt que comme des catégories en les resserrant action par action, en filtrant selon la façon dont le board se connecte, et choisit ses lignes en comparant l'espérance de gain entre plusieurs tailles de mise, plutôt qu'en appliquant un seuil.
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é :
- Le produit. Quoi construire, quoi couper, quoi reporter. Le quatrième niveau de bots a été conçu, puis délibérément mis de côté, sous condition. La séparation des bots Omaha est entièrement planifiée et explicitement non programmée. La ligne entre gratuit et Plus a été redessinée plusieurs fois à mesure que le produit se précisait ; en dernier lieu en faisant passer trois structures de blinds et les grands champs de tournoi derrière Plus, tout en gardant gratuit un match duplicate complet et compté. Chacun de ces choix était un jugement, et chacun était le sien.
- Le poker. C'est la partie qu'aucune qualité de code ne remplace. Des corrections qui ont changé la conception, pas seulement les chiffres :
- « Personne ne coucherait jamais KK face à un tapis. » Rejeter l'idée que coucher des rois puisse se défendre à une certaine profondeur de tapis a mené à un plancher dur dans le modèle : les mains premium ne couchent jamais face à un tapis préflop, plutôt qu'à un énième ajustement de seuil.
- « Le dimensionnement des mises change en tournoi, surtout quand les tapis raccourcissent. » Une seule formule codée en dur servait tous les niveaux, les deux formats et toutes les profondeurs.
- « Un bon joueur relance et couche bien plus souvent qu'il ne suit. » Cela a réorienté toute une passe de réglage, qui visait une cible inventée plutôt que réelle.
- « La structure du Main Event des WSOP, ce n'est pas 60 minutes, c'est deux heures », avec le lien vers la feuille officielle. C'était faux deux fois : la durée des paliers, et le fait que la structure réutilisait la courbe de blinds d'un autre modèle plutôt que celle de l'événement.
- Des tests de jeu qui ont trouvé de vrais défauts. Jouer au produit a fait surgir des bogues qu'aucune suite de tests n'a attrapés : un total de pot mis à jour avant que les jetons ne bougent, un Débutant qui suit trois streets avec une sous-paire, un bot Avancé qui se contente de suivre avec des as, une plaque de nom qui cachait le seul mot indiquant si un joueur avait relancé ou suivi, et un panneau de résultats entièrement vide parce que rien n'avait jamais écrit les données derrière. Chaque rapport était assez précis pour être reproduit.
- Le fait de pousser en arrière quand le travail était mauvais. Y compris sur des affirmations qui se sont révélées exagérées.
Ce que Claude a apporté :
- L'implémentation sur toute la pile : moteur, bots, persistance, API, couche WebSocket, interface.
- La discipline de mesure : le banc de réglage, les portes statistiques, la réduction de variance du duplicate, l'empreinte des bots et le banc de sondes, et l'habitude de refuser de conclure quoi que ce soit à partir d'une seule exécution.
- Une architecture choisie pour la suite : une couture de stratégie qui permet à un quatrième niveau entraîné résolu d'être un échange de données plutôt qu'une réécriture, et qui sert aussi d'interface à la future couche d'analyse.
- La documentation, y compris des comptes rendus honnêtes de ce qui a été mesuré, de ce qui a manqué sa cible, et de ce qui a été délibérément laissé de côté.
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 :
- Les bots Omaha jouent légalement mais leur réalisme est mesuré et mauvais. Une couche de décision Omaha distincte est conçue et délibérément non programmée.
- Le quatrième niveau de bots reste conditionnel : désormais planifié comme de l'apprentissage automatique, entraîné contre nos propres bots et jamais sur les mains des joueurs ; les satellites de tournoi sont spécifiés et non construits.
- La couche d'analyse, autrefois appelée « coaching », et autrefois « le vrai facteur différenciant » ; aucune des deux formules ne survit au positionnement du propriétaire du 2026-08-21. Elle est entièrement spécifiée sur huit jalons et non commencée, et elle sera construite en commençant par le barreau le plus bas : les fréquences du joueur à côté de celles, mesurées, des niveaux de bots, puis une revue de session choisie pour lui, puis, seulement sur les fuites qu'aucun joueur compétent ne conteste, un second regard, sur le ton de « un régulier solide relance habituellement ici ». Jamais un verdict, jamais une prétention d'expertise ; le propriétaire n'est pas un expert du poker et a dit que le logiciel ne doit pas faire semblant de l'être.
- Les tables à plusieurs humains (des amis à une même table, avec ou sans bots) sont évaluées (un XL) et non planifiées, mais elles sont maintenant une direction affirmée plutôt qu'un peut-être : une partie maison en ligne, sans argent et sans site d'argent réel entre les joueurs, c'est exactement le bac à sable pour lequel le site existe. Sur invitation seulement, par conception, pour que les inconnus que le site existe pour éviter n'arrivent jamais.
- Un cours complet pour apprendre à jouer est construit et délibérément inaccessible. Quatre ceintures, dix-huit chapitres sur vingt et un, parcourus écran par écran par un humain et lourdement révisés d'après ces notes, mais les points d'entrée sont repoussés jusqu'à ce que le cours soit fini, donc aucun joueur ne peut encore le trouver.
- Un test se bloque par intermittence sous forte charge machine et a résisté à deux rondes de diagnostic. Il capture désormais une trace complète des fils d'exécution dans son propre message d'échec, pour que la prochaine occurrence arrive avec ses propres preuves.
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.