星盘页大运只有两种体系:右栏改成可切换,加 Yogini 和 Ashtottari(含小运) #88

Open
opened 2026-10-21 19:56:41 +08:00 by Claude · 7 comments
Collaborator

产品反馈:大运只展示了 Vimshottari 和 Chara 两种体系。产品已定:

  • 左栏固定 Vimshottari,不变。右栏顶部加体系切换:Chara / Yogini / Ashtottari,默认 Chara。
  • 三个体系都能像 Vimshottari 一样点开大运看小运。「现在」卡显示大运、小运、小运剩余。
  • Ashtottari 只有满足条件的盘才适用:本盘不适用时,切换里不出现这个选项,不要写「不适用」。
  • 数据:后端已有 POST /api/dasha {dasha:"yogini"|"ashtottari"}(dasha_registry.compute_dasha,目前只返回大运)。
    • Ashtottari 小运:引擎 ashtottari_dasha.py 已经算出(_attach_recursive_subperiods),把它带进 /api/dasha 响应和前端映射。
    • Yogini 小运:在 scripts/yogini_dasha.py 新增小运计算。从该大运的 Yogini 起依次轮转 8 位,时长为大运年数 × 子运年数 ÷ 36;首个大运按出生时已过去的比例截掉前面的部分。
    • 不改冻结文件 jyotish_api_server.py。
  • 核对(硬性):在 tests/test_dasha_api_engine_parity.py 里新增 Yogini 与 Ashtottari 的小运对照,至少 3 张公开名人盘,和 PyJHora 比主星顺序,起止日期误差不超过 1 天。PyJHora 只用作测试参照,不进运行代码。对不上就停下来报告,不得放宽误差凑通过;对不上的体系先不上页面。
  • 前端照现有的 chara 按需层加两个层:chart-view-engine.ts 层列表、chart-view-load.ts 调用、chart-view-contract.ts 轨道与失败态、chart-view-mapper.ts 照 charaTrack 写映射、use-chart-page.ts 合并。切换到某个体系时才请求它,失败时只有那一栏显示失败句,可以重试。
  • 等待态沿用现有 OrbitWaiting,不新增加载动画。
  • 合同测试的 fixture 必须取自真实 /api/dasha 响应(golden),不得手造。
  • 手机宽度下两栏上下排,切换条横向不溢出。
  • 改了 Python,验收要跑 Python 快速门全量。

不在本单:Kalachakra、Narayana、星座类体系(没核对或算法未定)。

顺序:#86 → #87(上升格改「/」)→ 本单。

产品反馈:大运只展示了 Vimshottari 和 Chara 两种体系。产品已定: - 左栏固定 Vimshottari,不变。右栏顶部加体系切换:Chara / Yogini / Ashtottari,默认 Chara。 - 三个体系都能像 Vimshottari 一样点开大运看小运。「现在」卡显示大运、小运、小运剩余。 - Ashtottari 只有满足条件的盘才适用:本盘不适用时,切换里不出现这个选项,不要写「不适用」。 - 数据:后端已有 `POST /api/dasha {dasha:"yogini"|"ashtottari"}`(`dasha_registry.compute_dasha`,目前只返回大运)。 - **Ashtottari 小运**:引擎 `ashtottari_dasha.py` 已经算出(`_attach_recursive_subperiods`),把它带进 `/api/dasha` 响应和前端映射。 - **Yogini 小运**:在 `scripts/yogini_dasha.py` 新增小运计算。从该大运的 Yogini 起依次轮转 8 位,时长为大运年数 × 子运年数 ÷ 36;首个大运按出生时已过去的比例截掉前面的部分。 - 不改冻结文件 `jyotish_api_server.py`。 - **核对(硬性)**:在 `tests/test_dasha_api_engine_parity.py` 里新增 Yogini 与 Ashtottari 的小运对照,至少 3 张公开名人盘,和 PyJHora 比主星顺序,起止日期误差不超过 1 天。PyJHora 只用作测试参照,不进运行代码。对不上就停下来报告,不得放宽误差凑通过;对不上的体系先不上页面。 - 前端照现有的 chara 按需层加两个层:`chart-view-engine.ts` 层列表、`chart-view-load.ts` 调用、`chart-view-contract.ts` 轨道与失败态、`chart-view-mapper.ts` 照 `charaTrack` 写映射、`use-chart-page.ts` 合并。切换到某个体系时才请求它,失败时只有那一栏显示失败句,可以重试。 - 等待态沿用现有 `OrbitWaiting`,不新增加载动画。 - 合同测试的 fixture 必须取自真实 `/api/dasha` 响应(golden),不得手造。 - 手机宽度下两栏上下排,切换条横向不溢出。 - 改了 Python,验收要跑 Python 快速门全量。 不在本单:Kalachakra、Narayana、星座类体系(没核对或算法未定)。 顺序:#86 → #87(上升格改「/」)→ 本单。
Claude added the agent/待规划agent/试点 labels 2026-10-21 19:56:45 +08:00
Claude added the agent/规划中 label 2026-10-21 20:14:44 +08:00
Author
Collaborator

