selection-save-duplicate-practice-release-2026-11-03.md 2.9 KB

重复历史单词记录保存修复上线(2026-11-03)

用户明确授权“直接上线更新”。已发布源提交 9953989ed6e757de23bb9379bc19697e2882a48f。

发布范围

只更新应用网关 xiaoshu.app.gateway 的 updateLearningWords,以及数据库函数 xs_mobile_teaching_write(text,text,text,text,jsonb)。网关其余函数逐一比较保持不变;SQL 使用当前正式函数的定义,仅替换已审函数体并保留其他属性。没有执行整套迁移、清理重复数据或重新部署前端。

  • 应用网关原哈希:a8f27027e749f44b9ba28b9e3b7a4eebbe09026f19a797536562c9b2b97d29a9
  • 应用网关新哈希:be6d3fa134ce400600be9ef245c53a8f5d9c151955f30c8e406ac4716b3393a8
  • 教学写入函数原函数体哈希:9a24362b5ee24f7aced29bcf258f3a9391f4a923b43f33f511749d92fa4d6cdd
  • 教学写入函数新函数体哈希:2ef95cc5c2959dc3d10d16a198ed06e551afcaa5289767b305db3c3924d051b6

备份当前正式网关及 SQL 定义,发布前确认函数未被其他任务修改。先事务更新 SQL 并回读,再选择性更新网关并回读,migration_status 正常。两处正式哈希均与待发布版本一致。

验证

  • 发布前重新运行 48 项相关回归测试,全部通过。
  • 发布后读取正式网关源码,在受限核验入口中使用真实分配老师账号执行该源码的完整 handler:调用 e_add_words 保存学员 1719、单元 158 的 73 个词,包含引发来源键冲突的 game / 586395,返回 HTTP 200。
  • 同一请求标识再次执行,响应与第一次相同,整份学习记录快照未再次变化,证明重复请求不会重复增加次数。
  • 以上业务写入置于保存点内,验证后全部回滚。该学员全部 PracticeRecord 的 JSON 快照哈希与验证前一致,诊断请求没有留下回执;未替老师永久完成这批词。
  • 正式 SQL 函数仍为已发布修复版本,正式网关回读哈希一致。
  • 手机端、管理端公网版本清单与发布前相同,本次无需更新客户端或重新构建前端。

首次核验脚本把成功 retcode 错当作必须为 1,而正式网关成功为 0;该次保存已经正常返回,核验断言失败后写入由保存点回滚。修正核验为接受现有协议的 0/1 成功值后,完整保存、重试和还原检查全部通过,没有修改业务协议。

证据及回滚基线:/Users/mac/.local/state/xiaoshu/cloud-releases/2026-11-03-selection-save-release/,包含 preflight-result.json、sql-before.json、gateway-before.json、sql-published.json、cloud-published.json、production-verification.json 及前端版本基线。

原页面保存失败后的待确认状态与请求标识保留,可直接点击“重试保存”继续。上述验证证明正式保存入口可处理这批重复历史记录,不等于已永久提交老师当前待保存的识词结果。