5.3 KiB
5.3 KiB
Domaine « partie » en TypeScript, scénarios exécutés, garde-fous
- Date : 2026-11-02
- Étape : 0d.1
- Statut : en cours
- Exécutant : sous-agent general-purpose, dans un worktree isolé
Objectif
Le domaine d'une partie contre l'ordinateur existe en TypeScript, sous forme de
journal d'événements (ADR 0007), branché au moteur WebAssembly par une
interface Engine. Le scénario docs/scenarios/jouer-une-partie.feature
s'exécute sous Node, sur le vrai moteur, dans make test. Les règles
d'architecture et le lien glossaire ↔ code sont vérifiés par les tests.
L'interface graphique et la PWA sont l'étape suivante (0d.2), pas celle-ci.
Consignes
- Outillage (ADR 0009, ADR 0004) : une image
docker/web/(Nodenode:22.11.0-alpine3.20déjà présent, versions npm figées et vérifiées) avec TypeScript, Biome,@cucumber/cucumberetdependency-cruiser. Ciblesmake web(compileapp/versbuild/web/avectsc), et intégration àmake lint(Biome ettsc --noEmit) etmake test. Étiquette d'image dans leMakefile,make setupla construit.CREDITS.mdà jour. - Arborescence (à ajuster si plus simple) :
app/src/domain/: le domaine pur, sous-dossiergame/;app/src/engine/: l'adaptateur qui implémenteEngineavec le moteur WebAssembly (réutiliserweb/engine-wasm.mjsetbuild/wasm/) ;app/src/ui/: vide pour l'instant (étape 0d.2) ;app/tests/: tests unitaires (runner intégré de Node,node:test) et définitions des étapes Cucumber. Les pages de prototype existantes (web/index.html,web/bench.html) doivent continuer de fonctionner.
- Interface
Enginedéfinie par le domaine (coups légaux avec position résultante, meilleur coup pour un niveau, décision de videau, décodage d'une position en plateau pour l'affichage). Compléterengine.hetengine-clisi une information manque (par exemple décoder un Position ID en nombre de pions par case, savoir si la partie est finie et combien elle rapporte), en restant simple, avec tests natifs. - Journal d'événements (ADR 0007, point 3) : événements immuables avec
identifiant, parent et version de format (
GameStarted,DiceRolled,MovePlayed,CubeOffered,CubeTaken,CubeDropped,GameEnded). L'état se calcule en rejouant le journal. Une branche est un nouvel événement accroché à un ancien ; annuler revient à repartir du parent. Le hasard des dés est injecté (source de dés passée au domaine). - Règles de la partie de 0d : partie libre contre l'ordinateur (Jacoby selon les réglages par défaut de gnubg) ; l'ordinateur joue le meilleur coup au niveau « standard » (choisir un niveau qui tienne les 2 s sur téléphone : 2 plis d'après les mesures 0b, à confirmer) ; il décide du videau avec le moteur ; le joueur peut prendre ou passer, et peut lui-même doubler (le moteur décide alors si l'ordinateur prend ou passe). Le joueur saisit son coup demi-coup par demi-coup (case de départ, case d'arrivée) ; le domaine n'accepte que ce qui mène à un coup légal complet. Aucune règle du jeu n'est réimplémentée : tout vient du moteur.
- Glossaire ↔ code (ADR 0008) : chaque type du domaine qui correspond à
un terme porte
Glossaire : docs/glossaire/<fiche>.mden commentaire, et la fiche reçoitcode: <Type>. Ajouter les fiches manquantes. Étendretests/test_glossary.shpour vérifier le lien dans les deux sens. - Scénarios exécutés : définitions des étapes en français pour
docs/scenarios/jouer-une-partie.feature, branchées sur le domaine et le vrai moteur WebAssembly (sous Node), avec des dés imposés pour être reproductibles. Si une étape du scénario est impossible à exécuter telle quelle, ajuster le scénario en gardant son sens pour le joueur, et le dire. - Garde-fous d'architecture (dependency-cruiser) : le domaine n'importe
ni
engine/, niui/, ni rien de spécifique au navigateur ;ui/n'importe pasengine/; pas de dépendance circulaire. Vérifier qu'une violation volontaire fait échouermake test.
Contraintes :
CLAUDE.md, ADR 0004, 0007, 0008, 0009 : simplicité avant tout, pas de patron de conception sans besoin, identifiants en anglais, commentaires et docs en français, tout outil dans Docker,-j2;- ne pas modifier
engine/gnubg/ni les références ; make lintetmake testdoivent passer ; commits petits, en français, avec la ligneCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>;- ne pas pousser ni créer de merge request ; ne rien simuler.
Rapport attendu : ce qui a été fait, l'API du domaine en quelques lignes, les fiches de glossaire ajoutées, le résultat des scénarios, les vérifications des garde-fous, les difficultés, les écarts au plan.
Critères de réussite
make testexécute le scénario « Jouer une partie contre l'ordinateur » sur le vrai moteur et passe.- Une partie complète (jusqu'à
GameEnded) se joue dans un test, l'ordinateur contre une stratégie simple du joueur, avec des dés imposés. - Les garde-fous d'architecture et le lien glossaire ↔ code échouent sur une violation volontaire.
make lintetmake testpassent.
Résultat
À remplir à la clôture.