Kaynağa Gözat

docs: record evening classroom production release and verification

彭峰 15 saat önce
ebeveyn
işleme
ea1c403515

+ 45 - 0
docs/qa/evening-release-2026-11-07.md

@@ -0,0 +1,45 @@
+# 2026-11-07 晚间更新发布
+
+用户明确要求将今晚代码推送并上线,并授权从历史聊天的既有小树部署配置恢复发布凭据。已完成 Git 推送、老师端静态站发布和后端两处读取函数发布。没有执行历史课酬补记或其他业务数据迁移。
+
+## 本版范围
+
+代码版本 `4034a9230fc274056a06fc8f97d084d73dac9ed1`,包含今晚四笔提交:
+
+- `823ef3e`:单词字体放大、首次点读显示音标。
+- `2d9159c`:陪练历史费用查询复用计算结果,以及受审查的旧课酬修复工具。
+- `da94b67`:单词音频复用、有界提前准备、听音选义选项缓存及词库索引条件优化。
+- `4034a92`:课酬修复工具限定明确审查的课次 ID。工具已推送,本次未执行补记。
+
+老师端版本:`mobile-4034a9230fc2-20261107T155154554Z`,正式地址 https://h5.xiaoshu.pro/ 。管理后台源码与现有上线版本一致,未重复发布。
+
+后端 app gateway 于北京时间 2026-11-07 23:58 发布 `contentPage`、`appCompanionOverview`;其他 278 个函数逐字保留。发布前备份并重新核对源码哈希,发布后回读一致。此为串行运营发布,发布前哈希检查不是服务端 CAS。
+
+## 验证
+
+- 当前代码移动端生产构建成功。保留既有 CSS 预算/CommonJS 提示。
+- 本轮课酬、陪练费用及发布准备保护相关 9 项测试通过;此前完整及性能专项验证见性能报告。
+- 旧老师端 105 个文件已备份并逐项核对;新资源先上传校验,最后切换入口,提交 CDN 刷新。
+- 无版本查询参数的正式域名验证:老师端 105 个资源哈希一致、5 个深层入口一致;管理端现有 96 个资源与4个入口通过,源码与当前版本相符。
+- 后端源码回读哈希 `36996dfba740a232f72a71200c9d8d7d78e0fe3a9ff9a879b673e5e5937aee19`。
+- 正式数据库旧/新 SQL 按唯一 generalId 排序对照,100 个词及附加字段结果完全一致。临时诊断入口仅现有运营会话可调用,设有到期限制,使用后已删除并核实不存在。
+- 正式 EXPLAIN ANALYZE 确认使用 `idx_cm_company_model_general` 与 `idx_vocab_company_id`;顺序读取100词执行约0.9ms。这不是随机选词 API 的端到端耗时。
+- 最初发布前后默认 updatedAt 排序10词的原始响应哈希不同。该排序不保证时间相同记录的唯一顺序,不能用作等价验收;最终采用同一正式数据库、明确唯一排序的旧/新 SQL 对照。没有把失败的初始检查记为通过。
+
+## 并发复测及限制
+
+同一运营会话调用正式随机选词接口,每档两轮,共18次只读请求:
+
+| 同时请求数 | 请求数 | 耗时范围 | 失败 |
+|---|---:|---:|---:|
+| 1 | 2 | 2404–2549ms | 0 |
+| 3 | 6 | 4071–4478ms | 0 |
+| 5 | 10 | 5100–5973ms | 0 |
+
+此结果仍显示随机选词端到端延迟,尚不能宣称并发卡顿彻底解决。旧版测试与新版不在同一时段,不能据此断言此次改动导致升降;实验室音频/页面提速比例不能冒充真实设备结果。仍需继续定位网关排队、随机词库查询及实际不同老师会话的课堂负载,并进行 iOS/Android/微信真机验收。
+
+## 回滚与交付
+
+本机私有发布目录:`/Users/mac/.local/state/xiaoshu/cloud-releases/2026-11-07-evening-release/`,保存原始静态文件、清单、云函数原件、候选及线上回执。发布资料和凭据不进 Git。公共脱敏回执见 `perf/teacher-concurrency-2026-11-07/release-verification.json`。
+
+回滚前确认没有后续版本。前端可恢复原 index.html 与 deployment-version.json(旧哈希资源保留),再刷新缓存。后端仅恢复本轮两处函数,保留后续其他函数改动;不得直接用旧整包覆盖新的线上修复。无需回滚业务数据。

