Parcourir la source

docs(release): verify student home hours rollout and unchanged credits

彭峰 il y a 2 heures
Parent
commit
e9f796778f

+ 2 - 0
docs/qa/student-home-hours-2026-11-15.md

@@ -1,5 +1,7 @@
 # 学生首页时长统计核对与四项显示
 
+> 后续状态:用户已授权上线,发布与验收记录见 [student-home-hours-release-2026-11-15.md](student-home-hours-release-2026-11-15.md)。以下保留发布前的核对记录。
+
 2026-11-15。用户先要求核对熊梓含初中及其他学生的累计陪练时长,随后明确要求学生首页隐藏累计时长,仅保留截图红框余额。当前交付为本地修复,尚未上线。
 
 ## 熊梓含初中

+ 177 - 0
docs/qa/student-home-hours-release-2026-11-15.json

@@ -0,0 +1,177 @@
+{
+  "state": "deployed_and_verified",
+  "commit": "86786f6cf2fc8ced0eb671695df2ea86aaa52126",
+  "releaseId": "mobile-student-hours-86786f6cf2fc-20261115T053650880Z",
+  "role": "student-home and read-only student statistics",
+  "public": [
+    {
+      "role": "mobile",
+      "releaseId": "mobile-student-hours-86786f6cf2fc-20261115T053650880Z",
+      "commit": "86786f6cf2fc8ced0eb671695df2ea86aaa52126",
+      "filesVerified": 105,
+      "routes": [
+        "pages/home/index",
+        "pages/member/starshop",
+        "pages/companion/index",
+        "pages/stu/stu_abc",
+        "pages/stu/stu_con"
+      ]
+    }
+  ],
+  "cdn": {
+    "id": "8198596118",
+    "status": "task_done",
+    "processing": 0,
+    "succeed": 1,
+    "failed": 0,
+    "total": 1
+  },
+  "gateways": [
+    {
+      "path": "xiaoshu/app/gateway",
+      "sha256": "08c15a454075e7ccf27657b238469fd18fc83b6aa7860d960bd76bfeccc59323",
+      "updatedAt": "2026-11-15T05:37:48.842Z"
+    },
+    {
+      "path": "xiaoshu/ops/gateway-v3",
+      "sha256": "6f99a3826ab90bb3911d13bf33c2290ebbf850d77ac8163ac4c20b22c8518c0f",
+      "updatedAt": "2026-11-14T00:38:27.640Z"
+    }
+  ],
+  "financialVerification": {
+    "targetHours": 19,
+    "formal60Minutes": 18,
+    "trial": 1,
+    "ledgerVersionUnchanged": true,
+    "ledgerGroups": 41,
+    "creditAccountsUnchanged": true,
+    "lessonRowsUnchanged": true,
+    "teacherStatsUnchanged": true,
+    "vocabularyTotalUnchanged": true
+  },
+  "ui": [
+    {
+      "scenario": "target-cold",
+      "ok": true,
+      "role": "student",
+      "jsErrors": 0,
+      "blockedWrites": 0,
+      "viewports": [
+        390,
+        1024
+      ],
+      "responses": [
+        {
+          "action": "app_account_overview",
+          "status": 200,
+          "retcode": 0
+        },
+        {
+          "action": "app_review_page",
+          "status": 200,
+          "retcode": 0
+        },
+        {
+          "action": "e_order_tongji",
+          "status": 200,
+          "retcode": 0,
+          "hours": "19"
+        }
+      ],
+      "visibleBalanceAndVocabularyMatchBefore": true
+    },
+    {
+      "scenario": "target-warm",
+      "ok": true,
+      "role": "student",
+      "jsErrors": 0,
+      "blockedWrites": 0,
+      "viewports": [
+        390,
+        1024
+      ],
+      "responses": [
+        {
+          "action": "app_account_overview",
+          "status": 200,
+          "retcode": 0
+        },
+        {
+          "action": "app_review_page",
+          "status": 200,
+          "retcode": 0
+        },
+        {
+          "action": "e_order_tongji",
+          "status": 200,
+          "retcode": 0,
+          "hours": "19"
+        }
+      ],
+      "visibleBalanceAndVocabularyMatchBefore": true
+    },
+    {
+      "scenario": "teacher",
+      "ok": true,
+      "role": "teacher",
+      "jsErrors": 0,
+      "blockedWrites": 0,
+      "viewports": [
+        390,
+        1024
+      ],
+      "responses": [
+        {
+          "action": "app_review_page",
+          "status": 200,
+          "retcode": 0
+        },
+        {
+          "action": "e_order_tongji",
+          "status": 200,
+          "retcode": 0,
+          "hours": "208"
+        }
+      ]
+    }
+  ],
+  "browser": {
+    "student-course": {
+      "samples": 10,
+      "success": 10,
+      "p75ReadyMs": 2696,
+      "p95ReadyMs": 3538
+    },
+    "student-home": {
+      "samples": 10,
+      "success": 10,
+      "p75ReadyMs": 2603,
+      "p95ReadyMs": 3486
+    },
+    "teacher-course": {
+      "samples": 10,
+      "success": 10,
+      "p75ReadyMs": 2677,
+      "p95ReadyMs": 2994
+    },
+    "teacher-home": {
+      "samples": 10,
+      "success": 10,
+      "p75ReadyMs": 3129,
+      "p95ReadyMs": 3272
+    }
+  },
+  "continuousReads": {
+    "attempts": 40,
+    "success": 40,
+    "capturedApiRequestFailures": 0
+  },
+  "protectedFinancialModuleAndSqlHashesUnchanged": 14,
+  "noBusinessWritesPerformed": true,
+  "limitations": [
+    "Financial readback verifies the target account and teacher statistics, not a complete financial audit of every member.",
+    "Existing valid sessions were used; no new password login or physical-device acceptance.",
+    "Historical incomplete-record cases remain unresolved and are not converted into balances.",
+    "Shared-worker timeout root cause is not established by this release sample."
+  ]
+}

