{
  "appVersion": "1.1.53",
  "pkgVersion": "20261015-v63",
  "schemaVersion": 2,
  "releasedAt": "2026-10-15T11:26:27.129Z",
  "type": "full",
  "file": "avc-upgrade-20261015-v63.zip",
  "size": 3733882,
  "sha256": "8cb9134545b03406cb0c47c19418c485ff6818c3311e6b9b3e9c13f5b781adda",
  "includesMiniprogram": true,
  "fileCount": 148,
  "deletedCount": 0,
  "changelog": "## 1.1.53 — 2026-10-16\n\n### 修复\n\n#### ★ 小程序一键授权过手机号，后台升级后显示「未绑定」—— 账户合并改为字段级补缺\n\n**现象**：小程序「绑定手机号 → 一键绑定」授权成功过，后台升级后该用户手机号显示「未绑定」。\n\n**根因**：绑手机号的写入本身是正常的（`acc.phone = p` + 落盘），但历史版本的云同步\n指纹 bug（1.1.51 才修）导致这次绑定**只落在服务器本地缓存、从没进云端数据库**。\n1.1.52 的启动救援会合并本地缓存，但账户合并是**整条二选一、按 updatedAt 挑新者**——\n而绑手机号、改积分、开会员这些写路径**从不写 updatedAt**，两边时间戳打平时\n云端那条（没有手机号）整条胜出，本地缓存里独有的 `phone` 字段被**整条丢掉**。\n\n**修复**：\n\n- `mergeAccounts` 改为**字段级合并**：内存（云端权威数据）字段优先，\n  本地缓存里**云端没有的字段**（`phone` / `vip` / `openid` 等历史遗留）逐个补回；\n  `credits` 等两边都有的字段以云端为准（不被本地旧值覆盖）；\n- 反向同样保护：云端已同步的手机号不会被本地旧快照抹掉；\n- `bindPhone` 补写 `updatedAt`（此前多数账户写路径不写，导致合并无从判断新旧）。\n\n**验证**：`verify:local-rescue` 扩至 29 项断言，新增 G 组：\n「云端无 phone + 本地有 → 启动补回手机号」「云端有 phone + 本地旧快照无 → 保留」\n「credits 始终以云端为准」。防假绿：换回旧「整条二选一」合并 → G2 变红（`phone=`空，\n精确复现症状）。全量回归 31 套件 0 失败。\n\n### 升级注意\n\n- 改动涉及 `server/lib/store.js`、`server/lib/membership.js`，**无需重新导入小程序代码包**。\n- 数据库迁移：无。\n- 升级重启后：本地缓存里还留有手机号绑定的用户会**自动补回**；\n  本地缓存已被清掉的，请该用户在小程序重新点一次「一键绑定」（此后绑定即时进数据库）。",
  "packFile": "avc-pack-20261015-v63"
}
