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

11 KiB
Raw Blame History

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。