docs(tasks): astrologer rulings batch 1 (pancha/kemadruma single detector, shadbala/bhava bala, nodes own sign, karaka-8 order, AV sodhana, neecha bhanga, tajika label)

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 09:35:03 +08:00
co-authored by Claude Opus 5.5
parent e6f13e37e3
commit d0233e3c37
2 changed files with 190 additions and 0 deletions
+1
View File
@@ -413,3 +413,4 @@
| `TASK-upstream-sync4-20261002.md` | `PROGRESS-upstream-sync4-20261002.md` | 上游同步第四轮(对照 yinduzhanxing `0a6696c5`):婚姻计数删关系次数断语、双重过运相位错一宫、Shadbala 四处计算错、格局列表截断与空回退、月亮/太阳类格局只计五星(吸收月亮单)、Arudha 只留 jaimini 一个来源、定位星循环与未标定概率;BUG 从 1183 起 | **待验收**(子代理直接执行完毕,未推送;追加 F3 太阳最低要求;BUG-1183~1191) | 分支 `codex/upstream-sync4-20261002` |
| `TASK-upstream-sync5-20261002.md` | `PROGRESS-upstream-sync5-20261002.md` | 上游同步第五轮:Narayana 默认 K.N. Rao、Chara Karaka 罗睺、燃烧统一、八分法净化、Yogini、诅咒格措辞、Budha-Aditya、Badhaka;生时校正至少 4 件事 3 个领域 | **待验收**(PM 移植 U2–U8 + 子代理 U8 后续 / R1 / 冻结 / 评测 / 回测第七轮,未推送;U1 延后;分数不变不升 scoring-11,policy v3 → v4;BUG-1192~1198) | 分支 `codex/upstream-sync5-20261002` |
| `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` |
@@ -0,0 +1,189 @@
# TASK:占星师口径第一批落地(低风险批)— 2026-10-03
## 基线
- `origin/staging` = `e6f13e37`(已部署代码 `ae18952e`,其后为纯文档)。开工时以 `git fetch origin --prune` 后的最新 `origin/staging` 为准。
- 分支 `codex/astrologer-rulings-batch1-20261003`,工作树 `.worktrees/astrologer-rulings-batch1-20261003`。
- 依据文档:`docs/research/astrologer_rulings_2026_10_03.md`(占星师确认 + 产品裁定,下称「定稿」)。题目原文:`docs/research/astrologer_questions_v3_2026_10_03.md`。
## 事故实证(行号按符号定位)
1. **五大人格有 4 套实现,卡片能被绕回。**
- `scripts/pancha_mahapurusha.py:detect_pancha_mahapurusha` 遇到燃烧、逆行、与凶星同宫、D9 落陷都会判 `is_valid=False`。
- 但 `jyotish_api_server._detect_yogas` 调用它时没传 `sun_degree`,燃烧检查从不执行。
- `scripts/yogas_doshas.py:calc_pancha_mahapurusha_yoga` 和 `references/yoga_rules.json` 的 `mahapurusha_*`、`*_own`、`moolatrikona_*`、`hamsa_trikona`(木星在 1/5/9,非经典)都不做破格判断。
- `consultation_native_layers.collect_consultation_yogas` 按名字合并三路来源,所以被主检测器判掉的格局会经规则引擎回到卡上。
2. **Kemadruma 有 4 套实现。**
- `yoga_rules.json:kemadruma_yoga`(`ky2`):命宫角宫有任何星(含日、罗、计)就解除。
- `yoga_rules.json:kemadruma_variant`:邻宫计入罗计。
- `scripts/yoga_expansion.py:detect_kemadruma`:只数五星、没有角宫解除,咨询卡用的是这一套。
- `scripts/divisional_yoga.py`:分盘版。
- 报告走 `modules.yoga`,用的是 yoga_rules 两套。同一张盘,卡片和报告可能给出相反结论。
3. **Shadbala 分档冒充强弱结论。** `scripts/shadbala.py:calc_shadbala` 按 `rupas / MIN_REQUIRED` 的百分比分成极强…极弱六档,`chart.shadbala.level` 原样进卡片和报告,没有标明这是网站自定的分档。
4. **Bhava Bala 同名两套。**
- `scripts/shadbala.py:calc_bhava_bala` 是自定加减分(吉星 +2、凶星 −1.5 等),驱动报告的「Bhava Bala」表。
- `scripts/bhava_bala.py:calc_bhava_bala` 是正式三分量(adhipati / dig / drik,移植自 jyotishganit),只接在 `/api/bhava_bala`,前端没有调用。
5. **罗睺本宫三处说法。**
- `jyotish_engine._get_dignity_level` 写处女(计都双鱼),这个结果会进 D1 状态列、Vimsopaka 和 `varga_dignity`。
- `yoga_engine.RAHU_KETU_OWNED_SIGN_INDEX` 写水瓶(计都天蝎)。
- `narayana_dasha._NARAYANA_NODE_OWN_SIGNS` 写水瓶。
6. **双主星取较强者混进主路径。** `yoga_engine.YogaContext._resolve_sign_lord` / `_stronger_co_lord` 在瑜伽检测里,天蝎、水瓶取较强者。宫主链(`calc_dispositor_chain`、`functional_benefics`、前端 `SIGN_LORDS`)固定取火星、土星。
7. **8 星制 Chara Karaka 排位错。**
- `scripts/jaimini.py:KARAKA_8` 把第 5 位标为 Putrakaraka、第 7 位标为 Darakaraka、第 8 位标为 Pitrukaraka。
- BPHS 第 32 章的 8 星制次序是 AK、AmK、BK、MK、PiK、PK、GK、DK,也就是 PiK 第 5、DK 第 8。上游 yinduzhanxing 同样写错。
- 下游有 `pl9_reader_export`(报告)和 `jyotish_engine`。
- 2026-10-03 甲1 试算(`codex/affliction-weight-trial-20261003` `bcaeb990`)中发现:9 张名人盘按两种排位取 PiK,结果全部不同。
8. **八分法净化没接上,名字也错了。**
- `ashtakavarga.calc_trikona_shodhana` / `calc_ekadhipatya_shodhana` 只有测试在调用。
- 报告实际用的 `calc_sodhita_av` 做的是「从各 BAV 扣掉土、火、日的贡献」,却标成「BPHS标准」。
- 卡片 `savHouses`、报告 `readSavFacts`、`report-fact-tables.ts`、`pl9_reader_export` 宫位表读的全是原始值。
9. **落陷取消自动叫「王者格」。** 咨询 `TRADITIONAL_YOGAS` 把它映射成「Neecha Bhanga Raja Yoga」;`personal-report-generation.ts` 归到 raja 类;yoga_rules 的 `neechabhanga_*` 名称都带 Raja Yoga。带条件清单的只有 `yogas_doshas.calc_nicha_bhanga_raj_yoga`(条件 A–F)。
10. **Tajika 年主选法和定稿不一致。**
- 现行年主取 Muntha 主星(`solar_return`、`tajika.calc_year_lord` 一致)。
- 定稿要的是 Panchavargiya,但 `tajika._resolve_year_lord_panchavargiya_score` 没有被调用,`calc_tajika_strength_layers` 把 Panchavargiya 标为 blocked(`unified_varga_core_and_golden_oracle_parity_required`)。
- Muntha 现行取「本命上升 + 年龄」,和定稿一致。`muntha.calc_muntha_from_sun_sign` 是变体。
## 根因
同一技法在不同时期由不同来源(本地实现、yoga_rules 数据驱动、上游移植、jyotishganit 移植)各写了一套,从来没有指定唯一的「主检测器」。按名字合并、按「谁先到」去重,结果取决于调用顺序,而不是口径。
## 决策记录
占星师定稿 2026-10-03,产品负责人同意作为签字确认:
| 定稿条目 | 本单处理 |
|---|---|
| 甲5 五大人格 | 只从命宫角宫算;逆行不破格;燃烧不破格、记「部分减弱」;与凶星同宫或被照只降低强度。主检测器统一为 `pancha_mahapurusha.py`。**D9 落陷破格定稿没有提到:本单保留现状,写进进度记录,作为下轮问题。** |
| 甲7 Kemadruma | 邻宫只数火水木金土;不启用角宫解除;角宫只有罗计也不算解除 |
| 甲12 | 宫主链固定取火星(天蝎)、土星(水瓶);「较强者」只留在 Jaimini 体系(Chara Dasha、Narayana)内部;罗睺、计都不设本宫 |
| 甲13 | Shadbala 先按 BPHS 最低要求判达标与否,150/125/100/75/50 标为「网站分档」;Bhava Bala 改用正式三分量,删去自定分 |
| 乙8 八分法 | 报告主值改为三方净化 + 单宫主净化后的值,同时保留原始值。**范围限定**:本单只改报告和卡片上的 SAV / BAV 展示与文字。过运(gochara)打分仍用原始 BAV 点数,经典里过运看的是未净化点数,这一处是否也改,记为下一轮问占星师的问题。 |
| 乙14 | 落陷取消只列出成立的条件,不叫 Raja Yoga |
| 甲11 | Muntha 维持「本命上升 + 已满年数」。年主 Panchavargiya 本单**不实现**(引擎里是 blocked 的代用实现),只在显示年主的地方标注「暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入」,另开单 |
| 新增 | 8 星制 Karaka 排位按 BPHS 第 32 章修正(不需要占星师裁决,属于对照原典的笔误) |
**不在本单:**
- 乙3 Narayana:上游所谓「K.N. Rao profile」只改了元数据,大运序列仍是旧算法(`narayana_dasha_full_report` 始终调用 `calc_narayana_mahadasha`)。要另行设计并过校正评测。
- 甲1 权重:试算证明无区分度,不上线。
- 甲3:产品裁定维持不猜行业。
- 甲8、甲9:等评测。
- 强制选岁差:产品裁定不做。
## 硬红线
1. 不改校正打分语义。若 T5、T6 的改动经评测确认改变了校正分数,按先例(BUG-981~985、BUG-1180)升级打分版本;同时验证升级前创建的历史 Case 仍能从列表打开(BUG-621)。分数不变就不升级。
2. v5 77 例评测任一档降超过 1pt,就停下回报,不得自行调参。
3. 不改数据库结构,不动迁移。
4. 遵守 AGENTS.md:`scripts/jyotish_api_server.py` 类方法数不增长;`Home()` 状态数不增长;改既有断言要写「原值 / 新值 / 原因」三栏;合同 fixture 只能用真实引擎重新生成(golden),不得手造。
5. 不改普通对话提示词。若卡片字段名有变化,同步改前端读取处和合同测试,并跑名人生平回测确认严重冲突数不增加(基线取 `docs/research/` 下最近一轮回测记录)。
6. 不顺手改上游仓库,也不搬上游 `c593354f..c7117f92` 之外的提交。
## 任务分解
### T1 五大人格:只留一个主检测器
- `pancha_mahapurusha.py` 按定稿改规则:
- 逆行不再判 invalid;
- 燃烧改为 `strength: reduced` 并附原因,用统一的 `is_combust`(乙6 容许度);
- 与凶星同宫或被凶星照(加上照的判断)改为 `reduced`;
- D9 落陷维持现状。
- `_detect_yogas` 传入太阳度数。
- yoga_rules 的 `mahapurusha_*`、`*_own`、`moolatrikona_*`、`hamsa_trikona`,以及 `yogas_doshas.calc_pancha_mahapurusha_yoga`,改为 `reference_only`,不再进卡片的 `traditional_yogas`、报告 raja 类和 `chart.yogas`。
- **验收**:
- 9 位名人盘上,卡片和报告的五大人格结论一致,且等于主检测器的结论;
- 新增测试:逆行不破格、燃烧为 reduced、主检测器判 invalid 的格局不会经其他路径回到卡上。
### T2 Kemadruma:只留一个主检测器
- 主检测器为 `yoga_expansion.detect_kemadruma`。
- `kemadruma_yoga`(ky2 角宫解除)和 `kemadruma_variant` 改为 `reference_only`,不进卡片和报告结论。
- `divisional_yoga` 的分盘版对齐同一套规则(只数五星,没有角宫解除)。
- **关联**:BUG-1187(upstream-sync4 T5,月亮类格局统一只计五星)。如果 yoga_rules 的两套 Kemadruma 仍然把罗计计入邻宫,说明 BUG-1187 没有覆盖到数据驱动的规则,要在 BUG 历史里按「复发 / 遗漏」关联原号,写清原测试为什么没拦住。
- **验收**:
- 9 张盘上,同一张盘不会同时出现 Kemadruma 和 Sunapha / Anapha / Durudhara(泰勒、齐达内两张原先就是这样的矛盾);
- 卡片和报告一致;
- 新增测试:角宫只有罗计时不解除。
### T3 Shadbala:达标判断在前,分档标明来源
- `chart.shadbala` 增加 `min_required`、`meets_minimum`、`level_source: "site_band"`。
- 报告和卡片上出现分档文字的地方,前面先写「达到 / 未达到 BPHS 最低要求」,分档后面标「(网站分档)」。
- **验收**:报告 Shadbala 段与卡片上能看到达标判断和「网站分档」标注;合同测试按三栏更新。
### T4 Bhava Bala:改用正式三分量
- 报告的 Bhava Bala 表改由 `bhava_bala.calc_bhava_bala`(正式三分量)驱动。
- `shadbala.calc_bhava_bala` 改名为能看出是本地评分的名字(例如 `calc_local_bhava_score`),并且不再进任何用户可见面。
- 有地方用它算分时(例如 `remedies`、健康叙述),逐处列出并改用正式值,或者写进进度记录说明为什么保留。
- **验收**:报告 Bhava Bala 表的列名为三分量;全仓 grep 不再有用户可见的「吉星 +2 / 凶星 −1.5」口径。
### T5 罗睺、计都不设本宫;宫主链固定取传统主星
- 删掉 `jyotish_engine._get_dignity_level` 里罗睺处女、计都双鱼的「本宫」判定。罗计的庙旺落陷是否保留,按现有 `_PLANET_DIGNITY_KNRAO` 的做法,不新增。
- `yoga_engine` 在主检测路径里用固定主星(火星、土星);`_stronger_co_lord` 只留给 Jaimini 系统调用。
- `RAHU_KETU_OWNED_SIGN_INDEX` 不再用于主路径。
- `narayana_dasha` 内部的 Jaimini 共主规则不动。
- **验收**:
- 新增测试:罗睺在处女 / 水瓶时都不显示「本宫」;瑜伽检测里天蝎宫主一律是火星。
- 跑 v5 评测并按红线 1 处理;Vimsopaka 和分盘庙旺表的变化写进进度记录。
### T6 8 星制 Chara Karaka 排位修正
- `KARAKA_8` 改为 1 AK、2 AmK、3 BK、4 MK、5 PiK、6 PK、7 GK、8 DK,中文名表同步。
- **验收**:
- 新增测试,用一张名人盘对照 BPHS 次序;
- 报告里的 8 星制表重新生成 golden;
- v5 评测按红线 1 处理(校正里如果用到 8 星制的 DK 或 PiK)。
### T7 八分法净化接入展示
- 实现标准链路:BAV → 三方净化 → 单宫主净化 → 净化后 SAV(各 BAV 净化后求和)。
- `calc_sodhita_av` 改名,去掉「BPHS标准」字样,写清它实际做的是什么;没人用了就删掉。
- 报告 SAV / BAV 表、卡片 `savHouses`、`pl9_reader_export` 宫位表:主值列用净化后的值,原始值并列,两列都写明标签。
- 过运打分不动(见决策记录)。
- **验收**:
- 新增测试,对照 BPHS 第 67 章的经典例题,或 `tests/test_trikona_shodhana.py` 已有的用例链;
- 报告和卡片同时出现「原始」和「净化后」两列;
- 过运相关测试不变。
### T8 落陷取消改成条件清单
- 全部用户可见面不再出现 Raja Yoga 字样,改为「落陷取消(成立条件:…)」。
- 条件来自 `yogas_doshas.calc_nicha_bhanga_raj_yoga` 的 `cancellation_reasons`。
- yoga_rules 的 `neechabhanga_*` 改为 `reference_only`,或改名并接到同一份条件来源。
- 报告不再把它归入 raja 类。
- **验收**:全仓前端和 `references/` 用户可见文案 grep 不到「Neecha Bhanga Raja」;卡片和报告都能列出成立的条件。
### T9 Tajika 年主如实标注
- 显示年主的地方(咨询年运卡、报告年运段),标注「暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入」。
- 确认 `calc_muntha_from_sun_sign` 不在任何主路径上。
- **验收**:报告和卡片上能看到这条标注;测试断言主路径上的 Muntha 等于「本命上升 + 已满年数」。
### T10 记录
- `docs/BUG_HISTORY.md`:每个 T 一条(T9 若只加标注,并入 T1~T8 中相关的一条也可以),写明「来自占星师定稿 2026-10-03」。
- `CHANGELOG.md`;`docs/tasks/PROGRESS-astrologer-rulings-batch1-20261003.md`。
- 进度记录末尾单列「下轮问占星师」:
- D9 落陷是否破格;
- 过运是否改用净化值;
- Tajika Panchavargiya 的来源。
## 让步顺序
时间不够时按这个顺序保:T6、T8、T2、T1、T3、T7、T4、T5、T9。T5 只要改变校正分数,就单独成一个提交,方便回退。
## 开工前置命令
```bash
cd /workspace/Jyotisha && git status -sb | head -1
git fetch origin --prune
git worktree add -b codex/astrologer-rulings-batch1-20261003 .worktrees/astrologer-rulings-batch1-20261003 origin/staging
df -h / # 少于 15G 先停下回报(10-03 曾经满盘)
grep -oE "BUG-1[0-9]{3}" docs/BUG_HISTORY.md | sort -u | tail -1
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
```
引擎改动需要读 `docs/research/pre_work_error_ledger.md`(AGENTS §9)。
## 验收口径
- Python:相关定向测试、`run_quality_gate.py --profile quick`(没有 `.venv` 时写清所用解释器)。
- v5 77 例评测前后对比表。
- 前端:`tsc --noEmit` 0 错;`npm run lint` 0 error;`npm test` 失败清单与基线逐条一致。
- 名人生平回测:只在卡片字段有变化时跑(需要模型 key,没有就写进 BLOCKED.md)。
- 不 push,回报分支和 commit,由我验收后推 staging。
## BUG 编号起点
BUG-1204(开工时核对 `docs/BUG_HISTORY.md` 最大号;10-03 实测最大号 BUG-1203)。