网页侧证据复跑并修掉 Vite 冷启动造成的假失败
Project CI / AI game creator shell Rust crates (push) Successful in 1m33s
Project CI / AI game creator shell Rust smoke (push) Successful in 1m45s
Project CI / AI game creator shell Rust lane 2/2 (push) Has been cancelled
Project CI / Frontend tests (push) Has been cancelled
Project CI / Repository checks (push) Has been cancelled
Project CI / Backend tests (push) Has been cancelled
Project CI / AI game creator shell web tests (push) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (push) Has been cancelled
Project CI / Native shell tests (push) Has been cancelled

- check-game-distribution-web-e2e:导航前先 fetch 预热 /games、/games/detail、/games/play 三条路由(120s 上限,失败只告警),首个 goto 超时提到 120s,避免 Vite dev 冷启动(实测 /games 首请求 20.2s、warm 后 14ms)被当成页面故障
- 复跑合并 Web 预检改动之后的网页侧四条 E2E:web-e2e 24/24 PASS、web-publish 全过、web-publish-recovery 全过、web-a11y 全过
- 里程碑补「网页侧证据复跑(2026-09-29)」小节;pitfalls 记录冷启动判据与修法
This commit is contained in:
kdletters
2026-09-29 00:21:43 +08:00
parent 25898969fb
commit 1951a88fba
3 changed files with 49 additions and 1 deletions
@@ -267,3 +267,14 @@
- 每条只给三档结论(已取证 / 部分取证 / 未取证)并写清缺哪半,例如「网页 ZIP 已取证、AGC dist 未取证」「音频播放与真实触屏未单独取证」「加密条目与嵌套 `.zip` 有实现无专门用例、设备文件缺拒绝实现」。
- 矩阵结论是**未上线**:未取证清单 6 类——AGC 客户端一次提交、真实环境完整链路(D1)、真实 CDN 与缓存到期行为、条款级小缺口、失败/撤回包保留清理任务(仓库内没有 game-distribution retention/cleanup 实现)、独立告警规则(目前只有巡检 timer + 日志 operation)。
- 这张矩阵同时是 D1 的输入:D1 要求的生产域名/TLS、生产账号、真实 CDN 与部署后巡检,正是矩阵「未取证清单」第 1–3、6 项。
## 网页侧证据复跑(2026-09-29,合并 Web 预检改动之后)
`origin/master` 上另一个分支合并进了 Web 环境预检相关改动(`b0d94ed2d` 等),为确认已勾选的网页侧条目没有被带坏,本轮把四条真实网页栈 E2E 全部重跑一遍(本地 `npm run dev`,真实 Chromium,管理员 `admin`):
- `check:game-distribution-web-e2e` → **24/24 PASS**(游客目录/筛选/空态/重置、详情主动作、游玩页先给开始面板再挂 iframe、iframe 真载入包内 `WEB-E2E-OK`、退出不保留 iframe、分享直达、返回目录恢复筛选、加载失败重试、移动端门槛与旋转提示)。
- `check:game-distribution-web-publish-e2e` → 全部通过(网页选包发布 → 待审 → 后台审核 → 广场与「我的游戏」同步 → 同 `gameId` 发新版且旧版在线)。
- `check:game-distribution-web-publish-recovery-e2e` → 全部通过(中断恢复草稿、重登继续沿用原版本、恢复后清理草稿、换账号看不到他人草稿)。
- `check:game-distribution-web-a11y-e2e` → 全部通过(桌面/移动导航、键盘可达、全屏、安全区、移动发布面板无横向溢出)。
**顺带修掉一处取证噪声**:`check:game-distribution-web-e2e` 的首个 `goto` 用的是默认 30 秒超时,碰上 Vite dev 冷启动(实测 `/games` 首请求 20.2 秒、warm 后 14 毫秒)会以 `Timeout 30000ms exceeded` 假失败。现在脚本在导航前先 `fetch` 预热 `/games`、`/games/detail?id=…`、`/games/play?id=…` 三条路由并把首个 `goto` 超时提到 120 秒;冷启动重跑即 24/24 PASS(详见 pitfalls 同日条目)。
@@ -6132,3 +6132,10 @@ Cocos Creator 根目录由 `package.json.creator.version` 与普通 `assets/`
- **判据**:`apps/ai-game-creator-shell/tests/appUpdate.test.ts` 新增「签名校验失败时拒绝安装、不重启进程,并保留待装更新供重试」——插件抛 `signature verification failed` 时断言 ①错误原样上抛 ②`restart_agc_app` 未被调用 ③再次安装仍会走插件调用并在成功后重启。变异验证:把 `restartAppAfterUpdate()` 挪到 `await` 之前,该用例立即以 `expected "spy" to not be called with arguments: [ 'restart_agc_app' ]` 变红。
- **边界**:真正的验签与临时文件清理都在官方插件原生实现里,本地只能证明"客户端不把失败当成功",真机安装闭环仍需已发布包与真实设备。
- **顺带记一条环境陷阱(2026-09-28 已修)**:`apps/ai-game-creator-shell/src-tauri/resources/codex/win-x64/` 下曾有两个 codex 二进制——`bin/codex.exe` 是**真正被解析**的那份(0.155.1),而包根目录那份 `codex.exe` 是 0.147.0 的旧残留(tauri 的 Windows 资源映射只引用 `bin/` 等路径),检查都查不出来,却会让本地核对误判「应用跑的是 0.147.0」。根因是 `src-tauri/build.rs` 的 `stage_codex_target()` 只按布局拷贝、从不清理目录,旧布局的组件会永久留在随包资源目录里。现在加了 `prune_stale_codex_components()`:拷贝前删掉不在本轮布局、也不在 `manifest.json`/`NOTICE.md` 白名单里的文件并收掉空目录;实测重建后根目录 `codex.exe` 被清掉、六个声明组件与清单/声明保留。
## 2026-09-29 Vite dev 冷启动会让 web E2E 的首个 goto 超时,别当成页面回归
- **现象**:`npm run dev` 刚起(Vite 冷缓存)时跑 `check:game-distribution-web-e2e`,三轮 API 断言(管理员登录、作者注册、真实游戏发布上传→送审→审核)全过,但 `page.goto('http://127.0.0.1:3000/games', { waitUntil: 'domcontentloaded' })` 以 `Timeout 30000ms exceeded` 失败——看起来像"网页打不开"。
- **实测**:冷启动时 `Invoke-WebRequest /games` 花了 **20,171 ms**(`/` 约 2,146 ms),随后连续两次 4,208 ms / 10,119 ms,预热完成后 **14 ms**。原因是 Vite dev 按需编译该路由的模块图,首个请求最贵。
- **处理**:脚本在浏览器导航前先 `fetch` 预热本轮要用的 `/games`、`/games/detail?id=…`、`/games/play?id=…`(120s 上限,失败只告警),并把首个 `goto` 超时提到 120s;冷启动重跑 → **24/24 PASS**。另外三个 web 脚本原本就用 `waitUntil: 'commit', timeout: 120_000`,属同一类防护,别再去掉。
- **判据**:遇到"首个 goto 超时 + API 断言全过"的形态,先用 `curl`/`Invoke-WebRequest` 量一次同 URL 的耗时;20s 级冷启动说明是 Vite 编译,不是页面回归。