@jesse 本单需要你拍板两件事才能开工。 我写任务书时用 PyJHora 实际跑了对照,发现 issue 里的两条硬性核对要求按原文做必然「对不上」,执行方会卡在第一步。

查到的事实

# 事实 影响
1 Yogini 小运:PyJHora 把每个大运平均切成 8 份;issue 定的是按比例(大运年数 × 子运年数 ÷ 36) 两种算法的日期本来就不一样,「误差不超过 1 天」做不到
2 Ashtottari:我们引擎判断「从哪颗星起运」的表,和 PyJHora 在 12 个星宿里有 8 个不一致;表里还有一处疑似抄错一位(第 20 宿注释写 Shravana,实际是 Uttara Ashadha) 不只是星盘页:完整报告里的 Ashtottari 那一节现在可能就算错了。例:Indira Gandhi 的公开盘,我们从木星起运,PyJHora 从土星起运,起点差约 5.5 年
3 Ashtottari「这张盘适不适用」:10 张名人盘上,PyJHora 判 4 张适用,我们接口判 2 张,仓库另一套规则判 1 张,三者只有 1 张一致 「不适用就不出现这个选项」没有可靠的判断依据
4 好消息:Ashtottari 小运引擎其实已经算好并随接口返回了,只是页面没接;Yogini 大运和 PyJHora 完全对得上 —

旧的对照测试没拦住第 2 条,是因为它绕过了接口,样本又恰好落在两张表一致的星宿上。

请你选

问题 1:Yogini 小运用哪种算法?

  • A(推荐)按比例:传统算法,和 Vimshottari 一样。小运日期只能做内部核对(加起来等于大运、顺序对),没有外部软件可对照,页面上标注「小运未经外部软件核对」。
  • B 平均切 8 份:能和 PyJHora 逐日对上,但这是 PyJHora 自己的做法,不是主流口径。

问题 2:Ashtottari 怎么办?

  • A(推荐)这一单先不上 Ashtottari:本单只做 Chara / Yogini 切换。另开一单专门查清并修正 Ashtottari 的起运表与适用规则(会影响完整报告),修好再加到切换里。
  • B 现在就改成和 PyJHora 一致:本单变大,完整报告的 Ashtottari 那一节也会跟着变,旧报告与新报告结果不同。
  • C 维持现状照做:不推荐,等于把可能算错的数据搬上星盘页。

回复「1A 2A」这样即可。你拍板后我把结论写进任务书(草稿已备好),再交给 Grok。顺序不变:#86 → #87 → 本单。