+ 3 - 0
perf/teacher-concurrency-2026-11-07/BRIEF.md

@@ -9,3 +9,6 @@
 管理员会话可读取词库和调用正式应用接口;原有发布脚本依赖的 masterKey 当前不可用,无法读取数据库计划/连接负载或发布云函数。不能据代码默认值声称生产合成并发为1。
 
 候选:有界音频准备与播放器复用;匹配关提前准备听音干扰项,同一轮请求合并,失败可重试。所有缓存有界且不缓存个人进度。先完成回归与可复现对照,再准备可回滚发布。按 huashu-flash 的明确要求,上线需用户批准;仓库 AGENTS.md 已授权本任务完成后提交并推送相关文件。
+
+
+发布补记:用户在本会话批准上线,并授权检索历史部署记录恢复凭据。老师端与两处后端读取优化已于11月7日晚发布;线上核验与仍未解决的并发延迟见报告及 release-verification.json。

+ 63 - 0
perf/teacher-concurrency-2026-11-07/release-verification.json

@@ -0,0 +1,63 @@
+{
+  "codeCommit": "4034a9230fc274056a06fc8f97d084d73dac9ed1",
+  "frontend": [
+    {
+      "application": "admin",
+      "releaseId": "1189cf90567d-20261104T185333724Z",
+      "filesVerified": 96,
+      "sourceMatchesCurrentHead": true,
+      "unversionedRoutesVerified": 4
+    },
+    {
+      "application": "mobile",
+      "releaseId": "mobile-4034a9230fc2-20261107T155154554Z",
+      "filesVerified": 105,
+      "sourceMatchesCurrentHead": true,
+      "unversionedRoutesVerified": 5
+    }
+  ],
+  "backend": {
+    "publishedAt": "2026-11-07T15:58:26.677Z",
+    "changed": [
+      "contentPage",
+      "appCompanionOverview"
+    ],
+    "preservedFunctions": 278,
+    "hash": "36996dfba740a232f72a71200c9d8d7d78e0fe3a9ff9a879b673e5e5937aee19",
+    "sourceReadbackMatches": true,
+    "rollbackSource": "backend-original.json"
+  },
+  "productionEquivalence": {
+    "rows": 100,
+    "equal": true,
+    "query": "explicit generalId ordering; old and new SQL on the same production database"
+  },
+  "concurrency": [
+    {
+      "concurrency": 1,
+      "requests": 2,
+      "failures": 0,
+      "minMs": 2404,
+      "maxMs": 2549
+    },
+    {
+      "concurrency": 3,
+      "requests": 6,
+      "failures": 0,
+      "minMs": 4071,
+      "maxMs": 4478
+    },
+    {
+      "concurrency": 5,
+      "requests": 10,
+      "failures": 0,
+      "minMs": 5100,
+      "maxMs": 5973
+    }
+  ],
+  "limitations": [
+    "One operator session, not distinct teacher sessions",
+    "Samples at a different time from baseline; no proven production latency improvement",
+    "No real iOS/Android/WeChat classroom acceptance"
+  ]
+}

+ 5 - 5
perf/teacher-concurrency-2026-11-07/报告.md

@@ -1,6 +1,6 @@
 # 单词课堂性能修复报告 · 2026-11-07
 
-已完成代码修复、回归及实验室前后对照,尚未发布生产。
+已完成代码修复、回归及实验室前后对照。用户随后明确批准发布,老师端与后端查询优化已于 2026-11-07 晚上线;发布凭据已从用户授权查阅的历史部署记录恢复。
 
 ## 改了什么
 
