Coordinator ruling (brief author, 2026-09-26): Aindra -> Indra (因陀罗), Variyana -> Variyan (安逸), Dhanishtha -> Dhanishta (虚宿). Spelling aliases only; the brief's table and its typed test copy are unchanged. BLOCKED item struck through, PROGRESS / checklist / task index updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
74 lines
11 KiB
Markdown
74 lines
11 KiB
Markdown
# PROGRESS · 星盘档案页补样式 + 星历页可读性(2026-09-26)
|
||
|
||
任务书:`docs/tasks/TASK-people-ephemeris-ui-20260926.md`。分支 `codex/people-ephemeris-ui-20260926`,worktree `.worktrees/people-ephemeris-ui-20260926`。执行方:Claude 子代理(产品授权直接执行)。未推送、未部署。
|
||
|
||
## 基线
|
||
|
||
- `origin/staging` = `65260ca7`(线上 `e84d6eb8` 之后只有文档提交)。
|
||
- 基线全量(同一台机器、Node v20.19.2):3883 条,61 失败(全是 Node 20 缺 `mock.module` 等环境缺口),27 跳过。
|
||
- BUG 编号:开工时 `docs/BUG_HISTORY.md` 最大 BUG-1037,BUG-1038 被并行单预留,本单 **BUG-1039**。
|
||
- 并行单 `TASK-new-chat-from-people-20260926` 的文件(`people-home-links.tsx`、`chat-session-url.ts`、`home-bootstrap-run.ts`、`app/(app)/page.tsx`)一律未动。`people-page.tsx` 里「和 TA 对话」仍是 `openPerson(selected.id, "/?newChat=1")` 一行,跳转目标由那一单改,合并时只会在这一行冲突。
|
||
|
||
## 改了什么
|
||
|
||
| 任务 | 文件 | 内容 |
|
||
| --- | --- | --- |
|
||
| T1 | `frontend/src/components/people/people-page.tsx` | 拆出无状态 `PeopleArchiveView`(同文件导出,便于组件测试);`data-view` 列表 / 详情切换;手机点人 `pushState(?person=<id>)`,`popstate` 与「‹ 返回」回列表,刷新详情地址直接打开;列表行、详情卡、时间卡、快捷入口;删除挪进编辑视图底部,确认 / 计数 / 失败句逻辑不变。 |
|
||
| T1 | `frontend/src/lib/people-archive-view.ts`(新) | 头像取色(按 id 取四个元素色)、首字、城市、行 meta、「已校正」判定、岁差中文名。 |
|
||
| T1 | `frontend/src/app/globals.css` | `people-archive*` 共 24 个类的规则;`@media (max-width: 1023px)` 只显示一栏,`@media (min-width: 1024px)` 两栏。 |
|
||
| T2 | `frontend/src/lib/panchanga-names-zh.ts`(新) | 任务书附表原样 + 三组别名;`panchangaNameZh` 查不到返回 null。 |
|
||
| T2/T3 | `frontend/src/lib/ephemeris-view.ts` | `panchangaDisplayRows`(中文主名 / 梵文副名,查不到记一次 `panchanga_name_zh_missing`)、`panchangaQualityCounts`、`panchangaComplete`、`panchangaDaySummary`(D7 纯函数)、`ephemerisAyanamsaNote`(D10)、`transitHouseLine`(D9);文案常量更新。 |
|
||
| T3/T4 | `frontend/src/components/ephemeris/ephemeris-page.tsx` | 顶栏不再有按钮;五要素总评 + 计数 + 彩色标签;行运行改版(符号、「在」、宫位副行、度°分′);底部提示卡。 |
|
||
| T3/T4 | `frontend/src/app/globals.css` | `.ephemeris-quality`(12% 同色底)、`.ephemeris-summary`、`.ephemeris-counts`、行运新行式、`.ephemeris-ask-card`;删掉行运表头和 `data-label` 堆叠;标签去字距、行距收紧;行星符号颜色复用 `.chart-page-planet-glyph` 的 `--color-planet-*` 规则。 |
|
||
| T5 | `docs/BUG_HISTORY.md`、`CHANGELOG.md`、`BLOCKED.md`、`frontend/DESIGN.md`(§15 新增「星盘档案页布局」、§16 重写)、`frontend/docs/VOICE.md`(总评句式、提示卡、档案页文案)、`docs/testing/people-ephemeris-ui-20260926.md` | 记录。 |
|
||
|
||
## 实现取舍(验收请看)
|
||
|
||
1. **中文名在视图层投影,不改接口。** 任务书 T2 写「`panchangaFromEngine` 输出中文主名与梵文副名」,同时红线 3 写「不改接口」。实际函数名是 `panchangaFactorsFromEngine`,它的输出就是 `/api/ephemeris` 的 `factors` 字段。为守红线,接口字段一字未改(`value` 仍是引擎名),中文主名 / 梵文副名由 `panchangaDisplayRows` 在客户端从 `panchanga-names-zh.ts` 查。「未知名记日志」因此在浏览器控制台,每个名字只记一次。
|
||
2. **星期不出副行。** 接口里星期本来就是中文(服务端 `VARA_ZH`),引擎原名是英文 Sunday,不是梵文;附表也没有星期。原型里的「土星日」不在附表里,没加。
|
||
3. **对照表与引擎拼写三处不一致 → 已按裁决补别名。** 引擎 `scripts/muhurta.py` 输出 `Aindra`、`Variyana`、`Dhanishtha`,附表写的是 Indra、Variyan、Dhanishta(真实 golden 2026-09-14 的瑜伽就是 `Aindra`)。首版按任务书只收三组别名,这三个名字照写梵文并挂待裁决;协调方 09-26 以任务书作者身份裁定:在 `PANCHANGA_NAME_ALIASES` 补 `Aindra → Indra`、`Variyana → Variyan`、`Dhanishtha → Dhanishta` 三组拼写别名,指向表内既有条目(因陀罗 / 安逸 / 虚宿),译名不变。测试里「任务书附表第二份抄本」保持原样,另加一条别名断言;原先锁「这三个名字返回 null」的三行断言随裁决删除(原值 null / 新值 因陀罗·安逸·虚宿 / 原因:裁决补别名)。
|
||
4. **D10 的两个边界句。** 资料岁差是 Lahiri 时,「和星盘页的 Lahiri 不同」是错的,改写「五要素按 Lahiri 岁差算,和星盘页相同。」;读不到资料岁差时只写「五要素按 Lahiri 岁差算。」已写进 VOICE。岁差名取接口已有的 `transits.ayanamsa`(即资料设置),名字与设置里一致,不带「(默认)」。
|
||
5. **没有本命上升时的句子改了。** 原句「还没有本命上升,相对本命这一列空着。」里的「列」随表格一起没了,改为「还没有本命上升,先不写落在你的第几宫。」行运逆行保留为副行「· 逆行」(D9 没提,但删掉会丢事实)。
|
||
6. **「已校正」判定** = 状态 accepted / confirmed **且**有校正案例 id。只看状态会把旧资料读回时 `readProfile` 的 `confirmed` 兜底(有时间就算 confirmed)误标成已校正。
|
||
7. **当前人物 vs 正在看的详情。** 「当前正在看的人高亮」按顶栏当前人物(`useCurrentSubject`)上强调色;桌面右栏打开的那一行只用中性浅底 `is-open`,免得两行都是强调色。
|
||
8. **桌面五要素仍是五格一行**(DESIGN §16 原有),标签在上、名称与标签在下;767px 以下才是原型那种「左标签 · 中名称 · 右标签」行。原型里日期条下的「星期六 · 今天」副标题、迦那副行「· 通常避开」都不在决策里,没做。
|
||
9. 档案页「还可以保存 N 个人」「本人不能删除」按原型去掉了句末句号(VOICE 已写)。
|
||
|
||
## 验证
|
||
|
||
| 项 | 结果 |
|
||
| --- | --- |
|
||
| `./node_modules/.bin/tsc --noEmit` | 0 错 |
|
||
| `npm run lint` | 0 error / 127 warning(与既有一致,新文件无 warning) |
|
||
| 全量 `npm test`(Node 20.19.2) | 3915 条,3827 通过,61 失败,27 跳过。基线 3883 / 61 失败。失败测试名与基线逐条比对:新增 0、消失 0;测试名无消失,新增 32 条(`panchanga-names-zh` 7、`ephemeris-readable-panchanga` 13、`people-archive-view` 12) |
|
||
| 定向 | `ephemeris-page`、`ephemeris-readable-panchanga`、`panchanga-names-zh`、`people-archive-view`、`people-archive-regressions`、`chart-library-other-profile`、`adopted-birth-date`、`settings-mvp-contract`、`secondary-page-entry`、`viewport-breakpoint-contract`、`touch-target-contract`、`dark-theme-contract`、`design-token-contract` 全绿(`ephemeris-route` 的 6 条失败是基线同名 Node 20 缺口) |
|
||
| Python 源码合同 | `tests/test_birth_time_journey_contract.py`、`test_session_management_entrypoints.py`、`test_supabase_user_data_contract.py`、`test_daily_and_rectification_entrypoints.py`:25 passed(系统 python3 + pytest 9.1.1;本 worktree 无 `.venv`) |
|
||
| `npm run build -- --webpack` | 成功;`○ /`、`○ /people`、`○ /ephemeris`、`○ /chart` 仍 Static(`/reports` 为 ƒ,本单未碰) |
|
||
| 首屏 gzip(`build-manifest.json` rootMainFiles 4 个文件,zlib 默认级别) | 131253 字节,基线 130933,+0.24%(±2% 内;本单只改组件与 CSS,不进 rootMainFiles,差值应是口径 / 构建噪声) |
|
||
|
||
改动的既有断言(三栏也写在测试文件里):
|
||
|
||
| 位置 | 原值 | 新值 | 原因 |
|
||
| --- | --- | --- | --- |
|
||
| `tests/ephemeris-page.test.tsx`「the Lahiri note sits under panchanga…」 | `EPHEMERIS_COPY.panchangaLahiriNote`(固定句「这一段按 Lahiri 岁差算,和星盘页用的岁差不是同一套。」) | `ephemerisAyanamsaNote("raman")`(「五要素按 Lahiri 岁差算,和星盘页的 Raman 不同。」) | D10 改句式并要求按资料实际岁差填名;位置断言不变 |
|
||
| `tests/ephemeris-page.test.tsx`「copy stays factual…」 | 整页 markup 不得含 `/运势\|适合\|不宜\|建议\|吉祥日/` | 去掉底部提示卡那一句问句后再断同一组词,另断问句只出现一次 | D8 定稿问句「想问这一天适不适合做某件事?」是邀请提问,不是宜忌结论;其余范围不放宽 |
|
||
|
||
## 浏览器截图(真实 Chrome 151,非登录态)
|
||
|
||
方式:本地 `next build --webpack` + `next start`,加一个**未提交**的临时宿主页 `/ui-harness-1039`:
|
||
- `?screen=people` 挂真实 `PeoplePage`,只把 `/api/account`、`/api/chart-profiles`、`/api/sessions` 三个读请求换成虚构数据(本人「示例甲」已校正、「示例乙」Lisbon/Lahiri、「示例丙」成都),列表 → 详情 → 返回走的是组件真实的 `pushState` / `popstate`。
|
||
- `?screen=ephemeris` 挂真实 `EphemerisView`:行运用真实引擎 golden(2026-09-15),五要素用虚构 Vishti/Purnima 组合以显示完整总评;另一张用真实 golden 五要素。
|
||
- CDP 驱动(`node --experimental-websocket`),设备像素比 2,`prefers-color-scheme` 亮 / 暗。每个宽度同时检查:页面与 `.secondary-page` 无横向滚动、可见按钮高度均 ≥ 44px、星历顶栏没有 `.ephemeris-ask`;手机宽度检查点人后 URL 带 `?person=`、`history.back()` 与「‹ 返回」都回到 `data-view="list"`。全部通过(`ui-1039/checks.json`)。
|
||
|
||
截图目录 `/tmp/claude-1000/-workspace-Jyotisha/725df462-ac7f-4544-90b7-60fba1501ed7/scratchpad/ui-1039/`(不在仓库里),宽度 × 主题各一组:
|
||
|
||
- 档案页:`people-{375,390,1280}-{light,dark}-list.png`(列表、当前人物高亮、虚线添加卡)、`people-{375,390}-{light,dark}-detail-self.png`(本人详情:已校正绿卡、Raman(默认)、三入口、「本人不能删除」)、`people-{375,390,1280}-{light,dark}-detail-other.png`(他人详情;1280 为两栏)、`people-{375,390,1280}-{light,dark}-edit-other.png`(编辑视图底部「删除这个人」)。
|
||
- 星历:`ephemeris-{375,390,1280}-{light,dark}-top.png`(总评、计数、彩色标签、中文主名梵文副名、岁差句、行运行)、`ephemeris-{375,390,1280}-{light,dark}-bottom.png`(九十天与底部提示卡)、`ephemeris-375-light-golden-top.png`(真实 golden 五要素:白分初五 / 亢宿 / 分离 / 巴瓦)。
|
||
|
||
## 环境缺口(未写成通过)
|
||
|
||
- Node 22 全量未跑(本机只有 Node 20.19.2),61 条基线失败为同一原因;需协调方在 Linux Node 22 复跑并比对名单。
|
||
- 无 Docker:本单不动表,未跑 `test:db`。
|
||
- 无受控登录账号:真实数据、iPhone Safari、左滑返回手势、读屏未验,见 `docs/testing/people-ephemeris-ui-20260926.md`。
|
||
- 未部署;BUG-1039 保持 `investigating`。
|