<!-- agent:claude escalate --> @jesse **本单需要你拍板两件事才能开工。** 我写任务书时用 PyJHora 实际跑了对照,发现 issue 里的两条硬性核对要求按原文做必然「对不上」,执行方会卡在第一步。 ### 查到的事实 | # | 事实 | 影响 | | --- | --- | --- | | 1 | Yogini 小运:PyJHora 把每个大运**平均切成 8 份**;issue 定的是**按比例**(大运年数 × 子运年数 ÷ 36) | 两种算法的日期本来就不一样,「误差不超过 1 天」做不到 | | 2 | Ashtottari:我们引擎判断「从哪颗星起运」的表,和 PyJHora 在 12 个星宿里有 **8 个不一致**;表里还有一处疑似抄错一位(第 20 宿注释写 Shravana,实际是 Uttara Ashadha) | 不只是星盘页:**完整报告里的 Ashtottari 那一节现在可能就算错了**。例:Indira Gandhi 的公开盘,我们从木星起运,PyJHora 从土星起运,起点差约 5.5 年 | | 3 | Ashtottari「这张盘适不适用」:10 张名人盘上,PyJHora 判 4 张适用,我们接口判 2 张,仓库另一套规则判 1 张,三者只有 1 张一致 | 「不适用就不出现这个选项」没有可靠的判断依据 | | 4 | 好消息:Ashtottari 小运引擎其实已经算好并随接口返回了,只是页面没接;Yogini 大运和 PyJHora 完全对得上 | — | 旧的对照测试没拦住第 2 条,是因为它绕过了接口,样本又恰好落在两张表一致的星宿上。 ### 请你选 **问题 1:Yogini 小运用哪种算法?** - **A(推荐)按比例**:传统算法,和 Vimshottari 一样。小运日期只能做内部核对(加起来等于大运、顺序对),没有外部软件可对照,页面上标注「小运未经外部软件核对」。 - B 平均切 8 份:能和 PyJHora 逐日对上,但这是 PyJHora 自己的做法,不是主流口径。 **问题 2:Ashtottari 怎么办?** - **A(推荐)这一单先不上 Ashtottari**:本单只做 Chara / Yogini 切换。另开一单专门查清并修正 Ashtottari 的起运表与适用规则(会影响完整报告),修好再加到切换里。 - B 现在就改成和 PyJHora 一致:本单变大,完整报告的 Ashtottari 那一节也会跟着变,旧报告与新报告结果不同。 - C 维持现状照做:不推荐,等于把可能算错的数据搬上星盘页。 回复「1A 2A」这样即可。你拍板后我把结论写进任务书(草稿已备好),再交给 Grok。顺序不变:#86 → #87 → 本单。
Claude added agent/需拍板 and removed agent/待规划agent/规划中 labels 2026-10-21 22:30:35 +08:00
Owner

1 A 2 A

1 A 2 A
jesse added agent/待规划 and removed agent/需拍板 labels 2026-10-21 22:53:03 +08:00
Claude added the agent/规划中 label 2026-10-21 23:24:24 +08:00
Author
Collaborator

结论:按你选的「1A 2A」写好任务书,可以交给 Grok,排在 #86、#87 之后。

项目 内容
用户能看到的变化 大运右栏顶部可以在 Chara / Yogini 之间切换(默认 Chara);Yogini 也能点开大运看小运,「现在」卡显示大运、小运和小运剩余;Yogini 小运下面注明「小运未经外部软件核对。」
核对 Yogini 大运与 PyJHora 逐日对照(至少 3 张名人盘,误差不超过 1 天);小运按比例算,做内部核对:加起来等于大运、顺序正确、首段裁剪一致
不在本单 Ashtottari(见下面的新单草稿)
风险 中。照抄 Chara 的做法有三个坑(缓存串、互相覆盖、刷新丢数据),任务书已逐条写明
分支 codex/chart-dasha-yogini-20261021

新单草稿,请你过目: 同意的话回「Ashtottari 单可以提」,我就按下面的内容提成新 issue(会先标需拍板,等你选 A/B/C)。

标题: Ashtottari 大运起运星与「是否适用」口径不统一,接口与报告可能算错

现象

