feat(onboarding): one-time 「那一刻的天空」 reveal after the first own chart (T6)
After saveOnboardingPlace succeeds (and the next step is already set), the new useBirthSkyReveal hook fetches /api/birth-sky?subject=self and paints the cover; if that finishes within 3 s the chart page's dialog fades in (600 ms, none under reduced motion) with 「继续」. Timeout or failure is silent, no retry; closing touches only the reveal's own state. Home() gains no useState/useRef; page.tsx only wires. Family profiles and profile edits never trigger it. Also caps the dialog image by viewport height (the percentage max-height did not resolve inside the flex/grid cell), and completes PROGRESS, DESIGN §17, CHANGELOG and the real-device checklist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
028aef2737
commit
14ef18ac24
@@ -2,7 +2,110 @@
|
||||
|
||||
任务书:`docs/tasks/TASK-birth-sky-cover-20260928.md`。产品授权直接执行(Claude 子代理)。
|
||||
|
||||
- 基线:`origin/staging` = `d670521f`(serif-headings 已合入)
|
||||
- 分支 / 工作树:`codex/birth-sky-cover-20260928` / `.worktrees/birth-sky-cover-20260928`(本地提交,**未推送**)
|
||||
- 状态:提交 1(T1–T4 + T7)已完成;T5、T6 见后续提交。完整数字在最后一个提交里补齐。
|
||||
- 提交 2(T5):报告封面 **blocked**,不显示;缺口与解除方案写进 `BLOCKED.md`。
|
||||
- 基线:`origin/staging` = `d670521f`(任务书写作时为 `dc640931`;`TASK-serif-headings` 与 BUG-1079 按钮配色都已在基线里)
|
||||
- 分支 / 工作树:`codex/birth-sky-cover-20260928` / `.worktrees/birth-sky-cover-20260928`(三个本地提交,**未推送**,由 Claude 验收后推)
|
||||
- 环境:Node v22.14.0(`/exec-daemon/node`);无 `.venv`,Python 一律系统 `python3`(3.13,pyswisseph 2.10.03);无 Docker;有 `/usr/bin/google-chrome`(无头)。
|
||||
- BUG 编号:开工时最大 BUG-1079。新功能,本单未开 BUG。
|
||||
|
||||
## 结论
|
||||
|
||||
| 项 | 结果 | 提交 |
|
||||
| --- | --- | --- |
|
||||
| T1 天空计算模块 | 完成 | 1 |
|
||||
| T2 BFF 路由与合同 | 完成 | 1 |
|
||||
| T3 封面渲染与星盘页入口 | 完成 | 1 |
|
||||
| T4 保存图片 | 完成 | 1 |
|
||||
| T7 文档 | 完成(DESIGN §17、VOICE、CONTEXT、CHANGELOG、真机清单、任务索引) | 1(后两提交各自补本期段落) |
|
||||
| T5 报告封面 | **blocked,未实现**:报告没有出生资料绑定,按任务书不显示,写进 `BLOCKED.md` | 2 |
|
||||
| T6 首次建盘揭幕 | 完成 | 3 |
|
||||
| 让步 | 未砍 T6;T5 是 blocked 不是砍;三组连线都保留 | — |
|
||||
|
||||
## T1 · `scripts/birth_sky.py`
|
||||
|
||||
- `compute_birth_sky(date, time, tz_offset_hours, lat, lon)`:本地时刻减时区得 UT,`swe.julday` 得 JD。
|
||||
- 行星:`swe.calc_ut`(默认旗标,回归黄道视位置)→ `swe.azalt(jd, ECL2HOR, (lon, lat, 0), 0, 10, …)`,取几何高度(`atpress = 0`,不加折射)。方位 = swe 方位 + 180°(swe 自正南起算;注释写明)。七颗都返回(月亮在地平线下也要进事实句),前端只画地平线以上的。
|
||||
- 恒星:`scripts/data/bright_stars.json`,耶鲁亮星表第 5 版(VizieR V/50,`https://cdsarc.cds.unistra.fr/ftp/V/50/catalog.gz`,sha256 `3dc44b1e90be8fbe5bcc7656032560f51275f985c7e3f783c9028e1838ec7bed`;NASA ADC 产品,CDS 无限制分发,公有领域)。V ≤ 4.0 共 518 颗,J2000,不加自行。生成脚本 `scripts/build_bright_stars.py` 校验 sha256,原始星表不进仓。IAU 1976(Lieske)岁差换到出生历元,再 `swe.azalt(EQU2HOR)`;只返回地平线以上的星。连线用 HR 号:北斗(含 Megrez–Dubhe 闭合)、仙后 W、猎户(肩、腰带、脚、头)。
|
||||
- `phase`:太阳高度 > 0 `day`;−18°~0° 按太阳本地时角分上午 / 下午(真太阳时,0~180° 为下午);< −18° `night`。
|
||||
- 返回不带任何输入字段。`POST /api/birth_sky` 在 `do_POST` 里 7 行薄注册(与 `/api/ephemeris_events` 同样式):`JyotishAPIHandler` 方法数 218 不变,`__new__` 计数不变,文件 10935 → 10942 行(上限 11224)。不是重计算路径,不进 `HEAVY_COMPUTE_PATHS`。
|
||||
- `tests/test_birth_sky.py`(14 条):样稿 golden(太阳 31.71° / 84.69°,土星 50.31° / 191.14°,月亮、木星在地平线下);三个纬度 / 日期的真太阳时正午高度 = 90 − |纬度 − 赤纬|(±0.5°,赤纬取 swe 赤道坐标,逐分钟扫最高点);北极星高度 30.8°(±1°)、方位近正北;四种 phase;输出不含输入;星表来源与许可;岁差对 Meeus 例 21.b 精确到 1e-5°;参数校验;HTTP 薄注册 200 / 400。已加入 quick 门禁列表(`run_quality_gate.py` +2 行)。
|
||||
- golden 生成脚本 `scripts/generate_birth_sky_golden.py` → `frontend/tests/fixtures/birth-sky-golden.json`(样稿虚构资料四个时刻的真实引擎输出,前端测试原样读取)。
|
||||
|
||||
## T2 · `GET /api/birth-sky?subject=`
|
||||
|
||||
- `lib/birth-sky/service-core.ts` `assembleBirthSky`:`loadSubjectBirth` → `prepareChartViewProfile`(与星盘页同一条路)→ 引擎 → `birthSkyFromEngine`(zod 合同 `lib/birth-sky/contract.ts`)。`timeBasis` = `birthTimeStatus` 为 `accepted` / `confirmed` 时 `adopted`,否则 `reported`。
|
||||
- 状态:未登录 401 `unauthenticated`;别人的 / 不存在的 subject 404 `not_found`;资料不全 200 `birth_profile_incomplete`;引擎失败、坏载荷、时区解析失败 503 `unavailable`;每用户每分钟 20 次,超了 429 `unavailable`。只读 `?subject=`,不接受客户端日期经纬度;不计费、不写库;响应 `no-store`。
|
||||
- `frontend/tests/birth-sky-route.test.ts`(6 条):401、404、incomplete(本人缺坐标 / 家人 `subject_incomplete`)、正常返回过合同且 JSON 不含 `latitude/longitude/date/time/timezone/placeLabel/name` 键与 1994、07:40、30.27、120.15、虚构名等值;adopted 标注;引擎抛错与坏载荷 503;路由源码只读 `subject`、服务端取出生资料、无计费与写库。
|
||||
|
||||
## T3 / T4 · 渲染、入口、保存
|
||||
|
||||
- `lib/birth-sky/sentence.ts`:四句主句表与事实句规则原样照任务书;样稿资料得「太阳在东,月亮在脚下,火星正悬在东南」。
|
||||
- `lib/birth-sky/draw.ts` `drawBirthSky(ctx, sky, { palette, width, height, footnote?, serif? })`:Canvas 2D 纯函数,600 × 800 设计格按宽度缩放,导出 1080 × 1440。两套 palette 取 DESIGN token(`night` 深色主题页底 / 墨 / 细线 / 深色 action 画太阳;`paper` 报告纸色 / 墨 / `--report-rule` / `--report-accent`)。行星名做了简单避让(四个候选位)。
|
||||
- `lib/birth-sky/render.ts`:`document.fonts.load('600 30px "Jyotisha Serif SC"', 主句+顶部小字)`,最多等 1.5 秒,超时或失败用黑体画;离屏 canvas → `toBlob("image/png")`。
|
||||
- `lib/birth-sky/export.ts`:文件名 `jyotisha-sky.png`;`navigator.canShare({ files })` 真 → `navigator.share`;`AbortError`(用户取消)返回 `cancelled` 不提示;其余走 Blob + `a.download`。
|
||||
- `hooks/use-birth-sky-cover.ts`:星盘页 `ok` 后按 `subjectId:profileFingerprint` 预取并画好 PNG,画好才返回;切人物 / 改资料键变即重取,旧请求 abort、旧 blob URL 释放。
|
||||
- `ChartPageView` 新增可选 `birthSky` prop,`view.status === "ok" && birthSky` 时往 `actions` 放 `BirthSkyEntry`(「那一刻的天空」描边小按钮)。弹层 `components/birth-sky/birth-sky-dialog.tsx`(原生 `<dialog>`,窄屏全屏、≥860px 居中 520px;`<img>` + 「保存图片」),与其 CSS、画布、导出一起懒加载。
|
||||
- 测试:`birth-sky-sentence.test.ts`(6)、`birth-sky-draw.test.ts`(8:1080×1440、全部文字不含日期/时刻/经纬度/地名/名字、footnote 两态、东在左且真实太阳画在圆心左侧、地平线下不画、宋体与超时退回黑体、paper palette、连线只连可见星)、`birth-sky-export.test.ts`(5:share 可用 / 不可用 / 用户取消 / share 失败回落下载 / 字体等待超时)、`chart-page-view.test.tsx` 追加 2(就绪才有按钮;未就绪、失败、资料不全、视图未到都无按钮;预取键与懒加载源码合同)。
|
||||
|
||||
海报(样稿虚构资料,真实引擎 golden → 同一个 `drawBirthSky` → 无头 Chrome 里 `canvas.toDataURL` 取出的 PNG,含宋体切片):
|
||||
|
||||
- `/tmp/claude-1000/-workspace-Jyotisha/d49dfa04-4e7a-47b2-80a7-8529c4c38f86/scratchpad/birth-sky-poster-day-night.png`(07:40,白天,night palette,「按你填写的时间」)
|
||||
- 同目录 `birth-sky-poster-night-night.png`(00:00,夜里,adopted,北斗与仙后可见)
|
||||
- 同目录 `birth-sky-poster-twilight_evening-paper.png`(19:10,傍晚,paper palette,猎户可见)
|
||||
- 同目录 `dialog-390x844.png`、`dialog-1280x900.png`(弹层版式静态样张,截在淡入途中)
|
||||
|
||||
## T5 · 报告封面:blocked
|
||||
|
||||
证据与解除方案见 `BLOCKED.md`「TASK-birth-sky-cover T5」。要点:`personal_reports` 行、报告文档、job / section / appendix 表都没有出生资料指纹;`request_fingerprint` 不含出生资料;`calculation_hash` 是引擎结果哈希或 markdown 哈希。按任务书不显示封面,`reportView`、报告页、打印样式都未改。`paper` palette 已在 T3 实现并有单测,解除后可复用。
|
||||
|
||||
## T6 · 首次建盘揭幕
|
||||
|
||||
- `lib/birth-sky/reveal.ts` `startBirthSkyReveal`:3 秒计时;期限内拿到画好的封面才 `onReady`;超时 abort 请求、迟到的封面释放 URL;失败静默,不重试。
|
||||
- `hooks/use-birth-sky-reveal.ts` 自持 `cover` 状态;`useProfileOnboarding` 新增可选参数 `onOwnBirthPlaceSaved`,只在 `saveOnboardingPlace` 保存成功、且下一步已设好之后调用(fire-and-forget)。`page.tsx` 只接线:+1 个自定义 hook 调用、+1 个参数、+1 个 `<BirthSkyReveal>`、+2 行 import(1370 → 1375 行;`Home()` 的 `useState` / `useRef` 数不变)。
|
||||
- 弹层与星盘页同一个组件,`reveal` 时加 `is-reveal`(600ms 透明度淡入,`prefers-reduced-motion` 关闭)与「继续」。关闭只清 reveal 自己的状态。
|
||||
- `frontend/tests/profile-onboarding-birth-sky-reveal.test.ts`(5):期限内出现、关闭不碰 onboarding;超时无弹层且迟到封面被释放、请求被 abort;失败无弹层无重试;只由本人 onboarding 出生地保存成功触发(`saveProfile`、星盘档案、`chart-profile-form` 不触发);弹层「继续」/ Esc / 遮罩与淡入 CSS。
|
||||
|
||||
## 验证
|
||||
|
||||
| 项 | 基线 `d670521f` | 提交 1 `d277cbd8` | 交付(提交 3) |
|
||||
| --- | --- | --- | --- |
|
||||
| `tsc --noEmit` | 0 错 | 0 错 | 0 错 |
|
||||
| `npm run lint` | 0 error / 127 warning | — | 0 error / 127 warning |
|
||||
| `npm test` | tests 4255 · pass 4200 · fail 24 · cancelled 0 · skipped 31 | tests 4282 · pass 4227 · fail 24 | tests 4287 · pass 4232 · fail 24 · cancelled 0 · skipped 31 |
|
||||
| 失败清单 | 24 条(全是需要 Docker / PostgreSQL 的数据库与部署套件) | 与基线逐条同名 | 与基线逐条同名 |
|
||||
| 测试名对比(`frontend/AGENTS.md` 方法) | — | 消失 0 | 消失 0,新增 32 |
|
||||
| `python3 -m pytest tests/test_birth_sky.py tests/test_api_server_growth_contract.py tests/test_readonly_chart_endpoints.py` | — | — | 全部通过 |
|
||||
| `python3 scripts/run_quality_gate.py --profile quick`(Node 22 在 PATH) | — | — | 所有 Python 步骤通过(pytest 997 passed / 1 skipped,含新加的 `tests/test_birth_sky.py`);最后一步 `npm test` 的 24 条失败与基线逐条同名(无 Docker)→ 退出码 1,属环境缺口 |
|
||||
| `python3 -m pytest tests/test_repo_privacy_markers.py -q` | — | — | 通过 |
|
||||
| `next build`(`rm -rf .next` 后全量) | `/` ○ Static | — | `/` ○ Static;路由表与基线逐行相同,只多一行 `ƒ /api/birth-sky` |
|
||||
|
||||
### 首屏 gzip(`index.html` 引用的全部 js / css,gzip -9 求和,两边都是干净全量构建)
|
||||
|
||||
| | 基线 | 交付 | 变化 |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| JS | 651,590 B | 652,363 B | +773 B(+0.12%) |
|
||||
| CSS | 66,346 B | 66,346 B | 0 |
|
||||
|
||||
JS 的 +773 B 是首页为 T6 引入的 `useBirthSkyReveal`、`startBirthSkyReveal`、`loadBirthSkyCover` / `fetchBirthSky` 与 `next/dynamic` 占位;弹层、画布、导出、`birth-sky.css` 都在懒 chunk。
|
||||
|
||||
## 改动的既有断言
|
||||
|
||||
无。`chart-page-view.test.tsx` 只追加了两条测试和一个 import,未改任何既有断言。
|
||||
|
||||
## 偏离任务书(请 Claude 定)
|
||||
|
||||
1. **星盘页按钮本身不懒加载**:`BirthSkyEntry` 是星盘页 chunk 里一个普通 `<Button>`(只在图画好后渲染),弹层、CSS、画布、导出都懒加载。原因:按钮要能在 SSR 测试里断言「就绪才出现」,且它不在首页 `/`。
|
||||
2. **事实句里的「最高的一颗可见行星」同时排除太阳与月亮**(月亮已有自己的一段)。任务书写「除太阳外」;样稿结果不变。
|
||||
3. **晨昏按太阳本地时角分上午 / 下午**(真太阳时),不按钟表时间。
|
||||
4. **顶部小字的字距用逐字绘制实现**,不用 canvas `letterSpacing`(部分 Safari 不支持;无头 Chrome 里设了又复位后后续文字仍带字距)。
|
||||
5. **BFF 增加每用户每分钟 20 次的限流**(与星盘页同量级),任务书未写。
|
||||
6. **宽屏弹层 520px**(报告导出抽屉是 720px),3:4 的图在 720 宽时会被高度卡住、两侧空白。
|
||||
7. **T6 的 3 秒包含取数与画 PNG**(含最多 1.5 秒字体等待)。
|
||||
8. VOICE 对照:四句主句与事实句未发现与 VOICE 其余条款冲突(短句、无 emoji、无揣测、不讲运势);主句带句号、事实句不带,照样稿。新增一句保存失败文案「没能保存。长按或右键上面的图,也能存下来。」已收进 VOICE。
|
||||
|
||||
## 环境缺口
|
||||
|
||||
- 无登录态与真机:星盘页按钮、弹层、分享 / 下载、首次揭幕只在单元测试、SSR 渲染、无头 Chrome 静态样张上验证;真机清单 `docs/testing/birth-sky-cover-checklist.md`(17 条)。
|
||||
- 无 Docker:24 条 DB / 部署套件失败与基线逐条同名;quick 门禁最后一步 `npm test` 因此退出码 1。
|
||||
- 无 `.venv`:Python 用系统 `python3`。
|
||||
- 无头 Chrome 的 `--screenshot` 在本机对这页时好时坏(挂起),海报改用 `canvas.toDataURL` + `--dump-dom` 取出,是导出 PNG 的真实像素。
|
||||
- 未推送、未部署。
|
||||
|
||||
@@ -248,7 +248,7 @@
|
||||
| `TASK-consult-first-frame-and-pacing-20260928.md` | `PROGRESS-consult-first-frame-and-pacing-20260928.md` | **普通对话发出即有反馈、正文按打字节奏放出**:客户端分类前静默(BUG-976 副作用)+ 服务端分类后才开流 → 发出后一两秒空白;服务端 160 字截留 + 客户端 settle 一帧全放 → 追问轮正文一下全出。D1 首帧「收到,正在看你的问题…」、D2 先建流、D3 每帧上限 + 限时收尾、D4 160 字阈值不动 | 已验收并部署 staging(真机欠) | 分支 `codex/consult-first-frame-and-pacing-20260928`(未推送);进度 `PROGRESS-consult-first-frame-and-pacing-20260928.md`;BUG-1074 / BUG-1075 |
|
||||
| `TASK-chart-types-and-report-buttons-20260928.md` | `PROGRESS-chart-types-and-report-buttons-20260928.md`、`PROGRESS-ayanamsa-report-buttons-20260928.md` | **星盘盘型扩充 + 表格随盘换 + 七政隐藏 + 岁差 6 项 + 我的报告按钮配色**:分盘表一直显示 D1 数据(BUG-1076);盘型条 + 「星盘类型」面板共 23 种(加 月亮盘 / Bhava / 行运 / D40 / D45 / D60);Bhava 端点缺 MC 静默等宫(BUG-1077);报告深色主按钮黑字深红、禁用半透明(BUG-1078,只改报告范围) | 已验收、已部署 staging `6a4e312c`(真机欠) | `af27709d`…`4189750c`(子代理实现 + Claude 验收补丁);BUG-1076~1078;含迁移 `20260928010000_profile_ayanamsa_six` |
|
||||
| `TASK-site-button-contrast-20260928.md` | `PROGRESS-site-button-contrast-20260928.md` | **全站实心按钮配色与禁用态统一**:层外 `button { color: inherit }` 压掉 Tailwind 文字色(61 个 `<Button>` 浅 3.33 / 深 2.57),`.button-primary` 30 个浅色 3.14,全部禁用态 45% 透明;产品选 A:全站用报告页配色(浅 4.85 / 深 5.77),推翻 DESIGN「已知缺口」;禁用改灰;删 BUG-1078 局部覆盖(BUG-1079) | 已验收、已部署 staging `dc640931`(真机欠) | `12aac87b` + `fa58df16`;BUG-1079 |
|
||||
| `TASK-birth-sky-cover-20260928.md` | `PROGRESS-birth-sky-cover-20260928.md` | **「那一刻的天空」封面**:出生那一刻头顶的真实天空做成 3:4 封面(产品从 A 年轮 / B 一笔画 / C 天空三版样稿中选 C,样稿 `assets/birth-sky-cover-sample-20260928.html`);星盘页按钮 + 保存图片、报告封面(须对得上报告出生资料)、首次建盘揭幕;不印出生资料、句库只描述天空、无新依赖 | 实现中(分支 `codex/birth-sky-cover-20260928`,未推送);T5 报告封面 blocked(无出生资料绑定,见 BLOCKED.md) | 新功能,不开 BUG |
|
||||
| `TASK-birth-sky-cover-20260928.md` | `PROGRESS-birth-sky-cover-20260928.md` | **「那一刻的天空」封面**:出生那一刻头顶的真实天空做成 3:4 封面(产品从 A 年轮 / B 一笔画 / C 天空三版样稿中选 C,样稿 `assets/birth-sky-cover-sample-20260928.html`);星盘页按钮 + 保存图片、报告封面(须对得上报告出生资料)、首次建盘揭幕;不印出生资料、句库只描述天空、无新依赖 | 已实现待验收(分支 `codex/birth-sky-cover-20260928`,未推送);T5 报告封面 blocked(无出生资料绑定,见 BLOCKED.md) | 新功能,不开 BUG |
|
||||
| `TASK-serif-headings-20260928.md` | `PROGRESS-serif-headings-20260928.md` | **全站标题改用自托管宋体、正文保持黑体**:产品推翻 BUG-737「CJK 不用衬线」结论(保留「声明的字体必须可加载」「不落系统宋体」两条);Noto Serif SC SemiBold 按通用规范汉字表 6500 字 unicode-range 切片自托管(改名 Jyotisha Serif SC),swap 不 preload;首页宋体流量 ≤300 KB;先于天空封面单 | 已实现待验收(分支 `codex/serif-headings-20260928`,未推送) | 不开新 BUG;BUG-737 追加说明 |
|
||||
| `TASK-cend-ui-claude-alignment-20260916.md` | `PROGRESS-cend-ui-r1/r2/r3-20260916.md` | **C 端界面向 claude.ai 产品界面对齐(三轮串行 R1→R2→R3,都动 `globals.css`,不得并行)**:根因是 `frontend/CLAUDE_DESIGN.md` 扒的是 **claude.com 营销官网**,它自己在 Known Gaps 里写明 claude.ai 产品界面不在范围内,而 `DESIGN.md:3` 把它当成了产品界面的实现契约。**R1**:`--font-display` 里 Tiempos Headline / StyreneB **从未加载**(无 `@font-face`、`public/` 无字体、`layout.tsx` 只 vendor 了 Inter),中文标题全站落到 **宋体 / SimSun**,波及 20 处含助手回答的 h2/h3(BUG-737);亮色强调色 `#85432f` 与暗色 `#d78064` 不同源,产品拍板亮色换 **Claude coral `#cc785c`**,**易漏点**是 `globals.css:16` 的 `--color-ring` 硬编码在 `@theme inline` 里不跟随 `:root`,另有第四个 `:root` 亮色块(`:4358`)必须同步(BUG-738);`.composer-footer` 常驻 44px + 顶栏 68px + `--composer-reserve` 148px,每屏固定吃掉 216px,模型选择器移进输入框内部、删掉底栏、顶栏收到 46px 并删「分析对象」副标题。**R2**:空状态是营销落地页(hero 卡 + 两张 132px 入口大卡 + 3 列 156px 主题卡),输入框被压在 **800px 以上**内容之下,重排成「问候 + 居中输入框 + 两枚入口 pill + 一排 chip」。**R3**:侧栏两个 `<details>` 拍平成一条「最近」、星盘的两个入口(侧栏分组 + 账户菜单)收敛到一处、删掉逐条助手头像。**决策记录 D3 推翻 DESIGN.md「报告强调色与应用同源」一句**(报告刻意保留深棕)。原型图 https://claude.ai/code/artifact/da275da6-2954-4f50-99aa-32bb8694d38b(三套画面 + 明暗,页面标题就是建议字体栈的实际渲染)。环境缺口:无登录态无 Chrome,四项真机观感留 `docs/testing/`。BUG 段 737–738 | 待领取 | — |
|
||||
| `TASK-cend-surfaces-claude-alignment-20260916.md` | `PROGRESS-cend-shell-20260916.md`、`PROGRESS-cend-report-20260916.md`、`PROGRESS-cend-rectification-20260916.md`、`PROGRESS-cend-chart-eph-20260916.md` | **次级页面对齐(上一单的续篇,R4→R5/R6,R7、R8 可并行)**:星盘 `/chart`、星历 `/ephemeris`、报告 `/reports` **各是脱离 app 外壳的独立全屏页**,顶部只有一个「返回对话」链接、侧栏整个消失,且三家各写了一套一模一样的 `*-shell`/`*-topbar`/`*-hero` 骨架——与上一单 E5 同根因(营销站 band 结构被套到产品界面)。**R4** 抽只读导航外壳 `AppNavRail`(只用现成的 `GET /api/sessions` + `GET /api/account`,会话行走 `sessionHref` 跳 `/?c=<uuid>`;**刻意不带**重命名/删除/收藏/归档——那套连着 `Home()` 的乐观更新与回滚,搬过来会撞 useState 增长门禁)。**R5** 星盘五 tab 下划线化 + 参数合表 + 行星表横向滚动;星历日期导航改 `‹ 日期 ›`。**R6** 报告中心卡片网格改行式列表;阅读页加常驻目录。**R7** 生时校正把可信区间从盘面板标题行提成常驻条(窄屏 `.is-compact` 下盘面板是 overlay,现在默认看不到区间),五个 `technique-audit` 折叠块收成两段。**R8** 设置内容区收窄(880px 弹窗里表单铺了 690px)、套餐卡三修饰符收敛成两态。**已解锁**:原挡路的设置单已于 `111b4a84`(BUG-698)合入。**两条不得回退**:BUG-698 的 `@supports (height: 1dvh)` 写法(重复声明回退会被 Lightning CSS 折叠)、BUG-616/617 的报告盘面 grid 实现。默认不占 BUG 号 | **R4–R8 全部已实现并验收合入** | R4:抽出 `AppNavRail`(只读,两个 GET,零写操作)+ `SecondaryShell`,三个次级页并入 app 外壳并删掉各自的 shell/topbar/hero;四个路由渲染标记**完全不变**(`/` `/chart` `/ephemeris` 仍 Static);CSS gzip −0.25%。`/reports/[reportId]` 留给 R6 与目录一起做。两处自身健壮性问题被测试抓到:`usePathname()` 可为 null、`fetch` 可能不存在。差点弄丢 BUG-717 的 eyebrow 文案(已放回)。R8:表单分区收窄到 440px(列表分区不变)、套餐卡三修饰符收敛成互斥的 `is-current` / `is-recommended`,`--highlighted` 删除改为滚动定位;手机端 `order:-1` 改挂 `[data-plan-alias]`(版位不是状态)。测试 3350→3354(净增 4),失败清单与基线逐条一致;`/` 仍 Static;我的干净构建实测 CSS gzip −3 字节。**遗留待产品拍板**:`?plan=` 深链现在完全没有视觉指向,只有滚动位置。R6:报告中心卡片网格改行式列表、阅读页并入外壳并把目录挪到右侧常驻。**任务书 E10 过期**——目录在 `cfcd369d` 就已存在,本轮是挪位置定稿而非从零加。挂外壳带出一个真实打印风险已处理:`.chat-app`/`.chat-panel` 是 `height:100%;overflow:hidden`,裸 `window.print()` 会把九节报告裁成一页,阅读页因此多挂一条只在挂载期生效的 print 样式解锁外壳。「生成中的分节进度」做不了——`REPORT_LIST_COLUMNS` 不返回节数,按 VOICE.md 不许前端编。R7:区间常驻条与盘面折叠收敛。**任务书 E9 也不准确**——对话区顶部早有常驻条 `RectificationTimeline` 且窄屏可见,真正只在盘面标题行的是**代表分钟**;因此没另造第二条,在既有条上补齐代表分钟与已答题数(与盘面同一次 `workingRectificationTime()` 调用)。折叠块实际是 **8 个**不是 5 个。**触发让步顺序第 5 条**:收窄进度未做——服务端无该字段,且 `candidate_range` 会放宽(BUG-572),前端相减会把一次放宽报成收窄,已写进 `BLOCKED.md`。顺带修掉一个**静默失效的旧断言**(`slice(indexOf(A), indexOf(B))` 在 B 改名后变成几乎整份文件,四条 `doesNotMatch` 假通过)|
|
||||
|
||||
@@ -33,3 +33,13 @@
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 11 | 桌面 Chrome | 打开「我的报告」任一份 | 没有天空封面,没有占位 | |
|
||||
| 12 | 桌面 Chrome | 该报告「打印 → 存为 PDF」 | 第一页与上线前相同 | |
|
||||
|
||||
## 首次建盘揭幕
|
||||
|
||||
| # | 设备 / 浏览器 | 操作 | 期望 | 结果 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 13 | iPhone Safari | 新账号走完首页引导,最后一步保存出生地 | 3 秒内在当前页面上淡入同一张图(约 0.6 秒),多一个「继续」 | |
|
||||
| 14 | 同上 | 点「继续」/ Esc / 点遮罩 | 关掉,下面就是原本的下一步(问候或校正引导),没有被换掉 | |
|
||||
| 15 | 桌面 Chrome | 新账号,保存出生地前在 DevTools → Network → Request blocking 加一条 `*api/birth-sky*`(或把 `/api/birth-sky` 限速到 3 秒以上) | 保存成功后不出现弹层、不报错,引导照常往下走 | |
|
||||
| 16 | 任一 | 系统开启「减少动态效果」后重复 13 | 弹层直接出现,没有淡入 | |
|
||||
| 17 | 任一 | 在星盘档案里新建一个家人、或在设置里改自己的出生资料 | 都不弹「那一刻的天空」 | |
|
||||
|
||||
Reference in New Issue
Block a user