feat(narayana-rath): follow book p.43 for dual lords and node years (BUG-1227~1229)
Independent Staging Quality Gate / validate (push) Failing after 16m17s
Independent Staging Quality Gate / publish (push) Skipped

Round-7 option A is text-first, so Scorpio and Aquarius lords, the Ketu-only degree reversal, and node exaltation years now live in the Rath display layer. Scoring files stay unchanged.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-10-04 18:37:34 +08:00
co-authored by Cursor
parent 64c652eea2
commit baf4ae8b34
15 changed files with 604 additions and 84 deletions
+38 -6
View File
@@ -16567,16 +16567,48 @@
## BUG-1227 | Rath 版双主星(天蝎、水瓶)没按原书 p.43 (a)–(e) 选
- 状态:blocked(任务书红线 2:照裁定实现会让 Table 17 年数低于现状,按约定停下;分支未改 `_lord`)
- 状态:resolved(第七轮裁定问 1 选 A,推翻第五批红线 2 的 Table 17 年数底线;分支 `codex/astrologer-rulings-batch6-20261004`)
- 首次发现 / 最近更新:2026-10-03 / 2026-10-04
- 来源:第三批 BUG-1218 验收(软件表双主星 8/10);占星师第六轮裁定问 6a(p.43 (d)、p.116);任务书 T1。
- 影响面:`scripts/narayana_rath._lord`(仍调冻结 `narayana_dasha._resolve_narayana_lord(…, "jaimini_dual_lord_source_v1")`)→ 天蝎 / 水瓶大运年数、第 2 级宫主角色、第 5–7 级、子运起点。
- 影响面:`scripts/narayana_rath.resolve_dual_lord`(第五批仍调冻结的 `jaimini_dual_lord_source_v1`)→ 天蝎 / 水瓶大运年数、第 2 级宫主角色、第 5–7 级、子运起点。展示层 `narayana_legacy_label`。不进打分。
- 现象:原书 5 张软件表的双主星对上 8/10:Table 23 水瓶原书土星、我们罗睺;Table 25 天蝎原书计都、我们火星。
- 原书原文(PDF Page 40 / 41,书页 p.43;BPHS 46.158–163):(a) 两主都在本宫 → 12 年;(b) 两主同在另一宫 → 从本宫数到该宫;(c) 一主在本宫、另一主在别处 → 取在别处的那颗;(d) 两主分落别的星座 → 比两主所落星座的力量(脚注 33 指第 1 章力量来源),强者给年数;(e) 两宫力量相等 → 取给出年数较多的那颗(原书例:计都射手、火星处女、都无同宫 → 取火星 10 年)。p.116:两主同宫时经度高者强。
- 试算(研究,未落地;实现见研究分支 `codex/narayana-rath-rectification-trial-20261004` 的 `--dual-lord p43`):(a)–(e) 按上文,(d) 用本模块 7 级 `compare_signs`(叠加 BUG-1224 罗计尊贵)。软件表双主星 **9/10**(Table 23 水瓶改对,土星:摩羯 2 角色 > 双子 1 角色,第 2 级;Table 25 天蝎改对,计都:双鱼计都 Moolatrikona,第 3 级),新错 Table 23 天蝎:处女(火星)对射手(计都),射手得木星两角色、第 2 级判计都,原书判火星。**Table 17 年数 12/12 → 10/12**:同一张标准盘的原书 Table 17 / Chart 3 天蝎取火星 10 年、水瓶取罗睺 8 年,(d) 给计都 1 年、土星 1 年。强弱 28/30、Table 25 子运 24/36 不变。
- 根因(原书内部不一致):标准盘(Table 17 / 23 同一出生资料)三处说法互相冲突——p.43 (e) 的例句与 Chart 3 把「计都射手、火星处女」当作力量相等(取火星 10 年),但按第 2 级(第二来源)射手得木星两角色、按 BUG-1224 计都在射手入旺,任何逐级比较都判计都;Chart 3 水瓶取罗睺 8 年(注「土星在本宫摩羯 Rule 5(c)」,即把土星落自己另一宫当作 (c) 的「在本宫」),而同书 Table 23 软件判定土星强。没有一条通则能同时满足 Table 17 年数与 Table 23 双主星。占星师答复里「Table 23 水瓶:金牛 3 星 > 处女 1 星」的推算对应的是 Table 25(Wadiyar)的水瓶(土星金牛、罗睺处女),Table 23 本盘是土星摩羯、罗睺双子。
- 处理:按任务书红线 2「任一项低于现状就停下」不落地;`_lord` 不变(双主星仍 8/10),Table 17 年数保持 12/12。等产品 / 占星师决定:(1) Table 17 / Chart 3 与 Table 23 以哪处为准;(2) (d) 的「力量」是否只比第 1 级(星数),平了即走 (e)——这一读法 Table 17 年数全对,但 Table 24 天蝎、Table 25 天蝎会错(7/10)。
- 验证:试算脚本与结果见进度记录 T1 节;`tests/test_narayana_rath_book_tables.py` 仍钉住 8/10 与 12/12。
- 相关记录:BUG-1218、BUG-1224。
- 处理(第五批,已推翻):当时按红线 2 停下,`_lord` 仍走冻结的 `jaimini_dual_lord_source_v1`(双主星 8/10,Table 17 年数 12/12)。
- 修复:第七轮书面回复经产品负责人采用,问 1 选 A(正文优先,不倒改通则去凑 Table 17)。`narayana_rath.resolve_dual_lord` 在本模块实现 p.43 (a)–(e):(d) 用本模块 7 级 `compare_signs`;(c) 只认天蝎 / 水瓶本身;(a)(b) 同宫身份按 p.116,只倒算计都,经度全同返回未决;比较途中再遇到同一双主星则返回未决。不改冻结的 `_resolve_narayana_lord`。软件表双主星 9/10,唯一不符是 Table 23 天蝎(书火星、第 2 级计都)。Table 17 年数 10/12(天蝎计都 2 = 基本 1 加旺 1,水瓶土星 1),不再作通过线。
- 验证:`tests/test_narayana_rath_book_tables.py`、`tests/test_narayana_rath_rules.py`(火星白羊 / 土星摩羯不触发 (c);同宫经度;计都 0° 比较值为 30;全同未决;遇环未决)。
- 防复发:上述测试钉住 9/10 与 Table 23 天蝎这一条不符;年数断言钉新值,不钉书印。
- 相关记录:BUG-1218、BUG-1224、BUG-1228、BUG-1229。
- 复发自:无
- 修复版本:—(blocked)
- 修复版本:待发布
## BUG-1228 | Rath 版第 5 级把罗睺度数也倒算
- 状态:resolved(分支 `codex/astrologer-rulings-batch6-20261004`)
- 首次发现 / 最近更新:2026-10-04 / 2026-10-04
- 来源:第七轮裁定问 3(p.71 正文与脚注 42、p.116 Rule 2)。任务书 T2。
- 影响面:`scripts/narayana_rath._strength_degree`(第 5 级宫主度数,以及同宫双主星比经度)。Chara Karaka 八星排序不改。
- 现象:强弱比较里罗睺、计都都用 30 − 宫内度数。原书脚注 42 写明强弱计算只倒算计都。
- 根因:第 5 级沿用了 Chara Karaka 对罗睺的倒算。
- 修复:实体星与罗睺用原始宫内度数,逆行也不倒算;只有计都用 30 − 宫内度数。计都在 0° 时比较值为 30,不再取模成 0。完全相等返回未决。
- 验证:原书软件表 30 对的胜者与改前相同,仍是 28/30(不符仍是 Wadiyar 两对,第 5 级)。新增同宫经度测试。
- 防复发:`tests/test_narayana_rath_rules.py` 的经度用例。
- 相关记录:BUG-1227。
- 复发自:无
- 修复版本:待发布
## BUG-1229 | Rath 版罗计为宫主时,入旺不加算、落陷不减年
- 状态:resolved(分支 `codex/astrologer-rulings-batch6-20261004`)
- 首次发现 / 最近更新:2026-10-04 / 2026-10-04
- 来源:第七轮裁定对 p.40 (a) 的推论(产品负责人采用问 1 的「正文优先」)。原书 Chart 3 水瓶罗睺 8 + 1 = 9 年。任务书 T3。
- 影响面:`scripts/narayana_rath.rath_period_years`(大运年数与强弱第 7 级)。冻结的 `calculate_narayana_period_years` 不改,七颗实体星仍走它。
- 现象:年数旺陷表只有七颗实体星。罗睺在双子、计都在射手不加 1 年;罗睺在射手、计都在双子不减 1 年。
- 根因:Phalita 旺陷没有接到 Rath 版年数上。
- 修复:基本年数仍用奇偶足计数。罗计按 Phalita 入旺 +1、落陷 −1(罗睺旺双子 / 陷射手,计都旺射手 / 陷双子),再截在 0–12。输出分栏 `lord`、`base_years`、`dignity_adjustment`、`years`、`adjustment_source`。
- 验证:Table 17 天蝎计都基本 1、修正 +1、最终 2;Table 18 水瓶罗睺基本 2、修正 −1、最终 1。Chart 3 若取罗睺,水瓶为基本 8、修正 +1、最终 9,与书注一致;本单按 A 取的是土星,最终 1,差异记在进度记录。
- 防复发:`tests/test_narayana_rath_rules.py::test_node_dignity_adjusts_the_period_and_clamps`。
- 相关记录:BUG-1224、BUG-1227。
- 复发自:无
- 修复版本:待发布
@@ -0,0 +1,97 @@
# PROGRESS:占星师第七轮落地(p.43 双主星、只倒算计都、罗计旺陷加减年)— 2026-10-04
- 任务书:`docs/tasks/TASK-astrologer-rulings-batch6-20261004.md`(`64c652ee`)。
- 分支:`codex/astrologer-rulings-batch6-20261004`,工作树 `.worktrees/astrologer-rulings-batch6-20261004`。
- 开工基线:`origin/staging` = `64c652ee`。预检 `scripts/pre_work_check.py` 为 `pass`,远端 `verified`。磁盘 `/` 可用约 343 GiB。
- BUG:开工时最大号 BUG-1227。本单 BUG-1227 改 resolved,新增 BUG-1228(T2)、BUG-1229(T3)。
- 研究分支 `86e55514` 不在本仓对象库,p.43 按任务书与第七轮回复在 `narayana_rath.py` 重写,没有搬研究开关。
- 冻结文件未改:`scripts/narayana_dasha.py`、`references/rectification_sealed_holdout.v1.json`。Rath 仍只被 `narayana_legacy_label.py` 导入。
## 我替任务书确认的实现
1. (a)(b) 的 `rule` 记年数条款,同宫身份另记 `identity_rule: p116_longitude`。经度全同则 `status: undecided`,不按列表先后取星。
2. (d) 的比较若因循环变成未决,不改走 (e)。
3. (a) 两主都在天蝎或水瓶时,年数固定 12(四颗星在该宫的旺陷修正都是 0),身份仍可比经度。
4. 第 2 周期仍是 12 减第 1 周期,基本年数和修正留空,只保留最终年数。
## T2 第 5 级只倒算计都(BUG-1228)
`_strength_degree`:实体星与罗睺用宫内度数,计都用 30 − 宫内度数,0° 计都的比较值是 30。原书软件表 30 对的胜者与改前相同,不符仍是 Wadiyar 双子/射手、处女/双鱼,都在第 5 级。没有因本条改判的盘。
## T3 罗计旺陷 ±1(BUG-1229)
`rath_period_years`。实体星沿用冻结函数。罗计按 Phalita:罗睺旺双子 / 陷射手,计都旺射手 / 陷双子。截在 0–12。大运和第 7 级都走这层。
显式起运宫后的年数(顺序都是 12/12):
| 表 | 星座 | 书印 | 新值 | 基本 | 修正 | 来源 |
| --- | --- | --- | --- | --- | --- | --- |
| Table 15 | 水瓶、天蝎 | 2、7 | 2、7 | | | 与书印相同 |
| Table 17 | 天蝎 | 10(火星;Chart 3 也是 10) | 2 | 1 | +1 | 双主星 A 取计都,计都在射手入旺 |
| Table 17 | 水瓶 | 8(Table 17);9(Chart 3:罗睺 8+1) | 1 | 1 | 0 | 双主星 A 取土星,不取罗睺。Chart 3 的 9 年按罗睺仍可算出(基本 8、修正 +1),本单不采用 |
| Table 18 | 水瓶 | 2 | 1 | 2 | −1 | 主星仍是罗睺,罗睺落陷减 1。其余 11 段与书印相同 |
| Table 18 | 天蝎 | 9 | 9 | | | 与书印相同 |
其余样表行与书印相同的不逐行列。年数不再作通过线。
## T1 双主星(BUG-1227,解除 blocked)
软件表 10 条都由 (d) 判出:
| 表 | 宫 | 书 | 我们 | 级 | 两主所在 |
| --- | --- | --- | --- | --- | --- |
| Table 22 | 水瓶 | 土星 | 土星 | 1 | 摩羯 / 巨蟹 |
| Table 22 | 天蝎 | 火星 | 火星 | 1 | 水瓶 / 摩羯 |
| Table 23 | 水瓶 | 土星 | 土星 | 2 | 摩羯 / 双子 |
| Table 23 | 天蝎 | 火星 | 计都 | 2 | 处女 / 射手 |
| Table 24 | 水瓶 | 土星 | 土星 | 2 | 天秤 / 射手 |
| Table 24 | 天蝎 | 火星 | 火星 | 2 | 水瓶 / 双子 |
| Table 25 | 水瓶 | 土星 | 土星 | 1 | 金牛 / 处女 |
| Table 25 | 天蝎 | 计都 | 计都 | 3 | 狮子 / 双鱼 |
| Table 27 | 水瓶 | 罗睺 | 罗睺 | 1 | 巨蟹 / 射手 |
| Table 27 | 天蝎 | 火星 | 火星 | 3 | 狮子 / 双子 |
9/10。唯一不符:Table 23 天蝎,书火星,第 2 级计都(射手得木星两个角色)。这是选 A 的已知代价。
底线:Table 15、17 通则起运宫仍自动复现(巨蟹第 1 级、双鱼第 2 级)。Table 18 显式巨蟹后顺序 12/12,通则仍是摩羯第 5 级。强弱 28/30。Table 25 子运仍是 24/36(巨蟹 12、双子 0、金牛 12)。
## T4 展示
- 标签改为「Sanjay Rath 版(并列参考,未进打分与时间轴结论;按原书 p.43 正文(第七轮裁定))」,英文对照在 `pl9_reader_english_terms.py`。
- 参考版报告大运表改为基本年数 / 修正 / 最终。天蝎、水瓶各写一句双主星依据。
- 咨询卡只在当前大运是天蝎或水瓶时带这一句。字数测试仍不超过 12,500(加方法清单的年运、时运不超过 18,500)。
- 12 张公开盘的 Rath 段用真实引擎按盘内经度重算后写入 golden。乔布斯当前大运由天秤 70–72 岁改为水瓶 71–72 岁(前面天蝎少了 1 年,年龄边界前移)。嘉兰水瓶主星由土星改为罗睺,年数仍是 5 / 7。齐达内天蝎由火星 7 年改为计都 8 年(基本 7,入旺 +1)。梦露水瓶由 8 年改为 9 年(罗睺入旺 +1)。
## 测试
| 项 | 结果 |
| --- | --- |
| `test_narayana_rath_rules.py`、`test_narayana_rath_book_tables.py`、`test_narayana_legacy_label.py`、`test_report_english_dictionary.py`、`test_report_english_edition.py`、`test_narayana_dasha.py`、`test_node_own_sign_and_fixed_lords.py` | 通过(上游对照 1 条因本机没有上游仓而跳过) |
| 咨询卡:Rath 三例、字数三份(证据卡、v2、压缩清单) | 通过 |
| `tsc --noEmit` | 0 错。本机 Node 是 v24.15.0;`tsc` 与 `npm test` 用 nvm 的 Node 22.14.0 |
| `npm run lint` | 0 error,126 warnings |
| `npm test`(Node 22.14.0) | 4932 项,pass 4872,fail 19,skipped 41。失败 19 条都是本机没有 Docker,起不来 Postgres。与开工基线同一条命令的失败名单相同,顺序也相同 |
| 全量 `pytest tests` | 见下节 |
| v5 77 例 | 与第五批公布的记分板相同,见下节 |
| 快速门 `run_quality_gate.py --profile quick --skip-frontend-runtime` | `Quality gate passed`。1046 passed、2 skipped(第五批记录是 1047 passed、1 skipped;本机多跳过 1 条,门禁结果是通过) |
## 全量 pytest
开工基线 `64c652ee`(一次性 `--detach` 工作树)与本分支各跑一遍 `.venv` 的 `python -m pytest tests -q --tb=line`。两边都先放好本机已有的 `de421.bsp` 和 `hip_main.dat`,避免 Skyfield 经本机代理现下这两份星历。
失败名单:基线 68 条,本分支 67 条。本分支没有多出来的失败。基线多的一条是 `tests/test_vedastro_divisional_longitude_bridge.py::test_vedastro_bridge_divisional_longitudes_match_local_degree_mapping`,当时报 `bridge_runtime_error`(两套全量同时在跑)。这条在基线工作树单独再跑通过。其余 67 条名字相同,包括库存清单、占星 oracle 快照、VedAstro 运行时针脚;Rath 定向测试和英文版测试不在失败名单里。
跑完后 `git checkout` 掉测试改写的 4 个 `references/oracle/prashna_*_2026_07_20.json`。
## v5 77 例
命令:`PYTHONHASHSEED=0 JYOTISH_API_CHART_CACHE_TTL_SECONDS=0 python scripts/research/holdout_v5_baseline.py --dataset v5`。77 例,三套 harness 都没有 errors。打分文件与 `64c652ee` 无差异。记分板与第五批进度记录里的改前 / 改后数字相同:
| 指标 | ±10 | ±30 | ±60 |
| --- | --- | --- | --- |
| 先验头名 | 0.1818 | 0.0909 | 0.0779 |
| 六题回放头名 | 0.6364 | 0.4935 | 0.3117 |
| 线上区间回放头名 | 0.6623 | 0.5584 | 0.4026 |
| 覆盖(回放) | 0.987 | 0.987 | 0.987 |
| 中位宽度(回放) | 13 | 33 | 65 |
| futile 真值在区间 | 76 | 75 | 76 |
+1 -1
View File
@@ -419,4 +419,4 @@
| `TASK-annual-return-frame-20261003.md` | `PROGRESS-annual-return-frame-20261003.md` | 太阳返照时刻错位:出生太阳与求解器不同参考系(差 15″≈6 分钟)+ 年盘丢秒;243 张年盘里年盘上升变 13、年主变 11;搬上游 7cc6425d/46ed9399 两处,PyJHora 对照 ≤0.5 分钟;排在第三批之后(依据 `docs/research/shared_engine_reuse_audit_2026_10_03.md`) | 已部署 staging `01929bae`(BUG-1220) | 分支 `codex/annual-return-frame-20261003` |
| `TASK-astrologer-rulings-batch4-20261003.md` | `PROGRESS-astrologer-rulings-batch4-20261003.md` | Rath 当前大运进全部领域卡(卡预算 12,000→12,500、总 18,000→18,500,修改 BUG-1160/1161 决定);报告年运强度表改 Tajika 五分法(与年主同口径);校正打分不换,等第六轮 | 已实现待验收(T1–T3 完成) | 分支 `codex/astrologer-rulings-batch4-20261003`(未推送;BUG-1221~1222;校正分数不变、未升版本) |
| `TASK-astrologer-rulings-batch5-20261004.md` | `PROGRESS-astrologer-rulings-batch5-20261004.md` | 占星师第六轮:Rath 双主星按 p.43(a)–(e)、罗计尊贵按 Rath Table 9(仅 Narayana 内)、子运方向 p.51 例外与书内分歧标注、Wadiyar 两对标软件特例;年主选不出时不再用 Muntha 主星顶替(对齐上游 03bea6ed);Rath 替换校正 v5 重试算(研究)(BUG 从 1223 起) | 已实现待验收(T2–T5 完成;T1 按红线停下 blocked;T6 研究分支已跑) | 分支 `codex/astrologer-rulings-batch5-20261004`(未推送;BUG-1223~1227;校正分数不变、未升版本);研究分支 `codex/narayana-rath-rectification-trial-20261004`(不合入) |
| `TASK-astrologer-rulings-batch6-20261004.md` | `PROGRESS-astrologer-rulings-batch6-20261004.md` | 第七轮裁定(共享仓书面回复,产品采用;问 1 选 A):Rath 版双主星按 p.43 (a)–(e)(BUG-1227 解除 blocked,推翻第五批红线 2 的 Table 17 年数底线);第 5 级宫主度数只倒算计都(p.71 脚注 42);罗计旺陷 ±1 年;同宫两主比经度;BUG 从 1228 起 | 待领取 | 分支 `codex/astrologer-rulings-batch6-20261004` |
| `TASK-astrologer-rulings-batch6-20261004.md` | `PROGRESS-astrologer-rulings-batch6-20261004.md` | 第七轮裁定(共享仓书面回复,产品采用;问 1 选 A):Rath 版双主星按 p.43 (a)–(e)(BUG-1227 解除 blocked,推翻第五批红线 2 的 Table 17 年数底线);第 5 级宫主度数只倒算计都(p.71 脚注 42);罗计旺陷 ±1 年;同宫两主比经度;BUG 从 1228 起 | 待验收 | 分支 `codex/astrologer-rulings-batch6-20261004`(BUG-1227~1229;校正分数文件未改、未升版本) |