Files
Jyotisha/docs/tasks/PROGRESS-people-ephemeris-ui-20260926.md
T
Jesse_ChenandClaude Opus 5.5 dd8912fea0 fix(ephemeris): alias the engine's three panchanga spellings to the table
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
2026-09-26 06:58:41 +08:00

74 lines
11 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-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`。