Files
Jyotisha/docs/tasks/PROGRESS-chart-page-skeleton-wait-20260924.md
T
jesse-uxandClaude Code 1420471ab1
Independent Staging Quality Gate / validate (push) Successful in 10m34s
Independent Staging Quality Gate / publish (push) Successful in 3m36s
feat: add chart waiting states and report block exports
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>
2026-09-24 12:33:09 +08:00

110 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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通过。