From 9a59c4a0d2a84483e95fd501770d2f3e83cdef1b Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 14 Sep 2026 20:27:13 +0000 Subject: [PATCH] =?UTF-8?q?Bloc=2099=20:=20le=20tampon=20de=20version=20ne?= =?UTF-8?q?=20fait=20plus=20partie=20des=20r=C3=A9glages=20joueur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug utilisateur : un transfert depuis le simulateur Stuff vers les paramètres du joueur pouvait revenir à zéro tout seul, peu après le chargement de la page. C'est aussi ce qui rendait player-settings-panel.test.tsx instable en CI depuis le Bloc 93. Cause. `safePlayerSettings` étalait l'objet stocké en entier, donc `v` — de la comptabilité de stockage, absente de `PlayerSettings` — repartait à l'intérieur des réglages. Toute comparaison entre la valeur en mémoire et la valeur relue était donc inégale par construction, quel que soit le contenu. La garde de `syncFromStorage` en est une : le panneau répondait à sa propre sauvegarde par un nouvel objet, et le cycle écriture/diffusion supplémentaire qui suivait portait un instantané d'avant le transfert — instantané qui écrasait l'écriture externe arrivée entre-temps. Correctif : `v` est séparé des réglages à la lecture (déstructuration), et sert uniquement à décider de la migration v1 → v2 comme avant. Rien d'autre ne change : la sérialisation continue d'estampiller. Mesure, comparaison contrôlée (même charge CPU, 6 boucles saturantes, 60 exécutions du fichier de test dans chaque bras) : avant : 6 échecs / 60 après : 0 échec / 60 0/60 ne prouve pas l'impossibilité, mais la cause est corrigée de façon déterministe et deux tests l'épinglent : `safePlayerSettings` rend les réglages seuls (mêmes clés que `defaultPlayerSettings`, comparaison JSON égale), et un montage ne produit plus qu'une seule sauvegarde/diffusion au lieu de deux. Les deux rougissent sur le code d'avant. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01HJgsDSfsCbbn8cochFGwe2 --- src/components/player-settings-panel.test.tsx | 50 +++++++++++++++++-- src/components/player-settings-panel.tsx | 29 +++++++---- 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/components/player-settings-panel.test.tsx b/src/components/player-settings-panel.test.tsx index d1e327e4..0ee25267 100644 --- a/src/components/player-settings-panel.test.tsx +++ b/src/components/player-settings-panel.test.tsx @@ -11,10 +11,12 @@ import { NextIntlClientProvider } from "next-intl"; import messages from "../../messages/fr.json"; import { PlayerSettingsPanel, + playerSettingsChangedEvent, playerStorageKey, replaceEquipmentSkills, safePlayerSettings, } from "./player-settings-panel"; +import { defaultPlayerSettings } from "../lib/player-settings"; import { templarRates } from "../lib/gems-templars"; // Bloc 68/F: the league field is a LeagueButtons group now, not a