docs(tasks): astrologer rulings batch 3 (Mudda from birth nakshatra, Tajika five-fold PVB, Rath Narayana redo)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
This commit is contained in:
Jesse_Chen
2026-10-03 19:03:50 +08:00
co-authored by Claude Opus 5.5
parent 2fc0f9cd11
commit ac588172a1
2 changed files with 149 additions and 0 deletions
+1
View File
@@ -415,3 +415,4 @@
| `TASK-report-chart-blank-columns-20261003.md` | `PROGRESS-report-chart-blank-columns-20261003.md` | 报告/星盘页空列:Kranti 删列、八分法宫位表 SAV 标错(实为含上升 386)补三列、上升补星宿、分盘庙旺接引擎十档(有限推翻 BUG-1076/1099 三档)、报告末尾重复分盘去重(BUG-1199~1203);Claude 直接执行,已部署 staging `ae18952e`,真机待产品 |
| `TASK-astrologer-rulings-batch1-20261003.md` | `PROGRESS-astrologer-rulings-batch1-20261003.md` | 占星师定稿 2026-10-03 第一批(低风险批):五大人格、Kemadruma 各只留一个主检测器;Shadbala 达标在前、分档标「网站分档」;Bhava Bala 改正式三分量;罗计不设本宫、宫主链固定传统主星;8 星制 Karaka 排位按 BPHS 修正;八分法净化值进报告/卡片(过运不动);落陷取消改条件清单;Tajika 年主如实标注。乙3 Narayana、甲1、甲8/9 不在本单(BUG 从 1204 起) | 已实现待验收 | 分支 `codex/astrologer-rulings-batch1-20261003`(未推送;BUG-1204~1212;校正分数不变、未升版本) |
| `TASK-astrologer-rulings-batch2-20261003.md` | `PROGRESS-astrologer-rulings-batch2-20261003.md` | 占星师第四轮:五大人格 D9 落陷只算减弱;Tajika 年主按 Panchadhikari 选法(移植上游 c7117f92);Narayana 实现 Sanjay Rath 版并用原书三张样表验收,不接打分;旧 Narayana 如实标注;Rath 版替换校正 Narayana 的 v5 试算(只研究)。产品选方案 A(BUG 从 1213 起) | 已实现待验收(T3 起运宫未过原书样表,按红线未接、T5 未做) | 分支 `codex/astrologer-rulings-batch2-20261003`(未推送;BUG-1213~1215;校正分数不变、未升版本) |
| `TASK-astrologer-rulings-batch3-20261003.md` | `PROGRESS-astrologer-rulings-batch3-20261003.md` | 占星师第五轮:Mudda 改出生月宿起排(与年主脱钩);年主改 Tajika 正式五分力量;Rath 版 Narayana 按原书 7 级强弱、计都反转、子运起点重做并以三张样表验收,过了再并列展示与 v5 试算(研究分支);土计同宫计都优先(产品选 A);上游两个 bug 记录(BUG 从 1216 起) | 待领取 | 分支 `codex/astrologer-rulings-batch3-20261003` |
@@ -0,0 +1,148 @@
# TASK:占星师口径第三批(Mudda、正式 Panchavargiya、Rath 版 Narayana)— 2026-10-03
## 基线
- `origin/staging` 的最新提交(开工时 `git fetch origin --prune` 后为准)。最近一次部署是第二批 `503c1190`。
- 分支 `codex/astrologer-rulings-batch3-20261003`,工作树 `.worktrees/astrologer-rulings-batch3-20261003`。
- 依据:
- `docs/research/astrologer_questions_round5_2026_10_03.md`(第五轮问题)
- 占星师第五轮回复(要点见「决策记录」,原文未入库)
- 第二批 `docs/tasks/PROGRESS-astrologer-rulings-batch2-20261003.md`
- 上游参照:`/workspace/yinduzhanxing` `origin/main` = `c7117f92`。只读,不提交、不推送上游。
## 事故实证(按符号定位)
1. **Mudda Dasha 跟着年主变(用户可见,错误)。**
- 我方 `scripts/tajika.py:calc_mudda_dasha` 从年主(varsha lord)起排。
- 第二批改了年主选法以后,9 盘中有 6 盘的年内各月分段跟着变了。
- 占星师裁定 Mudda 应从出生月宿推算,与年主无关。
- 上游 `c7117f92:scripts/tajika.py:calc_mudda_with_dasha_balance` 已实现月宿起运和余额,我方没有这个函数。
2. **年主比强弱用的是近似 Panchavargiya。**
- 第二批移植的 `_resolve_year_lord_panchavargiya_score` 在拿不到外部结果时,退回 `native_proxy`(D1/D2/D3/D9/D12 庙旺分)。
- 上游 `c7117f92:scripts/tajika.py:_calc_native_panchavargiya_bala` 是 Tajika 正式五分法(Kshetra/graha_bala、Uchcha、Hadda、Drekkana、Navamsa,原始满分 80,除以 4 后满分 20,规则在 `references/tajika_panchavargiya_rules.json`),但上游年主选择也没有调用它(占星师确认这是上游 bug)。
3. **Rath 版 Narayana 起运宫只对上 1/3。**
- 第二批自写的 `scripts/narayana_rath.py` 用原书起运宫时,顺序和年数 36/36 全对,但「命宫与第 7 宫谁强」的判定只对上 Table 15。
- 上游 `c7117f92:scripts/narayana_dasha.py`(1431 行,我方 1001 行)已有 `select_narayana_seed_sign(strength_profile="rath_p36_role_conjunction_v1")`、`build_narayana_sign_sequence`、`_has_narayana_sequence_exception`、`_rasi_aspects`、`calc_narayana_antardasha(profile="rath_table25_lord_start_v1")` 等。
- 上游另有 `scripts/varsha_narayana.py`、`tests/test_rath_role_strength.py`、`tests/test_varsha_narayana_native.py` 可作参照。
## 根因
- 上游已有、并且按原书写好的实现一直没同步过来,第二批又从零重写,规则缺了好几级。
- Mudda 和年主耦合,是旧函数的设计问题。
## 决策记录
**占星师第五轮裁定(2026-10-03,附原书页码):**
| 题 | 裁定 |
|---|---|
| 问 1 | 起运宫强弱的第二级,按木星、水星、宫主三个角色分别判断「同宫或星座相位(Rasi Drishti,p.48,不用行星特殊相位)」。每个角色最多记一次,角色之间不按星体去重(木星兼宫主记两次)。第一级「占据星数」数实际星体。原书 p.36、p.63 |
| 问 2 | 通则 7 级,上一级分出强弱即停,不加权:① 占据星多;② 三角色支持多;③ 占据星尊贵(旺、Moolatrikona、本宫);④ 双体 > 固定 > 活动;⑤ 宫主在 Chara Karaka 意义上的星座内度数;⑥ 宫主是否落在与所主星座奇偶相反的星座;⑦ 给出较长大运者强。「含 AK」「宫主为 AK」不作通则(p.35)。Indira 例题(p.65–66)以 AK 裁出巨蟹,作为**书内特例**单独标注,不泛化 |
| 问 3 | 计都在起运宫时,大运方向反转,但保留固定 / 双体的步进结构,不是把整张表倒序(p.51、p.53 Table 12;p.54 Table 14 是子运表)。土星在起运宫时,黄道顺行、逐宫推进(Table 11) |
| 问 4 | 子运起点:比较大运星座与它的第 7 宫,取较强一方,从该宫宫主所在的星座起;双主星座按原书双主规则选宫主;每个子运是大运的 1/12(p.48 Arambha Rasi,p.50 说明 2) |
| 问 5 | 年主比强弱用 Tajika 正式五分法,不再用庙旺近似 |
| 问 6 | Muntha 维持「本命上升 + 已满年数」(第二批已实现) |
| 问 7 | Mudda 起运星 = (已满年数 + 出生月宿序号 1–27 − 2) mod 9,余数对应:1 日、2 月、3 火、4 罗、5 木、6 土、7 水、8 计、0 金。与年主无关 |
**产品负责人裁定(2026-10-03):**
1. 土星与计都同在起运宫时选 **A**:计都优先(PyJHora 的做法),页面注明「按 PyJHora 做法」。
2. Narayana 继续走方案 A:通过三张样表后,先做 v5 试算(研究分支,不合入),由产品决定是否替换。
**产品负责人授权:** 从上游 `c7117f92` 原样移植:
- `calc_mudda_with_dasha_balance` 及其依赖;
- `_calc_native_panchavargiya_bala` 及其依赖;
- `narayana_dasha.py` 里 Rath 相关的强弱判定、序列、例外、子运函数,以及对应的上游测试。
BUG 记录里写明来源 SHA。
## 硬红线
1. **不改冻结身份里的文件**(清单见 `references/rectification_sealed_holdout.v1.json` → `production_scoring_files`,其中包括 `scripts/narayana_dasha.py`)。
- Rath 相关函数移植进**非冻结**模块 `scripts/narayana_rath.py`,替换第二批自写的部分。
- `tajika.py` 不在冻结清单里,可以改。
- 若确实不得不碰冻结文件,按 ERR-110 重新冻结,并**同步改 `frontend/tests/rectification-confirmation-gate.test.ts` 的两处路径(写三栏注释)和 `tests/test_sealed_holdout_contract_freshness.py`**,跑通。
2. v5 77 例与改动前逐项相同(本批不改打分)。
3. Rath 版三张样表的起运宫、12 个大运的顺序和年数要全部复现(Table 18 允许以「书内特例」路径复现,必须带特例标记)。做不到就不接入任何用户可见面,T4 不做,停下回报。
4. 不改普通对话提示词,不动迁移,不升打分版本。卡片单卡不超过 12,000 字。
5. **任何改到 `references/*.json` 的字符串都要有 `_en` 对照**(第一批漏过,`tests/test_report_english_dictionary.py` 不在快速门里,必须单独跑)。
6. 禁止 `git stash`。不切换别人的工作树。一次性评测工作树用 `git worktree add --detach`,用完删除。开工和大评测前先 `df -h /`,少于 15G 停下。
## 任务分解
### T1 Mudda Dasha 改为出生月宿起排(最优先)
- 移植 `calc_mudda_with_dasha_balance`。年运主值 `mudda_dasha` 改用它,余额来源默认 `moon_at_birth_time`。
- 记录 `annual_start`、`annual_duration_days`、`completed_years`、`natal_moon_longitude`、`balance_profile`。360 天年和太阳年分开标注。
- 旧的 `calc_mudda_dasha`(从年主起排)不再进主路径。
- `annual_tajika_pack._monthly_windows` 等下游随之改。
- **验收**:
- 新增测试:出生月宿、已满年数、年度起点、年长和余额模式都固定,只改年主,Mudda 表不变。
- 起运星按公式核对 9 位名人的 2026 年盘。
- 卡片和报告的年运月份分段来自新函数。
### T2 年主比强弱改用正式五分法
- 移植 `_calc_native_panchavargiya_bala`,并让 `scripts/tajika_year_lord.py` 的分数来源改为它(`engine: "tajika_native_five_fold"`)。
- `native_proxy` 不再用于选年主。
- 卡片上「Panchavargiya 为本地近似计算」的标注改为「按 Tajika 五分力量」。
- **验收**:
- 新增测试:分量(graha_bala、uchcha、hadda、drekkana、navamsa)、`raw_total ≤ 80`、`score = raw_total / 4`;
- 9 盘的年主前后对比表写进进度记录(哪几盘变了)。
### T3 Rath 版 Narayana 按第五轮裁定重做(不接打分)
- 在 `scripts/narayana_rath.py` 中用上游移植的实现替换第二批自写的强弱判定。必须包含:
- 问 1 的三角色计数;
- 问 2 的 7 级通则,并带 `strength_level_decided`(第几级分出的强弱);
- Indira 特例(`book_example_exception: "rath_p66_indira_ak"`),只在通则走完仍分不出强弱时才可选,并且要标明;
- 问 3 的计都反转(保留步进结构)、土星顺行;土星与计都同宫时计都优先,`method_note: "PyJHora 兼容:计都优先"`;
- 问 4 的子运起点选择器(比大运宫与第 7 宫),记录 `antardasha_start_rule`。
- 输出字段:`profile: "sanjay_rath"`、`seed_sign`、`seed_basis`、`strength_level_decided`、`direction`、`exception_applied`、`dual_lord_rule`、`mahadasha`、`antardasha_start_rule`、`source`(页码)、`status`。
- 移植上游 `tests/test_rath_role_strength.py`,以及 `test_varsha_narayana_native.py` 里相关的用例。
- **验收**:三张样表全部复现(红线 3);新增测试覆盖 7 级里每一级至少一例(可用构造盘)。
### T4 接入展示(只有 T3 通过才做)
- 咨询卡、参考版报告上,Rath 版 Narayana 和旧算法**并列**显示,旧算法保留「旧算法」标注。
- 打分和时间轴结论仍然用旧算法(方案 A:等 T5 试算和产品决定)。
- 卡片不超过 12,000 字;必要时卡片只放 Rath 版大运(不放子运),子运只进报告。
- **验收**:卡片和报告上可见两条,标注清楚;golden 用真实引擎重采。
### T5 v5 试算(研究分支,不合入本分支)
- 另开分支 `codex/narayana-rath-rectification-trial-20261003`(基于本分支 T3 提交),在校正引擎里加开关,把 Narayana 换成 Rath 版:
- R1:只换大运;
- R2:大运和子运都换。
- 跑 v5 77 例三段,与基线对比,任一档降超过 1pt 即为变差。
- 研究记录 `docs/research/narayana_rath_rectification_trial_2026_10_03.md` 在**本分支**更新:结论先行、表格、逐例变化最大的 5 例(只写案例 id)。
- 研究分支的代码不合入。
### T6 记录
- `docs/BUG_HISTORY.md`:T1、T2、T3+T4 各一条,写明来源(第五轮裁定加原书页码)和移植 SHA。
- 另起一条记录上游的两个 bug:选年主时没用正式五分法;`calc_panchadhikari_year_lord` 用年盘上升推 Muntha。状态写 `upstream`,不改上游。
- `CHANGELOG.md`;`PROGRESS-astrologer-rulings-batch3-20261003.md`(含 v5 表、样表复现表、年主前后对比、T5 结果、下轮问题);`docs/tasks/README.md` 改为「已实现待验收」。
## 让步顺序
T1 → T2 → T3 → T6 → T4 → T5。T3 样表不过时停在 T3,T4 和 T5 不做。
## 开工前置命令
```bash
cd /workspace/Jyotisha && git status -sb | head -1
git fetch origin --prune
git worktree add -b codex/astrologer-rulings-batch3-20261003 .worktrees/astrologer-rulings-batch3-20261003 origin/staging
df -h /
grep -oE "BUG-1[0-9]{3}" docs/BUG_HISTORY.md | sort -u | tail -1
git -C /workspace/yinduzhanxing log --oneline -1 origin/main # 以 c7117f92 为准
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
```
前端 node_modules 软链到同 lockfile 的工作树;Node 22 用 `/exec-daemon/node`。
## 验收口径
- Python 定向测试;`run_quality_gate.py --profile quick`;**另跑** `tests/test_report_english_dictionary.py`。
- v5 逐项相同。
- 前端:`tsc` 0 错;lint 0 error;`npm test` 失败名单与开工基线逐条相同,确认门测试通过。
- 不 push,由 Claude 验收后推 staging。
## BUG 编号起点
BUG-1216(10-03 实测最大号 BUG-1215;开工时再核对)。