Au premier test sur le Fairphone (2026-11-03), Pierre a demandé qu'une position du plateau soit joignable par sa seule adresse. On pourrait ainsi la partager, ou la mettre dans une leçon ou dans un prompt. Il a ensuite précisé : « Il faudra vraiment que chaque page (l'aide, etc.) ait une URL. Utilise des liens accessibles, pas des états. »
Jusqu'ici, l'aide, le glossaire, le menu et « Mes parties » s'ouvraient par des boutons qui changeaient un état caché. Ces écrans ne pouvaient ni se partager ni s'ouvrir dans un nouvel onglet. Le retour du téléphone quittait l'application au lieu de fermer l'écran. Un lecteur d'écran ne les annonçait pas comme des liens.
L'ADR 0013 et son amendement du 2026-11-03 (MR !29 et !34) fixent le schéma d'adresses.
Quoi
Chaque écran a son adresse, placée dans le fragment :
#/ pour la partie ;
#/aide, et #/aide/<question> pour une question ;
#/glossaire, et #/glossaire/<terme> pour un terme ;
#/a-propos ;
#/parties, et #/parties/<id> pour une partie ;
#/menu.
#/accueil et #/tutoriel(/<n>) sont réservées pour 0e.5 : pour l'instant, elles affichent la partie avec un message.
On passe d'un écran à l'autre par de vrais liens. Les actions de jeu restent des boutons.
Le retour du téléphone ferme d'abord la question ou la feuille ouverte, puis revient à l'écran précédent.
#/position/<Position ID>/<Match ID> montre la position, non jouable, avec deux actions :
« Jouer à partir d'ici », qui ajoute une partie dans « Mes parties » ; la partie en cours reste reprenable ;
« Retour à ma partie ».
Un lien illisible affiche un message clair.
« Copier le lien de la position » est disponible depuis le menu, depuis la vue du coup de l'ordinateur et depuis la vue d'une position.
Correction d'un défaut déjà présent sur main : la vibration de fin de partie était remplacée par celle d'une prise quand le dernier coup de l'ordinateur frappait un pion.
Comment
Le travail a été délégué à un sous-agent. Un second agent l'a repris après une limite d'usage, à partir des commits déjà faits et des modifications en cours.
Routeur.app/src/ui/router.ts est un module pur, testé sous Node. Il traduit le fragment en écran, et l'écran en fragment.
Navigation.app/src/ui/navigation.ts écoute hashchange. L'adresse est la seule source de vérité : l'application dessine l'écran qu'elle désigne.
Retour sans empiler. Pour que « Retour », Échap ou la croix reculent sans ajouter d'entrée à l'historique, chaque entrée garde dans history.state la suite des adresses de l'onglet. Comme history.go est asynchrone, une adresse demandée pendant un retour attend son arrivée.
Liens du menu. Ils remplacent l'adresse au lieu d'en empiler une : le retour ne rouvre donc pas la feuille.
Position. Le moteur valide le Position ID et le Match ID. Le domaine en tire la partie à jouer (setupOf), sans règle réimplémentée.
Test navigateur, nouvelle étape « adresses ». Elle :
ouvre les 16 adresses du tableau de l'ADR, chacune dans un nouvel onglet ;
vérifie le retour, Échap et le rôle link ;
fait l'aller-retour d'un lien de position ;
teste « Jouer à partir d'ici » et « Retour à ma partie ».
Vérification par la session principale, après fusion de main : make lint, aucun problème, et make test, 10/10. L'agent a fait passer make test-browser dans Chromium et Firefox sur le même code ; main n'a apporté depuis que de la documentation.
Choix et compromis
Identifiant d'une question. Il vient du titre du scénario. Renommer un scénario casse donc le lien de sa question ; l'aide affiche alors son sommaire, avec un message.
Question ouverte par son adresse. La page défile jusqu'à elle, et l'en-tête sort de la vue. Ce point est soumis à la recette design.
Test du coup enregistré. Il attend jusqu'à 10 s, car l'écriture IndexedDB de Firefox est lente sur le disque dur de la machine de développement. Pendant un rsync concurrent, deux passages Firefox ont échoué sur ce contrôle, puis un passage a eu une erreur IndexedDB. Une fois le rsync fini, le passage complet a réussi. C'est probablement la charge du disque, mais c'est à surveiller.
Risques et déploiement
Aucune configuration serveur, aucune nouvelle dépendance, CSP inchangée.
Une adresse sans fragment ouvre la partie, comme avant.
Retour arrière : annuler la fusion. Le format des parties enregistrées ne change pas.
Comment vérifier
make lint && make test && make test-browser
ls build/browser-shots/adresses/
## Pourquoi
Au premier test sur le Fairphone (2026-11-03), Pierre a demandé qu'une position du plateau soit joignable par sa seule adresse. On pourrait ainsi la partager, ou la mettre dans une leçon ou dans un prompt. Il a ensuite précisé : « Il faudra vraiment que chaque page (l'aide, etc.) ait une URL. Utilise des liens accessibles, pas des états. »
Jusqu'ici, l'aide, le glossaire, le menu et « Mes parties » s'ouvraient par des boutons qui changeaient un état caché. Ces écrans ne pouvaient ni se partager ni s'ouvrir dans un nouvel onglet. Le retour du téléphone quittait l'application au lieu de fermer l'écran. Un lecteur d'écran ne les annonçait pas comme des liens.
L'ADR 0013 et son amendement du 2026-11-03 (MR !29 et !34) fixent le schéma d'adresses.
## Quoi
- **Chaque écran a son adresse**, placée dans le fragment :
- `#/` pour la partie ;
- `#/aide`, et `#/aide/<question>` pour une question ;
- `#/glossaire`, et `#/glossaire/<terme>` pour un terme ;
- `#/a-propos` ;
- `#/parties`, et `#/parties/<id>` pour une partie ;
- `#/menu`.
`#/accueil` et `#/tutoriel(/<n>)` sont réservées pour 0e.5 : pour l'instant, elles affichent la partie avec un message.
- **On passe d'un écran à l'autre par de vrais liens.** Les actions de jeu restent des boutons.
- **Le retour du téléphone** ferme d'abord la question ou la feuille ouverte, puis revient à l'écran précédent.
- **`#/position/<Position ID>/<Match ID>`** montre la position, non jouable, avec deux actions :
- « Jouer à partir d'ici », qui ajoute une partie dans « Mes parties » ; la partie en cours reste reprenable ;
- « Retour à ma partie ».
Un lien illisible affiche un message clair.
- **« Copier le lien de la position »** est disponible depuis le menu, depuis la vue du coup de l'ordinateur et depuis la vue d'une position.
- **Correction d'un défaut déjà présent sur main** : la vibration de fin de partie était remplacée par celle d'une prise quand le dernier coup de l'ordinateur frappait un pion.
## Comment
Le travail a été délégué à un sous-agent. Un second agent l'a repris après une limite d'usage, à partir des commits déjà faits et des modifications en cours.
- **Routeur.** `app/src/ui/router.ts` est un module pur, testé sous Node. Il traduit le fragment en écran, et l'écran en fragment.
- **Navigation.** `app/src/ui/navigation.ts` écoute `hashchange`. L'adresse est la seule source de vérité : l'application dessine l'écran qu'elle désigne.
- **Retour sans empiler.** Pour que « Retour », Échap ou la croix reculent sans ajouter d'entrée à l'historique, chaque entrée garde dans `history.state` la suite des adresses de l'onglet. Comme `history.go` est asynchrone, une adresse demandée pendant un retour attend son arrivée.
- **Liens du menu.** Ils remplacent l'adresse au lieu d'en empiler une : le retour ne rouvre donc pas la feuille.
- **Position.** Le moteur valide le Position ID et le Match ID. Le domaine en tire la partie à jouer (`setupOf`), sans règle réimplémentée.
- **Test navigateur, nouvelle étape « adresses ».** Elle :
- ouvre les 16 adresses du tableau de l'ADR, chacune dans un nouvel onglet ;
- vérifie le retour, Échap et le rôle `link` ;
- fait l'aller-retour d'un lien de position ;
- teste « Jouer à partir d'ici » et « Retour à ma partie ».
Vérification par la session principale, après fusion de `main` : `make lint`, aucun problème, et `make test`, 10/10. L'agent a fait passer `make test-browser` dans Chromium et Firefox sur le même code ; `main` n'a apporté depuis que de la documentation.
## Choix et compromis
- **Identifiant d'une question.** Il vient du titre du scénario. Renommer un scénario casse donc le lien de sa question ; l'aide affiche alors son sommaire, avec un message.
- **Question ouverte par son adresse.** La page défile jusqu'à elle, et l'en-tête sort de la vue. Ce point est soumis à la recette design.
- **Test du coup enregistré.** Il attend jusqu'à 10 s, car l'écriture IndexedDB de Firefox est lente sur le disque dur de la machine de développement. Pendant un `rsync` concurrent, deux passages Firefox ont échoué sur ce contrôle, puis un passage a eu une erreur IndexedDB. Une fois le `rsync` fini, le passage complet a réussi. C'est probablement la charge du disque, mais c'est à surveiller.
## Risques et déploiement
- Aucune configuration serveur, aucune nouvelle dépendance, CSP inchangée.
- Une adresse sans fragment ouvre la partie, comme avant.
- Retour arrière : annuler la fusion. Le format des parties enregistrées ne change pas.
## Comment vérifier
```
make lint && make test && make test-browser
ls build/browser-shots/adresses/
```
Sur https://ustagammon.sans.pub après déploiement :
- ouvrir `#/aide`, toucher une question, puis le bouton retour : la question se ferme, puis on revient à la partie ;
- dans le menu, « Copier le lien de la position », puis coller le lien dans un nouvel onglet : la même position s'affiche ;
- ouvrir `#/position/abc` : le message « Lien illisible » s'affiche.
## Hors périmètre
- Les écrans d'accueil et de tutoriel (0e.5), dont seules les routes existent.
- L'import XGID.
- Les adresses des écrans de l'étape 1, qui suivront le même schéma.
- Le panneau de fin de partie, qui apparaît au début de l'animation du dernier coup : remarqué, non modifié.
Generated with Claude Code https://claude.com/claude-code
Le moteur écrit et décode le Match ID ; readPosition valide un lien,
linkOf donne celui d'une partie, setupOf la partie à jouer depuis la
position. Scénario « Partager une position », fiche « Lien de position ».
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Routeur pur (fragment vers écran et inversement) et navigation sur
hashchange : aide et ses questions, glossaire et ses termes, à propos,
menu, mes parties et chaque partie, vue d'une position avec « Jouer à
partir d'ici » et « Retour à ma partie », « Copier le lien de la
position ».
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
history.go est asynchrone : une adresse demandée pendant un retour attend
son arrivée. Le test dans le navigateur ouvre chaque adresse du tableau de
l'ADR 0013 dans un nouvel onglet, vérifie le retour, le rôle link des liens
et l'aller-retour d'un lien de position, et range ses captures dans
browser-shots/adresses/.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le dessin lancé au début de l'animation annonçait la fin ; une prise de
l'ordinateur pendant ce dernier coup vibrait ensuite et la remplaçait (vu
dans Firefox par make test-browser).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
L'application enregistre sans attendre ; sur le disque dur de la machine
de développement, l'écriture de Firefox peut suivre de loin. En cas
d'échec, le message dit ce que montre l'écran.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Barre haute de l'aide en position sticky ; question ou terme ouvert par
son adresse arrêté 12 px sous elle ; surlignage du terme effacé après 2 s.
Boutons en white-space: nowrap ; actions de la position empilées
(Jouer, Copier, Retour). En paysage, plateau à gauche sur toute la
hauteur avec la géométrie du jeu (videau entier, sans menu ni annuler),
colonne de 288 px à droite. Test navigateur : aucun bouton sur deux
lignes, barre de l'aide en vue, actions visibles sans défiler, videau
entier.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Pourquoi
Au premier test sur le Fairphone (2026-11-03), Pierre a demandé qu'une position du plateau soit joignable par sa seule adresse. On pourrait ainsi la partager, ou la mettre dans une leçon ou dans un prompt. Il a ensuite précisé : « Il faudra vraiment que chaque page (l'aide, etc.) ait une URL. Utilise des liens accessibles, pas des états. »
Jusqu'ici, l'aide, le glossaire, le menu et « Mes parties » s'ouvraient par des boutons qui changeaient un état caché. Ces écrans ne pouvaient ni se partager ni s'ouvrir dans un nouvel onglet. Le retour du téléphone quittait l'application au lieu de fermer l'écran. Un lecteur d'écran ne les annonçait pas comme des liens.
L'ADR 0013 et son amendement du 2026-11-03 (MR !29 et !34) fixent le schéma d'adresses.
Quoi
Chaque écran a son adresse, placée dans le fragment :
#/pour la partie ;#/aide, et#/aide/<question>pour une question ;#/glossaire, et#/glossaire/<terme>pour un terme ;#/a-propos;#/parties, et#/parties/<id>pour une partie ;#/menu.#/accueilet#/tutoriel(/<n>)sont réservées pour 0e.5 : pour l'instant, elles affichent la partie avec un message.On passe d'un écran à l'autre par de vrais liens. Les actions de jeu restent des boutons.
Le retour du téléphone ferme d'abord la question ou la feuille ouverte, puis revient à l'écran précédent.
#/position/<Position ID>/<Match ID>montre la position, non jouable, avec deux actions :Un lien illisible affiche un message clair.
« Copier le lien de la position » est disponible depuis le menu, depuis la vue du coup de l'ordinateur et depuis la vue d'une position.
Correction d'un défaut déjà présent sur main : la vibration de fin de partie était remplacée par celle d'une prise quand le dernier coup de l'ordinateur frappait un pion.
Comment
Le travail a été délégué à un sous-agent. Un second agent l'a repris après une limite d'usage, à partir des commits déjà faits et des modifications en cours.
app/src/ui/router.tsest un module pur, testé sous Node. Il traduit le fragment en écran, et l'écran en fragment.app/src/ui/navigation.tsécoutehashchange. L'adresse est la seule source de vérité : l'application dessine l'écran qu'elle désigne.history.statela suite des adresses de l'onglet. Commehistory.goest asynchrone, une adresse demandée pendant un retour attend son arrivée.setupOf), sans règle réimplémentée.link;Vérification par la session principale, après fusion de
main:make lint, aucun problème, etmake test, 10/10. L'agent a fait passermake test-browserdans Chromium et Firefox sur le même code ;mainn'a apporté depuis que de la documentation.Choix et compromis
rsyncconcurrent, deux passages Firefox ont échoué sur ce contrôle, puis un passage a eu une erreur IndexedDB. Une fois lersyncfini, le passage complet a réussi. C'est probablement la charge du disque, mais c'est à surveiller.Risques et déploiement
Comment vérifier
Sur https://ustagammon.sans.pub après déploiement :
#/aide, toucher une question, puis le bouton retour : la question se ferme, puis on revient à la partie ;#/position/abc: le message « Lien illisible » s'affiche.Hors périmètre
Generated with Claude Code https://claude.com/claude-code