# PROGRESS · TASK-staging-gate-fix-20260924 · 2026-09-24 ## 基线与范围 - 基线:`origin/staging = 6dc6510c1b789399f9bc6c94b999b63d4e8bb381`(任务书记录的代码提交 `f125fae0` 已在该历史中)。工作树开工前已执行 `git status -sb` 与 `git fetch origin --prune`,随后以当前 `origin/staging` 重置到干净基线。 - 本轮只执行非破坏性 T1–T3 与允许写入记录;未删除、清空、替换任何 raw-appendix 文件或其测试。T4 保留为用户批准/权限 blocked。 - 不改 workflow、数据库、依赖、main、DNS、其它 worktree;未 push。 ## T1:5 条新增红合同测试 | 断言 | 原值 | 新值 | 原因 | | --- | --- | --- | --- | | `chat-navigation-a11y-contract.test.ts` bootstrap retry | `window.location.reload()` 硬刷新 | 断言 `retryHomeBootstrap(...)`,并断言 helper 清空错误、回到账户阶段、调用 provider reload;同时保留 `window.location.reload()` 禁止断言 | D2 已批准局部重试;不能把已验收行为改回整页刷新 | | `new-chat-recovery.test.ts` activation slice | 以已删除的 `if (modelCatalogResult.unavailable)` 作终点 | 以稳定的 `if (parsedSessions.fallbackSessionIds.length > 0)` 作终点 | 模型失败现走 fatal screen,源码合同不得依赖删除语句 | | `consultation-recovery.test.ts` bootstrap start | 以 `let reservedConsultation ... = null` 作起点 | 以 `const storedPending = dropRectificationStoredPending(` 作稳定起点 | 并行预取改变初始化右值,恢复逻辑行为未变 | | `consultation-recovery.test.ts` pending/global ordering | 要求 stored pending 分支源码先于 `fetchActiveConsultationStatus` | 仅要求 pending 分支存在并检查其 request/session 参数 | T1/D2 将全局状态与模型目录并行预取;源码顺序不再代表优先级,避免锁错误实现形状 | | `new-chat-recovery.test.ts` / `consultation-recovery.test.ts` shared boundaries | 依赖易变语句/初始化形状 | 使用稳定、行为相关锚点并保留真实函数执行 | 同型源码脆弱合同再次触发(BUG-933/934/939/992);不删除测试、不弱化行为断言 | `modelCatalogResult.unavailable` 在 `frontend/tests` 中应为 0 命中;T4 raw-appendix 测试不触碰。 ## T2:page.tsx 行数 - 原值:`frontend/src/app/(app)/page.tsx` 1858 行(本轮工作树初始 staging);任务书要求回到任务书基线 `edc9c22c` 的 1849 行。 - 新值:将错误屏重试的 5 行状态清理抽到 `frontend/src/lib/home-bootstrap.ts` 的 `retryHomeBootstrap`,并合并不改变语义的 import 空白/相邻声明行;page 当前 1847 行,低于任务书要求的 ≤1849。 - 原因:保持错误屏与局部重试行为不变;仅删除空白并合并 import 声明,不删除业务逻辑或 hook。 ## T3:支付成功无条件广播余额 - 原值:仅在 `typeof payload.credits === "number"` 时调用 `notifyBalanceChanged`;订阅订单 `credits` 缺失时不广播。 - 新值:支付状态 `paid` 后无条件调用 `notifyBalanceChanged(typeof payload.credits === "number" ? payload.credits : 0)`。 - 原因:`page.tsx` 余额监听只触发 `refreshAccount()`,支付成功不能因订阅响应缺失点数而静默不刷新;未知余额使用 0 仅作为事件载荷,服务端刷新仍是权威值。既有点数订单行为保持。 - 回归断言:`frontend/tests/billing-panel.test.ts` 已从仅检查 `credits` 类型改为锁定 paid 分支无条件调用,并记录订阅响应缺少 `credits` 时使用 0 载荷的原值/新值/原因。 ## T4 与记录边界 - raw-appendix 三件套及 `frontend/tests/personal-report-raw-appendix.test.ts` 原样保留;没有删除、清空、替换或借其它工具绕过权限。 - `docs/testing/report-reader-actions-20260924.md`、`docs/tasks/PROGRESS-report-reader-actions-20260924.md` 当前未由本轮创建;若权限允许,待用户批准后由协调主会话补齐。T4 删除及其全仓零命中验收均 blocked。 ## 验证 - 已执行静态 diff、源代码切片检查、行数检查:page 从 1858 降至 1847;`git status -sb` 干净起步,当前仅本轮列出的代码/测试/记录有修改。`frontend/tests` 中 `modelCatalogResult.unavailable` 命中为 0;raw-appendix 三件套仍各有源码命中并保留。 - 本环境是 Windows,工作树无 `frontend/node_modules`;`tsx`、`tsc`、`eslint`、`next` 均不可用,故定向测试、tsc、lint、build 和全量测试未执行,未声称通过。 - 未找到可用 Linux runner 或 Linux 日志。任务书提供的 Linux 基线:`edc9c22c` 3807 条、56 条失败;当前 `f125fae0` 3809 条、61 条失败,新增 5 条名称已列于任务书。本轮无法实际重跑 Linux 全量并逐条 diff,Linux 当前失败名单/新增必须为 0 验收 blocked。 - tsc、lint、定向测试、build、Linux 全量测试和失败名单逐条比较均待具备 Node 依赖的 Linux 环境后运行;不得将环境缺口写成通过。 ## 下一步 1. 在 Linux/Node 20 环境安装或使用现有依赖,运行全量前端测试并与 `edc9c22c` 失败名单逐条比较,新增必须为 0。 2. 同环境运行 `./node_modules/.bin/tsc --noEmit`、`npm run lint`、5 条定向测试、`npm run build`。 3. 用户批准并解除权限后再处理 T4;当前不 push、不部署。