Corrections : niveau d'évaluation du prompt, tests instables sous Firefox et Chromium #60

Manually merged
pierre merged 7 commits from corrections-plis-firefox into main 2026-11-12 08:37:38 +00:00
Owner

Pourquoi

Trois défauts ont été repérés pendant les livraisons de 1f et des retours des joueurs.

  1. Le niveau d'évaluation du prompt était faux. Le prompt d'un coup annonçait « Classement de GNU Backgammon (analyse à 2 plis) », mais chaque ligne disait « évalué à 1 pli ». Le classement venait d'un autre calcul que celui du conseil du maître. Or la règle de 1f veut que le prompt reprenne exactement les chiffres affichés par l'application.
  2. Un test échouait parfois sous Firefox : « la nouvelle partie n'a pas été enregistrée », dans la section « mes parties » de play.mjs. Relancé, il passait.
  3. Deux autres fragilités du même test :
    • sous Firefox, touchTarget recevait une boîte nulle ;
    • sous Chromium, après le rechargement hors ligne, le bilan rouvert d'une partie finie couvrait le bouton Aide.

Quoi

  • Prompt d'un coup. Il donne le classement de l'analyse du coup joué, celui du conseil du maître, avec les mêmes équités que la feuille du maître et l'écran d'analyse. Chaque coup y est marqué au niveau où gnubg l'a réellement évalué.
  • Tests navigateur. Ils attendent des états observables au lieu de lire trop tôt. Aucun comportement de l'application ne change pour le joueur.

Comment

Le travail a été délégué à un sous-agent, arrêté par la limite d'usage juste avant la fin. La session principale a terminé la tâche :

  • fusion de main ;
  • correction du test d'aide après le rechargement ;
  • vérifications.

Moteur (engine.c, sans toucher à engine/gnubg/) :

  • engine_analyse_move rend désormais les dix premiers coups de la liste de l'analyse, chacun au niveau où gnubg l'a évalué ;
  • il refait d'abord l'analyse de la chance, comme AnalyzeMove dans gnubg de bureau, car son cache change les coups restés à 0 pli ;
  • les références d'analyse gagnent le niveau de chaque coup du classement, et compare.py le compare au gnubg de bureau.

Domaine : le conseil (version 2) range ce classement. Le prompt le reprend tel quel, avec en titre le niveau du meilleur coup.

Test « nouvelle partie » :

  • sous Firefox et sur disque lent, l'enregistrement de la nouvelle partie attend dans la file, derrière l'analyse de la partie finie ;
  • le test lisait IndexedDB trop tôt : il attend maintenant que la partie en cours change ;
  • un test unitaire vérifie que rien n'est perdu avec un stockage lent. Ce n'est donc pas un défaut de l'application.

touchTarget : les zones du plateau sont relevées en une seule lecture dans la page, et le test attend qu'elles soient toutes présentes.

Rechargement hors ligne : le test ferme le bilan, s'il est rouvert, avant d'ouvrir l'aide.

Vérification :

  • make lint : aucun problème ;
  • make test : 10/10, références comprises ;
  • make test-browser : suite complète au vert, sous Chromium et Firefox.

Choix et compromis

  • Classement du prompt. Il reprend celui du conseil, déjà calculé, plutôt que de lancer un second classement : le prompt et l'écran ne peuvent plus diverger.
  • Plafond de dix coups. Ils suffisent au prompt (le top 3) et à la feuille d'explication.

Risques et déploiement

  • Conseils des anciennes parties. Ils passent en version 2. D'après la règle de migration de 1d, un conseil d'une autre version est oublié au rechargement. Les parties en cours perdent donc leurs lignes du maître déjà affichées, mais le bilan et l'analyse se recalculent.
  • Moteur WebAssembly. Il change, et le service worker distribue la nouvelle version.
  • Retour arrière. Annuler la fusion.

Comment vérifier

make lint && make test && make test-browser
SCRIPTS=play BROWSERS=firefox make test-browser    # deux fois de suite

Dans l'application, faire une erreur, ouvrir la feuille du maître, puis « Demander à une IA ». Les équités du prompt doivent être celles de la feuille, et le niveau doit être le même dans le titre et dans les lignes.

Hors périmètre

  • La relecture du texte des prompts.
  • 1g, 1h, 1i et 1j.

Generated with Claude Code https://claude.com/claude-code

