diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 574f2964..0aafca23 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -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` | diff --git a/docs/tasks/TASK-astrologer-rulings-batch3-20261003.md b/docs/tasks/TASK-astrologer-rulings-batch3-20261003.md new file mode 100644 index 00000000..c26dad37 --- /dev/null +++ b/docs/tasks/TASK-astrologer-rulings-batch3-20261003.md @@ -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;开工时再核对)。