Bloc 99 â đ Transfert Stuff â ParamĂštres joueur annulĂ© tout seul (tampon de version dans les rĂ©glages) - #125
Merged
Conversation
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 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HJgsDSfsCbbn8cochFGwe2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Le bug, tel qu'un joueur le vit
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 le mĂȘme dĂ©faut qui rendait
player-settings-panel.test.tsxinstable en CI depuis le Bloc 93 â je l'avais signalĂ© sans le corriger.J'ai capturĂ© un Ă©chec rĂ©el avant de toucher au code, pour ne pas partir d'une hypothĂšse : c'est bien le test
reflects an external equipment-skills transfer livequi tombe, surAttaque avec équipementattendu 12.5, reçu 0. Le transfert est écrasé, pas ignoré.La cause
safePlayerSettingsĂ©talait l'objet stockĂ© en entier :parsedcontientv, le tampon de version â de la comptabilitĂ© de stockage, absente du typePlayerSettings. Il repartait donc Ă l'intĂ©rieur des rĂ©glages, et TypeScript ne le voyait pas (un spread dePartial<PlayerSettings> & { v?: number }passe).ConsĂ©quence : toute comparaison entre la valeur en mĂ©moire et la valeur relue est inĂ©gale par construction, quel que soit le contenu. VĂ©rifiĂ© sur le vrai code avant correctif :
La garde de
syncFromStorageen est une :Le panneau rĂ©pondait donc Ă sa propre sauvegarde par un nouvel objet. Le cycle Ă©criture/diffusion supplĂ©mentaire qui suivait portait un instantanĂ© d'avant le transfert â et c'est lui qui Ă©crasait l'Ă©criture externe arrivĂ©e entre-temps.
Le correctif
vest sĂ©parĂ© des rĂ©glages Ă la lecture, et sert uniquement Ă dĂ©cider de la migration v1 â v2 comme avant :Rien d'autre ne change : la sĂ©rialisation continue d'estampiller,
replaceEquipmentSkillsaussi.Mesure â comparaison contrĂŽlĂ©e
MĂȘme charge CPU (6 boucles saturantes), mĂȘme N, 60 exĂ©cutions du fichier de test dans chaque bras, le bras « avant » tournĂ© sur le code d'origine restaurĂ© :
0/60 ne prouve pas l'impossibilitĂ© â c'est une mesure, pas une dĂ©monstration. Mais la cause, elle, est corrigĂ©e de façon dĂ©terministe, et c'est ce que verrouillent les deux tests ajoutĂ©s.
Tests
safePlayerSettingsrend les rĂ©glages seuls : mĂȘmes clĂ©s quedefaultPlayerSettings, et la comparaison JSON que faitsyncFromStorageest Ă©gale sur des rĂ©glages inchangĂ©s.Les deux rougissent sur le code d'avant (
'v'en clé surnuméraire ; 2 diffusions au lieu de 1), donc ni l'un ni l'autre n'est décoratif.Validation
pnpm lint+ typecheck + prettier : proprespnpm test: 1298 tests verts (+2)pnpm build: succĂšspnpm test:e2e: 87/87 verts (4,9 min), sur une base e2e recréée Ă neufđ€ Generated with Claude Code
https://claude.ai/code/session_01HJgsDSfsCbbn8cochFGwe2
Generated by Claude Code