docs: 优化工作台的 spec 与 6 个实施 issue(.scratch/wallpaper-optimization/)

按本仓 issue-tracker 约定落盘:spec.md 记决策与验收,issues/NN-*.md 一步一票。
01 已完成,02-06 待做。
This commit is contained in:
Shuery committed 2026-09-19 19:27:47 +08:00
1 parent 09ff322fe8
commit 8ad177c822
7 files changed
+152

No files matched your search

@@ -0,0 +1,20 @@
# 03 健壮性:初始化状态机、死代码、用户级覆盖语义
Status: ready-for-agent
## 问题
1. **初始化竞态(已实证)**:`SpineController.changeConfig()` 整个函数体都在 `if (this.player)` 里,
包括状态赋值。WE 可能在 `window.load` 之前就下发用户属性,此时预设被静默丢弃:
同一份代码、同一份属性,`load` 之后下发得到 `animation`(kv37,正确),
`DOMContentLoaded` 时下发得到 `idle`(xilian)——背景与音乐已切到 kv37、立绘还是昔涟。
修法:**状态先写、应用后置**;`changeX()` 无条件更新状态,只在有 `player` 时应用,加载完成时统一应用一次。
2. `index.js` 里有一段重复的 `window.wallpaperRegisterListener`(该 API 在本机 WE 不存在),是死代码。
3. `SpineController.adjustCanvas()` 与播放器自身的 resize 重复,且用 `getBoundingClientRect()` 写 `canvas.width` 而未乘 DPR。
4. 用户级覆盖语义:用户自定义了音源/音量后,切换预设不得把它清回预设默认值。
## 验收
- 把"属性在 `DOMContentLoaded` 下发"这一路作为回归断言:玩家实际使用的动画必须与所选预设一致。
- 死代码与重复 resize 移除后,对拍仍无回归。
- 同一份预设往返切换 20 次,用户自定义音源/音量保持不变。