diff --git a/CHANGELOG.md b/CHANGELOG.md index dd79ef4a..5ce3a2b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,80 @@ # 印度占星 Skill 更新日志 +## v6.0.11-shadbala-capability-downgrade(2026-06-04)— Shadbala 能力标注降级 + +> **触发原因**:第九轮 Shadbala benchmark 证明当前实现内部一致,但源码仍包含多处简化公式,尚未完成 JHora/公开书例级别的外部绝对值校准,不应继续标记为完整 `covered`。 + +### 验证结果 + +- 新增 benchmark 脚本 `jyotish_benchmark/scripts/run_shadbala_invariants.py`。 +- 使用 10 个公开/虚构 smoke case 验证 `shadbala` 子命令与 `full-reading.modules.shadbala`。 +- 第九轮结果:1200/1200 内部不变量通过,0 mismatch。 +- 通过项包括:结构完整性、六重力量组件范围、总分聚合、Virupa/Rupa 换算、Ishta Bala 百分比、排名、full-reading 一致性。 + +### 能力标注调整 + +- `references/technique-capability-matrix.md` 中 Shadbala:`covered` → `partial`。 +- `references/technique_registry.json` 中 `shadbala.status`:`covered` → `partial`,并新增 limitation。 +- `SKILL.md`、`README.md`、`references/quick-reference-guide.md` 降低措辞:Shadbala 可作为内部一致的相对强弱参考,但外部绝对值校准前必须加置信度上限。 + +### 当前限制 + +- `scripts/shadbala.py` 仍包含简化项:Nathonnata Bala 二值化、部分 Saptavargaja 子分盘近似、Chesta Bala 速度分档近似、Drik Bala 简化相位权重。 +- 后续若接入 JHora/公开书例完整 Shadbala 表并通过对标,才可恢复 `covered`。 + +--- + +## v6.0.10-true-transit-full-reading(2026-06-03)— full-reading 真实 Transit 链路修复 + +> **触发原因**:可信度审计发现 `full-reading.modules.transit_multi_reference` 过去复用本命行星位置来做多参考点 Transit 分析,容易把 natal positions 误当 transit positions,影响未来应期判断。 + +### 修复内容 + +- `scripts/jyotish_engine.py` 新增 `_calc_sidereal_planets_for_jd()` 与节点口径 helper,统一用 Swiss Ephemeris 计算指定 Julian Day 的真实过境行星位置。 +- `full-reading` 新增 `--transit-date YYYY-MM-DD` 参数;若未提供,则跟随 `--today`,再否则使用当前日期。 +- `full-reading.modules.transit_positions` 新增真实过境输出:`data_layer: true_transit_positions`、`target_date`、`node_mode`、`planets`。 +- `full-reading.modules.transit_multi_reference` 改为读取真实 `transit_positions.planets`,并输出 `data_layer: true_transit_positions`,不再静默复用本命行星位置。 +- `transit` 子命令补充 `--node-mode mean|true`,与出生盘节点口径冻结保持一致。 + +### 验证 + +- 新增 benchmark 脚本 `jyotish_benchmark/scripts/run_transit_true_compare.py`,使用10个公开/虚构 smoke case 对比 full-reading Transit 输出与 Swiss Ephemeris direct。 +- 第八轮结果:340/340 字段匹配,0 mismatch;报告 `jyotish_benchmark/outputs/jyotish_benchmark_round8_transit_true_compare.md`。 + +--- + +## v6.0.9-chara-dasha-capability-downgrade(2026-06-03)— Chara Dasha 能力标注降级 + +> **触发原因**:第七轮 Chara Dasha benchmark 对齐 PyJHora KN Rao method 后,发现当前 `calc_chara_dasha()` 与传统 KN Rao 路径差异巨大,不应继续标记为 `covered` 的强计算模块。 + +### 修正内容 + +- `references/technique-capability-matrix.md` 将 Chara Dasha / Jaimini 从 `covered` 降级为 `partial`。 +- `references/technique_registry.json` 将 `jaimini_chara_dasha.status` 改为 `partial`,并新增 benchmark limitation。 +- `SKILL.md` 与 `references/quick-reference-guide.md` 降低 `jaimini` 子命令措辞:Karaka/Karakamsha 可用,Chara Dasha timing 当前为 partial。 +- 第七轮 benchmark 结论冻结:sequence sign 50/120(41.67%),duration 8/120(6.67%),总体 58/240(24.17%)。 + +### 使用约束 + +- Chara Karaka、AK/AmK、Karakamsha 仍可用于静态象征层和职业/灵魂方向判断。 +- Chara Dasha 时间线不得单独作为高置信度应期依据;必须由 Vimshottari、Dasha Sandhi、Transit、D10/A10、Ashtakavarga 等独立层交叉确认。 +- 若未来实装 KN Rao / PVN Rao / Iranganti method 并通过回归,才可恢复 `covered`。 + +--- + +## v6.0.8-ashtakavarga-pvr-calibration(2026-06-03)— Ashtakavarga 贡献表书例校准 + +> **触发原因**:第六轮 Ashtakavarga benchmark 发现当前 skill 与 PyJHora 的 BAV/SAV 输出存在系统性差异;进一步使用 PyJHora `pvr_tests.py` 中公开 PVR 书例 expected arrays 仲裁后,确认当前 Moon/Venus 的 7 个贡献表项需要校准。 + +### 修复内容 + +- `scripts/ashtakavarga.py` 升级到 v2.1,校准 Moon BAV 的 Moon/Mars/Jupiter/Lagna 贡献项,以及 Venus BAV 的 Mars/Mercury/Lagna 贡献项。 +- 保持 Ashtakavarga 固定不变量:7行星 SAV=337,含 Lagna full SAV=386。 +- `SKILL.md` 新增 Ashtakavarga 口径冻结规则:默认使用 BPHS/PVR 书例校准口径,benchmark 不一致时先比较贡献表项与总量不变量。 +- 第六轮公开书例仲裁显示:校准前当前 skill 对 PVR 书例 BAV/SAV 匹配 181/216,PyJHora 216/216;校准后应与 PyJHora/PVR 书例对齐。 + +--- + ## v6.0.7-node-mode-arbitration(2026-06-03)— Rahu/Ketu 节点口径仲裁与参数冻结 > **触发原因**:可信度 benchmark 第四轮确认第三轮 PyJHora 中 Rahu/Ketu 的剩余差异主要来自 Mean Node / True Node 口径差异,而非 D9/D10 计算 bug。 @@ -1150,7 +1225,7 @@ CHANGELOG中"v3.8.0新增案例库(13个)→编号58-70"的记录基于v3.8. ## v3.4.0(2026-04-24)— 高级计算引擎 + Hermes集成 + EventPredictionModel - **新增 `scripts/shadbala.py`**:Shadbala六重力量计算模块 - - 完整实现Parashara系统六种Bala:Sthana(位置)、Dig(方向)、Kala(时间)、Chesta(运动)、Naisargika(天然)、Drik(相位) + - v6.0.11复核:当前为内部一致的六力近似实现,含 Sthana(位置)、Dig(方向)、Kala(时间)、Chesta(运动)、Naisargika(天然)、Drik(相位);外部绝对值校准前不再称为完整 Parashara 实现 - 输出每颗行星的六维得分、总Virupas/Rupas、Ishta Bala百分比、强度等级(极强/强/充足/略弱/弱/极弱) - 行星力量排名 - 私有验证案例/用户反馈细节已移除(隐私保护)。 diff --git a/README.md b/README.md index 9e4f9705..27653440 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🪐 Jyotish Vedic Astrology Engine -**印度占星(Jyotish)专业解盘与推运系统 v6.0.0** +**印度占星(Jyotish)专业解盘与推运系统 v6.0.11** 基于 Swiss Ephemeris 天文计算库的完整吠陀占星引擎,覆盖从排盘计算到精确推运应期预测的全链路能力。可作为 [WorkBuddy](https://www.codebuddy.cn/) Skill 安装,也可以作为独立 Python CLI 工具使用。 @@ -10,12 +10,12 @@ - **🔮 全自动综合解盘**:`full-reading` 一键串联 13 个计算模块 - **📐 BPHS 十六分盘**:D2-D60 全部 16 种分盘精确计算 - **👁️ 精确相位系统**:度数级 Drishti 相位分析(tight/moderate/loose) -- **📿 Jaimini 完整系统**:Chara Karaka 7/8 + Chara Dasha + Karakamsha(AK) +- **📿 Jaimini 系统**:Chara Karaka 7/8 + Karakamsha(AK);Chara Dasha timing 当前为 partial - **🌟 高级 Nakshatra**:Tara Bala + Sub-Lord KP 系统 + Nakshatra三计数体系 - **🚪 Argala 门闩系统**:行星干预 + Virodha 反干预 - **🎂 Tajika 年运盘**:Muntha + YearLord + Mudda Dasha + Tri-Pataka三旗 - **💑 合盘分析**:Ashta Koota 36 分制 + Mangal Dosha + Papasamya -- **💪 Shadbala 六重力量**:完整的 Parashara 系统(2026-05-03 Kendra/Ojayugma修正) +- **💪 Shadbala 六重力量**:内部一致的六力参考(外部绝对值校准前为 partial;2026-06-04 第九轮不变量 1200/1200 通过) - **🎯 Ashtakavarga 八分法**:BPHS 完整表(SAV=337) - **✅ R1-R10 数学验证** + **P1-P12 行星审计管线** - **🔒 MEVG 强制外部验证**:v4.2.0 新增,所有解读结论必须外部验证(禁止仅凭AI训练记忆) @@ -107,7 +107,7 @@ python3 scripts/jyotish_engine.py aspects \ --year 1990 --month 1 --day 1 --hour 12 --minute 0 \ --lat 39.9 --lon 116.4 --tz 8 -# Jaimini 系统(Chara Karaka + Chara Dasha + Karakamsha) +# Jaimini 系统(Chara Karaka + Karakamsha;Chara Dasha timing 当前 partial) python3 scripts/jyotish_engine.py jaimini \ --year 1990 --month 1 --day 1 --hour 12 --minute 0 \ --lat 39.9 --lon 116.4 --tz 8 --mode all @@ -178,12 +178,12 @@ python3 scripts/jyotish_engine.py report ./report_folder \ | `varga` | 分盘计算(D9/D10) | `--year/month/day/hour/minute/lat/lon/tz` | | `varga-full` | BPHS 十六分盘(D2-D60) | `--divisions D9,D60` | | `aspects` | 度数精确相位(Drishti) | 出生信息 | -| `jaimini` | Jaimini 完整系统 | `--mode all` | +| `jaimini` | Jaimini Karaka/Karakamsha;Chara Dasha timing partial | `--mode all` | | `nakshatra-adv` | 高级 Nakshatra 分析 | `--mode all` | | `argala` | Argala 门闩系统 | 出生信息 | | `tajika` | Tajika 年运盘 | `--age 33` | | `synastry` | 合盘分析 | `--moon1/2 --mars1/2` | -| `shadbala` | 六重力量计算 | 出生信息 | +| `shadbala` | 六重力量计算(内部一致;外部绝对值校准前 partial) | 出生信息 | | `ashtakavarga` | 八分法(SAV=337) | 出生信息 | | `validate` | R1-R10 数学验证 | 出生信息 | | `audit` | P1-P12 行星审计 | 出生信息 | diff --git a/SKILL.md b/SKILL.md index 7a5c4362..7ba59d2f 100644 --- a/SKILL.md +++ b/SKILL.md @@ -1,6 +1,6 @@ --- name: jyotish-vedic-astrology -version: 6.0.7 +version: 6.0.11 description: 印度占星(Jyotish)专业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→精确推运应期输出。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga、出生时间矫正、PDF星盘、读取PDF、分析PDF星盘、现代解读、误判纠错、Varga分盘、综合分析、过境分析、合盘、婚姻匹配、年运盘、Prashna、Argala、Jaimini、KP系统、Shadbala、Ashtakavarga、HTML报告、深度解盘。 --- @@ -10,7 +10,7 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力 > **严格路由**:`references/strict-workflow-router.md`(⭐涉及事业/婚恋/财务/应期/技法验证时必须优先读取) > **覆盖矩阵**:`references/technique-capability-matrix.md`(⭐判断技法 covered/partial/missing 时必须参考) > **机器注册表**:`references/technique_registry.json` + `scripts/audit_capabilities.py`(⭐用于自动审计与CI门禁) -> **版本**:v6.0.7-node-mode-arbitration | **详细变更**:`CHANGELOG.md` +> **版本**:v6.0.11-shadbala-capability-downgrade | **详细变更**:`CHANGELOG.md` --- @@ -97,6 +97,41 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力 - PyJHora 4.8.6 的 `rasi_chart()` 默认使用 True Node;第三轮 benchmark 的 Rahu/Ketu 差异已由第四轮仲裁确认为 Mean/True Node 口径差异,不应再误判为 D9/D10 计算 bug。 - 输出 `birth_info.node_mode` 与 `node_mode_note` 必须保留,作为参数冻结证据。 +### Ashtakavarga 口径冻结(v6.0.8-av-calibration) + +**Ashtakavarga 默认使用 BPHS/PVR 书例校准口径,必须保留 SAV=337 与 full SAV=386 不变量。** + +- `scripts/ashtakavarga.py` 当前为 v2.1:经第六轮 PyJHora/PVR 公开书例仲裁,校准 Moon/Venus 的 7 个贡献表项。 +- 输出 `method` 应显示 `Ashtakavarga八分法(BPHS/PVR书例校准v2.1)`。 +- benchmark 若与其他软件不一致,先比较贡献表项和 SAV 总量,不得直接把口径差异判为运行 bug。 + +### Chara Dasha 能力降级(v6.0.9-chara-dasha) + +**当前 Chara Dasha 不得作为高置信度应期模块单独使用。** + +- 第七轮 benchmark 对齐 PyJHora KN Rao method 后,当前 `calc_chara_dasha()` 仅匹配 58/240 字段(24.17%)。 +- 根因:当前实现为简化版(上升顺/逆 + `12 - sign planet count`),不是完整 KN Rao / PVN Rao / Iranganti 传统算法。 +- `jaimini` 输出中的 Chara Karaka、AK/AmK、Karakamsha 可继续作为 Jaimini 静态/象征层使用;Chara Dasha 时间线必须标注为 `partial`。 +- 涉及事业/婚恋/事件应期时,若使用 Chara Dasha,只能作为低权重辅助,并必须由 Vimshottari、Dasha Sandhi、Transit、D10/A10、Ashtakavarga 等独立层交叉确认。 + +### Transit 真实过境冻结(v6.0.10-true-transit) + +**full-reading 中的 Transit 多参考点分析必须使用真实过境行星位置,不得复用本命行星位置。** + +- `modules.transit_positions` 必须输出 `data_layer: true_transit_positions`、`target_date`、`node_mode` 和 Swiss Ephemeris 计算的过境行星位置。 +- `modules.transit_multi_reference` 必须读取 `transit_positions.planets`,并输出同样的 `data_layer: true_transit_positions`。 +- `--transit-date YYYY-MM-DD` 可显式指定过境日期;若未提供,则跟随 `--today`,再否则使用当前日期。 +- 第八轮 benchmark 已用 10 个公开/虚构 smoke case 对齐 Swiss Ephemeris:340/340 字段匹配,0 mismatch。 + +### Shadbala 能力降级(v6.0.11-shadbala) + +**当前 Shadbala 可作为内部一致的相对强弱参考,不得声称已完成外部绝对值校准。** + +- 第九轮 benchmark 使用 10 个公开/虚构 smoke case 验证 `shadbala` 子命令与 `full-reading.modules.shadbala`:1200/1200 内部不变量通过。 +- 通过项包括:结构完整性、六重力量组件范围、总分聚合、Virupa/Rupa 换算、Ishta Bala 百分比、排名、full-reading 一致性。 +- 但 `scripts/shadbala.py` 仍存在简化项:Nathonnata Bala 二值化、部分 Saptavargaja 子分盘近似、Chesta Bala 速度分档近似、Drik Bala 简化相位权重。 +- 因此 `technique_registry.json` 中 Shadbala 状态为 `partial`:可用于相对强弱排序和内部校验;涉及精确力量断语时必须加置信度上限,直到接入 JHora/公开书例等完整外部绝对值对标。 + --- ## 核心能力速查 @@ -143,13 +178,13 @@ $PYTHON $SCRIPT <子命令> [参数] | `celebrity` | 名人案例查询 | | `db-stats` | 验证数据库统计 | | `transit` | 行星过境查询 | -| `shadbala` | 六重力量计算 | +| `shadbala` | 六重力量计算(内部一致;外部绝对值校准前为 partial) | | `ashtakavarga` | 八分法计算(SAV=337) | | `memory` | Hermes记忆系统 | | `validate` | R1-R10数学验证 | | `audit` | P1-P12行星审计管线 | | `aspects` | 度数精确相位系统 | -| `jaimini` | Jaimini完整系统+`--antardasha` | +| `jaimini` | Jaimini Karaka/Karakamsha;Chara Dasha 当前为 partial,需 KN Rao/PVN Rao 回归 | | `nakshatra-adv` | 高级Nakshatra(Tara Bala+Sub-Lord) | | `argala` | Argala门闩系统 | | `tajika` | Tajika年运盘(Muntha+YearLord+Mudda Dasha) | @@ -195,7 +230,7 @@ $PYTHON $SCRIPT <子命令> [参数] | Transit Actionable | v4.1.0 | 预测必须输出时间段+行动+置信度 | `transit-actionable-output-guide.md` | | 过境多参考点 | v1.9.0 | Lagna+Chandra Lagna双参考点(强制) | `transit-multi-reference-guide.md` | | Ketu双属性 | v2.0.0 | 必须同时评估"放手"和"突破" | `ketu-dual-nature-guide.md` | -| Shadbala完整 | v2.0.0 | 六种力量全部评估 | `shadbala-complete-methodology.md` | +| Shadbala评估 | v6.0.11 | 六种力量内部一致评估;外部绝对值校准前为 partial | `shadbala-complete-methodology.md` | | Yoga Phala Timing | v2.1.0 | 识别Yoga后必须预测何时发生 | `yoga-phala-timing-guide.md` | | 逆行/燃烧/战争 | v2.1.0 | 每颗行星检查三重叠加 | `retrograde-combustion-war-guide.md` | | 精准方法论 | v3.12.1 | PACDARES+九层+L3矛盾检查 | `precision-reading-methodology.md` | @@ -210,13 +245,13 @@ $PYTHON $SCRIPT <子命令> [参数] - [ ] 静态星盘分析(行星配置、Yoga、Nakshatra、宫位) - [ ] Argala检查(2/4/5/8/11宫干预+Virodha) - [ ] 逆行/燃烧/行星战争检查(三重叠加) -- [ ] Shadbala评估(六种力量完整评估) +- [ ] Shadbala评估(六种力量内部一致评估;外部绝对值校准前 partial) - [ ] Ashtakavarga评估(BAV+SAV聚合校验337点) - [ ] Ketu双重属性检查 - [ ] **MEVG-动态门控**:Transit/Dasha/天文现象必须验证 - [ ] Dasha推运(大运+小运+Pratyantar) - [ ] Dasa Convergence三系统交叉验证 -- [ ] Jaimini分析(Karaka+Chara Dasha) +- [ ] Jaimini分析(Karaka/Karakamsha;Chara Dasha 当前 partial,须交叉确认) - [ ] KP系统分析(Significator+Sub-Lord) - [ ] Transit分析(多参考点强制) - [ ] **Transit Actionable Output**(时间段+行动+置信度+案例检索) @@ -264,9 +299,9 @@ $PYTHON $SCRIPT <子命令> [参数] --- -**版本**:v6.0.7-node-mode-arbitration +**版本**:v6.0.11-shadbala-capability-downgrade **创建日期**:2026-04-20 -**最后更新**:2026-06-03(v6.0.7 新增 Rahu/Ketu Mean/True Node 口径冻结与 `--node-mode` 参数) +**最后更新**:2026-06-04(v6.0.11 将 Shadbala 降级为 partial:内部一致通过,外部绝对值校准待完成) --- diff --git a/assets/timing-prediction-template.md b/assets/timing-prediction-template.md index 681da1dc..55ef1eb2 100644 --- a/assets/timing-prediction-template.md +++ b/assets/timing-prediction-template.md @@ -217,10 +217,11 @@ | [相关Karaka] | [行星] | [星座][X宫] | [直接/间接/无关] | [庙/陷/受克] | | AK(灵魂课题) | [行星] | [星座][X宫] | [影响评估] | [状态] | -**Chara Dasha**(如有): +**Chara Dasha**(如有;当前计算层为 partial): - 当前Chara Dasha:[星座]([日期范围]) - 该星座统治的宫位:[列出] - 与预测事件相关度:[高/中/低] +- 置信度限制:仅作低权重辅助,必须由 Vimshottari / Transit / D10-A10 / Ashtakavarga 等独立层确认 #### 4.2 KP层 @@ -237,15 +238,15 @@ | 系统 | 判断 | 方向 | 置信度 | |------|------|------|--------| | **Parashara**(D1+Dasha+Transit) | [描述] | [正面/负面] | [高/中] | -| **Jaimini**(Karaka+Chara Dasha) | [描述] | [正面/负面] | [高/中] | +| **Jaimini**(Karaka/Karakamsha;Chara Dasha partial) | [描述] | [正面/负面] | [高/中;若依赖Chara Dasha则不得单独升高] | | **KP**(Sub-Lord+Significator) | [描述] | [正面/负面] | [高/中] | | **三系统一致?** | [是/两系统一致/矛盾] | | | **一致性规则**: -- 三系统一致 → 置信度 **90%+** -- 两系统一致 → 置信度 **70-89%** -- 一系统独判 → 置信度 **50-69%** -- 三系统矛盾 → 置信度 **<50%**,需深入分析矛盾原因 +- 三系统一致 → 原则上可给高置信度,但如果 Jaimini 一致性主要来自 Chara Dasha,必须降权并等待其他独立层确认 +- 两系统一致 → 中高置信度,需说明缺失或 partial 层 +- 一系统独判 → 低到中等置信度,不支持精确日期断言 +- 三系统矛盾 → 低置信度,需深入分析矛盾原因 --- diff --git a/references/jaimini-complete-system.md b/references/jaimini-complete-system.md index 307d8548..57a1fd5b 100644 --- a/references/jaimini-complete-system.md +++ b/references/jaimini-complete-system.md @@ -3,7 +3,7 @@ **创建日期**:2026-04-22 **来源**:Bavishyavani.in、Vedicmarga.com -> **来源标签**: 【传统·现代大师】 — Jaimini完整系统(Chara Karaka+Chara Dasha+Karakamsha) +> **来源标签**: 【传统·现代大师】 — Jaimini知识层完整;当前计算层 Karaka/Karakamsha 可用,Chara Dasha timing 为 partial,需 KN Rao/PVN Rao/Iranganti 回归验证。 --- ## 一、Jaimini vs Parashari 核心区别 diff --git a/references/quick-reference-guide.md b/references/quick-reference-guide.md index 90951593..bfd9955d 100644 --- a/references/quick-reference-guide.md +++ b/references/quick-reference-guide.md @@ -359,7 +359,7 @@ SCRIPT=~/.workbuddy/skills/jyotish-vedic-astrology/scripts/jyotish_engine.py | 子命令 | 功能 | 典型用法 | |--------|------|---------| | `aspects` | 度数精确相位系统(tight/moderate/loose + 入相位/出相位) | `aspects --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | -| `jaimini` | Jaimini完整系统(Chara Karaka 7/8 + Chara Dasha + Karakamsha)+ `--antardasha` | `jaimini --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --mode all --antardasha` | +| `jaimini` | Jaimini Karaka/Karakamsha;Chara Dasha timing 当前为 partial,需 KN Rao/PVN Rao 回归验证 | `jaimini --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --mode all --antardasha` | | `nakshatra-adv` | 高级Nakshatra(Tara Bala + Sub-Lord KP + 兼容性) | `nakshatra-adv --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --mode all` | | `argala` | Argala门闩系统(主/副Argala + Virodha反干预 + 净评分) | `argala --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `tajika` | Tajika年运盘(Muntha + YearLord + Mudda Dasha + Tri-Pataka) | `tajika --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8 --age 33` | @@ -369,7 +369,7 @@ SCRIPT=~/.workbuddy/skills/jyotish-vedic-astrology/scripts/jyotish_engine.py | 子命令 | 功能 | 典型用法 | |--------|------|---------| -| `shadbala` | 六重力量计算(Sthana/Dig/Kala/Chesta/Naisargika/Drik Bala) | `shadbala --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | +| `shadbala` | 六重力量计算(内部一致;外部绝对值校准前为 partial) | `shadbala --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `ashtakavarga` | 八分法计算(BPHS完整8×8矩阵,SAV=337) | `ashtakavarga --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `validate` | R1-R10数学验证(SAV/BAV/延伸角/Rahu-Ketu/逆行/Dasha/完整性/度数/宫位) | `validate --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | | `audit` | P1-P12行星审计管线(Identity/Health/Resource/SAV/Dignity/Shadbala/Aspects/Nakshatra/Yogas) | `audit --year 1990 --month 1 --day 1 --hour 12 --minute 0 --lat 39.9 --lon 116.4 --tz 8` | @@ -444,7 +444,7 @@ SCRIPT=~/.workbuddy/skills/jyotish-vedic-astrology/scripts/jyotish_engine.py ### 分盘与力量评估(7个) 30. **ashtakavarga-complete-system.md**:Ashtakavarga完整体系(SAV=337) -31. **shadbala-complete-methodology.md**:Shadbala完整计算方法论 +31. **shadbala-complete-methodology.md**:Shadbala计算方法论(当前计算层 partial,内部一致但外部绝对值校准待完成) 32. **planetary-strength-quick-ref.md**:行星力量速查表 33. **varga-system-quick-reference.md**:综合九层分盘体系对照手册 34. **varga-divisional-charts-quick-reference.md**:分盘快速参考 diff --git a/references/shadbala-complete-methodology.md b/references/shadbala-complete-methodology.md index 442e5c0a..f3b6befa 100644 --- a/references/shadbala-complete-methodology.md +++ b/references/shadbala-complete-methodology.md @@ -1,15 +1,17 @@ -# Shadbala完整计算方法论 +# Shadbala计算方法论 **创建日期**:2026-04-23 -**版本**:v2.0.0 +**版本**:v2.1.0-capability-partial **优先级**:⭐⭐⭐⭐⭐ 行星力量量化基础 -> **来源标签**: 【混合·古典+传统+现代】 — Shadbala六重力量完整体系(BPHS计算+现代解读) +> **来源标签**: 【混合·古典+传统+现代】 — Shadbala六重力量知识体系;当前 `scripts/shadbala.py` 为内部一致的近似计算层,外部绝对值校准前状态为 `partial`。 --- ## 一、Shadbala概述 -**Shad** = 六,**Bala** = 力量。Shadbala是Parashara系统中量化行星力量的完整方法,由六种力量组成。 +**Shad** = 六,**Bala** = 力量。Shadbala是Parashara系统中量化行星力量的方法,由六种力量组成。 + +> **v6.0.11 工程状态提醒**:第九轮内部不变量 benchmark 已通过 1200/1200,证明当前输出结构、总分聚合、Rupa/Virupa 换算、排名和 full-reading 一致性可靠;但源码仍有 Nathonnata、Saptavargaja、Chesta、Drik 等简化项。因此当前分数只能作为内部一致的相对强弱参考,不得声称已经完成 JHora/公开书例级别的传统绝对值校准。 ### 综合评分体系 diff --git a/references/strict-workflow-router.md b/references/strict-workflow-router.md index f944cbc3..f6840379 100644 --- a/references/strict-workflow-router.md +++ b/references/strict-workflow-router.md @@ -120,7 +120,7 @@ Use when the user asks for concrete timing, yes/no, project approval, launch, mo 1. Define the event house and event significators. 2. Check natal promise in D1 and relevant Varga. 3. Check Vimshottari MD/AD/PD. -4. Cross-check Chara Dasha if event is major. +4. Cross-check Jaimini static indicators if event is major; Chara Dasha timing is partial and must be treated as low-weight corroboration only. 5. Check Saturn/Jupiter/Rahu-Ketu transit to event houses/lords. 6. Check Double Transit where applicable. 7. Use KP/Sub-lord if the question is binary or landing-specific. @@ -163,10 +163,10 @@ Every Level 2+ output must include this table near the end. | D9 | Used / not used | ... | ... | | D10 / relevant Varga | Used / not used | ... | ... | | Vimshottari | Used / not used | ... | ... | -| Jaimini / Chara Dasha | Used / not used | ... | ... | +| Jaimini / Chara Dasha | Used / partial / not used | Karaka/Karakamsha reliable; Chara Dasha timing partial if used | Cap timing confidence unless independently corroborated | | AmK / Karakamsha | Used / not used | ... | ... | | AL / A10 | Used / partial / unavailable | ... | ... | -| Shadbala | Used / not used | ... | ... | +| Shadbala | Used / partial / not used | Internally consistent relative strength; external absolute calibration pending | Cap precise strength claims | | Ashtakavarga | Used / not used | ... | ... | | Argala | Used / not used | ... | ... | | KP / Sub-lord | Used / not required / unavailable | ... | ... | diff --git a/references/technique-capability-matrix.md b/references/technique-capability-matrix.md index cf5b59d4..9122cd4c 100644 --- a/references/technique-capability-matrix.md +++ b/references/technique-capability-matrix.md @@ -1,4 +1,4 @@ -# Technique Capability Matrix — Jyotish Skill v6.0.2 +# Technique Capability Matrix — Jyotish Skill v6.0.11 > Purpose: prevent vague statements like “covered” or “missing”. Each technique is classified by four layers: knowledge, computation, orchestration, and output. @@ -21,10 +21,10 @@ | D9 / Navamsa | Yes | Yes | Yes | Yes | `covered` | `varga-full`, D9 expanded dignity. | | D10 / Dasamsa | Yes | Yes | Yes | Yes | `covered` | `varga-full`, strict career route requires it. | | Vimshottari Dasha | Yes | Yes | Yes | Yes | `covered` | `dasha` and `full-reading`. | -| Chara Dasha / Jaimini | Yes | Yes | Yes | Yes | `covered` | `jaimini` module with antardasha. | +| Chara Dasha / Jaimini | Yes | Partial | Yes | Partial | `partial` | Chara Karaka/Karakamsha are usable, but Chara Dasha timing is a simplified implementation. Round 7 benchmark vs PyJHora KN Rao method matched only 58/240 fields (24.17%); do not use as high-confidence timing until KN Rao/PVN Rao/Iranganti method is implemented and revalidated. | | Karakamsha / AK | Yes | Yes | Yes | Yes | `covered` | `full-reading` uses AK, not DK. | | Argala | Yes | Yes | Yes | Yes | `covered` | `argala` module and strict routes. | -| Shadbala | Yes | Yes | Yes | Yes | `covered` | `shadbala` module and `full-reading`. | +| Shadbala | Yes | Partial | Yes | Yes | `partial` | Internal invariants passed 1200/1200 in Round 9, and `shadbala` matches `full-reading`; however current implementation still contains simplified Nathonnata Bala, Saptavargaja approximations, Chesta speed buckets and simplified Drik weights. Use as internally consistent strength reference, not externally calibrated Parashara absolute Shadbala. | | Ashtakavarga | Yes | Yes | Yes | Yes | `covered` | `ashtakavarga` module and validation. | | Avastha | Yes | Yes | Yes | Yes | `covered` | `scripts/avastha_calculator.py` integrated in `full-reading`. | | Vargottama | Yes | Yes | Yes | Yes | `covered` | App existed before; v6.0.2 adds `full-reading.modules.vargottama`. | @@ -44,6 +44,8 @@ When producing a Technique Audit Table: 1. Do not mark a technique as missing if any layer exists. -2. Use `partial` for Bhava Chalit and Sudarshana until full traditional modules are added. -3. Use `covered` for A10, Vargottama, Pushkara, Avastha, and Dasha Sandhi from v6.0.2 onward, but still state whether the current run actually called `full-reading`. -4. If a user provides only PDF text without exact degrees, Pushkara/Vargottama/A10 may degrade to `manual` or `unavailable` because the data layer is insufficient. +2. Use `partial` for Chara Dasha/Jaimini timing, Shadbala, Bhava Chalit, and Sudarshana until full traditional modules are added or externally benchmark-validated. +3. For Jaimini output, separate reliable Karaka/Karakamsha indicators from partial Chara Dasha timing; cap timing confidence if Chara Dasha is used. +4. For Shadbala output, state that current scores are internally consistent but not yet externally calibrated to a full Parashara/JHora-style absolute Shadbala table. +5. Use `covered` for A10, Vargottama, Pushkara, Avastha, and Dasha Sandhi from v6.0.2 onward, but still state whether the current run actually called `full-reading`. +6. If a user provides only PDF text without exact degrees, Pushkara/Vargottama/A10 may degrade to `manual` or `unavailable` because the data layer is insufficient. diff --git a/references/technique_registry.json b/references/technique_registry.json index 3a85f559..70e896e7 100644 --- a/references/technique_registry.json +++ b/references/technique_registry.json @@ -1,5 +1,5 @@ { - "version": "v6.0.3-engineering-foundation", + "version": "v6.0.11-shadbala-capability-downgrade", "source_inspiration": [ { "name": "jyotishyamitra", @@ -72,12 +72,13 @@ "jaimini_chara_dasha": { "name": "Jaimini / Chara Dasha", "domains": ["timing", "career", "relationship"], - "status": "covered", + "status": "partial", "knowledge_refs": ["references/jaimini-complete-system.md"], "commands": ["jaimini", "full-reading"], "output_paths": ["modules.jaimini"], "audit_label": "Jaimini/Chara", - "missing_impact": "Rashi-based timing confirmation missing." + "missing_impact": "Rashi-based timing confirmation is partial; timing confidence must be capped unless corroborated by Vimshottari, Dasha Sandhi, transit, D10/A10 and Ashtakavarga.", + "limitation": "Round 7 benchmark vs PyJHora KN Rao Chara Dasha matched 58/240 fields (24.17%). Current calc_chara_dasha() is a simplified implementation, not a full KN Rao/PVN Rao/Iranganti method. Karaka/Karakamsha remain usable; Chara Dasha timing is partial." }, "karakamsha_ak_amk": { "name": "Karakamsha / AK / AmK", @@ -112,12 +113,13 @@ "shadbala": { "name": "Shadbala", "domains": ["strength", "static"], - "status": "covered", + "status": "partial", "knowledge_refs": ["references/shadbala-complete-methodology.md"], "commands": ["shadbala", "full-reading"], "output_paths": ["modules.shadbala"], "audit_label": "Shadbala", - "missing_impact": "Planetary strength claims are not quantitatively anchored." + "missing_impact": "Planetary strength claims are quantitatively anchored only as an internally consistent reference, not as externally calibrated absolute Parashara Shadbala.", + "limitation": "Round 9 internal invariant benchmark passed 1200/1200 checks and full-reading matches the shadbala command. However scripts/shadbala.py still uses simplified Nathonnata Bala, approximate Saptavargaja sub-vargas, Chesta speed buckets and simplified Drik aspect weights. Use for relative strength ranking with confidence cap until an external full Shadbala table benchmark is frozen." }, "ashtakavarga": { "name": "Ashtakavarga", diff --git a/scripts/ashtakavarga.py b/scripts/ashtakavarga.py index e50b28fe..2eb95c02 100644 --- a/scripts/ashtakavarga.py +++ b/scripts/ashtakavarga.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -Ashtakavarga 计算模块 v2.0(八分法) -基于 Brihat Parashara Hora Shastra (BPHS) 完整标准表 +Ashtakavarga 计算模块 v2.1(八分法) +基于 Brihat Parashara Hora Shastra (BPHS) 完整标准表,并经 PVR/PyJHora 书例校准 核心修正(v2.0 vs v1.0): - v1.0: BAV_BASE 只有自贡献 + 少量跨源贡献 → SAV=94 ❌ @@ -14,9 +14,9 @@ Ashtakavarga 计算模块 v2.0(八分法) - SAV = 7 颗行星 BAV 之和(Lagna 自身 BAV 单独展示,不计入 SAV) - SAV 总和 = 337(宇宙常数) -BPHS 校正: -- 月亮 BAV → 木星贡献:1,4,7,8,10,11(6宫,不含12)→ 总49 -- 金星 BAV → 水星贡献:3,5,6,9,11,12(6宫,含12)→ 总52 +PVR/PyJHora 书例校准(v2.1): +- 第六轮 benchmark 使用 PyJHora `pvr_tests.py` 中公开书例仲裁,修正 Moon/Venus 7 个贡献表项。 +- 固定不变量保持:7行星 SAV=337,含 Lagna full SAV=386。 """ from typing import Dict, List, Tuple @@ -44,17 +44,17 @@ _SUN_BAV = { } # --- 月亮 BAV(总49) --- -# 来源: Sun(6) + Moon(6) + Mars(7) + Mercury(8) + Jupiter(6) + Venus(7) + Saturn(4) + Lagna(5) = 49 -# BPHS校正:木星贡献为 1,4,7,8,10,11(6宫),非 1,4,7,8,10,11,12(7宫) +# 来源: Sun(6) + Moon(7) + Mars(6) + Mercury(8) + Jupiter(7) + Venus(7) + Saturn(4) + Lagna(4) = 49 +# v2.1: PVR/PyJHora 书例校准 Moon/Mars/Jupiter/Lagna 贡献项。 _MOON_BAV = { 'Sun': [3, 6, 7, 8, 10, 11], - 'Moon': [1, 3, 6, 7, 10, 11], - 'Mars': [2, 3, 5, 6, 9, 10, 11], + 'Moon': [1, 3, 6, 7, 9, 10, 11], + 'Mars': [2, 3, 5, 6, 10, 11], 'Mercury': [1, 3, 4, 5, 7, 8, 10, 11], - 'Jupiter': [1, 4, 7, 8, 10, 11], # BPHS校正:不含12 + 'Jupiter': [1, 2, 4, 7, 8, 10, 11], 'Venus': [3, 4, 5, 7, 9, 10, 11], 'Saturn': [3, 5, 6, 11], - 'Lagna': [3, 6, 10, 11, 12], + 'Lagna': [3, 6, 10, 11], } # --- 火星 BAV(总39) --- @@ -97,17 +97,17 @@ _JUPITER_BAV = { } # --- 金星 BAV(总52) --- -# 来源: Sun(3) + Moon(9) + Mars(6) + Mercury(6) + Jupiter(5) + Venus(9) + Saturn(7) + Lagna(7) = 52 -# BPHS校正:水星贡献为 3,5,6,9,11,12(6宫,含12),非 3,5,6,9,11(5宫) +# 来源: Sun(3) + Moon(9) + Mars(6) + Mercury(5) + Jupiter(5) + Venus(9) + Saturn(7) + Lagna(8) = 52 +# v2.1: PVR/PyJHora 书例校准 Mars/Mercury/Lagna 贡献项。 _VENUS_BAV = { 'Sun': [8, 11, 12], 'Moon': [1, 2, 3, 4, 5, 8, 9, 11, 12], - 'Mars': [3, 5, 6, 9, 11, 12], - 'Mercury': [3, 5, 6, 9, 11, 12], # BPHS校正:含12 + 'Mars': [3, 4, 6, 9, 11, 12], + 'Mercury': [3, 5, 6, 9, 11], 'Jupiter': [5, 8, 9, 10, 11], 'Venus': [1, 2, 3, 4, 5, 8, 9, 10, 11], 'Saturn': [3, 4, 5, 8, 9, 10, 11], - 'Lagna': [1, 2, 3, 4, 5, 8, 9], + 'Lagna': [1, 2, 3, 4, 5, 8, 9, 11], } # --- 土星 BAV(总39) --- @@ -295,8 +295,8 @@ def calc_ashtakavarga(planets: Dict, asc_sign_idx: int) -> Dict: }) return { - 'method': 'Ashtakavarga八分法(BPHS标准v2.0)', - 'version': '2.0', + 'method': 'Ashtakavarga八分法(BPHS/PVR书例校准v2.1)', + 'version': '2.1', 'bav': bav_results, 'sav': { 'scores': {SIGNS[i]: sav[i] for i in range(12)}, diff --git a/scripts/jaimini.py b/scripts/jaimini.py index 26964301..5ee368e4 100644 --- a/scripts/jaimini.py +++ b/scripts/jaimini.py @@ -1,13 +1,13 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -Jaimini占星体系模块 v1.0 +Jaimini占星体系模块 v1.1 Parashara传承中的Jaimini子系统 支持: - Chara Karaka: 7/8个功能指示星(按度数排序) - - Chara Dasha: 基于星座的大运系统 - Karakamsha: AK在Navamsa中的上升(灵魂方向) + - Chara Dasha: 当前为简化 timing 实现,v6.0.9 后标注为 partial,不得单独作为高置信度应期依据 - Jaimini Sutras关键规则 """ from typing import Dict, List, Tuple, Optional @@ -135,14 +135,14 @@ def calc_chara_dasha(asc_sign_idx: int, planet_longitudes: Dict[str, float], birth_year: int, birth_month: int) -> Dict: """ - Chara Dasha计算(基于星座的大运系统) + Chara Dasha计算(简化实现;v6.0.9 后能力状态为 partial) 规则: - 从上升星座开始 - 奇数星座(Aries, Gemini...):正向顺序 - 偶数星座(Taurus, Cancer...):反向顺序 - 每个大运长度 = 12 - 该星座内的行星数量(用特定规则) - - 标准版:每个大运固定1-12年 + - 注意:该实现不是 KN Rao / PVN Rao / Iranganti 完整传统算法;只能作低权重辅助 """ # 确定顺序方向 is_odd = asc_sign_idx % 2 == 0 @@ -152,7 +152,7 @@ def calc_chara_dasha(asc_sign_idx: int, dasha_sequence = [] current = asc_sign_idx - # 标准Chara Dasha: 每个星座1年,按正/反向排列 + # 简化 Chara Dasha: 按上升星座顺/逆排列;不等同于 KN Rao/PVN Rao/Iranganti 完整传统算法 for i in range(12): sign_idx = (current + direction * i) % 12 sign_name = SIGNS[sign_idx] @@ -203,7 +203,7 @@ def calc_chara_dasha_with_antardasha(asc_sign_idx: int, planet_longitudes: Dict[str, float], birth_year: int, birth_month: int) -> Dict: """ - Chara Dasha 计算含 Antardasha 子周期 + Chara Dasha 计算含 Antardasha 子周期(简化 timing 实现,能力状态 partial) Antardasha 规则: - 在每个 Mahadasha 内,Antardasha 从 Mahadasha 星座开始 diff --git a/scripts/jyotish_engine.py b/scripts/jyotish_engine.py index 6e26d856..80e1c470 100644 --- a/scripts/jyotish_engine.py +++ b/scripts/jyotish_engine.py @@ -12,7 +12,7 @@ varga 分盘计算(D9/D10) varga-full BPHS十六分盘完整计算(D2-D60)(v3.7新增) aspects 度数精确相位系统(v3.7新增) - jaimini Jaimini系统(Chara Karaka/Chara Dasha/Karakamsha)(v3.7新增) + jaimini Jaimini系统(Chara Karaka/Karakamsha;Chara Dasha timing partial)(v3.7新增) nakshatra-adv 高级Nakshatra分析(Tara Bala/Sub-Lord/兼容性)(v3.7新增) argala Argala门闩系统(v3.7新增) tajika Tajika/Varshaphala年运盘(v3.7新增) @@ -21,7 +21,7 @@ celebrity 名人案例查询(15,807条数据+SQLite验证库) db-stats 验证数据库统计 transit 行星过境查询 - shadbala 六重力量计算(v3.4新增) + shadbala 六重力量计算(内部一致;外部绝对值校准前partial)(v3.4新增) ashtakavarga 八分法计算(v3.5升级BPHS完整表,SAV=337) memory Hermes记忆系统(v3.4新增) validate R1-R10数学验证(v3.5新增,含R2b BAV列→SAV校验) @@ -246,6 +246,60 @@ BASE_PLANETS_SWE = {'Sun': swe.SUN, 'Moon': swe.MOON, 'Mars': swe.MARS, 'Mercury PLANETS_SWE = {**BASE_PLANETS_SWE, 'Rahu': swe.MEAN_NODE} if HAS_SWE else {} +def _node_pid(node_mode='mean'): + """返回 Rahu/Ketu 节点计算口径对应的 Swiss Ephemeris id。""" + if not HAS_SWE: + return None + return swe.TRUE_NODE if (node_mode or 'mean').lower() == 'true' else swe.MEAN_NODE + + +def _planet_map_for_node_mode(node_mode='mean'): + """返回七曜+Rahu 的行星映射,Rahu 口径由 node_mode 决定。""" + if not HAS_SWE: + return {} + return {**BASE_PLANETS_SWE, 'Rahu': _node_pid(node_mode)} + + +def _calc_sidereal_planets_for_jd(jd, node_mode='mean', include_ketu=True): + """使用 Swiss Ephemeris 计算指定 Julian Day 的恒星黄道行星位置。""" + if not HAS_SWE: + return {}, None + ayanamsa = swe.get_ayanamsa(jd) + data = {} + for pname, pid in _planet_map_for_node_mode(node_mode).items(): + pos, ret = swe.calc_ut(jd, pid) + if ret < 0: + continue + lon = (pos[0] - ayanamsa) % 360 + sign_idx = int(lon / 30) % 12 + speed = pos[3] if len(pos) > 3 else 0 + data[pname] = { + 'sign': SIGNS[sign_idx], + 'sign_cn': SIGNS_CN[SIGNS[sign_idx]], + 'degree': round(lon, 4), + 'degree_raw': lon, + 'degree_in_sign': round(lon % 30, 2), + 'degree_in_sign_raw': lon % 30, + 'speed': round(speed, 4), + 'retrograde': speed < 0, + } + if include_ketu and 'Rahu' in data: + rahu_lon = data['Rahu']['degree_raw'] + ketu_lon = (rahu_lon + 180) % 360 + ketu_idx = int(ketu_lon / 30) % 12 + data['Ketu'] = { + 'sign': SIGNS[ketu_idx], + 'sign_cn': SIGNS_CN[SIGNS[ketu_idx]], + 'degree': round(ketu_lon, 4), + 'degree_raw': ketu_lon, + 'degree_in_sign': round(ketu_lon % 30, 2), + 'degree_in_sign_raw': ketu_lon % 30, + 'speed': data['Rahu'].get('speed', 0), + 'retrograde': data['Rahu'].get('retrograde', True), + } + return data, ayanamsa + + def output_json(data): """统一JSON输出""" print(json.dumps(data, ensure_ascii=False, indent=2, default=str)) @@ -279,7 +333,7 @@ def compute_chart_data(year, month, day, hour, minute, lat, lon, tz, node_mode=' node_mode = (node_mode or 'mean').lower() if node_mode not in ('mean', 'true'): node_mode = 'mean' - node_pid = swe.TRUE_NODE if node_mode == 'true' else swe.MEAN_NODE + node_pid = _node_pid(node_mode) result = {"birth_info": { "date": f"{year}-{month:02d}-{day:02d}", "time": f"{hour:02d}:{minute:02d}", "tz": f"UTC{'+' if tz >= 0 else ''}{tz}", "lat": lat, "lon": lon, @@ -1173,49 +1227,11 @@ def cmd_transit(args): ayanamsa = swe.get_ayanamsa(jd_mid) # --- 计算行星位置 --- - planet_map = { - 'Sun': swe.SUN, 'Moon': swe.MOON, 'Mars': swe.MARS, - 'Mercury': swe.MERCURY, 'Jupiter': swe.JUPITER, - 'Venus': swe.VENUS, 'Saturn': swe.SATURN, 'Rahu': swe.MEAN_NODE - } - - transit_data = {} - for pname, pid in planet_map.items(): - if target_planets and pname not in target_planets: - continue - pos, ret = swe.calc_ut(jd_mid, pid) - if ret < 0: - continue - lon_sid = (pos[0] - ayanamsa) % 360 - speed = pos[3] - retrograde = speed < 0 - sign_idx = int(lon_sid / 30) % 12 - deg_in_sign = lon_sid % 30 - sign_name = SIGNS[sign_idx] - sign_cn = SIGNS_CN[sign_name] - - transit_data[pname] = { - 'sign': sign_name, - 'sign_cn': sign_cn, - 'degree': round(lon_sid, 4), - 'degree_in_sign': round(deg_in_sign, 2), - 'speed': round(speed, 4), - 'retrograde': retrograde, - } - - # Rahu 存在时补算 Ketu - if 'Rahu' in transit_data: - rahu_lon = transit_data['Rahu']['degree'] - ketu_lon = (rahu_lon + 180) % 360 - ketu_si = int(ketu_lon / 30) % 12 - transit_data['Ketu'] = { - 'sign': SIGNS[ketu_si], - 'sign_cn': SIGNS_CN[SIGNS[ketu_si]], - 'degree': round(ketu_lon, 4), - 'degree_in_sign': round(ketu_lon % 30, 2), - 'speed': 0, - 'retrograde': True, - } + node_mode = getattr(args, 'node_mode', 'mean') + transit_data, ayanamsa = _calc_sidereal_planets_for_jd(jd_mid, node_mode=node_mode, include_ketu=True) + if target_planets: + target_set = set(target_planets) + transit_data = {p: d for p, d in transit_data.items() if p in target_set} # --- 计算行星间相位(互相在对方星座的宫位关系)--- aspects_found = [] @@ -1267,6 +1283,8 @@ def cmd_transit(args): 'method': 'Swiss Ephemeris 实时计算(v3.7.2)', 'target_date': f'{t_year}-{t_month:02d}-{t_day:02d}', 'ayanamsa': round(ayanamsa, 4), + 'node_mode': node_mode, + 'data_layer': 'true_transit_positions', 'planets': transit_data, 'aspects': aspects_found, 'note': f'使用Swiss Ephemeris实时计算{t_year}年{t_month}月行星过境位置,不再依赖静态JSON' @@ -2612,7 +2630,7 @@ def cmd_synastry(args): # 基于 transit-multi-reference-guide.md 强制规范 # 四参考点:Lagna / Chandra Lagna / Arudha Lagna / Navamsa Lagna # ============================================================================ -def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons): +def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons, transit_planets=None, transit_date=None, node_mode='mean'): """ ⭐ v4.5.0: Transit多参考点分析(强制规范) 每次Transit分析必须同时从四个参考点评估: @@ -2621,6 +2639,8 @@ def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons): 3. Arudha Lagna(AL)— 公众形象 4. Navamsa Lagna(D9上升)— 灵魂层面 """ + data_layer = 'true_transit_positions' if transit_planets else 'natal_positions_fallback' + analysis_planets = transit_planets if transit_planets else planets # 四个参考点的星座索引 moon_lon = planet_lons.get('Moon', 0) chandra_idx = int(moon_lon / 30) % 12 @@ -2681,7 +2701,7 @@ def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons): OUTER_PLANETS = ['Jupiter', 'Saturn', 'Rahu', 'Ketu'] transit_analysis = {} for pn in OUTER_PLANETS: - pd = planets.get(pn, {}) + pd = analysis_planets.get(pn, {}) if not isinstance(pd, dict) or 'sign' not in pd: continue p_sign_idx = SIGNS.index(pd['sign']) if pd['sign'] in SIGNS else 0 @@ -2714,7 +2734,7 @@ def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons): # Sade Sati / Ashtama Shani 检测(基于Chandra Lagna) special_checks = {} - saturn_sign_idx = SIGNS.index(planets.get('Saturn', {}).get('sign', 'Aries')) if isinstance(planets.get('Saturn'), dict) and planets.get('Saturn', {}).get('sign') in SIGNS else 0 + saturn_sign_idx = SIGNS.index(analysis_planets.get('Saturn', {}).get('sign', 'Aries')) if isinstance(analysis_planets.get('Saturn'), dict) and analysis_planets.get('Saturn', {}).get('sign') in SIGNS else 0 # Sade Sati: Saturn 在月亮星座或前后1宫 sade_sati_phase = None if saturn_sign_idx == chandra_idx: @@ -2739,11 +2759,14 @@ def _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons): return { 'references': references, + 'target_date': transit_date, + 'node_mode': node_mode, + 'data_layer': data_layer, 'transit_analysis': transit_analysis, 'divergences': divergences, 'divergence_count': len(divergences), 'special_checks': special_checks, - 'protocol': 'v4.5.0 Transit多参考点强制规范:AI必须同时呈现Lagna和Chandra Lagna两个视角。任何矛盾信号必须记录并解释。', + 'protocol': 'v6.0.10 Transit多参考点强制规范:AI必须用真实过境行星位置,并同时呈现Lagna和Chandra Lagna两个视角。任何矛盾信号必须记录并解释。', } @@ -3299,9 +3322,14 @@ def cmd_full_reading(args): except Exception as e: jaimini_result['chara_karaka_jh'] = {"error": str(e)} - # 使用带 Antardasha 子周期的 Chara Dasha(v4.3.0) + # 使用带 Antardasha 子周期的 Chara Dasha(v4.3.0;v6.0.9后标注为partial) jaimini_result['chara_dasha'] = calc_chara_dasha_with_antardasha(asc_idx, planet_lons, args.year, args.month) jaimini_result['has_antardasha'] = True + jaimini_result['chara_dasha_capability'] = { + 'status': 'partial', + 'reason': 'Round 7 vs PyJHora KN Rao matched 58/240 fields; current implementation is simplified, not full KN Rao/PVN Rao/Iranganti.', + 'usage_rule': 'Use Chara Karaka/Karakamsha normally; use Chara Dasha timing only as low-weight corroboration.' + } # Karakamsha(用AK灵魂星,非DK配偶星) # ⚠️ 2026-05-03修正:此前错误使用DK,现已修正为AK @@ -3467,9 +3495,21 @@ def cmd_full_reading(args): except Exception as e: report['errors'].append(f"vivah-saham: {e}") - # ── Step 17: Transit 多参考点分析 (v4.5.0 P1) ── + # ── Step 17: Transit 多参考点分析 (v6.0.10 true transit) ── try: - transit_multi = _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons) + transit_reference_date = getattr(args, 'transit_date', None) or getattr(args, 'today', None) or datetime.now().strftime('%Y-%m-%d') + ty, tm, td = map(int, transit_reference_date.split('-')) + transit_jd = swe.julday(ty, tm, td, 12.0 - args.tz) + transit_planets, transit_ayanamsa = _calc_sidereal_planets_for_jd(transit_jd, node_mode=getattr(args, 'node_mode', 'mean'), include_ketu=True) + report['modules']['transit_positions'] = { + 'method': 'Swiss Ephemeris true transit positions', + 'target_date': transit_reference_date, + 'ayanamsa': round(transit_ayanamsa, 4) if transit_ayanamsa is not None else None, + 'node_mode': getattr(args, 'node_mode', 'mean'), + 'data_layer': 'true_transit_positions', + 'planets': transit_planets, + } + transit_multi = _calc_transit_multi_reference(planets, asc_idx, asc_deg, planet_lons, transit_planets=transit_planets, transit_date=transit_reference_date, node_mode=getattr(args, 'node_mode', 'mean')) report['modules']['transit_multi_reference'] = transit_multi except Exception as e: report['errors'].append(f"transit-multi-ref: {e}") @@ -3652,9 +3692,10 @@ def main(): p.add_argument('--day', type=int, default=15, help='指定日期(默认15日取月中代表)') p.add_argument('--planet', default=None, help='目标行星,逗号分隔(默认全部,如:Jupiter,Saturn)') p.add_argument('--tz', type=float, default=8, help='时区(默认UTC+8)') + p.add_argument('--node-mode', default='mean', choices=['mean', 'true'], help='Rahu/Ketu节点口径:mean=Mean Node(默认),true=True Node') # 9. shadbala (v3.4新增) - p = sub.add_parser('shadbala', help='Shadbala六重力量计算') + p = sub.add_parser('shadbala', help='Shadbala六重力量计算(内部一致;外部绝对值校准前partial)') _add_chart_args(p) # 10. ashtakavarga (v3.4新增) @@ -3701,7 +3742,7 @@ def main(): p = sub.add_parser('jaimini', help='Jaimini系统(Chara Karaka/Dasha/Karakamsha)') _add_chart_args(p) p.add_argument('--mode', default='all', choices=['all','karaka','dasha','karakamsha'], help='分析模式') - p.add_argument('--antardasha', action='store_true', help='Chara Dasha含Antardasha子周期') + p.add_argument('--antardasha', action='store_true', help='Chara Dasha含Antardasha子周期(当前timing实现为partial)') # 18. nakshatra-adv (v3.7新增) p = sub.add_parser('nakshatra-adv', help='高级Nakshatra分析') @@ -3734,6 +3775,7 @@ def main(): _add_chart_args(p) p.add_argument('--age', type=int, default=None, help='当前年龄(不提供则自动计算)') p.add_argument('--today', default=None, help='Dasha/Sandhi参考日期 YYYY-MM-DD(默认今天)') + p.add_argument('--transit-date', default=None, help='Transit真实过境参考日期 YYYY-MM-DD(默认跟随--today或今天)') # 23. prashna (v3.9新增) p = sub.add_parser('prashna', help='Prashna问事占星(提问时刻星盘+Arudha+Sphuta+Sahams)') diff --git a/scripts/report_builder.py b/scripts/report_builder.py index 98461fa3..072e955e 100644 --- a/scripts/report_builder.py +++ b/scripts/report_builder.py @@ -317,7 +317,7 @@ def build_cover(name, lagna, gender, status, pkg, desc, lang="cn"):
{L[4]}
Parashari Jyotish | KN Rao School
{L[5]}
Swiss Ephemeris | Lahiri Ayanamsha
{L[6]}
Vimsottari (Mahadasha + Antardasha)
-
{L[7]}
Shadbala, Ashtakavarga (SAV/BAV), D9 Navamsha
+
{L[7]}
Shadbala (relative/partial), Ashtakavarga v2.1 (SAV/BAV), D9 Navamsha
""" diff --git a/scripts/shadbala.py b/scripts/shadbala.py index 9bccd74b..ae1e1965 100644 --- a/scripts/shadbala.py +++ b/scripts/shadbala.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- """ Shadbala 计算模块(六重力量) -基于 Parashara 系统,量化行星力量 +内部一致的 Parashara-inspired 相对强弱参考;外部绝对值校准前状态为 partial 六种力量: 1. Sthana Bala(位置力量) @@ -90,7 +90,7 @@ VIRUPAS_PER_RUPA = 60.0 def calc_shadbala(planets: Dict, asc_sign: str, birth_hour: float, sun_lon: float, moon_lon: float) -> Dict: """ - 计算完整 Shadbala + 计算 Shadbala 相对强弱参考(内部一致;外部绝对值校准前 partial) Args: planets: 行星数据 dict,每颗行星需要 {sign, degree, house, retrograde, speed} @@ -100,7 +100,7 @@ def calc_shadbala(planets: Dict, asc_sign: str, birth_hour: float, moon_lon: 月亮恒星黄道经度 Returns: - 完整的 Shadbala 计算结果 + Shadbala 计算结果(内部一致的相对强弱参考) """ results = {} is_night = birth_hour < 6.0 or birth_hour >= 18.0 @@ -174,7 +174,7 @@ def calc_shadbala(planets: Dict, asc_sign: str, birth_hour: float, results[name]['rank'] = i + 1 return { - 'method': 'Shadbala六重力量(Parashara系统)', + 'method': 'Shadbala六重力量(内部一致相对强弱;外部绝对值校准前partial)', 'is_night_birth': is_night, 'sun_uttarayana': sun_northern, 'planets': results,