173 Commits
Author SHA1 Message Date
Pierre MARTINandClaude Opus 5.5 ca1e2a5077 ADR 0010 : accord de Pierre sur Alegreya Sans et fontTools
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:05:05 +01:00
pierre f8b89a8c44 Fusion de la MR !13 : étape 0d.2, plateau jouable en PWA 2026-11-03 00:02:38 +00:00
Pierre MARTINandClaude Opus 5.5 6bc1c27bee Étape 0d.2 : plan clos, feuille de route et journal à jour
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:02:05 +01:00
Pierre MARTINandClaude Opus 5.5 1c722cca9f Identité visuelle : logo, icônes et ADR 0010
Symbole P3d (deux pions sur une flèche brique), logotype L3 (« mm » en
flèches alternées), accent brique, icône sur fond ivoire, choisis par
Pierre. Fichiers SVG et PNG dans docs/identite/logo/, générateur et notice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 01:01:06 +01:00
Pierre MARTINandClaude Opus 5.5 e3b31f3269 Étape 0d.2 : guide de test, aide documentée, résultat du plan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:46:48 +01:00
Pierre MARTINandClaude Opus 5.5 2c43a0a69f Test dans les navigateurs : CSP vérifiée, diagnostic des blocages
make test-browser vérifie maintenant la politique de sécurité dans
Chromium et Firefox : aucune violation pendant toute la partie, et un
script en ligne ajouté exprès est bloqué. Un blocage est diagnostiqué
(étape, capture, dernière commande du moteur, journal de la partie) au
lieu d'attendre sans fin. Firefox sous Playwright refuse toute navigation
hors ligne : on y vérifie le cache et le contrôle par le service worker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:46:48 +01:00
Pierre MARTINandClaude Opus 5.5 9cc0e0ccd5 Service worker enregistré une fois le moteur chargé
Dans Chromium, l'installation du service worker échouait (« Cache.add()
encountered a network error » sur wasm/engine.data) quand le Worker du
moteur téléchargeait les mêmes 8,7 Mo au même moment : l'application
n'était alors pas disponible hors ligne. Repéré par make test-browser,
reproduit dans quatre essais sur cinq sans ce changement, jamais avec. Évite aussi
de télécharger deux fois ces données à la première visite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:41:32 +01:00
Pierre MARTINandClaude Opus 5.5 ae1ea54782 Moteur WebAssembly : remettre la pile en place après chaque commande
callMain (Emscripten) copie les arguments sur la pile du WebAssembly
(64 Ko) sans les retirer. Pendant une partie dans le navigateur, le même
moteur reçoit des centaines de commandes : vers la 540e, la pile débordait
et corrompait la mémoire du moteur (moteur muet dans Firefox, onglet planté
dans Chromium, « memory access out of bounds » sous Node). Repéré par
make test-browser. stackSave et stackRestore sont exportés et encadrent
chaque commande ; un test en envoie 3000 à la suite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 00:27:24 +01:00
Pierre MARTINandClaude Opus 5.5 a8636b3f83 Plateau jouable en PWA : interface, Web Worker, stockage, service worker
L'application est à la racine du site : plateau en SVG, saisie au toucher
(pion puis case d'arrivée, proposées à partir du moteur), boutons du jet,
du videau et de nouvelle partie, coup de l'ordinateur affiché avec son
temps, fin de partie, reprise depuis localStorage, aide lue dans les
copies de docs/. Le moteur tourne dans le Web Worker existant ; main.ts
est le seul assembleur (nouvelles règles dependency-cruiser). Le service
worker met tout le site en cache, avec une empreinte du contenu comme
version. Les pages de test du moteur passent sous /moteur/. Politique de
sécurité du contenu dans le Caddyfile ; make test-browser joue une partie
dans Chromium et Firefox sans écran (Playwright, hors de make test).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:47:12 +01:00
Pierre MARTINandClaude Opus 5.5 613ff38254 Domaine : reprise d'une partie, plateau affiché, demi-coups possibles, droit de doubler
Ce dont l'interface a besoin, sans règle réimplémentée : le plateau vu de
chaque camp, les demi-coups que le moteur accepte à la suite de ceux déjà
saisis, le droit de doubler selon le moteur, et la reprise d'une partie
depuis son journal enregistré. Les types du navigateur sont ajoutés à
l'application ; le domaine reste vérifié sans eux.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:23:06 +01:00
Pierre MARTINandClaude Opus 5.5 fea94324af Plan de l'étape 0d.2 : plateau jouable en PWA
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:15:37 +01:00
pierre b4421dcea5 Fusion de la MR !11 : étape 0d.1, domaine « partie » 2026-11-02 20:14:19 +00:00
Pierre MARTINandClaude Opus 5.5 2c1bb93b89 Étape 0d.1 : domaine « partie » en TypeScript, scénario exécuté, garde-fous
Fusion du travail du sous-agent (branche plateau-domaine-travail) ; plan
supprimé à la clôture, son résultat est repris dans la merge request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:13:44 +01:00
Pierre MARTIN 91ea0acf93 Merge remote-tracking branch 'origin/main' into plateau 2026-11-02 21:09:33 +01:00
pierre f944debedd Fusion de la MR !10 : déploiement CapRover 2026-11-02 20:05:11 +00:00
Pierre MARTINandClaude Opus 5.5 c158d57111 Déploiement : domaine ustagammon.sans.pub
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 21:04:37 +01:00
Pierre MARTINandClaude Opus 5.5 a556c67fef Plan de l'étape 0d.1 : résultat
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:45:00 +01:00
Pierre MARTINandClaude Opus 5.5 85cc034611 Glossaire relié au code dans les deux sens
Fiches Demi-coup (HalfMove) et Plateau (Board) ajoutées ; champ code des
fiches Coup, Jet, Pli, Moteur, Identifiant de position, Videau, Événement de
partie et Partie. tests/test_glossary.sh vérifie que chaque référence
« Glossaire : » du code mène à une fiche qui nomme le type, et que chaque
champ code désigne un type qui renvoie à sa fiche.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:42:08 +01:00
Pierre MARTINandClaude Opus 5.5 1f9981dc63 Scénario « Jouer une partie » exécuté ; garde-fous d'architecture
Les étapes de docs/scenarios/jouer-une-partie.feature pilotent le domaine
sur le vrai moteur WebAssembly, avec des dés imposés (Cucumber, sous Node).
Deux retouches du scénario : 8/4 avec 3-1 est un coup permis (8/5/4),
remplacé par 13/12 (case tenue par l'ordinateur) ; « c'est ensuite au tour
de l'ordinateur » distingue le constat de la situation de départ du même nom.

dependency-cruiser vérifie que le domaine n'importe que le domaine, que
l'interface n'appelle pas le moteur et qu'il n'y a pas de cycle ;
tests/test_web.sh prouve aussi que des violations volontaires sont
détectées.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:42:08 +01:00
Pierre MARTINandClaude Opus 5.5 602d0eafed Domaine « partie » en journal d'événements, branché au moteur WebAssembly
app/src/domain/game/ : une partie libre contre l'ordinateur, enregistrée
comme un arbre d'événements immuables et versionnés (GameStarted,
DiceRolled, MovePlayed, CubeOffered, CubeTaken, CubeDropped, GameEnded) ;
l'état se recalcule en les rejouant, annuler repart du parent, une action
après un retour ouvre une branche. Dés injectés. Le joueur saisit son coup
demi-coup par demi-coup ; l'ordinateur joue et décide du videau à 2 plis.
Toutes les règles viennent du moteur, derrière l'interface Engine que le
domaine définit.

app/src/engine/wasm-engine.ts : l'adaptateur Engine sur les commandes
d'engine-cli du moteur WebAssembly.

Tests : unitaires avec un faux moteur, et deux parties complètes jusqu'à
GameEnded sur le vrai moteur, avec des dés imposés.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:42:08 +01:00
Pierre MARTINandClaude Opus 5.5 54883f4ca3 Outils de l'application web : image ustagammon/web, make web, lint
Image docker/web/ (Node 22.11) avec TypeScript 6.0.3, @types/node,
Biome 2.5.15, @cucumber/cucumber 12.9.0 et dependency-cruiser 18.6.0,
versions figées (ADR 0009). make web compile app/ dans build/web/ ;
make lint passe Biome et tsc --noEmit, et vérifie à part que le domaine
compile sans les types de Node ni du navigateur. make setup construit
l'image ; CREDITS.md à jour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:41:57 +01:00
Pierre MARTINandClaude Opus 5.5 db76200c69 Moteur : « pion » plutôt que « dame », comme le glossaire
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:41:57 +01:00
Pierre MARTINandClaude Opus 5.5 84998608d5 Déploiement CapRover : site statique construit sur le PC, servi par Caddy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:37:00 +01:00
Pierre MARTINandClaude Opus 5.5 6af82f73b0 Moteur : plateau, fin de partie, Match ID et saisie demi-coup par demi-coup
Ce dont le domaine d'une partie a besoin, sans réimplémenter de règle :
décodage d'un Position ID en plateau et position vue de l'adversaire,
résultat d'une partie finie (gammon, règle Jacoby), codage d'un Match ID,
vérification de demi-coups saisis un par un (la légalité vient de
GenerateMoves de gnubg), demi-coups de chaque coup légal, droit de doubler
et recommandations de double et de prise. Nouvelles commandes d'engine-cli
position, halfmoves et matchid, avec leurs tests natifs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:23:04 +01:00
Pierre MARTINandClaude Opus 5.5 ea304795b5 ADR 0009 accepté : socle PWA, mesures du Fairphone 4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:21:29 +01:00
Pierre MARTINandClaude Opus 5.5 03b26ccba7 ADR 0009 proposé (PWA en TypeScript) ; plan de l'étape 0d.1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:04:49 +01:00
pierre 14d1186e84 Fusion de la MR !9 : étape 0b, moteur en WebAssembly 2026-11-02 18:24:15 +00:00
Pierre MARTINandClaude Opus 5.5 c411771e48 Étape 0b close : plan supprimé, feuille de route et journal à jour
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 19:23:43 +01:00
Pierre MARTIN 07dd36605c Merge remote-tracking branch 'origin/main' into wasm 2026-11-02 19:20:31 +01:00
Pierre MARTINandClaude Opus 5.5 d83dbfb1e5 Plan 0b : résultat, documentation de la suite WebAssembly
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 19:20:04 +01:00
Pierre MARTINandClaude Opus 5.5 120367e6d3 Page de test et page de mesure du moteur WebAssembly
web/ : le moteur tourne dans un Web Worker (module ES) ; la page de
test donne le meilleur coup d'une position et son temps de calcul ;
la page de mesure chronomètre les positions de référence, mesure la
taille téléchargée et la mémoire, compare aux seuils de l'étape 0b et
produit un rapport à copier. make bench fait la même mesure sous Node,
make deploy-web sert les pages sur le réseau local. Guide de test pour
le Fairphone 4 dans docs/guide-test-etape-0.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 19:13:04 +01:00
Pierre MARTINandClaude Opus 5.5 b0030521d8 Moteur en WebAssembly : make engine-wasm et suite de contrat
Le moteur et engine-cli sont compilés avec Emscripten (image figée
emscripten/emsdk:3.1.64), en C générique, sans threads ; les données
de build/data/ sont incluses dans engine.data. Le JavaScript appelle
engine_init une fois puis main pour chaque commande : la sortie est le
JSON d'engine-cli, sans code de mise en forme dupliqué.

tests/test_wasm_reference.sh rejoue les 32 positions de référence sous
Node avec le même comparateur (option --cli) et la même tolérance.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 19:07:01 +01:00
pierre 39052215b1 Fusion de la MR !8 : étape 0a.4, comparaison aux références 2026-11-02 18:04:52 +00:00
Pierre MARTINandClaude Opus 5.5 4b8e2f73cc ADR 0004 amendé : outils de l'étape 0 validés par Pierre
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 19:04:24 +01:00
Pierre MARTIN 12a90aec03 Merge remote-tracking branch 'origin/main' into comparaison 2026-11-02 19:03:47 +01:00
pierre 51801e8491 Fusion de la MR !7 : étape 0a.3, moteur embarqué et engine-cli 2026-11-02 18:03:46 +00:00
Pierre MARTINandClaude Opus 5.5 850de27e90 Plan de l'étape 0b : moteur en WebAssembly
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 19:00:28 +01:00
Pierre MARTINandClaude Opus 5.5 4dba402b74 Étape 0a.4 close : plan supprimé, feuille de route à jour
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 18:55:13 +01:00
Pierre MARTINandClaude Opus 5.5 15939802ce Plan 0a.4 : résultat
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:19:18 +01:00
Pierre MARTINandClaude Opus 5.5 83cb1a6f83 Tests : comparaison du moteur embarqué aux références de gnubg
tests/test_engine_reference.sh lance tests/reference/compare.py sur les
32 positions aux niveaux 0 et 2 plis. Tolérance de 0,002 mesurée et
justifiée dans tests/reference/README.md : écart maximal de 9,5e-4, avec
ou sans -ffast-math ; la cause est la sigmoïde approchée (_mm_rcp_ps) de
gnubg de bureau en SSE2, qu'un build SSE2 du moteur reproduit au bit près.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:18:10 +01:00
Pierre MARTINandClaude Opus 5.5 ae166d51e5 Chaîne C : Python 3 et jq ; test_reference.sh tourne dans Docker
jq n'est plus utilisé sur le PC (ADR 0004) : tests/test_reference.sh se
relance dans l'image ustagammon/build-c:2, qui contient aussi Python 3
pour le comparateur du moteur.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:18:10 +01:00
Pierre MARTINandClaude Opus 5.5 be6a4b4446 Moteur : classement exact de hint et commande engine-cli reference
- engine_best_moves suit hint_move de gnubg : fAnalyse vrai, seuil
  « douteux », puis RefreshMoveList (classement par niveau d'évaluation
  et départage des égalités).
- Correction : en match, l'équité des coups était convertie deux fois par
  mwc2eq (ScoreMove la convertit déjà).
- engine_cube : ajout de optimal et decision_text ; decision prend le nom
  de l'énumération cubedecision de gnubg, comme les références.
- engine-cli : commande reference (un niveau au format de
  tests/reference/) et nombres écrits avec 9 chiffres significatifs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:18:10 +01:00
Pierre MARTINandClaude Opus 5.5 856e4d64bd Plan de l'étape 0a.4 : comparaison aux références
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:04:14 +01:00
Pierre MARTINandClaude Opus 5.5 b02d012f58 Étape 0a.3 : moteur embarqué (cœur de gnubg), engine.h et engine-cli
Fusion du travail du sous-agent (branche moteur-embarque-travail) ; plan
supprimé à la clôture, son résultat est repris dans la merge request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:02:56 +01:00
pierre 1d97d40a7c Fusion de la MR !6 : étape 0a.2, gnubg et positions de référence 2026-11-02 13:00:59 +00:00
Pierre MARTINandClaude Opus 5.5 b273b96c33 Étape 0a.2 : gnubg de référence et 32 positions de référence
Fusion du travail du sous-agent (branche moteur-reference-travail) ; plan
supprimé à la clôture, son résultat est repris dans la merge request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 14:00:06 +01:00
Pierre MARTINandClaude Opus 5.5 7e2f9d4ad8 Crédits du moteur et résultat de l'étape 0a.3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 13:58:01 +01:00
Pierre MARTINandClaude Opus 5.5 a90f8ac9bf Tests du moteur embarqué
tests/test_engine.sh : coups d'ouverture connus à 0 et 2 plis, nombre de
coups légaux, bornes et symétrie des probabilités, décisions de videau
évidentes, erreurs. test_makefile.sh essaie make clean sur un dossier
jetable, pour ne plus forcer la recompilation du moteur à chaque test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 13:58:00 +01:00
Pierre MARTINandClaude Opus 5.5 05d59c6acb Compilation du moteur dans Docker : make engine
Image ustagammon/build-c (Debian trixie, gcc, GLib pour les seuls outils
de génération), construite par make setup. engine/engine.mk compile le
moteur et engine-cli, et génère gnubg.wd et les bases .bd avec makeweights
et makebearoff, comme le Makefile.am de gnubg. Dépendances suivies : un
second make engine ne recompile rien. make build appelle make engine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 13:58:00 +01:00
Pierre MARTINandClaude Opus 5.5 c1baf1a5d3 Plan 0a.2 : résultat
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 13:57:45 +01:00