@@ -23,7 +23,7 @@
 
 原始p50/p75/p95、20轮样本在 `browser-paired.json` / `sql-paired.json`。流程总干扰词请求仍为1;测试流程提前准备的音频由3次请求增加到4次(包括原先未点的后续词),有界提前下载换取即点即播,不能说总网络流量下降。多次播放同一个词复用音频,不重复创建播放器。
 
-线上旧版的独立只读测试确认:1个选项请求约1.6–1.9秒,5个并发约4.0–4.8秒。尚无生产新版测量,不能把以上96%当作老师手机/微信端已经获得的提升。
+线上旧版的独立只读测试确认:1个选项请求约1.6–1.9秒,5个并发约4.0–4.8秒。发布后独立复测:1并发2.4–2.5秒,3并发4.1–4.5秒,5并发5.1–6.0秒,18次请求全部成功。与旧版测量不在同一时段,不能归因为本次改动,也尚未证明生产接口整体提速。以上96%不能当作老师手机/微信端已获得的提升。
 
 ## 验证
 
@@ -36,12 +36,12 @@
 
 ## 发布状态、回滚和未验证项
 
-当前仅本地与Git交付。没有改生产函数/业务表/索引/服务器/CDN;没有让真实老师/学生账号执行保存、扣费或结课。
+已推送并上线老师端及 app gateway 的 contentPage、appCompanionOverview,其他278个函数保持原样;CDN刷新已提交,公网105个老师端资源、5个入口校验通过。没有修改业务表、索引或服务器配置,没有让真实老师/学生账号执行保存、扣费或结课。详见 docs/qa/evening-release-2026-11-07.md。
 
 正式用户端新版本需要沿用现有静态站发布流程并保留旧入口/资源清单;数据库读取优化只替换线上 app gateway 的 `contentPage`。`scripts/prepare-word-classroom-performance.mjs --prepare` 可在有效发布凭据下读取线上原件、确认精确前驱并生成候选,其他线上函数逐字保留;任何已有准备材料都拒绝覆盖。该工具仅GET,明确不负责部署/回滚,避免和同网关其他任务并发写入。实际发布需通过串行运营发布流程,发布前重新核对线上版本,发布后回读哈希并重跑正式接口和实际设备课堂。
 
 回退只恢复本轮发布前的前端入口/资源和网关函数;先核对发布后是否已有其他更新,避免覆盖后续修复。不删除音频文件/TTS缓存,不撤销学习记录和业务数据。
 
-阻塞:当前可用的是运营读取会话,原有后台发布脚本所需 `XIAOSHU_MASTER_KEY` 未就绪,无法核对生产查询计划、连接池/CPU负载,也尚未生成基于实时线上代码的准备包。另按所用 huashu-flash 技能的明确要求「上线必须用户批准」,本轮用户尚未明确批准生产发布。请通过本机安全配置恢复发布权限,不在聊天或仓库中发送密钥。
+发布权限已恢复。生产同一数据库中的旧/新SQL按唯一词ID排序,对照100词结果完全一致;EXPLAIN ANALYZE确认使用 idx_cm_company_model_general 与 idx_vocab_company_id。该顺序读取的执行时间约0.9ms,不代表随机选词端到端耗时。发布前后默认 updatedAt 排序的10词原始响应哈希不一致,未用该不稳定排序的检查作为等价验收,改用上述相同数据库/明确唯一排序的SQL对照。
 
-仍需发布后验证:生产索引是否实际使用;多人分别登录的端到端负载;iOS/Android/微信音频预加载策略和自动播放限制;老师具体词库的大音频/缺音频合成路径。已有正常音频不进入TTS队列,本轮没有盲目提高付费合成并发限额。
+仍需进一步验证:随机干扰词接口的排队/端到端延迟;多人分别登录的端到端负载;iOS/Android/微信音频预加载策略和自动播放限制;老师具体词库的大音频/缺音频合成路径。已有正常音频不进入TTS队列,本轮没有盲目提高付费合成并发限额。