星盘页本来要加 Ashtottari 大运(#88),写单时核对发现引擎这一套目前对不上外部参照软件 PyJHora,所以先从 #88 移出。

# 问题 影响
1 「哪个月宿从哪颗星起运」引擎里有两张表。接口和完整报告用的是旧白名单那张,它在 12 个适用月宿里有 8 个起运星与 PyJHora 不同(例:Rohini 旧表给太阳、PyJHora 给金星) 起运星不同,整条时间线都不同
2 两张表不一致时,出生余额不生效,第一段大运从出生当天满额起算 每一段的起止日期都偏
3 旧白名单里有一个月宿编号错了一位:注释写 Shravana,实际编号对应的是 Uttara Ashadha 这两个月宿的盘适用判断反了
4 「本盘适用不适用」仓库里有三套规则,PyJHora 又是一套。10 张公开名人盘上:PyJHora 判 4 张适用,接口现用规则判 2 张,仓库另一套判 1 张,三者只在 1 张上一致 页面该不该显示 Ashtottari 没有确定答案
5 接口算 Ashtottari 时从不传「用哪套规则」,永远走旧白名单 即使引擎里有别的规则也用不上
6 现有对照测试直接调计算模块、手动指定规则,没有走接口;样本恰好落在两张表一致的月宿上 所以测试一直是绿的,没有拦住上面几条

例:一张公开名人盘(月亮在 Uttara Ashadha),接口判「适用」、从木星起、从出生日起算;PyJHora 从土星起,首段起点早约 5 年半。

需要产品负责人决定

Ashtottari 跟哪一派 / 哪套规则?

  • A 跟 PyJHora:起运表与适用判断都按 PyJHora(罗睺落在命主星所在宫的三方或四正、且不在命宫才适用)。能逐段对照核实;报告里的 Ashtottari 段会跟着变。
  • B 跟经典白名单(月宿 + 月相):修正起运表与错位的编号,但「哪些盘适用」仍与 PyJHora 不同,起运日期只能部分对照。
  • C 仓库现有的「罗睺—命主 + 月相 + 昼夜」规则:介于两者之间,适用的盘最少,没有外部软件可对照适用判断。

推荐 A:唯一能用外部软件逐段核实的选项。

影响范围

  • 完整报告(中英两版)里的 Ashtottari 段目前可能是错的,修复后已生成的报告内容会与新算的不一致(是否提示用户另议)。
  • 星盘页加 Ashtottari 切换要等本 issue 定了再做。
  • 修复要补一条走接口路径的对照测试,覆盖旧表与 PyJHora 不一致的月宿。
<!-- agent:claude plan brief=docs/tasks/TASK-chart-dasha-yogini-20261021.md branch=codex/chart-dasha-yogini-20261021 base=8c63f31f120f548a6ef2cf355f8a2833b6f5142d --> **结论:按你选的「1A 2A」写好任务书,可以交给 Grok,排在 #86、#87 之后。** | 项目 | 内容 | | --- | --- | | 用户能看到的变化 | 大运右栏顶部可以在 Chara / Yogini 之间切换(默认 Chara);Yogini 也能点开大运看小运,「现在」卡显示大运、小运和小运剩余;Yogini 小运下面注明「小运未经外部软件核对。」 | | 核对 | Yogini 大运与 PyJHora 逐日对照(至少 3 张名人盘,误差不超过 1 天);小运按比例算,做内部核对:加起来等于大运、顺序正确、首段裁剪一致 | | 不在本单 | Ashtottari(见下面的新单草稿) | | 风险 | 中。照抄 Chara 的做法有三个坑(缓存串、互相覆盖、刷新丢数据),任务书已逐条写明 | | 分支 | `codex/chart-dasha-yogini-20261021` | --- **新单草稿,请你过目:** 同意的话回「Ashtottari 单可以提」,我就按下面的内容提成新 issue(会先标需拍板,等你选 A/B/C)。 **标题:** Ashtottari 大运起运星与「是否适用」口径不统一,接口与报告可能算错 #### 现象 星盘页本来要加 Ashtottari 大运(#88),写单时核对发现引擎这一套目前对不上外部参照软件 PyJHora,所以先从 #88 移出。 | # | 问题 | 影响 | | --- | --- | --- | | 1 | 「哪个月宿从哪颗星起运」引擎里有两张表。接口和完整报告用的是旧白名单那张,它在 12 个适用月宿里有 **8 个**起运星与 PyJHora 不同(例:Rohini 旧表给太阳、PyJHora 给金星) | 起运星不同,整条时间线都不同 | | 2 | 两张表不一致时,出生余额不生效,第一段大运从出生当天满额起算 | 每一段的起止日期都偏 | | 3 | 旧白名单里有一个月宿编号错了一位:注释写 Shravana,实际编号对应的是 Uttara Ashadha | 这两个月宿的盘适用判断反了 | | 4 | 「本盘适用不适用」仓库里有三套规则,PyJHora 又是一套。10 张公开名人盘上:PyJHora 判 4 张适用,接口现用规则判 2 张,仓库另一套判 1 张,三者只在 1 张上一致 | 页面该不该显示 Ashtottari 没有确定答案 | | 5 | 接口算 Ashtottari 时从不传「用哪套规则」,永远走旧白名单 | 即使引擎里有别的规则也用不上 | | 6 | 现有对照测试直接调计算模块、手动指定规则,没有走接口;样本恰好落在两张表一致的月宿上 | 所以测试一直是绿的,没有拦住上面几条 | 例:一张公开名人盘(月亮在 Uttara Ashadha),接口判「适用」、从木星起、从出生日起算;PyJHora 从土星起,首段起点早约 5 年半。 #### 需要产品负责人决定 **Ashtottari 跟哪一派 / 哪套规则?** - **A 跟 PyJHora**:起运表与适用判断都按 PyJHora(罗睺落在命主星所在宫的三方或四正、且不在命宫才适用)。能逐段对照核实;报告里的 Ashtottari 段会跟着变。 - **B 跟经典白名单(月宿 + 月相)**:修正起运表与错位的编号,但「哪些盘适用」仍与 PyJHora 不同,起运日期只能部分对照。 - **C 仓库现有的「罗睺—命主 + 月相 + 昼夜」规则**:介于两者之间,适用的盘最少,没有外部软件可对照适用判断。 推荐 A:唯一能用外部软件逐段核实的选项。 #### 影响范围 - 完整报告(中英两版)里的 Ashtottari 段目前可能是错的,修复后已生成的报告内容会与新算的不一致(是否提示用户另议)。 - 星盘页加 Ashtottari 切换要等本 issue 定了再做。 - 修复要补一条走接口路径的对照测试,覆盖旧表与 PyJHora 不一致的月宿。
Claude added agent/待执行 and removed agent/待规划agent/规划中 labels 2026-10-21 23:27:24 +08:00
Grok added agent/执行中 and removed agent/待执行 labels 2026-10-22 00:22:35 +08:00
Collaborator

本轮没有开工。

任务书要求:前面两单(#86、#87)合进测试环境之后,才能做这一单。刚才核对,这两单都还在验收,测试环境里只有任务书,没有它们的功能改动。

锁已去掉,标签回到待执行。它们合入后再领。

本轮没有开工。 任务书要求:前面两单(#86、#87)合进测试环境之后,才能做这一单。刚才核对,这两单都还在验收,测试环境里只有任务书,没有它们的功能改动。 锁已去掉,标签回到待执行。它们合入后再领。
Grok added agent/待执行 and removed agent/执行中 labels 2026-10-22 00:25:58 +08:00
Grok added agent/执行中 and removed agent/待执行 labels 2026-10-22 03:24:48 +08:00
Collaborator

星盘页大运右栏可以在 Chara 和 Yogini 之间切换,默认还是 Chara。Yogini 也能点开看小运,「现在」卡会显示大运、小运和小运剩余。小运下面写了「小运未经外部软件核对。」Ashtottari 没有做。

三张公开名人盘的 Yogini 大运和外部参照软件对过:主星顺序一致,起止日误差在 1 天以内。

检查 命令 结果
Yogini 核对 pytest 两个文件,-rs 15 通过,0 失败,0 跳过
星盘页相关测试 tsx --test 90 通过
类型 tsc --noEmit 0 错
代码检查 npm run lint 0 个错误,122 条原有警告

进度:docs/tasks/PROGRESS-chart-dasha-yogini-20261021.md

没做的:没有在浏览器里点已登录的星盘页。全量前端测试、构建和 Python 快速门交给验收。

<!-- agent:grok report branch=codex/chart-dasha-yogini-20261021 sha=a06598c8a65e82b495fec5729a85edbe617ac824 --> 星盘页大运右栏可以在 Chara 和 Yogini 之间切换,默认还是 Chara。Yogini 也能点开看小运,「现在」卡会显示大运、小运和小运剩余。小运下面写了「小运未经外部软件核对。」Ashtottari 没有做。 三张公开名人盘的 Yogini 大运和外部参照软件对过:主星顺序一致,起止日误差在 1 天以内。 | 检查 | 命令 | 结果 | | --- | --- | --- | | Yogini 核对 | pytest 两个文件,-rs | 15 通过,0 失败,0 跳过 | | 星盘页相关测试 | tsx --test | 90 通过 | | 类型 | tsc --noEmit | 0 错 | | 代码检查 | npm run lint | 0 个错误,122 条原有警告 | 进度:`docs/tasks/PROGRESS-chart-dasha-yogini-20261021.md` 没做的:没有在浏览器里点已登录的星盘页。全量前端测试、构建和 Python 快速门交给验收。
Grok added agent/待验收 and removed agent/执行中 labels 2026-10-22 03:58:54 +08:00
Claude added the agent/验收中 label 2026-10-22 08:01:19 +08:00
Author
Collaborator

验收通过,已合入 staging(0034333b,在 #85 之后),等自动部署。

检查 结果
类型检查、代码检查 0 错
前端全量测试 5120 条,失败名单与 staging 完全一致,新增 24 条
Python 全量测试 / 快速门 与 staging 一致
构建 首页仍是静态页;首屏体积 +0.24%
Yogini 核对 大运与 PyJHora 在 3 张名人盘上逐日对上;小运按比例,加起来等于大运、顺序与首段裁剪都核对过;没装 PyJHora 时测试会失败而不是跳过
三个坑 都避开了:两种体系分开缓存、互不覆盖、刷新后都还在,各有测试
合并后 星盘页 176 条前端测试、大运对照与接口增长测试全过

Ashtottari 没有做,与你的决定一致。部署好后请按 docs/testing/chart-dasha-switch-20261021.md 真机走查。

<!-- agent:claude review sha=a06598c8a65e82b495fec5729a85edbe617ac824 verdict=pass staging=0034333b876b212eda256a9124c770be07adfa61 checklist=docs/testing/chart-dasha-switch-20261021.md --> **验收通过,已合入 staging(`0034333b`,在 #85 之后),等自动部署。** | 检查 | 结果 | | --- | --- | | 类型检查、代码检查 | 0 错 | | 前端全量测试 | 5120 条,失败名单与 staging 完全一致,新增 24 条 | | Python 全量测试 / 快速门 | 与 staging 一致 | | 构建 | 首页仍是静态页;首屏体积 +0.24% | | Yogini 核对 | 大运与 PyJHora 在 3 张名人盘上逐日对上;小运按比例,加起来等于大运、顺序与首段裁剪都核对过;没装 PyJHora 时测试会失败而不是跳过 | | 三个坑 | 都避开了:两种体系分开缓存、互不覆盖、刷新后都还在,各有测试 | | 合并后 | 星盘页 176 条前端测试、大运对照与接口增长测试全过 | Ashtottari 没有做,与你的决定一致。部署好后请按 `docs/testing/chart-dasha-switch-20261021.md` 真机走查。
Claude added agent/部署中 and removed agent/待验收agent/验收中 labels 2026-10-22 09:19:32 +08:00
Author
Collaborator

已部署到 staging(0034333b),@jesse 可以真机验收了。 门禁、迁移、部署全部成功;登录页正常,未登录访问账户接口被拒绝(401)。

真机清单:docs/testing/chart-dasha-switch-20261021.md。要点:大运右栏顶部可在 Chara / Yogini 间切换(默认 Chara);Yogini 能点开看小运,小运下写「小运未经外部软件核对。」;手机上两栏上下排、切换条不溢出。

<!-- agent:claude deployed sha=0034333b876b212eda256a9124c770be07adfa61 --> **已部署到 staging(`0034333b`),@jesse 可以真机验收了。** 门禁、迁移、部署全部成功;登录页正常,未登录访问账户接口被拒绝(401)。 真机清单:`docs/testing/chart-dasha-switch-20261021.md`。要点:大运右栏顶部可在 Chara / Yogini 间切换(默认 Chara);Yogini 能点开看小运,小运下写「小运未经外部软件核对。」;手机上两栏上下排、切换条不溢出。
Claude added agent/待真机 and removed agent/部署中 labels 2026-10-22 09:40:49 +08:00
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: root/Jyotisha#88