## Pourquoi Trois défauts ont été repérés pendant les livraisons de 1f et des retours des joueurs. 1. **Le niveau d'évaluation du prompt était faux.** Le prompt d'un coup annonçait « Classement de GNU Backgammon (analyse à 2 plis) », mais chaque ligne disait « évalué à 1 pli ». Le classement venait d'un autre calcul que celui du conseil du maître. Or la règle de 1f veut que le prompt reprenne exactement les chiffres affichés par l'application. 2. **Un test échouait parfois sous Firefox** : « la nouvelle partie n'a pas été enregistrée », dans la section « mes parties » de `play.mjs`. Relancé, il passait. 3. **Deux autres fragilités du même test** : - sous Firefox, `touchTarget` recevait une boîte nulle ; - sous Chromium, après le rechargement hors ligne, le bilan rouvert d'une partie finie couvrait le bouton Aide. ## Quoi - **Prompt d'un coup.** Il donne le classement de l'analyse du coup joué, celui du conseil du maître, avec les mêmes équités que la feuille du maître et l'écran d'analyse. Chaque coup y est marqué au niveau où gnubg l'a réellement évalué. - **Tests navigateur.** Ils attendent des états observables au lieu de lire trop tôt. Aucun comportement de l'application ne change pour le joueur. ## Comment Le travail a été délégué à un sous-agent, arrêté par la limite d'usage juste avant la fin. La session principale a terminé la tâche : - fusion de `main` ; - correction du test d'aide après le rechargement ; - vérifications. **Moteur** (`engine.c`, sans toucher à `engine/gnubg/`) : - `engine_analyse_move` rend désormais les dix premiers coups de la liste de l'analyse, chacun au niveau où gnubg l'a évalué ; - il refait d'abord l'analyse de la chance, comme `AnalyzeMove` dans gnubg de bureau, car son cache change les coups restés à 0 pli ; - les références d'analyse gagnent le niveau de chaque coup du classement, et `compare.py` le compare au gnubg de bureau. **Domaine** : le conseil (version 2) range ce classement. Le prompt le reprend tel quel, avec en titre le niveau du meilleur coup. **Test « nouvelle partie »** : - sous Firefox et sur disque lent, l'enregistrement de la nouvelle partie attend dans la file, derrière l'analyse de la partie finie ; - le test lisait IndexedDB trop tôt : il attend maintenant que la partie en cours change ; - un test unitaire vérifie que rien n'est perdu avec un stockage lent. Ce n'est donc pas un défaut de l'application. **`touchTarget`** : les zones du plateau sont relevées en une seule lecture dans la page, et le test attend qu'elles soient toutes présentes. **Rechargement hors ligne** : le test ferme le bilan, s'il est rouvert, avant d'ouvrir l'aide. **Vérification** : - `make lint` : aucun problème ; - `make test` : 10/10, références comprises ; - `make test-browser` : suite complète au vert, sous Chromium et Firefox. ## Choix et compromis - **Classement du prompt.** Il reprend celui du conseil, déjà calculé, plutôt que de lancer un second classement : le prompt et l'écran ne peuvent plus diverger. - **Plafond de dix coups.** Ils suffisent au prompt (le top 3) et à la feuille d'explication. ## Risques et déploiement - **Conseils des anciennes parties.** Ils passent en version 2. D'après la règle de migration de 1d, un conseil d'une autre version est oublié au rechargement. Les parties en cours perdent donc leurs lignes du maître déjà affichées, mais le bilan et l'analyse se recalculent. - **Moteur WebAssembly.** Il change, et le service worker distribue la nouvelle version. - **Retour arrière.** Annuler la fusion. ## Comment vérifier ``` make lint && make test && make test-browser SCRIPTS=play BROWSERS=firefox make test-browser # deux fois de suite ``` Dans l'application, faire une erreur, ouvrir la feuille du maître, puis « Demander à une IA ». Les équités du prompt doivent être celles de la feuille, et le niveau doit être le même dans le titre et dans les lignes. ## Hors périmètre - La relecture du texte des prompts. - 1g, 1h, 1i et 1j. Generated with Claude Code https://claude.com/claude-code
pierre added 7 commits 2026-11-12 08:32:51 +00:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
engine_analyse_move rend les dix premiers coups de la liste de l'analyse,
chacun au niveau où gnubg l'a évalué, et refait d'abord l'analyse de la
chance comme AnalyzeMove : son cache change les coups restés à 0 pli.
Les références d'analyse gagnent le niveau de chaque coup du classement,
comparé par compare.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Le classement du conseil vient de l'analyse du coup joué (conseils en
version 2) : mêmes équités que la feuille du maître et l'analyse. Le
titre dit le niveau du meilleur coup ; une ligne plus basse le dit aussi.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sous Firefox, sur disque lent, l'enregistrement de la nouvelle partie
attend dans la file derrière l'analyse de la partie finie ; le test lisait
IndexedDB trop tôt. Il attend désormais que la partie en cours change.
Test unitaire : rien n'est perdu avec un stockage lent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
touchTarget mesurait chaque zone par boundingBox ; une zone remplacée
entre-temps par un nouveau dessin du plateau n'avait plus de boîte (null,
vu sous Firefox). Les zones sont relevées dans la page en une lecture, et
le test attend qu'elles soient toutes là.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
pierre manually merged commit cfb2e485c3 into main 2026-11-12 08:37:38 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: pierre/Ustagammon#60