docs(tasks): astrologer rulings batch 2 (D9 modifier, Tajika panchadhikari, Narayana Rath profile + trial)

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 16:15:05 +08:00
co-authored by Claude Opus 5.5
parent e7eeb4045a
commit 52b3061fe5
2 changed files with 156 additions and 0 deletions
+1
View File
@@ -414,3 +414,4 @@
| `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`(未推送;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 起) | 待领取 | 分支 `codex/astrologer-rulings-batch2-20261003` |
@@ -0,0 +1,155 @@
# TASK:占星师口径第二批(D9 修饰、Tajika 年主、Narayana Rath 版)— 2026-10-03
## 基线
- `origin/staging` = `e7eeb404`(第一批已部署,health `gitCommit` 一致)。开工时以 `git fetch origin --prune` 后的最新 `origin/staging` 为准。
- 分支 `codex/astrologer-rulings-batch2-20261003`,工作树 `.worktrees/astrologer-rulings-batch2-20261003`。
- 依据:
- `docs/research/astrologer_feedback_2026_10_03.md`(第四轮问题)
- 占星师第四轮回复(要点见下方「决策记录」,原文由产品负责人转来,未入库)
- `docs/research/astrologer_rulings_2026_10_03.md`(定稿)
- 第一批 `docs/tasks/PROGRESS-astrologer-rulings-batch1-20261003.md`
- 上游参照:`/workspace/yinduzhanxing`,`origin/main` = `c7117f92`。只读,不提交、不推送上游。
## 事故实证(行号按符号定位)
1. **五大人格的 D9 落陷。**
- 第一批之后,`scripts/pancha_mahapurusha.py` 的主检测器仍然保留「D9 落陷 → 不成立」这条规则。
- 但各产品路径从来不传 D9 星座,所以这条规则实际上从未执行过(见第一批进度记录)。
- 占星师裁定:D9 落陷只算减弱,格局仍然成立。
2. **Tajika 年主。**
- 现行年主取 Muntha 主星(`solar_return`、`tajika.calc_year_lord`)。第一批 T9 只加了「暂用」的标注。
- 我方 `scripts/tajika.py` 已经有 `_benefic_aspect_targets`、`_resolve_year_lord_panchavargiya_score`、`_calc_panchavargiya_bala_for_planet`、`_external_pyjhora_panchavargiya_score*`,**但没有 `calc_panchadhikari_year_lord`**,也没有 `references/tajika_panchavargiya_rules.json`。
- 上游 `c7117f92:scripts/tajika.py:calc_panchadhikari_year_lord` 已经实现:五类候选 → 吉相位照年盘上升的短名单 → 按 Panchavargiya 比强弱 → 凶相位短名单 → 都没有时取全体最强,并给出 `selection_basis`。
3. **Narayana 旧算法。**
- `scripts/narayana_dasha.py:narayana_dasha_full_report` 始终调用 `calc_narayana_mahadasha(lagna_sign_idx, …)`,也就是一律从上升起、一律顺行。
- 各种 profile 只改元数据。`select_narayana_seed_sign`(`jaimini_lagna_seventh_strength_v1`)只写进 `seed_selection`,不参与排大运。
- 调用方:
- 咨询:`jyotish_api_server`,`narayana_dasha_full_report` 调用处
- 报告:`jyotish_engine` Step 4.13
- 生时校正:`active_rectification_event_engine` 两处直接调用 `calc_narayana_mahadasha`;`rectification/event_probes` 一处
- 另有 `cmd_narayana_dasha`、`public_real_case_benchmark`、`reference_transparency_contract`
- 上游有 Rath 原书规则账本 `docs/research/sanjay_rath_narayana_book_ledger_2026_08_28.md`,以及书中样表 `references/oracle/chara_narayana_book_golden_cases_2026_08_28.json`:Table 15 Aurobindo 1872 起巨蟹;Table 17 1963 标准盘起双鱼;Table 18 Indira 1917 起巨蟹,土星起运例外。
## 根因
- 第二时间轴从来没有按任何一位作者的规则实现过,只是不断换标签。
- Tajika 选年主的完整规则上游已经写好,但一直没有同步到我们这边。
## 决策记录
**占星师第四轮裁定(2026-10-03):**
| 题 | 裁定 |
|---|---|
| 问 1 | D9 落陷只算减弱:`formed` 保留,加 `d9_dignity_modifier = "weakened"`;只有 D1 条件不成立时才是 `not_formed` |
| 问 2 | 过运维持净化前的 BAV(第一批已经这样做,本单不动) |
| 问 3 | 年主选法:五类候选(昼夜年主、本命上升主、Muntha 主、年盘上升主、Tri-rashi 主)→ 有吉相位照年盘上升的,取其中 Panchavargiya 最强者 → 都没有吉相位时,在有凶相位的候选中取最强者 → 两类都没有时,取全体最强,`selection_basis = panchadhikari_pvb_fallback_all_candidates` |
| 问 4 | 第二时间轴用 Sanjay Rath 版 Narayana Dasha:从命宫和第 7 宫中较强的一宫起算,依起运宫奇偶定顺逆,双主星按传统 profile 处理;K.N. Rao 只作为 Chara Dasha 的名称。新算法完成前,旧输出只能标为 `legacy_reference_only` |
**产品负责人裁定(2026-10-03):** 问 4 选方案 A。
1. 先实现 Rath 版,用原书样表验收,再在 77 例上试算。
2. 本单**不替换**校正打分里的 Narayana,也不改咨询和报告结论所用的时间轴。只在用户可见处把旧算法标为「旧算法(从上升起、一律顺行),待替换为 Sanjay Rath 版」。
3. 是否替换,等本单的试算结果出来,由产品负责人决定。
**产品负责人授权:** 从上游 `c7117f92` 移植 `calc_panchadhikari_year_lord` 及其依赖、`references/tajika_panchavargiya_rules.json`、Rath 规则账本和样表 JSON(只搬这些,按上游原样搬,在 BUG 记录里写明来源 SHA)。
**不跟:**
- 回复里的「强制选择岁差」「对接验收包」「调用共享引擎接口」等要求。我方是本地引擎副本,不调用上游接口;强制选岁差已由产品裁定不做。
## 硬红线
1. 生时校正打分不变:开关关闭(默认)时,v5 77 例结果须与改动前逐项相同。改动若碰到冻结身份里的文件,按 ERR-110 重新冻结研究记录。
- **必须同步改 `frontend/tests/rectification-confirmation-gate.test.ts` 里两处读取冻结记录的路径,并写三栏注释。** sync5 和第一批的子代理都漏改过这一处。
- 同步改 `tests/test_sealed_holdout_contract_freshness.py` 等,凡是引用旧冻结记录名的地方都要改。
2. Rath 版若不能复现三张原书样表的起运宫和大运顺序,就不要接到任何用户可见面,停下回报。
3. 不改普通对话提示词,不动数据库迁移,不升打分版本(本单不改打分)。
4. 遵守 AGENTS.md:api_server 类方法数不增长;改既有断言写三栏;golden 用真实引擎重采;不用 `git stash`;只在自己的工作树里工作。
5. 开工和跑大评测前先 `df -h /`,少于 15G 就停下回报。
## 任务分解
### T1 五大人格 D9 落陷只算减弱
- 主检测器接受 D9 星座(或 D9 庙旺信息),把「D9 落陷 → not_formed」改为在 `formed` 结果上加 `d9_dignity_modifier: "weakened"`。
- 咨询、报告、`_compute_pmc` 等调用方都传入 D9。
- 卡片和报告文字:格局照常列出,并附「D9 落陷,兑现减弱」。
- **验收**:
- 新增测试:D9 落陷时 `formed` 不变,modifier 为 weakened;D1 条件不成立时为 `not_formed`。
- 9 张名人盘上,卡片和报告结论一致。
### T2 Tajika 年主按 Panchadhikari 选法
- 从上游原样移植 `calc_panchadhikari_year_lord` 和缺少的依赖,以及 `references/tajika_panchavargiya_rules.json`;同时移植上游 `tests/test_tajika.py` 里对应的用例。
- 接入 `annual_tajika_pack` 的年主主值。两个生产者都要改成同一选法,`_field_with_conflict_gate` 照常检查一致性。
- 输出 `candidate_list`、`selection_basis`、每个候选的 Panchavargiya 分数及其 `engine`(`native_proxy` 还是 PyJHora),以及相位证据。
- 咨询年运卡、报告年运段:年主旁边写选法依据(一句话)。去掉第一批 T9 的「暂用 Muntha 主星」标注。
- 若 Panchavargiya 只能用 `native_proxy`,标注改为「Panchavargiya 为本地近似计算」。
- Muntha 维持「本命上升 + 已满年数」。
- **验收**:
- 移植的上游测试全部通过。
- 9 张名人盘的 2026 年年盘,年主与上游 `c7117f92` 同输入的结果逐项相同(若上游可运行;不可运行就写进进度记录)。
- 卡片和报告上能看到选法依据。
### T3 Narayana:实现 Sanjay Rath 版(不接打分)
- 在 `narayana_dasha.py` 新增 `sanjay_rath` profile,**真实改变大运序列**:
- 起运宫:命宫和第 7 宫中较强者,强度规则按账本 `rath_md_start_stronger_lagna_seventh` 和现有 `select_narayana_seed_sign`;遇到 `later_narayana_sign_strength_rules_required`,就输出 `status: parameter_sensitive`,并列出两种起法。
- 顺序:按 Table 10(动、定、双星座的一般顺序);土星在起运宫时改为顺黄道(Table 11);计都反转(Table 14)。
- 年数:沿用现有 duration profile(`jaimini_odd_footed_dignity_v2` 一类),在进度记录写明用的是哪一个、对应账本哪几条。
- 子运:12 等分,按奇偶滚动(Table 13)。
- 输出字段:`profile`、`seed_sign`、`seed_basis`、`direction`、`dual_lord_rule`、`mahadasha`(含年数)、`source`、`status`。
- 移植上游账本和样表 JSON。样表盘的出生资料取原书所载的公开资料,在 fixture 里注明出处。
- **验收**:
- 新增测试,三张原书样表的起运宫与 12 个大运的顺序全部一致。
- 年数如有不一致,逐行列出并写原因;年数不一致不阻断本单,顺序不一致则阻断(红线 2)。
### T4 旧 Narayana 在用户可见处如实标注
- 咨询卡片、报告、星盘页凡是显示 Narayana 的地方,标「旧算法(从上升起、一律顺行),待替换为 Sanjay Rath 版」。
- 数据里加 `profile: "legacy_reference_only"`。
- 任何「K.N. Rao」字样只能出现在 Chara Dasha 旁边。全仓 grep「K.N. Rao」和「kn_rao」靠近 Narayana 的用户可见文案,全部改掉。
- 打分代码不动。
- **验收**:
- 用户可见面 grep 不到「K.N. Rao Narayana」一类说法;
- 报告和卡片上可见旧算法标注;
- v5 与改动前逐项相同。
### T5 试算:用 Rath 版替换校正里的 Narayana(只研究,不上线)
- 加环境变量开关(默认关闭),把 `active_rectification_event_engine` 两处和 `event_probes` 的 Narayana 换成 Rath 版:
- 变体 R1:只换大运;
- 变体 R2:大运和子运都换。
- 跑 v5 77 例,三段(sweep / cluster_width / futile_collect)和基线对比,任一档降超过 1pt 即判为变差。
- 研究记录 `docs/research/narayana_rath_rectification_trial_2026_10_03.md`:结论先行,表格给数字,列出逐例变化最大的 5 例(只写案例 id)。
- 开关关闭时逐项相同,作为红线 1 的证据。
### T6 记录
- `docs/BUG_HISTORY.md`:T1、T2、T3+T4 各一条,写明「来自占星师第四轮 2026-10-03」和移植来源 SHA。
- `CHANGELOG.md`;`docs/tasks/PROGRESS-astrologer-rulings-batch2-20261003.md`(含 v5 表、T5 结果、下轮问题);`docs/tasks/README.md` 本行改为「已实现待验收」。
## 让步顺序
时间不够时依次保:T4 → T1 → T2 → T3 → T5。T3 样表不过就停在 T3,T5 不做。
## 开工前置命令
```bash
cd /workspace/Jyotisha && git status -sb | head -1
git fetch origin --prune
git worktree add -b codex/astrologer-rulings-batch2-20261003 .worktrees/astrologer-rulings-batch2-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;若有更新,以 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`。
- v5:开关关闭时与改动前逐项相同;T5 两个变体的对比表。
- 前端:`tsc --noEmit` 0 错;`npm run lint` 0 error;`npm test` 失败清单与开工基线逐条相同(**确认门测试必须通过**)。
- 名人生平回测:没有模型 key 时写进 BLOCKED.md。
- 不 push,由 Claude 验收后推 staging。
## BUG 编号起点
BUG-1213(10-03 实测最大号 BUG-1212;开工时再核对一次)。