+ 46 - 0
docs/qa/student-home-hours-release-2026-11-15.md

@@ -0,0 +1,46 @@
+# 学生累计统计修正与隐藏卡片发布
+
+2026-11-15(北京时间),用户明确授权“把这次隐藏累计时长和统计修正上线,课时和费用别动,上线后再核对一下”。候选提交 `86786f6cf2fc8ced0eb671695df2ea86aaa52126`。
+
+## 范围
+
+- H5:`mobile-student-hours-86786f6cf2fc-20261115T053650880Z`,此前版本 `mobile-home-cache-v2-6d6f28466265-20261114T160313735Z`。仅发布移动端产物,未发布待上线的管理后台课程栏时长显示。
+- app gateway:以最新线上源码为底本,仅替换 `orderStatistics` 的学生分支/空值输出,附加学生只读统计函数。目标函数与已测试基线逐字一致;事务带旧代码MD5校验。其余网关代码逐字保留,包括教师统计、收费与运行环境兼容代码。
+- app gateway SHA-256:`08c15a454075e7ccf27657b238469fd18fc83b6aa7860d960bd76bfeccc59323`;原值 `33b236b9606e7bdc8f4f134b6915cdac0f717462d65ee7b36cf1efcbbf714745`。
+- ops gateway维持 `6f99a3826ab90bb3911d13bf33c2290ebbf850d77ac8163ac4c20b22c8518c0f`。没有修改数据库结构、充值、课时预留、扣课、退款、费用或结算规则,没有重新结课或重跑导入。
+
+## 发布与备份
+
+发布前保存完整网关、105个静态文件、旧清单与入口。先更新兼容旧客户端的统计接口,再上传静态资源、校验源站后切换清单和入口。公网105个SHA-256、5个深层入口通过。CDN任务 `8198596118` 完成,成功1、失败0。
+
+受保护目录:`/Users/mac/.local/state/xiaoshu/qa/2026-11-15-hours-release/`。条件回滚脚本保留旧源码和入口,遇到后续版本会先停止,避免覆盖别人的更新;不删除业务数据或旧哈希资源。
+
+本次重新构建、学生统计5项回归及11项云函数定义校验通过。候选本地完整回归1,389项通过,详情见 student-home-hours-2026-11-15.md。上线没有运行通用cloud:deploy或任何schema安装。
+
+## 真实账号只读核对
+
+- 熊梓含初中:上线前接口10小时,上线后19小时;60分钟正式课18次、体验1次;生词总数724保持一致。
+- 发布前后41组全量课时流水版本和条数相同,账户余额、预留、可用值相同;19次课记明细完整一致。
+- 熊梓含UserPoint、SilverCoin余额均12,预留各1,可用各11;Purse、UserExp均0。没有补扣、退费或充值。
+- 另一真实学生统计接口正常返回候选结果;老师接口完整结果与发布前相同,累计208小时。此项是发布回归检查,不是对全部会员重新做财务审计。
+- 使用熊梓含现有有效会话检查390px/1024px冷进入与旧stats缓存升级:只显示四卡,余额12/0/12、生词724与发布前一致,累计卡片不存在;后台统计请求19小时。老师仍显示累计时长。所有读取成功,0脚本错误、无横向溢出,写操作保护未触发。
+- 使用既有会话,无密码重置、无新登录。核对不提交开课、结课、取消、成绩或财务写入。
+
+连续读取和最终回读结果完成后追加。上述浏览器检查不能替代实体手机/微信WebView验收,也不能说明此前11个历史资料缺失账号已经补全。
+
+## 最终连续验收与财务回读
+
+40次(熊梓含/老师的首页、当天课表各10次)全部成功,函数请求均HTTP200/retcode0,已捕获请求失败0。门槛为页面数据完整且稳定500ms;学生首页每次三项读取响应齐全。真实家长和老师会话、390px、Fast4G模拟、直连、每次新上下文;没有并行执行其他UI验收。
+
+| 页面 | 成功 | p75可操作时间 | p95可操作时间 |
+|---|---:|---:|---:|
+| 熊梓含首页 | 10/10 | 2.603秒 | 3.486秒 |
+| 老师首页 | 10/10 | 3.129秒 | 3.272秒 |
+| 熊梓含课表 | 10/10 | 2.696秒 | 3.538秒 |
+| 老师课表 | 10/10 | 2.677秒 | 2.994秒 |
+
+最终再次核对:累计统计19小时,正式60分钟18次、体验1次;生词724;41组流水版本/条数、课时余额/预留/可用值、19次课记完整结果、老师统计均与发布前一致。14个扣费/结课/奖励/结算模块及SQL源码哈希与受保护基线一致。网关和管理网关最后回读匹配预期。
+
+**本批已上线并通过上述验收。** 家长刷新学生端后可看到四项数据。没有修改充值、扣费、退款、课时预留或工资;原11个历史数据待核对账号不在本次自动修复范围。
+
+脱敏回执见同名JSON。原始账号、会话和账本数据仅存受保护发布目录。