docs: astrologer rulings batch 1 records (BUG-1204..1212, CHANGELOG, PROGRESS, BLOCKED)

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 15:14:24 +08:00
co-authored by Claude Opus 5.5
parent 9392f0601b
commit 57c56dbb8e
5 changed files with 287 additions and 1 deletions
@@ -0,0 +1,132 @@
# PROGRESS:占星师口径第一批落地(低风险批)— 2026-10-03
- 任务书:`docs/tasks/TASK-astrologer-rulings-batch1-20261003.md`;依据:`docs/research/astrologer_rulings_2026_10_03.md`。
- 执行方:Claude 子代理(产品负责人要求直接执行)。分支 `codex/astrologer-rulings-batch1-20261003`,工作树 `.worktrees/astrologer-rulings-batch1-20261003`,基线 `origin/staging` = `60d065a8`。**未推送**。
- BUG 编号:开工时最大号 BUG-1203;本单 BUG-1204~1212。
## 环境
| 项 | 实际 |
| --- | --- |
| Python | 本机无 `.venv`,全部用系统 `python3`(3.13.5);PyJHora 4.8.7 已装(只在一个对照测试里 `importorskip`) |
| Node | `/exec-daemon/node` v22.14.0(软链到 scratchpad 的 PATH 目录);`frontend/node_modules` 软链到同 lockfile 的 `.worktrees/consult-career-yoga-functional-20261002/frontend/node_modules`,未重装依赖 |
| 磁盘 | 开工 45G 可用,跑评测前 44–45G |
| 预检 | `pre_work_check.py` exit 0(remote verified,focused 5 目标全过) |
| 模型 key | 无(环境变量里没有任何模型凭据)→ 名人生平回测未跑,见「环境缺口」 |
| `next build` | 未跑:node_modules 是工作树外软链,Turbopack 拒绝(记忆中的已知限制);本单不改页面/路由,首屏 gzip 未测 → 环境缺口 |
## 提交与任务对应
| 任务 | 提交 | BUG |
| --- | --- | --- |
| T6 8 星制 Karaka 排位 | `0cf2249e` | BUG-1204 |
| T8 落陷取消改条件清单 | `df21e591` | BUG-1205 |
| T2 Kemadruma 主检测器 | `6916bbae` | BUG-1206(关联 BUG-1187 遗漏) |
| T1 五大人格主检测器 | `de793901`、`b1185c63`(全量解读传逆行标记) | BUG-1207 |
| T3 Shadbala 达标在前 | `5fdf2f74`(卡片行精简在 `0d6af77c`) | BUG-1208 |
| T7 八分法净化接入展示 | `ea78804b` | BUG-1209 |
| T4 Bhava Bala 正式三分量 | `6feb1a4a` | BUG-1210 |
| T5 罗计不设本宫、固定主星(单独提交) | `b0329ef0` | BUG-1211 |
| T9 年主标注 | `eb00b0f7` | BUG-1212 |
| golden 重采(证据卡、名人回测) | `0d6af77c` | — |
| 研究记录重新冻结(ERR-110) | `9392f060` | — |
| T10 记录(BUG 历史、CHANGELOG、本文件、任务索引、BLOCKED) | 最后一个提交(docs) | — |
## 关键实现说明(与任务书的出入)
1. **主检测器的接法**:新建 `scripts/main_yoga_detectors.py`,把五大人格(`pancha_mahapurusha.py`)、Kemadruma(`yoga_expansion.detect_kemadruma`)、落陷取消(`yogas_doshas.calc_nicha_bhanga_raj_yoga`)转成规则引擎同形的行(中英双份),由 `YogaEngine.detect` 追加。`yoga_rules.json` 的同名规则加 `reference_only: true` + `reference_only_reason`(保留来源与逻辑,不求值),共 23 条:`mahapurusha_*`×10、`moolatrikona_*`×5、`hamsa_trikona`、`bvr_maalavya_yoga`(任务书未列,同名 BVR 重复规则,同样不做破格)、`kemadruma_yoga`、`kemadruma_variant`、`neechabhanga_*`×4。这样报告(`modules.yoga`)、卡片(`chart.yogas` + 规则引擎 → 筛选 → `traditional_yogas`)读到的是同一个结论。
2. **T1 D9 落陷**:定稿未提,保留「D9 落陷判不成立」。代码事实:主检测器只在调用方传 `navamsa_sign` 时检查,**产品路径(`_detect_yogas`、规则引擎、报告)都不传**,所以这一条现在实际上不生效;本单未启用(启用即改变结论,等占星师答复)。
3. **T1 凶星照**:用仓内 Parashari 整宫 drishti(`aspects.calc_house_aspects` 同规则):太阳 7、火星 4/7/8、土星 3/7/10;罗计不照(与 `consultation_native_layers.DRISHTI_RULE` 一致)。
4. **T1 报告与卡片燃烧口径**:九盘核对时发现嘉兰的报告写「燃烧 14° 以内」、卡片写 12°——报告路径 `cmd_yoga` 的行星串不带逆行标记。`de793901` 让 `cmd_yoga` 生日路径带经度与逆行,`b1185c63` 让全量解读的 varga 重跑在行星串第 5 段带 `R`。
5. **T2 BUG-1187 遗漏**:`yoga_rules.json` 两套 Kemadruma 里 `kemadruma_variant` 确实仍计罗计;另外 `yoga_engine._detect_solar_lunar_yogas`(算法版月前/月后/月双夹、日前/日后/日双夹)仍把太阳、月亮、罗计算作邻星——泰勒盘「计都在月亮第 12 宫」出 Anapha 与 Kemadruma 同盘即来自这里。已改为只数五星,BUG 历史按「复发自 BUG-1187(遗漏面)」记录。`divisional_yoga` 分盘版按不存在的 `house` 字段比相邻(永远判孤月),改为按星座相邻。
6. **T3**:`shadbala.py` 在冻结身份里,展示字段放在新 `scripts/shadbala_display.py`(ERR-115 的做法)。卡片每星只留 `rupas` / `minimum_check` / `level`:引擎另三个字段语义重复,全部带上会让乔布斯 general / career 卡超过 12,000 字预算(12,166 / 12,250),精简后回到预算内。
7. **T4**:`shadbala.calc_bhava_bala` 改名 `calc_local_bhava_score` 并移出 `calc_shadbala` 返回值(原 `bhava_bala` 键就是报告表的来源);全量解读改用 `bhava_bala.bhava_bala_from_chart`(宫主 Shadbala Virupa + Bhava Dig + Bhava Drishti,等宫,同 `/api/bhava_bala`)。本地评分的其他使用者:**无**(`remedies`、健康叙述只读 Shadbala Rupa)。`bhava_bala.py` 自带的 60/50/40… 分档不是经典口径,报告不显示。
8. **T7**:`ashtakavarga.py` 删去 `calc_sodhita_av`(无人再用)。新链路 `scripts/ashtakavarga_shodhana.py` 用仓内既有两函数;占星宫只数七星(PyJHora 把罗计和上升标记也算占星,且只在每颗星自己的两宫上做单宫主净化——两点列入下轮问题)。经典例题:PVR 书 Exercise 22 / Chart 7 的 BAV(PyJHora 自带)做三方净化逐行对照,并与 PyJHora `_trikona_sodhana` 一致;单宫主净化逐条规则测。报告 SAV 表、宫位表、BAV 表,卡片 `sav_by_house`(`sav_sodhita` 在前、`sav_score` 原始,另带 `sav_columns` 说明),个人报告 `savScores`(`score` 净化后、`rawScore` 原始,schema 新增可选字段),事实表都已两列并列。过运(慢星过运 `sav`、双重过运、gochara)仍是原始点数,相关测试未改。
9. **T5**:只删罗计「本宫」判定;`jyotish_engine` 本来就没有罗计庙旺表,未新增。`yoga_engine` 默认固定主星,`_stronger_co_lord` 只在 `dynamic_co_lords=True` 时用(目前无调用方);`narayana_dasha` 不动。
10. **T9**:Muntha 主路径是 `solar_return._muntha_from_natal_ascendant(本命上升, 已满年数)`,测试锁定;`muntha.py`(含 `calc_muntha_from_sun_sign`)没有任何脚本导入。
11. **density 夹具**:`report-density-fictional-engine.json` 是 09-23 冻结快照、无采集脚本。只把 `worksheets.strengths_and_scores.ashtakavarga` 这一叶用真实引擎按夹具自带输入重采(`scripts/research/refresh_density_fixture_ashtakavarga.py`);`bav`、`sav` 与旧值相同,其余叶逐字节不变(脚本核对)。
## 改动的既有断言(原值 / 新值 / 原因)
| 文件 / 测试 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| `tests/test_consultation_yoga_detection_merge.py::test_traditional_yogas_closed_list_only_and_fixed_label` | 闭列表名 `Neecha Bhanga Raja Yoga` | `落陷取消(Neecha Bhanga)` | 乙14(BUG-1205) |
| `tests/test_pancha_mahapurusha_self_conjunction.py::test_another_malefic_in_the_same_sign_still_cancels_and_is_named` | `is_valid False`,原因在 `cancellations` | `is_valid True`、`strength reduced`,原因在 `reductions` | 甲5:凶星同宫只减弱(BUG-1207) |
| 同文件 `test_benefic_yoga_planet_unchanged` | Hamsa `is_valid False` | `is_valid True`、`reduced` | 同上 |
| `tests/run_all.py` t31 | 燃烧 → `is_valid False` | 燃烧 → `is_valid True`、`reduced`(输入改为真实摩羯座经度 280/283) | 甲5;原输入 degree=50 不在摩羯座 |
| `tests/run_all.py` t32 | 逆行 → `is_valid False` | 逆行 → `is_valid True`、`full` | 甲5:逆行不破格 |
| `tests/run_all.py` t54 | 求值规则 ≥ 400 | 求值 + reference_only ≥ 400(378 + 23) | 23 条规则改 reference_only |
| `tests/run_all.py` t1 / t57 | 导入 `calc_sodhita_av`;每格 ≤ 8 | 导入 `ashtakavarga_shodhana.sodhita_chain`;每格 ≤ 原始 BAV | BUG-1209 删除旧函数 |
| `tests/test_report_chart_blank_columns.py` 两条(BUG-1200) | 表头 `House/Sign/SAV/Lagna BAV/SAV + Lagna`,原始值在第 2–4 列 | 表头加 `Sodhita SAV`、原始列标 `Raw`,原始值在第 3–5 列,合计行多一格 | 乙8:净化值为主值 |
| `tests/test_shadbala_complete.py::TestBhavaBala` 五条 | 调用 `calc_bhava_bala` | 调用 `calc_local_bhava_score`(断言不变) | 甲13 改名(BUG-1210) |
| `tests/test_report_longform_gaps2.py` | 夹具行为本地评分形状;标题「Bhava Bala(本地三分量评分)」 | 夹具行为正式三分量;标题「Bhava Bala(三分量)」并断言整行 | 甲13 |
| `frontend/tests/report-fact-tables.test.ts`(density golden) | SAV 表 `cells[1]` = 原始;`subtables[0]` = 原始 BAV | `cells[1]` = 净化后、`cells[2]` = 原始;`subtables[0]` = 净化后 BAV、`[1]` = 原始 BAV;列名断言 | 乙8 |
| `frontend/tests/consult-evidence-card-v2-20260927.test.ts` career | 10H 行键 `sign/sav_score/level` | `sign/sav_sodhita/sav_score/level`,加 `sav_columns` 断言 | 乙8 |
| 同文件 annual | 年盘键列表无 `varshesha_basis` | 加 `varshesha_basis` | 甲11(BUG-1212) |
| `frontend/tests/consult-career-yoga-functional-20261002.test.ts` | Obama 名单含精确字符串 `Sasa Yoga`、`Neecha Bhanga Raja Yoga` | `Sasa Yoga…` 前缀、`落陷取消(Neecha Bhanga)(…成立条件:…)`,且全部不含 raja | 乙14 / 甲5 |
## 测试
| 项 | 结果 |
| --- | --- |
| 新增 Python 测试 | `test_chara_karaka_8_bphs_order.py`、`test_neecha_bhanga_conditions.py`、`test_kemadruma_main_detector.py`、`test_pancha_mahapurusha_main_detector.py`、`test_shadbala_minimum_first.py`、`test_ashtakavarga_sodhita_chain.py`、`test_bhava_bala_formal.py`、`test_node_own_sign_and_fixed_lords.py`、`test_year_lord_basis_label.py`,全部通过 |
| 定向回归(格局、报告读者版中英、density、CLI、API 安全、过运/双重过运、八分法、Shadbala、Jaimini、长报告) | 全部通过;`tests/run_all.py` 102/102 |
| `run_quality_gate.py --profile quick --skip-frontend-runtime`(系统 python3) | `Quality gate passed`,exit 0:1047 passed、1 skipped(在重新冻结提交 `9392f060` 上跑;前端另跑) |
| 隐私 `tests/test_repo_privacy_markers.py` | 通过(含记录提交后复跑) |
| `tsc --noEmit` | 0 错 |
| `npm run lint` | 0 error(126 warnings,与开工同数) |
| `npm test`(Node 22.14) | 开工基线 4927 项 / fail 24 / cancelled 0;收尾 4929 项 / fail 24 / cancelled 0。**失败清单与基线逐条相同**(24 条全部是 DB / Docker / 部署类:admin code、billing、migration runner、Better Auth、staging env/backup、live staging sync 等)。中途一次(goldens 刚重采、卡片未改前)多出 5 条,已在 `0d6af77c` 修复:3 条三栏改断言、2 条卡片体积超 12,000(卡片 Shadbala 行精简后回到预算内) |
| golden 二次重采 | 证据卡、名人回测 golden 用 capture 脚本再跑一次,逐字节相同 |
| `validate_logic_v2.py`(optional,信息) | 见「其他观察」 |
## 生时校正评测(v5 77 例)
- 命令:`python3 scripts/research/holdout_v5_baseline.py --dataset v5 --out-dir <dir>`,`PYTHONHASHSEED=0`、`JYOTISH_API_CHART_CACHE_TTL_SECONDS=0`,改前在 `origin/staging` `60d065a8` 一次性工作树,改后在 `b0329ef0`(T1–T8 与 T5 全部引擎改动之后)一次性工作树。
- 结果:sweep / cluster_width / futile_collect 三段与合并文件,去掉耗时与路径后**逐项相同**。
| 指标(v5 77 例) | ±10 | ±30 | ±60 |
| --- | --- | --- | --- |
| 先验头名 前 / 后 | 0.182 / 0.182 | 0.091 / 0.091 | 0.078 / 0.078 |
| 六题回放头名 前 / 后 | 0.6364 / 0.6364 | 0.4935 / 0.4935 | 0.3117 / 0.3117 |
| 线上区间回放头名 前 / 后 | 0.6623 / 0.6623 | 0.5584 / 0.5584 | 0.4026 / 0.4026 |
| 覆盖 前 / 后 | 0.987 / 0.987 | 0.987 / 0.987 | 0.987 / 0.987 |
| 中位宽度(线上回放)前 / 后 | 13 / 13 | 33 / 33 | 65 / 65 |
红线(任一档降 > 1pt)未触发。
- reported offset 900 例:0 例变化;sealed holdout 20 例逐条相同、metrics 相同(重新冻结提交 `9392f060`)。
- **结论:校正分数不变,不升打分版本**(`ALGORITHM_VERSION` 仍为 `rectification-v5-matrix-scoring-10`),无需做 BUG-621 历史 Case 打开验证。冻结身份里的 `jaimini.py`、`ashtakavarga.py`、`shadbala.py` 字节变了,按 ERR-110 以标签 `astrologer_rulings_batch1_2026_10_03` 重新冻结;upstream_sync5 记录转为 previous、逐字节保留。
- 校正打分路径不读 Karaka、格局、罗计尊严与宫主共主(grep 打分文件与冻结清单确认),与「分数不变」一致。
## 九位名人:卡片与报告一致性(甲5 / 甲7 验收)
`scripts/research/capture_consult_biography_backtest_golden.py` 同一批 9 位公开 AA 名人,career 路由的卡片(`chart.yogas` + 筛选 + `traditional_yogas`)对照同盘报告瑜伽总表(scratchpad 工具,未入库):
| 名人 | 改前(卡片 / 报告) | 改后(卡片 = 报告) |
| --- | --- | --- |
| 乔布斯 | 卡 Sunaphaa + Durudhura;报告「月双夹」(太阳算邻星) | Sunapha 系,无 Durudhura |
| 奥巴马 | 卡 Sasa、Neecha Bhanga Raja;报告两条「落陷取消格局」无条件 | Sasa(部分减弱:受凶星照:太阳);落陷取消(木星,三条成立条件);两边一致 |
| 泰勒 | 卡 Hamsa(来自 1/5/9 的非经典规则)+ Kemadruma;报告「汉萨三方宫格局」+「月后瑜伽(计都)」——孤月与月后同盘 | 无 Hamsa;只有 Kemadruma,无 Anapha |
| 嘉兰 | 卡 Bhadra;报告无 | Bhadra(部分减弱:水星燃烧 12° 以内,受火、土照);报告同(`b1185c63` 之后) |
| 齐达内 | 卡 Kemadruma + Kemadruma (Empty Houses);报告「空劫格局(空宫版)」 | Kemadruma 一条 + 落陷取消(火星);两边一致 |
| 梦露、皮雅芙、卡罗、小布什 | 卡与报告 Sunapha/Anapha 一致 | 不变 |
## 名人生平回测
卡片字段有变化(`traditional_yogas` 文字、`shadbala` 行、`sav_by_house`、年盘 `varshesha_basis`)。本机无模型 key,**未跑**,写入 `BLOCKED.md`。基线取 `docs/testing/consult-affliction-backtest-20261001.md` 第七轮。需要有 key 的环境按 `docs/testing/consult-affliction-backtest-20261001.md` 的命令重跑一轮,核对「严重冲突数不增加」。
## 其他观察(不在本单范围,未改)
- `validate_logic_v2.py`(与 PyJHora 的格局对照基准,门禁里是 optional,本单不入库其输出):precision 0.951 → 0.928、recall 0.741 → 0.733。原因是本单按定稿**有意**与 PyJHora 分开(PyJHora 的 Kemadruma / 月亮邻宫计罗计、天蝎水瓶取较强共主),与 BUG-1187 决策 3 同向。
- 报告 Shadbala 表 `Total` 列是 Virupa、`Required` 列是 Rupa(单位不同),本单未动。
- `ashtakavarga.calc_ashtakavarga` 的 Shodhya / Yoga Pinda 用的仍是原始 BAV(BPHS 的 Shodhya Pinda 应在净化之后算),记为下一批。
- `bhava_bala.py` 的 Bhava Dig Bala 表数值在 10–30 Virupa(BPHS 通常 0–60),来自 jyotishganit 移植,未核原典。
- `v5` 改后评测所在的一次性工作树在评测进行中被切到 `0d6af77c`(本会话误操作);与 `b0329ef0` 的差异只在 `consultation_native_layers.py`、`pl9_reader_export.py`、`pl9_reader_english_terms.py`,不在打分路径。
## 下轮问占星师
1. **D9 落陷是否破格**(五大人格):现状是传了 D9 星座就判不成立,但产品路径都不传,所以现在等于不检查。按定稿精神「只降低强度」,还是「不成立」,还是「不看 D9」?
2. **过运是否改用净化值**:本单只改展示,过运打分(gochara、慢星过运 SAV)仍用原始点数。经典里过运看未净化点数,是否维持?
3. **Tajika 年主 Panchavargiya 的来源**:五个职位(Muntha 主、出生/年盘上升主、Tri-Rashi 主、日/夜主星等)以哪本书、哪个版本为准?力量用 Harsha / Pancha-Vargiya Bala 的哪套算法?
4. **单宫主净化细则**:(a) 占星宫是否把罗睺、计都算作「有星」(我们只数七星;PyJHora 把罗计甚至上升标记都算);(b) 一宫有星、一宫空且两宫点数相等时,空宫清零还是保留(我们清零;PyJHora 保留为相同值);(c) 每行 BAV 都对五对星座做,还是只对该行星自己的两宫做(PyJHora 是后者)。
5. **五大人格「被凶星照」**:照的凶星是否包括太阳?罗睺、计都的照是否计入?
6. **Shodhya Pinda**:是否改为在净化后的 BAV 上计算?
+1 -1
View File
@@ -413,4 +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` |
| `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;校正分数不变、未升版本) |