Merge origin/staging into codex/lagna-precheck-20261027.

This commit is contained in:
jesse-ux
2026-10-27 07:30:22 +08:00
4 changed files with 143 additions and 0 deletions
@@ -0,0 +1,85 @@
# 星盘界面对标竞品:拆解与方案(issue #114,2026-10-27)
产品负责人 10-27 转来某竞品 13 张截图(星盘页、盘面检视、深读四个页签、对话页右侧盘面),要求「按这种来做」,先按业务拆开、逐项把需要他定的事说清,全部定了再开工。截图里有一张含真实出生资料,本文不引用。
我方现状来自 staging `009456d8e` 代码盘点(`frontend/src/components/chart-page/*`、`chat-chart-frame.tsx`、`chart-view-*.ts`)。
## 0. 总体对照
| 竞品 | 我方今天 |
| --- | --- |
| 一页铺开:左边大盘 + 盘面检视,右边九曜表 / 宫位主题 / 大运条 / 命盘速览,下面「深读」四个页签 | 四个页签(星盘 / 基础信息 / 大运 / 西洋盘),每次只看一块 |
| 南印度方盘为默认,可切北印度菱形盘 | **只有北印度菱形盘** |
| 点星 / 点宫:盘上画宫主线和视相线、表格同行高亮、检视面板展开 | 点星只弹一个文字气泡;西洋盘有相位线联动,印度盘没有 |
| 盘上可叠「八宫点 / 宫力 / 行运」图层 | 没有图层;行运是单独一种盘型 |
| 六力、宫力、八宫点、瑜伽、出生历法都有可视化 | **引擎都算了(有接口),星盘页一样都没接** |
| 大运三层(大运 / 分运 / 子运)带进度条,等比长卷可逐层展开,可换观测日期 | 两层(大运 → 子运),子运日期是前端按年数比例拆的,没有进度、不能换日期 |
| 对话页右侧是完整可点的盘 + 检视 + 九曜表,空对话给按盘出的问题 | 右侧只有一张不能点的 D1 小图,默认收起,手机没有 |
竞品也有没做好的地方:「宫主流向」整列「未提供」,六力「门槛未提供」,瑜伽把大量「未满足」也列出来——这些我们引擎都有数据,可以做得更完整、更干净。
## 1. 业务拆分(每块一张任务书,按顺序)
### M1 盘面本身
- 新做南印度方盘(固定星座格、上升斜线、中心大字「上升 巨蟹」样式、度数上标、旺 / 陷 / 逆标记),与现有北印度盘可切换,记住用户选择。
- 盘型条沿用现有 23 种(D1~D60、月亮盘、宫位盘、行运)。
- 中心显示当前三层大运小标签。
- 图层:无 / 八宫点(每宫角落显示点数,高于 28 金色、低于蓝色)/ 宫力 / 叠加行运(行运星以浅色叠在本命盘上)。
### M2 点选联动 + 盘面检视
- 点星:该星所在格高亮,其余变淡;实线连到它主管的宫,虚线连到它视相的宫;中心改显示这颗星;右侧表格同一行高亮。
- 检视面板:星座内位置条(0°~30°,标月宿分界)、月宿、尊贵刻度(陷 → 中 → 旺)、六力(对门槛的百分比)、视相宫位、主管大运区间、此刻行运位置;按钮「问 AI:这颗星」「在 D9 定位」。
- 点宫 / 点「宫位主题」小签:该宫高亮,面板显示宫主、宫内星、宫力、八宫点。
- 键盘 ← / → 切换、Esc 收起(桌面)。
### M3 命盘速览 + 顶部小签
- 速览卡:上升(度分)、月亮星座与月宿、灵魂星(Atmakaraka,写中文)、当前大运 › 分运(带进度条与结束日)、六力最强、需留意(最弱或落陷)。
- 页头小签:上升 / 月亮 / 太阳 / 当前大运,点了在盘上定位。
- 与 #112 的「上升确定 / 可能换座」那一行放在一起。
### M4 时运流年
- 观测日期:日期选择 + 上月 / 下月 / 上年 / 下年 / 此刻;换日期后大运进度、行运表、叠加图层一起更新。
- 当前运期三层(大运 / 分运 / 子运):起止日期、已过百分比、剩余时长。
- 九曜行运表:星座度数、从上升起第几宫、从月亮起第几宫、该宫八宫点;土星七年半状态。
- 人生长卷:三行等比条(大运 / 该大运的分运 / 该分运的子运),点哪段展开哪段;「叠到盘面」。
- 需要引擎补:子运第三层(目前前端按比例拆,需改用引擎值)、任意日期行运(接口已有)。
### M5 能量图谱
- 行星六力:每星一条总量 + 六段分量(自然 / 位置 / 方位 / 时间 / 运动 / 视相),竖线为门槛,右侧百分比。
- 宫位力量柱状图,均值虚线,点柱选宫。
- 八宫点矩阵:按宫位 / 按星座;原始 / 三角削减 / 同主削减三种口径切换;格子按点数深浅着色。
- 数据:引擎已有 `/api/shadbala`、`/api/bhava_bala`、`/api/ashtakavarga`,需接进星盘页。
### M6 命性格局(瑜伽)
- 组合列表:名称、涉及行星、状态(条件满足 / 部分满足);点一条在盘上高亮涉及的星。
- 引擎 `/api/yogas` 是否给「部分满足」需开工前核对。
### M7 排盘底册
- 出生资料与计算口径(岁差、宫制、交点)、出生历法(提毗、羯罗那、常瑜伽、日出日落、月出、当时行星时)与各要素下次交界时刻、行星名册、宫主流向(第 N 宫之主 → 落第几宫)。
- 历法数据:星历页已有五要素,日出日落 / 行星时 / 交界时刻需引擎补。
### M8 对话页右侧盘面
- 右栏换成可点的完整盘(M1 + M2 的窄版):顶部小签、盘、检视、九曜表;「换一盘」切人物档案里的人。
- 空对话中间显示「盘面已带入」+ 按这张盘出的 4 个示例问题。
- 检视面板「问 AI:这颗星」直接在当前对话里发问。
## 2. 顺序与依赖
- #111(组件库修复)、#112(星盘页页头一行)都在改星盘页,**本需求排在它们合入之后**。
- 建议分三批:
- **第一批**:M1 + M2 + M3 + M8(看得见、用得最多)。
- **第二批**:M4 时运流年。
- **第三批**:M5 + M6 + M7(数据型)。
- 执行:按任务书模式交 Grok,Claude 验收;一次揭幕、首屏 gzip ±2%、`page.tsx` 不增状态等红线照旧。
## 3. 需要产品负责人定的事
见 issue #114 评论(Q1~Q9)。
+1
View File
@@ -537,3 +537,4 @@
| `TASK-full-data-parity-1-b-fix-20261023.md` | `PROGRESS-full-data-parity-1-b-20261023.md` | **#91 B 段修复**:K1–K3 已交;K4 年运键序与 Yogini 子运字段已补(BUG-1425、BUG-1426) | 已合入 staging | `codex/full-data-parity-1-20261021` |
| — | `PROGRESS-full-data-parity-1-fix2-20261022.md` | **#91 A 段第 2 次打回**(Claude 口头修复单 F1~F4):11 节只印「未判定」和键名改读真实记录;测试只认非第一列真实值、禁止键名格;中文瑜伽组合句由中文源给出(BUG-1418);六章降为 `##`、节 `###`(BUG-1419) | 本地完成,待验收 | `codex/full-data-parity-1-fix2-20261022` |
| `TASK-lagna-precheck-20261027.md` | — | **#112 选 A**:星盘页页头告诉用户上升在其时间精度内会不会换(复用现成的 D1 窗口扫描,纯计算);校正开场说清能做 / 不能做(BUG-1444、BUG-1445) | 待执行 | `codex/lagna-precheck-20261027` |
| `TASK-lagna-precheck-fix-20261027.md` | — | **#112 第 1 次打回**:已有进行中的校正时点链接报冲突(应走首页续上);别人的星盘页不该给校正链接 | 待执行 | `codex/lagna-precheck-20261027` |
@@ -0,0 +1,38 @@
# 修复单:上升交界预检(issue #112,第 1 次打回,2026-10-27)
- 被验提交:`903d206f3`(分支 `codex/lagna-precheck-20261027`)
- 原任务书:`TASK-lagna-precheck-20261027.md`
- 执行方:Grok。同一分支继续,开工前 `git merge origin/staging`(不 rebase)。BUG 编号开工时核对最大号 +1(#111 的分支也在用 1444 起的号,以合入 staging 时的实际最大号为准,撞号由合并方改)。
## 验收结论(Claude,Linux)
| 项 | 结果 |
| --- | --- |
| `tsc --noEmit` | 0 错(换新 `.next` 后) |
| `npm run lint` | 0 error |
| `npm test` 全量 | 5183 项,失败 25,与 staging 已知名单逐条相同;Windows 上那条技能路径失败在 Linux 通过 |
| `next build` | `/` 仍 Static;首屏 gzip 727,726,staging 727,249,+0.07% |
| Python 快速门 | 通过 |
| 文案、窗口、失败不挡星盘、开场限度、断言三栏 | 都对 |
未通过两条,都在「出生时间校正」这个链接上。
## F1 · 已有进行中的校正时,点链接会报错(必修)
`use-rectification-surface.ts` 里 `?rectify=1` 调的是 `startNewRectification` → `openRectificationCase("new", …)`。数据库函数 `open_agentic_rectification_case_v2` 在 `p_intent = 'new'` 且有可续的进行中校正时**直接抛 `agentic_rectification_active_case_conflict`**(`20260812010000_agentic_rectification_v9_runtime.sql`,「restarting with an active case must surface a safe conflict」)。上升会换的人恰恰最可能已经开过一次校正,他们点链接看到的是报错,而不是回到自己那次校正。
修法:链接走首页入口的同一路径——`openRectificationCase("homepage", null, null)`(有进行中的就续上,没有就新建;即本文件里现成的那个 homepage 打开函数)。不要新建 intent,不改数据库。
验收:加一条测试——已有可续校正时,`?rectify=1` 走 `homepage` 意图、不出现冲突提示;没有时新建。
## F2 · 别人的星盘页不要给链接(必修)
现在人物档案里别人的星盘页也显示「出生时间校正」链接,点进去只得到「生时校正暂时只支持本人。」——一个点了没用的入口(产品口径:多余入口宁可删除)。
修法:`subjectId` 不是本人时,`lagnaPrecheckLine` 的「会换」「不知道时间」两种情况**不带链接、也不写「想定下来可以做一次出生时间校正」那半句**,句子止于「(大约 HH:MM 换座)。」或「上升星座定不下来。」;本人不变。
验收:组件测试——非本人两种情况 DOM 里没有链接、没有「出生时间校正」字样;本人照旧有。
## 交回前必跑
`tests/lagna-precheck*.test.ts`、`tests/chart-page-view.test.tsx`、`tests/chat-session-url.test.ts`、校正开场三份测试;全量与构建由 Claude 复验。
@@ -114,3 +114,22 @@
- `npm run test:db`(U6、U7 改了表的读写路径)。
- Python 快速门 `run_quality_gate.py --profile quick`。
- `docs/testing/ui-kit-migration-20261023.md`、`onboarding-journey-20261022.md` 补上本单的真机步骤(桌面加载不闪、中英切换能看出选中、老用户无启程动画)。
## 第 2 轮验收(2026-10-27,被验 `365a623fc`;同一单第 2 次未过,按规则交产品负责人决定由谁修)
验收数字(Claude,Linux):`tsc` 0 错;lint 0 error;`npm test` 5196 项、失败 25,与 staging 已知名单逐条相同(比 staging 多 20 项测试);`/` 仍 Static;首屏 gzip 694,941(基线 `0f66d92d4` 646,201,+7.54%;当前 staging 727,249,−4.4%);`test:db` 83 项过 81,2 条为本机环境已知;Python 快速门通过。U2、U3、U4、U6、U7、U9 通过。
还要修的(按严重度):
1. **揭幕后整页回到「正在载入账户」**(违反 AGENTS §6「揭幕后不得出现加载」,也是 U1 同类的整页卸载)。`page.tsx` 的加载判断新加了 `account && !subjectCatalogReady`;而 `use-profile-onboarding.ts` 两处(为别人建档补地点后、`chooseOnboardingOther`)调用 `invalidateSubjectCatalog()` 把 `catalogReady` 置回 false,于是整页聊天被换成加载屏;那次重载失败时 `useCurrentSubjectReady` 只在挂载时重试,页面会一直停在加载屏。修法:只有**首次**未就绪才走加载屏(已揭幕过就保留旧名单直到新名单到),重载失败要能恢复。加测试:揭幕后调用 `invalidateSubjectCatalog()` 不出现 `app-loading`。
2. **对话右栏盘面拖不动宽度**(读代码判断,未在浏览器复现)。`chat-chart-split.tsx` 的 `ResizablePanelGroup` 里只剩一个面板加固定 `style={{ width }}`,把手两边没有可交换的面板,`onWidth` / 拖到最小收起都不会触发。修法:让聊天列仍是组里的另一个面板,但**不随右栏加载换位**(U1 的要求),或改用不依赖分组的拖宽把手;加一条测试证明拖动会调用 `onWidth`。
3. **侧栏拖宽把手没有键盘操作**:原组件的左右方向键没了。补回方向键调整宽度。
4. **测试删减没写三栏**(AGENTS §7.3):`report-export-drawer.test.tsx` 删了「关闭导出」按钮那条;`chart-type-picker.test.tsx` 删了 `doesNotMatch(source, /<dialog|<button|ToggleGroup|role="tablist"/)`;`birth-time-guided-review-fixes.test.ts` 整条删除(组件删了可以删,但要写原值 / 新值 / 原因)。补回或补三栏。
5. **为了让测试能跑改了线上登录代码**:`modules/identity/client.ts` 加 `customFetchImpl: globalThis.fetch`、`email-otp-login.tsx` 加 `NextImage.default` 兼容。这两处碰真实登录路径且不在任务书里;改回去,把替身放在测试里。
6. 启程清单入口改成延后加载后,揭幕后才冒出来(第二次变化)。给它预留位置,或与首屏一起出现。
7. 小:删掉的旧校正画面在 `globals.css` 和 `birth-time-choice.css` 里留下的无用样式,确认无引用后删除。
需要产品负责人定的:
- **首屏 +7.54%**:多出来的是组件库外壳与整站样式,延后加载已经做了。是接受(写进 BLOCKED / DESIGN 的体积说明),还是继续压到 ±2%?
- **U11 第 2、3 项**(月亮开场、给别人看时天空过场的上升句):执行方说现有资料里没有这两个值、本单又不许新增请求,所以没做。是放弃,还是允许为此多读一次已算好的盘?