修正PWA升级验收跨导航等待(09-06-release-gate-integrity / 09-17-company-loan-principal-repayment)
N3 第二轮候选 18315d11:浏览器 371 通过、1 失败;报销付款主链路通过。 PWA 自动导航会销毁旧执行环境,原 expect.poll 回调直接 page.evaluate 因此提前抛错。 改为当前 html 的版本属性断言,保持 45 秒期限、同会话 A/B 联合见证及全部否定断言。 受管定向 1 项通过,无失败、跳过或重试,环境及清理通过;任务/治理检查通过。 应用、资金规则、迁移、门禁范围和并发/重试配置未改。两个失败回执完整保留。 第三轮完整候选验证以新回执为准;独立代码复核及真实还款待验。 仅本地提交,不推送、不部署,不访问生产或真实 OCR。
这个提交包含在:
@@ -349,6 +349,7 @@ test.beforeEach(async ({ page }) => {
|
||||
- Synthetic APIs must be served by a loopback HTTP harness. Do not use `page.route` or `context.route`, because a real Service Worker owns worker-originated requests.
|
||||
- Switch the same server/origin from build A to B, close the A page while retaining the BrowserContext, then revisit the same route. Do not change port, hostname or profile.
|
||||
- After switching to B, test code must not reload, clear cookie/cache, unregister a worker, create another BrowserContext or emulate hard refresh. Application-owned update behavior is the subject under test.
|
||||
- Wait for B's document version with a locator attribute assertion within the existing convergence deadline. A raw `page.evaluate` inside `expect.poll` can throw when the application's expected navigation destroys the old execution context. Keep the version expectation, deadline and all joint witnesses; do not hide arbitrary errors or add test-owned navigation.
|
||||
- Prove B with a joint witness: controller change or worker version change, controller equals the active registration, browser-fetched no-store `sw.js` fingerprint matches build B, document SHA is B and a B-only hashed asset loaded successfully. The constant `/sw.js` URL alone is not version evidence.
|
||||
- Assert the business route and synthetic session survive, old-only hashed assets leave Cache Storage, and there are no login fallbacks, JS/CSS 404s, chunk/preload errors, page errors or reload loops.
|
||||
- If the first B witness fails, freeze the safe ledger and stop. Do not add a second navigation or reload to turn the first failure into an intermittent result.
|
||||
|
||||
@@ -1,4 +1,15 @@
|
||||
## 2026-09-27 首个受管完整门禁 PASS 并发布(当前)
|
||||
## 2026-10-09 PWA 跨导航版本等待修正(N3 候选验证接续)
|
||||
|
||||
来源为借款任务 N3 的 `18315d11` 完整回执:服务端 4558 通过/1 项既有可选跳过,浏览器 371 通过/1 失败、零跳过/重试。栈明确位于 `expect.poll` 回调中的 `documentBuildSha`:页面自动更新销毁旧执行环境后,直接 `page.evaluate` 抛错,未等完原定 45 秒。冻结诊断已观察到文档 B、B 控制器摘要匹配、旧资源缓存归零、B 资源加载、会话保留及零静态 404;这些事后观察不改写原失败。
|
||||
|
||||
- [x] 定位具体失败及保存第二轮完整回执,确认环境、源码一致性与自有资源清理通过。
|
||||
- [x] 仅把 B 版本等待改为 Playwright 对当前 `html` 元素的属性断言,保留 45 秒上限和后续全部联合见证;不用吞掉所有异常的 `catch`,不加刷新、清缓存或重试。
|
||||
- [x] 受管 `retained-local` 选择完整的 `pwa-cross-version-upgrade.spec.ts`:1 项通过、零失败/跳过/重试,浏览器用例总耗时 9.4 秒。A/B 联合见证、会话及全部否定断言通过;实际单文件 1 worker,不改全局并发。受管生产构建、环境、源码一致性及自有资源清理通过。
|
||||
- [ ] 完成主会话差异及任务/治理检查后本地提交;返回借款任务 N3,对干净新候选另开完整 `verify-candidate`。前端应用未变,复用第二轮已通过的类型检查并保留本次受管构建;第三轮正式门禁仍完整执行类型检查/构建。不沿用原候选资格。
|
||||
|
||||
定向记录在 `artifacts/qa-flow/loan-receipt-n3-20261009/pwa-navigation-focused/` 及同级日志,下一轮完整回执在 `artifacts/release-gate/loan-receipt-n3-20261009-r3/`。验证时冻结受测文件,实际结果追加到回执;本节下方历史授权和结果只代表各自时点。没有产品、资金状态机、权限、迁移或发布入口改动,不触发真实业务操作;独立代码复核未完成。
|
||||
|
||||
## 2026-09-27 首个受管完整门禁 PASS 并发布(历史时点)
|
||||
|
||||
候选 `70af0c6b` 在本机(2 核/8G,4 worker)经 6 轮 verify-candidate 取得 PASS(372/372,`artifacts/release-gate/20260926-202856`)。期间处理:付款主链路 300→420s、视觉组 180→240s(`34675e1a`,项目默认 180s 回执校验不变);采购「审批后页面旧状态」查明为 SW 3s 网络超时回退缓存的产品缺陷并修复(`0931b1ea`,任务 09-26-approve-success-state-unchanged);资产 E2E 后退前等 `data-unsaved-changes=false`(`70af0c6b`)。浏览器源缓存/BIFF8 venv 位于用户级缓存目录并按 copy-browser-cache 复制独占副本。已经 deploy 入口消费回执发布至生产,详见 09-26 任务 implement 顶部。本机负载下另见采购提交事务偶发 P2028(生产同写法,待另立任务)。
|
||||
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
## 2026-10-09 借款候选验证中的 PWA 导航观测修正
|
||||
|
||||
`09-17-company-loan-principal-repayment` 的 N3 接续已获本地提交、验证及必要测试修正授权。其候选 `18315d11` 第二轮完整门禁为 FAIL:浏览器 371 通过/1 失败、零跳过/重试;唯一失败为 PWA 跨版本测试的版本读取在应用自动导航时抛出 `Execution context was destroyed`。报销付款主链路已通过,受管环境、源码一致性及清理通过。原回执保留在 `artifacts/release-gate/loan-receipt-n3-20261009-r2/`。
|
||||
|
||||
本任务承接这处验收测试修正:版本等待必须容忍被测应用正常的自动导航,并在原有 45 秒内确认新文档的版本属性。保留同一 origin/BrowserContext、A 前提、B 的控制器与文件摘要、缓存和实际资源加载、会话、错误及导航次数全部断言;不增加测试重试、人工刷新或运行预算。产品 PWA、付款资金规则和正式门禁范围不变。先受管定向重验该文件,再形成新的本地候选并由 N3 执行完整门禁;定向通过不能抵扣原 FAIL。当前 inline 下由主会话实施和检查,独立代码复核另记待完成;不推送、部署或访问生产。
|
||||
|
||||
修正后的受管定向回执为 1 项通过、无失败/跳过/重试,A/B 联合见证与全部原断言走完;环境、源码一致性和自有资源清理通过。新的完整候选资格仍待第三轮正式回执,不能把此次单例通过与旧 371 项拼成完整 PASS。
|
||||
|
||||
## 2026-09-19 R101定向3/3接收,固定新候选进入最终验收
|
||||
|
||||
R101一次生产构建定向复验3/3通过,零失败/跳过/重试;只读补审通过,接收时112输入及5份before/after均一致。新增响应来源检查、准确到达、原标题/入口/设计断言与两张截图全部走完。只证明该次通过,不宣称统计稳定性或历史唯一根因已确定。
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
## 2026-10-09 N3 第二轮结果及第三轮候选验证
|
||||
|
||||
第二轮候选为 `18315d11`,完整 `verify-candidate` 为 **FAIL**。82 个迁移、服务端 4558 通过/1 项既有可选跳过、静态/构建和业务回归通过;浏览器 371 通过/1 失败、无跳过或重试。修正后的报销付款主链路实际走到执行及下游收口并通过。原始回执、失败定位及环境清理见 `artifacts/release-gate/loan-receipt-n3-20261009-r2/`,不可由定向结果抵扣。
|
||||
|
||||
- 唯一失败为 `pwa-cross-version-upgrade.spec.ts`。原始栈明确:B 版本 `expect.poll` 的回调直接执行 `documentBuildSha`,应用自动导航时旧执行环境被销毁,`page.evaluate` 抛错。冻结诊断另观察到 B 文档、控制器、缓存和资源已更新,但不据此宣称原断言通过。
|
||||
- 已由现有 `09-06-release-gate-integrity` 承接这处验收测试修正,使用当前 `html` 的版本属性断言,保持原 45 秒期限和后续全部联合见证;不修改产品 PWA、资金代码、迁移、全局并发或零重试要求。
|
||||
- 修正后完整 PWA 文件受管定向 1 项通过、零失败/跳过/重试;同一 origin/BrowserContext 的 A→B 控制器、缓存、实际加载、会话与负向断言通过,环境/源码一致性/清理通过。证据为准备目录的 `pwa-navigation-focused/`、`pwa-navigation-focused.log`、`pwa-focused-process.json`。
|
||||
- 完成主会话差异与任务/治理检查后,按既有 N3 本地提交授权形成单独修正提交,不 amend 两个已有提交。第三轮完整回执固定为 `artifacts/release-gate/loan-receipt-n3-20261009-r3/`;正式命令仍为 `bash scripts/qa/run-release-gate.sh verify-candidate`,不以单例通过或前两轮已通过项拼接资格。
|
||||
- 候选固定后冻结源码、测试及任务文档;实际提交、完整结果、只读复核交接和本轮专用浏览器清理写入 ignored 回执。独立代码复核继续待完成;不推送、部署、查询生产、读取真实 OCR 配置或操作真实数据。
|
||||
|
||||
当前实际候选和最终结果以第三轮回执及其 `local-followup.json` 为准;本节不提前宣称 PASS。以下记录保留前两轮各自的修正与验证事实。
|
||||
|
||||
## 2026-10-09 N3 首轮结果及人工核验测试补充
|
||||
|
||||
本地提交 `5a7a1352` 包含 N1–N2 的 31 个文件。首轮 `verify-candidate` 已完成且结果为 **FAIL**:static、82 迁移、服务端 4558 通过/1 项既有可选跳过、业务回归通过;浏览器 371 通过、1 失败、无跳过或重试。失败为报销付款批次主链路在人工核验提交时收到 HTTP 409、`VALID_001`,尚未执行付款。首轮完整回执和环境清理记录保留在 `artifacts/release-gate/loan-receipt-n3-20261009/`。
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# 公司借款台账与本金归还
|
||||
|
||||
## 2026-10-09 N3 第二轮结果及 PWA 测试等待修正
|
||||
|
||||
修复候选 `18315d11` 的完整第二轮仍为 FAIL:82 个迁移、服务端 4558 通过/1 项既有可选跳过、静态/构建及业务回归通过;浏览器 371 通过/1 失败、无跳过或重试。本轮报销付款主链路完整通过;唯一失败为 PWA 自动升级时,测试读取版本号的 `page.evaluate` 遇到正常导航而失去执行环境。错误栈和原回执保留,不把定向通过或事后 B 版本见证替换为整轮 PASS。
|
||||
|
||||
该测试等待修正归属已有 `09-06-release-gate-integrity` 任务:改为当前文档的属性断言,原 45 秒上限、同会话升级及所有结果断言保持。受管定向 1 项通过,环境与清理通过;产品 PWA、借款/报销资金规则、迁移和门禁范围未变。按 N3 的本地修正与提交授权固定新候选,第三轮回执为 `artifacts/release-gate/loan-receipt-n3-20261009-r3/`,实际结果以其 `release-result.json` 和 `local-followup.json` 为准,不预填通过。
|
||||
|
||||
独立代码复核、真实还款、发布和公网验收继续开放;未推送、部署、查询生产、外发原件或写入真实业务。下方记录保留各轮历史时点,任务仍为 `in_progress`。
|
||||
|
||||
## 2026-10-09 N3 本地提交及新候选验证接续
|
||||
|
||||
N1–N2 已本地提交为 `5a7a1352`。首轮完整候选验证为 FAIL:服务端、构建及业务回归通过,浏览器 371 通过/1 失败;人工核验测试提交返回 409,未执行付款。原测试未记录具体业务原因,不能追认解析超时为根因;现已补其确定缺失的人工原件依据及安全诊断,保留全部资金断言。复验安排见 implement 顶部,后续新候选实际结果以 `artifacts/release-gate/loan-receipt-n3-20261009-r2/` 为准,首轮失败回执不覆盖、不改写。
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"assignee": "shunli",
|
||||
"createdAt": "2026-09-17",
|
||||
"completedAt": null,
|
||||
"branch": null,
|
||||
"branch": "main",
|
||||
"base_branch": "main",
|
||||
"worktree_path": null,
|
||||
"commit": "46a70aa5",
|
||||
@@ -23,4 +23,4 @@
|
||||
"relatedFiles": [],
|
||||
"notes": "2026-09-17 T1–T4本地实施完成:72迁移、9组PG约束/并发、16组正式认证HTTP和3组桌面手机权限浏览器通过;212定向unit及ERP退出后付款128回归通过,最终前端typecheck/build与Prisma通过。AC5真实样本/AC8独立复核、恢复事实与发布门禁仍开放;未提交推送部署。 2026-09-26 更新:本地实现已通过候选分支合并落地到 origin/main(合并提交 46a70aa5),不再是仅存在于未提交分支的工作;但真实样本验证/独立复核/生产切换等验收项仍开放,任务状态维持 in_progress,未视为完成。",
|
||||
"meta": {}
|
||||
}
|
||||
}
|
||||
@@ -612,7 +612,8 @@ test("production PWA 在同 profile 中从旧 build 自动收敛到新 build", a
|
||||
let workerB: ServiceWorkerSnapshot | null = null;
|
||||
try {
|
||||
await pageB.goto(`${origin}/portal`, { waitUntil: "domcontentloaded" });
|
||||
await expect.poll(() => documentBuildSha(pageB), { timeout: 45_000 }).toBe(BUILD_B_SHA);
|
||||
// The application may replace the document while applying the new worker.
|
||||
await expect(pageB.locator("html")).toHaveAttribute("data-build-sha", BUILD_B_SHA, { timeout: 45_000 });
|
||||
await expect(pageB).toHaveURL(`${origin}/portal`);
|
||||
await expect.poll(() => controllerPath(pageB)).toBe("/sw.js");
|
||||
await expect.poll(() => requestCount("B", "/api/auth/refresh")).toBeGreaterThan(0);
|
||||
|
||||
在新工单中引用
屏蔽一个用户