Files
Ustagammon/docs/plans/2026-11-03-position-dans-l-adresse.md
T
2026-11-09 14:40:16 +01:00

4.4 KiB
Raw Blame History

Une adresse pour chaque écran, et pour chaque position (0e.4)

  • Date : 2026-11-03
  • Étape : 0e.4 (feuille de route)
  • Statut : fait (branche adresses-ecrans)
  • Exécutant : sous-agent general-purpose, dans un worktree

Objectif

Appliquer l'ADR 0013 et son amendement du 2026-11-03 : chaque écran (aide, glossaire, menu, mes parties…) a son adresse et s'ouvre par un vrai lien ; chaque position du plateau a un lien direct.

Consignes

ADR 0007, 0008 et 0013. Aucune nouvelle dépendance.

  1. Routeur : un petit module pur (sans dépendance) qui traduit le fragment en écran et inversement, testé unitairement ; l'app dessine l'écran demandé par l'adresse, sur hashchange. Tous les écrans existants (aide et ses questions, glossaire et ses termes, à propos, menu, mes parties de 1b) passent par lui, avec de vrais liens <a href> ; le bouton retour du navigateur ramène à l'écran précédent. Les actions de jeu restent des boutons.
  2. Lecture de #/position/<Position ID>/<Match ID> ; validation par le moteur ; message clair si illisible.
  3. Vue de la position, non jouable, avec « Jouer à partir d'ici » (nouvelle partie depuis la position, la partie en cours restant reprenable) et « Retour à ma partie ».
  4. Domaine : démarrer une partie depuis une position et un Match ID donnés (événement GameStarted étendu de façon rétrocompatible, ou équivalent justifié), sans règle réimplémentée.
  5. « Copier le lien de la position » depuis le menu de la partie et depuis la vue du coup de l'ordinateur ; le lien copié rouvre exactement la même position (test aller-retour).
  6. Scénarios Gherkin (« Ouvrir un lien vers une position », « Partager la position »), fiches du glossaire (Position ID, Match ID si absentes).
  7. make lint, make test, make test-browser : chaque adresse du tableau de l'ADR ouverte directement dans un nouvel onglet montre le bon écran ; « retour » du navigateur ; liens reconnus comme liens (rôle link) ; position : ouvrir un lien, jouer à partir d'ici, revenir, lien invalide.

Critères de réussite

Un lien copié depuis l'app, ouvert dans un nouvel onglet, montre la même position ; les trois commandes passent.

Résultat

Fait, sur la branche adresses-ecrans (2026-11-03 au 2026-11-09).

  1. Routeur : app/src/ui/router.ts (pur, testé par app/tests/router.test.ts) traduit le fragment en écran et inversement ; app/src/ui/navigation.ts écoute hashchange et garde dans history.state la suite des adresses de l'onglet, pour que « Retour », Échap et la croix d'une feuille reviennent dans l'historique au lieu d'y empiler la partie. Aide, ses questions (#/aide/<identifiant>, tiré du titre du scénario), glossaire et ses termes, à propos, menu, mes parties et chaque partie sont des liens <a href> ; les actions de jeu restent des boutons. Les liens du menu remplacent son adresse : le retour du téléphone ferme la feuille sans la rouvrir. Accueil et tutoriel : routes seules, la partie s'affiche avec « Cet écran n'existe pas encore ».
  2. #/position/<Position ID>/<Match ID> : lu par le routeur (adresse encodée ou collée telle quelle), validé par le moteur (readPosition) ; lien illisible : « Lien illisible » et « Retour à ma partie ».
  3. Vue de la position, non jouable, avec « Jouer à partir d'ici » et « Retour à ma partie » (un lien).
  4. Domaine : setupOf donne la partie à jouer depuis une position ; la partie en cours reste reprenable dans « Mes parties ».
  5. « Copier le lien de la position » : menu de la partie, vue du coup de l'ordinateur, vue d'une position.
  6. Scénarios « Partager la position », « Ouvrir un lien vers une position », « Ouvrir un lien abîmé » ; fiche « Lien de position ».
  7. make test-browser (étape « adresses ») : les 16 adresses du tableau ouvertes dans un nouvel onglet ; retour du navigateur (question, onglet, menu, mes parties) ; Échap ; rôle link ; aller-retour d'un lien de position (le lien recopié depuis la vue est identique), retour à la partie, partie jouée depuis la position. Captures 412×915 et 915×412 dans build/browser-shots/adresses/.

En chemin : une vibration de fin de partie remplacée par celle d'une prise pendant l'animation du dernier coup (corrigé) ; le test du coup enregistré laisse 10 s à IndexedDB (disque dur lent sous Firefox).