67 lines
5.1 KiB
Markdown
67 lines
5.1 KiB
Markdown
# PROGRESS · 慢网首页半揭幕 + 账户与点数打开慢(2026-09-24)
|
||
|
||
## 当前状态
|
||
|
||
- 实际 worktree:`G:\Ferti\Jyotisha\.claude\worktrees\agent-aa9a862be5b171b9b`
|
||
- 分支:`codex/home-slow-network-20260924`
|
||
- 基线:`origin/staging` `edc9c22c3`
|
||
- 当前实现提交:`1fbe14995`、`659bd9600`、`6a097b6a3`;本记录及最终验收修订尚未提交。
|
||
- 第二单、第三单未开始,按任务书串行依赖暂停。
|
||
|
||
## 实施
|
||
|
||
### T1 首页启动
|
||
|
||
- 新增 `HOME_BOOTSTRAP_SLOW_MS = 20_000`;删除原 8 秒硬超时语义。
|
||
- `/api/models`、咨询状态和 SessionListProvider 启动读取并行;模型或必要 bootstrap 请求失败时在 commit 前进入全屏错误状态,不揭幕半成品首页。
|
||
- React 错误屏「重试」取消上一轮、reload provider 读取并局部重跑,不调用 `location.reload()`。
|
||
- SessionListProvider 增加可重入 reload、AbortController 替换和旧请求提交保护。
|
||
- 首屏 ES5 fallback 调为 25 秒,仍保留六类失败分类;只有 bundle 没运行的首屏 fallback 按钮才允许用户点击整页 reload。
|
||
|
||
### T2 账户与点数
|
||
|
||
- BillingPanel 动态分包使用静态占位「账户信息还没拿到。」;账户菜单 pointer enter/down 预取 chunk 和套餐。
|
||
- 移除 `use-billing-panel` 挂载时完整 `/api/account` 请求;兑换成功使用兑换响应 `credits`,支付成功使用 status 响应 `credits`,均通过既有共享余额事件同步,不新增账户请求。
|
||
- 套餐结果模块级缓存 60 秒,过期返回旧值并后台刷新;套餐 route 的 feature flags 与商品读取并行,权益仍在 product IDs 就绪后读取。
|
||
- 预取动态 chunk 的失败显式 catch 隔离,不让离线 hover 预取触发全局 stale-client recovery reload。
|
||
|
||
## 三栏断言调整
|
||
|
||
| 文件 | 原值 | 新值 | 原因 |
|
||
| --- | --- | --- | --- |
|
||
| `frontend/tests/membership-navigation-contract.test.ts` | 挂载断言 `Promise.allSettled([fetchAccountData(), fetchPackages()])`,认证跳转计数 4 | 仅断言套餐加载、无 `fetchAccountData`/`/api/account`;认证跳转计数 3 | T2 删除无用挂载账户请求,保留订单、兑换、支付状态的 401 硬跳转 |
|
||
| `frontend/tests/epay-settings.test.ts` | 直接断言 hook fetch `/api/payment/packages`、`payload.enabled` 和旧 `setPaymentEnabled(true)` | 断言 hook 使用 `fetchPaymentPackages`,缓存模块发起请求并规范化 enabled | 网络请求迁移到 60 秒共享缓存,支付开关行为不变 |
|
||
| `frontend/tests/billing-panel.test.ts` | 兑换/支付后再次 `fetchAccountData()`;预取无失败处理 | 断言使用响应 credits 广播余额,预取 promise catch 隔离 | 删除重复账户查询但保留成功后的余额同步,避免离线预取未处理 rejection |
|
||
| `frontend/tests/first-paint-fallback-contract.test.ts` | 兜底晚于 8 秒 + 4 秒 prepare | 兜底晚于 20 秒慢网阈值并留余量 | 新首页 slow-network budget 为 20 秒 |
|
||
|
||
## 验证结果
|
||
|
||
已通过:
|
||
|
||
```text
|
||
./node_modules/.bin/tsc --noEmit exit 0
|
||
./node_modules/.bin/eslint src/hooks/use-billing-panel.ts \
|
||
src/lib/session-list-context.tsx tests/epay-settings.test.ts exit 0
|
||
./node_modules/.bin/tsx --test \
|
||
tests/membership-navigation-contract.test.ts \
|
||
tests/billing-panel.test.ts tests/epay-settings.test.ts \
|
||
tests/home-bootstrap-reveal.test.ts \
|
||
tests/first-paint-fallback-contract.test.ts 65 pass / 0 fail
|
||
```
|
||
|
||
全量 `npm run lint` 已执行:0 error、121 warnings;warnings 为仓库既有问题,本轮新增的 `epay-settings` 未使用变量 warning 已移除。全量 `npm test`、`npm run build`、浏览器 Slow 3G / Offline 真人验收仍需最终执行/记录。
|
||
|
||
## 环境缺口
|
||
|
||
- 本轮未读取或提交任何真实隐私资料、凭据、Cookie、JWT 或模型密钥。
|
||
- 本地 Windows worktree 可完成 TypeScript、定向合同和定向 lint;尚未有 Chrome 登录态,真人 Slow 3G / Offline、动态 chunk 网络行为无法在本地声明通过。
|
||
- 已执行 `npm test`:3766 tests / 3677 pass / 89 fail,失败主要集中在既有 DB/迁移/环境/部署/skill registry 合同;失败名单保留在本次验收临时输出,未改代码迎合。已执行 `npm run build`:编译和 TypeScript 阶段完成,但 Windows/Turbopack 在 `/api/birth-time-guide` page data 阶段因 `skill-package-registry.ts` 动态 filesystem/symlink tracing 失败;未修改业务逻辑。尚未获得 Static/gzip 对比、Docker/Linux volume 保真路径和 staging health;不能据此声称部署或 staging 已验收。
|
||
- 未 push;Gitea 认证 token 当前不可用,需协调方恢复既定认证后再按 `status → fetch --prune → 同步 origin/staging → push` 流程交付。
|
||
|
||
## 后续
|
||
|
||
1. 独立复核本记录、BUG_HISTORY 和定向测试。
|
||
2. 完成全量前端测试、build 与可用的静态/gzip 对比;将失败名单与基线逐项记录。
|
||
3. 协调推送前先 `git status -sb`、`git fetch origin --prune`,同步最新 `origin/staging`,确认无共享工作树改动后再推送本单。
|
||
4. staging 验收通过后才领取 `TASK-chart-ephemeris-fixes-20260924.md`。
|