Add bounded chart loading, per-layer retry states, and shared SVG skeletons. Add report block downloads with SVG, localized metadata, and inline deletion. Record verification and retain CRLF export, full-build, and controlled-device acceptance blockers. User authorized staging delivery with these gaps documented. Co-Authored-By: Claude Code <noreply@anthropic.com>
110 lines
12 KiB
Markdown
110 lines
12 KiB
Markdown
# PROGRESS · 星盘页盘位骨架与等待出口(2026-09-24)
|
||
|
||
## 交付授权(2026-09-24)
|
||
|
||
产品已明确要求“请你帮我push到staging”,授权将两单组合版本提交并快进推送。实际交付以push成功和远端SHA核对为准,不将推送当作完整构建、受控真机或部署通过。下述未提交状态描述的是验证时快照,BUG仍blocked,不提升main。
|
||
|
||
## 当前结论
|
||
|
||
T1–T4 已实现,通过定向、独立review与隔离真实Chrome,已串行整合到 `codex/chart-report-integration-20260924`。首轮组合全量已对照固定基线,无新增失败;完整构建、受控真机与部署仍有缺口。报告末次depth修正后的最终组合重验亦已完成,详见末节。未 commit / push / stash / 部署。BUG-1016 / 1017 暂 blocked,不以任务书要求的 resolved 字样替代真实验收。
|
||
|
||
- 实施基线:主会话已 fetch 并创建的 `5ff43b47f`;任务书旧基线 `8902e484` 仅作事故实证。本轮没有再切分支或改动主检出。
|
||
- 分支 / 工作树:`codex/chart-page-skeleton-wait-20260924` / `.worktrees/chart-page-skeleton-wait-20260924`。
|
||
- 依赖:仅建立授权的 `frontend/node_modules` junction,未安装或升级。固定 `D:/nvm/installs/v22.23.2/node.exe` v22.23.2,与主会话基线相同。
|
||
- 已读 AGENTS / CLAUDE、frontend AGENTS / DESIGN / VOICE、任务书、本地 Next `use-client` guide;本单纯前端与现有 BFF 投影,不运行基础设施预检。骨架只是既有空几何,没有数据编码或新分类调色板;不改原盘色。
|
||
|
||
## 逐项实施
|
||
|
||
| 项 | 实现 | 本地证据 / 尚欠 |
|
||
| --- | --- | --- |
|
||
| T1 主盘出口 | 共享 fetch(含侧栏预取、资料指纹重试)持有25秒 signal;client_timeout 映射 timedOut;JSON读取中超时不误判 schema;缓存已有view回填;401先呈现失败体再跳转 | React真实生命周期与模拟fetch,含预取、缓存、过期身份、401;真人/部署尚欠 |
|
||
| T1 层出口 | Map逐层记录失败;再次点原入口清失败并pending;失败不置loaded;成功只合并请求层,保留其它已成功层;BFF rate_limited不冒充engine_busy | assemble→fetch→hook四层429、catch重试、超时、坏429体、乱序成功与身份失效 |
|
||
| T2 盘位骨架 | VedicChartSvg导出空模型并支持skeleton,强制不画数据;西洋复用原SVG空模型;ChartPageSkeleton仅供星盘盘位;初始Tab可见禁用,主盘到后解禁 | 空盘几何与标签、busy、五禁用Tab、失败替换、静态表格均有渲染合同 |
|
||
| T2 动效与边界 | 唯一CSS keyframe:2.4s ease-in-out / 0.35↔0.6,reduced-motion静止0.5;无spinner/旋转/扫光 | CSS合同;真机视觉未验 |
|
||
| T3 规则 | AGENTS §6有限例外,DESIGN §9/§15及共享壳说明同步,VOICE新增唯一timedOut句 | BUG-716/966防复发条款同时注明有限推翻;其它页不变 |
|
||
| T4 记录 | BUG-1016/1017、CHANGELOG、BLOCKED、状态板、本记录与真机清单 | 未将本地实现当上线;Skill不bump |
|
||
|
||
## 任务书勘误与必要范围
|
||
|
||
1. 真实 `assembleChartView` 的后续层失败先经 `enginePayload` 变成 null,再返回 HTTP200/status=ok。单改 hook 无法恢复 429 原因。主会话确认必要范围后,给 `ChartViewOk` 增加可选 `layerFailures`,在 `chart-view-load.ts` 保留既有 engine_busy / engine_timeout / engine_bad_payload / engine_http_error 分类。未改 `/api/chart-view` 路由、引擎10秒期限、HEAVY_COMPUTE_PATHS、并发或任何Python文件。
|
||
2. 任务书 D5 写超时→timedOut;T1要求 status=client_timeout,以 T1 的明确状态要求为准:`client_timeout` 是状态,`timedOut` 仅是文案key。不把客户端超时加进出生资料失败原因数组。
|
||
3. 首次请求真正从共享缓存发出,故超时由 `refreshChartSnapshot` 建立而非 hook 单独建一个被已在途promise忽略的signal。预取起计时、资料指纹重试共用同一期限;过期epoch失败转当前刷新,不写回旧fallback。
|
||
4. BFF 自身 `rate_limited` 与引擎429不是同类,前者保留既有频繁打开句;只有引擎busy或没有有效业务体的HTTP429显示busy句。JSON读到一半发生abort仍是超时。
|
||
5. 各层响应带D1与其它未请求层的空占位,整体覆盖会在西洋成功后点D9丢西洋结果。客户端仅合并当前请求层;暖缓存进页的后台D1刷新迟到时,同身份已成功层也保留,动态乱序与暖刷新回归确保成功数据不退化。
|
||
6. 真机清单“断网→timedOut”并非浏览器必然行为:网络立即拒绝应unavailable,持续挂起才达25秒期限;已写明两种测试,不伪造速度承诺。AbortSignal按活动时间计时,后台休眠不承诺墙钟25秒。
|
||
7. grep `chart-skeleton-breathe` 本身会命中声明与引用两行;按意图只允许CSS一个文件、一个keyframe定义、一处动画规则,不把合法引用误当第二套动画。
|
||
|
||
## 历史检索与旧防线核查
|
||
|
||
以等待原句、`/api/chart-view`、hook、层日志关键词检索并完整阅读 BUG-715/716/717/718/723/966/996(最大号1015,本轮1016/1017未被占用)。
|
||
|
||
| 原防线 | 核查 |
|
||
| --- | --- |
|
||
| BUG-715/723:引擎失败分档、429独立、日志不吞 | chart-view-engine 与既有定向测试仍在;此次补后续层到UI透传,不改既有引擎分类 |
|
||
| BUG-716:静态壳、只取D1、其它层按需 | 静态route未改,engine/route合同通过;仅“不得骨架”按授权有限推翻 |
|
||
| BUG-717:不改并发、不预取西洋/七政、不写速度成本眉标 | 路径/并发未动、按需入口不变,成功和失败视图合同保留 |
|
||
| BUG-718:跳过页面无需的外部证据 | birthPayload标志未动,route合同仍通过 |
|
||
| BUG-966:模块缓存、同inflight、稳定壳 | 缓存/共享壳不搬;预取共享期限补上;星历/报告无骨架断言不改 |
|
||
| BUG-996:账户+资料指纹、旧结果不可回写、错误分档 | 原定向全过;新增旧请求异常与旧层完成不得写新身份缓存 |
|
||
|
||
## 验证实测
|
||
|
||
日志均只在本树 artifacts,不纳入提交。
|
||
|
||
| 命令 / 范围 | 基线 | 当前 |
|
||
| --- | ---: | ---: |
|
||
| 固定5套定向:chart-page-view / secondary-page-entry / chart-profile-update-consistency / chart-view-engine / chart-view-route | 49 pass / 0 fail / 0 skip | 54 pass / 0 fail / 0 skip |
|
||
| 新增 chart-page-hook 真React生命周期 | 不存在 | 18 pass / 0 fail / 0 skip |
|
||
| 合计定向 | 49 | 72 pass / 0 fail / 0 skip |
|
||
| tsc --noEmit | 主会话持有 | 0错,exit0 |
|
||
| npm run lint | 主会话持有 | 0error / 119warning,exit0;不顺修既有warning |
|
||
| 组合首轮全量npm test | 3717 /3633pass/84fail | 3763 /3679pass/84fail;新增46全过、名称消失0、旧状态变化0 |
|
||
| 组合首轮build、Static、gzip | 默认junction失败;webpack Skill symlink EPERM | 两类失败相同;webpack编译/类型过,Static与gzip仍未验证 |
|
||
| 隔离Chrome | — | 星盘单树及组合树分别13/13通过 |
|
||
| 受控登录、iOS与staging health | 未执行 | 环境/验收缺口,见BLOCKED与真机清单 |
|
||
|
||
使用 `node --import tsx --test`,不是新增测试运行器;日志 `artifacts/chart-targeted-baseline.log`、`chart-targeted-final.log`、`chart-tsc.log`、`chart-lint.log`。新增测试真实执行 hook 与 fetch/schema/assemble,不仅匹配源码;仍不替代浏览器布局或后端线上压测。
|
||
|
||
## 既有断言变更(三栏)
|
||
|
||
| 原值 | 新值 | 原因 |
|
||
| --- | --- | --- |
|
||
| chart-page-view 冷主盘等待不得骨架 | 必须data-skeleton + aria-busy、五Tab禁用,仍无spinner/正在加载 | D1有限授权,增加反向约束 |
|
||
| chart-page-view 西洋pending不得skeleton | 必须data-skeleton,仍保留原等待句且禁止InlineSpinner | D2复用西洋空模型 |
|
||
| secondary-page-entry 星盘源码禁止skeleton | 必须ChartPageSkeleton引用,仍禁止InlineSpinner/正在加载 | 只放开星盘;星历与报告原断言不变 |
|
||
|
||
定向日志名称实测:原49个名称无消失,新增23个全通过。所有原测试名称保留,未删除测试;主会话最终还需对全量名称多重集合与基线逐项比较。
|
||
|
||
## 独立复核与隔离浏览器(2026-09-24)
|
||
|
||
- 独立只读审查未发现需阻断交付的正确性缺陷;复跑 hook/缓存/引擎/路由55条与视图17条全部通过;独立暖缓存乱序复现确认慢D1不会覆盖已成功D9。
|
||
- 系统 Chrome 153、全新临时profile、真实 ChartPageRoute→useChartPage→fetchChartView、真实CSS,接口白名单mock消费真实assembler与虚构golden,13/13场景通过,pageerror=0。覆盖375/390/1280冷进、D9 429与原入口重试、西洋骨架、七政/大运静态等待、减弱动态、主盘/分盘超时、BFF限流及401导航。
|
||
- 超时测试只在浏览器harness把原25000ms映射为500ms;未改业务源码。401证据为导航前DOM提交且布局可见,不保证实际快速跳转时足够读完。
|
||
- 证据仅本地 `artifacts/chart-report-browser-20260924/chart-2026-09-24T03-24-29-908Z/results.json`。浏览器已关闭,不使用真实资料、账号或凭据。该证据不替代完整Next服务器、真实后端、登录staging、iOS真机或部署验收。
|
||
|
||
## 组合验收与剩余事项
|
||
|
||
- 已完成两个工作树串行整合:secondary-page-data同时保留chart身份逻辑与reports通用cache epoch;VedicChartSvg同时保留骨架与报告hook-free Drawing,无第二份几何。
|
||
- 首轮84失败名称多重集合一致,83项完整诊断直接一致;appendices owner-read一项首轮fixture槽位pid ENOENT,单项复跑恢复基线duplicate migration诊断,未写成通过。Docker本轮可用,不套用上一单地址池结论。
|
||
- 固定基线失败分类:migration symlink文本38、Skill references文本9、Windows symlink EPERM13、双盘符路径6、POSIX路径/权限/UID/install11、python3/rsync不可用4、底因未证实exit1共3。明细在基线artifacts及组合 `artifacts/combined-verification`,不提交。
|
||
- 首轮3305非md文件起止hash相同:`e95f3f18801d10fa757e52622fa3fb850af2258fc0ff7c5667300b588f73a90c`。此后仅追加报告未知depth透传/测试断言,最终重验结果见末节。
|
||
- 待完整构建环境补Static/gzip,按真人清单完成受控验收后再决定BUG是否resolved;没有本轮commit/push/部署,不改main。
|
||
- 报告独立审查的CRLF/D5冲突是另单未通过项,不冒称两单全部完成验收。
|
||
|
||
## 最终组合快照复验(含报告depth末次修正)
|
||
|
||
- tsc0错;lint0error/119warning;3763 tests/3679pass/84fail/skip0。相对固定基线新增46全通过、名称多重集合消失0、旧状态变化0,84失败名称及84份归一化完整诊断全部一致;首轮fixture槽位竞态未复现。
|
||
- 开始/结束3305非md文件hash同为 `b076a2c2f40d1fdac1520fa88b38818f14847b7e4710047571a0f73052d580ce`,无代码漂移,仅文档变化。
|
||
- 默认build仍junction失败;webpack编译/类型过,Skill symlink EPERM未解除,本轮先报/api/consult而非基线daily-starlanguage(并行worker先报路径不同,底层原因相同)。Static/gzip仍未验,不写成通过。
|
||
- 证据:组合树 `artifacts/combined-final-verification`;首轮日志保留。
|
||
|
||
## 最终组合Chrome复验
|
||
|
||
- 组合树重新运行星盘13/13、报告14/14,pageerror/非白名单请求0;真实合并代码,不复用单树成绩。
|
||
- 合并VedicChartSvg同时经星盘骨架与报告无原SVG fallback实际下载验证,SHA256 `c59bced71cc9433a32c09c68d5aa437f3b8de8e95f3cb9c8b88baeecc19a2a00`,两runner记录前后稳定;chart10个/report9个核心文件无漂移。
|
||
- 组合星盘证据:主仓本地 `artifacts/chart-report-browser-20260924/chart-2026-09-24T03-59-56-966Z/results.json`;报告为 `report-2026-09-24T04-01-33-428Z/results.json`。浏览器已关闭;mock API边界、超时harness映射与无受控登录/iOS/部署的限制不变。
|
||
|
||
## 最终范围与根tests合同
|
||
|
||
独立审计未见两共享文件合并遗漏、无关源码或冲突marker;精选整合点8/8通过。根Python前端合同四文件18条:17通过、1既有失败。主题合同test_frontend_theme_contract.py:29期待旧ink-secondary #676762,基线HEAD的CSS已为#5f5f59,内存重放基线同样失败;未改CSS迎合旧合同。另三个session/daily/rectification/birth journey入口合同通过。无Python/API路由/依赖/workflow/并发改动,diff --check通过。
|