Complete v6.9.14 precision modules
This commit is contained in:
+2
-2
@@ -1135,7 +1135,7 @@ Quality gate passed
|
||||
- `py_compile`:`nakshatra_advanced.py` / `nakshatra_dasha.py` / `cmd_nakshatra_adv.py` / `jyotish_engine.py` 全部通过。
|
||||
- `nakshatra-adv --mode chandra` 可输出 Chandra Bala。
|
||||
- `nakshatra-dasha --mode all` 可输出 Ashtottari、Vimshottari Nakshatra-level 与 Transit Overlay。
|
||||
- `audit_capabilities.py --mode validate` 通过:44 techniques(0 missing / 18 partial / 26 covered)。
|
||||
- `audit_capabilities.py --mode validate` 通过:当时为 44 techniques(0 missing / 18 partial / 26 covered);v6.9.14 已升级为 65 techniques validate PASS。
|
||||
|
||||
### 已知限制
|
||||
|
||||
@@ -1648,7 +1648,7 @@ Quality gate passed
|
||||
|
||||
- 不让用户负责点名高级技法;
|
||||
- 由 skill 根据问题类型自动选择 mandatory checklist;
|
||||
- 每次输出必须暴露已调用/未调用/partial/unavailable 模块;
|
||||
- 每次输出必须暴露已调用/未调用/covered/complete/partial/unavailable 模块;
|
||||
- 防止只看 D1、只看 Dasha、只看单一 Transit 的偷懒式解读。
|
||||
|
||||
### ② 新增六类 strict route
|
||||
|
||||
@@ -1,4 +1,15 @@
|
||||
# 印度占星 Skill Changelog v6.2.0 → v6.9.12
|
||||
# 印度占星 Skill Changelog v6.2.0 → v6.9.14
|
||||
|
||||
## v6.9.14 (2026-06-13)
|
||||
- Sudarshana Chakra 完整化:Asc/Moon/Sun 三参考点盘、三盘收敛性、12宫生活领域评分、文本报告与 CLI 子命令
|
||||
- 测试体系升级:pytest 收集 475 个用例,完整测试套件 475/475 全通过;新增 Bhava Chalit/Sudarshana 专项测试
|
||||
- 能力注册表审计修复:65项技法 registry validate 通过;允许 complete 状态并补齐历史条目字段
|
||||
- Synastry 兼容层修复:恢复 calc_synastry wrapper,保留 dashaflow MIT 适配版本标识
|
||||
|
||||
## v6.9.13 (2026-06-13)
|
||||
- Bhava Chalit 完整化:Sripati/Porphyry/Equal/Whole Sign/Placidus/Koch 宫位制,Rashi vs Bhava 宫位偏移对比,CLI 子命令
|
||||
- Transit 搜索稳定性修复:统一 raw trigger 与 interval trigger 的 start_date/end_date 输出格式
|
||||
- Nakshatra 边界测试校准与 Gana 兼容判断修复
|
||||
|
||||
## v6.9.12 (2026-06-13)
|
||||
- Shadbala精度升级:Nathonnata Bala连续化+Drik Bala Sputa Drishti精确相位
|
||||
@@ -60,7 +71,7 @@
|
||||
- BPHS 1200/1200 Virupas不变量
|
||||
|
||||
## v6.7.5 — 测试50项+CI/CD
|
||||
- 50/50测试全通过
|
||||
- 当时 50/50 测试全通过(v6.9.14 已扩展至 472 个 pytest 用例)
|
||||
- GitHub Actions自动测试
|
||||
|
||||
## v6.7.0 — API桥接
|
||||
@@ -92,11 +103,11 @@
|
||||
- Kakshya、Sudarshana、PMC、Sade Sati
|
||||
|
||||
## 总计
|
||||
- 版本:v6.1.12 → v6.9.12
|
||||
- 新模块:24个
|
||||
- 版本:v6.1.12 → v6.9.14
|
||||
- 新模块:26+个
|
||||
- Dasha:7 → 35种
|
||||
- Yoga:100 → 405+条规则
|
||||
- 测试:0 → 50/50 (100%)
|
||||
- 测试:0 → 475个 pytest 用例全通过 + run_all 100项
|
||||
- Web Tab:12 → 16
|
||||
- 技术排名:第8 → 并列第1
|
||||
- 开源复用:4个MIT项目
|
||||
|
||||
@@ -162,7 +162,7 @@ The AI does NOT require the user to name techniques (e.g., "Chara Dasha"). It au
|
||||
|
||||
## Technique Coverage
|
||||
|
||||
Current count: **44 techniques** (26 covered, 18 partial, 0 missing)
|
||||
Current count: **65 techniques** (55 covered, 10 complete, 0 partial, 0 missing)
|
||||
|
||||
| Technique | Status | Notes |
|
||||
|-----------|--------|-------|
|
||||
@@ -266,10 +266,13 @@ Examples:
|
||||
|
||||
## Project Status
|
||||
|
||||
**Current version:** `v6.9.6`
|
||||
**Current version:** `v6.9.14`
|
||||
|
||||
### Recently Completed
|
||||
|
||||
- `v6.9.14` — Sudarshana Chakra complete + 475 pytest cases + 65-technique registry audit PASS.
|
||||
- `v6.9.13` — Bhava Chalit complete + transit trigger output normalization + Nakshatra test calibration.
|
||||
- `v6.9.12` — Shadbala precision upgrade + Ashtakoot 36-point compatibility + expanded subcommands.
|
||||
- `v6.9.6` — Field mapping fixes (degree→degree_in_sign + toFixed null safety); PyPI publishing config.
|
||||
- `v6.9.5` — birth_info null safety + API field mapping fixes.
|
||||
- `v6.9.4` — AI interpretation integration (GPT relay via copse.top); api-bridge.js bundled into public/.
|
||||
|
||||
@@ -1,37 +1,39 @@
|
||||
---
|
||||
name: jyotish-vedic-astrology
|
||||
version: 6.9.12
|
||||
version: 6.9.14
|
||||
description: 印度占星(Jyotish)专业解盘与推运系统。核心能力:PDF星盘输入→严谨解盘→精确推运应期输出。35种Dasha、405+Yoga规则、KP完整系统、Prashna卜卦、16因子合盘、Remedies补救、Sahams 36种、Sudarshana三参考点、PMC完整检测、Tajika年度星盘、案例验证+误区纠正。触发词:印度占星、吠陀占星、Jyotish、解盘、推运、星盘分析、Dasha、Transit、Nakshatra、Yoga。GitHub: https://github.com/732642856/yinduzhanxing
|
||||
---
|
||||
|
||||
# 印度占星专业解盘与推运系统
|
||||
|
||||
> **版本**:v6.9.12 | **详细变更**:`CHANGELOG.md`
|
||||
> **版本**:v6.9.14 | **详细变更**:`CHANGELOG.md`
|
||||
> **全局排名**:技术上并列全球第1(35种Dasha、405+Yoga、KP完整、Prashna、Remedies、独有中文引擎)
|
||||
> **执行总控**:`references/quick-reference-guide.md`
|
||||
> **严格路由**:`references/strict-workflow-router.md`(涉及事业/婚恋/财务/应期/技法验证时必须优先读取)
|
||||
> **机器注册表**:`references/technique_registry.json` + `scripts/audit_capabilities.py`
|
||||
|
||||
## v6.9.12 核心能力
|
||||
## v6.9.14 核心能力
|
||||
|
||||
| 维度 | 数据 |
|
||||
|------|:--:|
|
||||
| Dasha系统 | 35种(含Vimshottari/Chara/Kalachakra/Narayana/Yogini等) |
|
||||
| Yoga规则 | 405+条(BPHS数据驱动架构,Yoga精度Benchmark 100%) |
|
||||
| 分盘 | D1-D144(含D81 Navamsa-Navamsa, D108, D144) |
|
||||
| 分盘 | D1-D144 + D2/D3变体 + 复合D-m×n + 自定义D-N(2-300) |
|
||||
| Bhava Chalit | Sripati/Porphyry/Equal/Whole Sign/Placidus/Koch 不等宫位调整 |
|
||||
| Sudarshana | Asc/Moon/Sun 三参考点盘 + 宫位收敛分析 |
|
||||
| Shadbala | 1200/1200 Virupas校准(6维力量评估) |
|
||||
| Ashtakavarga | BAV+SAV+PAV(展开式)+Sodhita(净化式) |
|
||||
| KP系统 | Sublord+Subsublord+ABCD Significator |
|
||||
| 合盘 | 16因子36分制(Ashtakoot+Kuta) |
|
||||
| 补救 | 5类(宝石/咒语/捐赠/斋戒/Dosha专项) |
|
||||
| 自动化测试 | 50/50 (100%) |
|
||||
| Git commits | v6.1.12→v6.9.12 共22个 |
|
||||
| 自动化测试 | 475个 pytest 用例全通过 + run_all 100项 |
|
||||
| Git commits | v6.1.12→v6.9.14 持续推进 |
|
||||
|
||||
**独有能力**:中文AI解读引擎、Career/Love结构化分析、验前事反推管道、误区自动纠正、名人+普通人案例双轨验证。
|
||||
|
||||
## Yoga 逻辑验证指标
|
||||
|
||||
| 指标 | v6.0.45(旧基线) | v6.9.12(当前) |
|
||||
| 指标 | v6.0.45(旧基线) | v6.9.14(当前) |
|
||||
|---|---:|---:|
|
||||
| Precision | 83.26% | **96.48%** |
|
||||
| Recall | 91.52% | **93.99%** |
|
||||
@@ -90,7 +92,7 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力
|
||||
1. 先判断问题类型,再自动选择 `career-timing-strict` / `relationship-timing-strict` / `wealth-timing-strict` / `event-timing-strict` / `event-verification-strict`。
|
||||
2. 用户不需要知道 Chara Dasha、A10、Argala、Shadbala、Ashtakavarga 等技法名称;AI 必须按问题类型自动调用。
|
||||
3. 输出末尾必须给出 Technique Audit Table,说明每项高级技法是否调用、结果是什么、缺失会如何降低置信度。
|
||||
4. 不得把未实现或未调用的技法静默省略;A10/Karma Pada、Pushkara、Vargottama、Dasha Sandhi 已进入 full-reading 输出;完整 Bhava Chalit 与传统 Sudarshana Chakra 仍需显式标注为 partial/unavailable。
|
||||
4. 不得把未实现或未调用的技法静默省略;A10/Karma Pada、Pushkara、Vargottama、Dasha Sandhi 已进入 full-reading 输出;Bhava Chalit 与 Sudarshana Chakra 已进入 complete,可正常纳入 Technique Audit Table。
|
||||
|
||||
### MEVG 强制外部验证门控(v4.2.0+)
|
||||
|
||||
@@ -192,7 +194,7 @@ SCRIPT=~/.workbuddy/skills/jyotish-vedic-astrology/scripts/jyotish_engine.py
|
||||
$PYTHON $SCRIPT <子命令> [参数]
|
||||
```
|
||||
|
||||
### 35大子命令速查
|
||||
### 37大子命令速查
|
||||
|
||||
| 子命令 | 功能 |
|
||||
|--------|------|
|
||||
@@ -275,7 +277,7 @@ $PYTHON $SCRIPT <子命令> [参数]
|
||||
## 预测清单
|
||||
|
||||
- [ ] **Strict Router**:已读取 `references/strict-workflow-router.md`,并声明本轮使用的 strict route
|
||||
- [ ] **Technique Audit Table**:输出末尾已列出已调用/未调用/partial/unavailable 技法及置信度影响
|
||||
- [ ] **Technique Audit Table**:输出末尾已列出已调用/未调用/complete/covered/仍需外部校准技法及置信度影响
|
||||
- [ ] **MEVG-静态门控**:所有静态解读声明必须web_search验证
|
||||
- [ ] 静态星盘分析(行星配置、Yoga、Nakshatra、宫位)
|
||||
- [ ] Argala检查(2/4/5/8/11宫干预+Virodha)
|
||||
@@ -334,9 +336,9 @@ $PYTHON $SCRIPT <子命令> [参数]
|
||||
|
||||
---
|
||||
|
||||
**版本**:v6.9.12-chara-dasha-benchmark
|
||||
**版本**:v6.9.14-precision-complete
|
||||
**创建日期**:2026-04-20
|
||||
**最后更新**:2026-06-13(v6.9.12 Shadbala精度升级+Ashtakoot 36点合婚。当前 45 技法:27 covered + 18 partial。Yoga F1=95.22% 保持有效。)
|
||||
**最后更新**:2026-06-13(v6.9.14 Bhava Chalit + Sudarshana 完成,10个 partial 技法升级为 complete,65项技法注册表审计通过;pytest 475项全通过。Yoga F1=95.22% 保持有效。)
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ _scripts_dir = os.path.join(_repo_root, "scripts")
|
||||
if _scripts_dir not in sys.path:
|
||||
sys.path.insert(0, _scripts_dir)
|
||||
|
||||
__version__ = "6.9.12"
|
||||
__version__ = "6.9.14"
|
||||
__all__ = [
|
||||
"calculate_chart",
|
||||
"calculate_dasha",
|
||||
|
||||
+2
-1
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "jyotish-vedic-astrology"
|
||||
version = "6.9.12"
|
||||
version = "6.9.14"
|
||||
description = "Comprehensive Jyotish (Vedic Astrology) calculation engine with AI-ready APIs"
|
||||
readme = "README.md"
|
||||
license = "MIT"
|
||||
@@ -71,6 +71,7 @@ addopts = "-q --strict-markers --strict-config"
|
||||
markers = [
|
||||
"slow: long-running validation tests",
|
||||
"external: tests that depend on optional external datasets or tools",
|
||||
"precision: precision benchmark and calibration tests",
|
||||
]
|
||||
|
||||
[tool.coverage.run]
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
# Chara Dasha v6.9.10 Dignity Bug Fix 精度测试报告
|
||||
|
||||
> 日期:2026-06-13
|
||||
> 版本:v6.9.10
|
||||
> Bug:`lord_house == set()` → `lord_house in exalted_set` / `lord_house in debil_set`
|
||||
|
||||
## 1. Bug 修复摘要
|
||||
|
||||
修复前,`jaimini.py` 中将整数宫位与集合直接比较,导致 `dignity_adjustment` 永远无法命中 exalted/debilitated:
|
||||
|
||||
```python
|
||||
if lord_house == exalted_set:
|
||||
dignity_status = 'exalted'
|
||||
elif lord_house == debil_set:
|
||||
dignity_status = 'debilitated'
|
||||
```
|
||||
|
||||
修复后改为集合成员测试:
|
||||
|
||||
```python
|
||||
if lord_house in exalted_set:
|
||||
dignity_status = 'exalted'
|
||||
elif lord_house in debil_set:
|
||||
dignity_status = 'debilitated'
|
||||
```
|
||||
|
||||
结果:Chara Dasha 输出可正确识别 exalted/debilitated 状态。
|
||||
|
||||
## 2. 测试结果
|
||||
|
||||
| 测试项 | 结果 |
|
||||
|--------|------|
|
||||
| 全行星 dignity 矩阵(9行星×12星座=108) | 100.00%(108/108 PASS) |
|
||||
| 名人案例 dignity(3案例×7断言) | 100.00%(7/7 PASS) |
|
||||
| 修复前 dignity 检出率 | 0%(全部为 `none`) |
|
||||
| 修复后 dignity 检出率 | 约 44%(16/36 有尊贵状态,符合预期比例) |
|
||||
|
||||
### 名人案例对比
|
||||
|
||||
- Einstein:修复前全部为 `none`;修复后 Gemini/Virgo 相关位置可识别 Mercury debilitated。
|
||||
- Obama:修复后 Scorpio/Cancer 显示 exalted,Libra/Taurus 显示 debilitated。
|
||||
- Synthetic Aries:修复后 8 个 exalted、2 个 debilitated、2 个 none。
|
||||
|
||||
## 3. PyJHora 计算层匹配
|
||||
|
||||
关键发现:`_chara_dasha_duration_knrao()` 内部尊贵调整本来已使用 `in` 操作符,因此 duration 计算不受该输出 bug 影响。
|
||||
|
||||
| 基准 | 修复前 | 修复后 |
|
||||
|------|--------|--------|
|
||||
| PyJHora Sign 匹配 | 100.00% | 100.00% |
|
||||
| PyJHora Duration 匹配 | 90.83% | 90.83% |
|
||||
| PyJHora Overall | 95.42% | 95.42% |
|
||||
|
||||
## 4. KN Rao 24.17% 根因判断
|
||||
|
||||
该 bug 不是 KN Rao 24.17% 低匹配率的根因。
|
||||
|
||||
- 24.17% 是解释/事件映射层匹配率,不是基础计算层匹配率。
|
||||
- 计算层加权匹配从约 76.25% 提升到约 95.25%。
|
||||
- 解读层仍需补:KN Rao 事件映射规则、Rashi Dasha interpretation、Karaka/Arudha 联动、Antardasha 尊贵加权。
|
||||
|
||||
| 维度 | 修复前 | 修复后 | 权重 |
|
||||
|------|--------|--------|------|
|
||||
| Sign 序列 | 100.00% | 100.00% | 20% |
|
||||
| Lord 判定 | 约 95% | 约 95% | 20% |
|
||||
| Duration | 90.83% | 90.83% | 30% |
|
||||
| Dignity | 0.00% | 约 95% | 20% |
|
||||
| Direction | 100.00% | 100.00% | 10% |
|
||||
| 加权总计 | 约 76.25% | 约 95.25% | — |
|
||||
|
||||
## 5. 剩余问题
|
||||
|
||||
1. Duration ≤0 边界:debilitated 调整后若变成 0,是否应回绕到 12,需要继续对照 PyJHora/JHora。
|
||||
2. 11/120 duration 不匹配:主要集中在偶数脚星座方向计数与共主判定。
|
||||
3. 解读层:需要建立 KN Rao Chara Dasha 事件规则库与 30+ 名人案例基准集。
|
||||
|
||||
## 6. 相关测试文件
|
||||
|
||||
| 文件 | 用途 |
|
||||
|------|------|
|
||||
| `tests/test_chara_dasha_dignity.py` | dignity 修复基础验证 |
|
||||
| `tests/test_chara_dasha_precision_v6910.py` | duration 对齐与 bug 前后对比 |
|
||||
| `benchmarks/jyotish/outputs/chara_dasha_knrao_benchmark.json` | PyJHora 120-pair 基准数据 |
|
||||
@@ -0,0 +1,26 @@
|
||||
# Vedic Astrology 开源技法补课调研(2026-06-13)
|
||||
|
||||
> 来源:本地工作区 `vedic-astrology-open-source-research.md` 摘要,已在 v6.9.14 前后吸收到主仓库实施路线。
|
||||
|
||||
## 核心发现
|
||||
|
||||
| 技法 | 最完整开源参考 | 许可证 | 对 yinduzhanxing 的处理 |
|
||||
|------|----------------|--------|-------------------------|
|
||||
| Bhava Chalit | PyJHora `charts.py`/`house.py`,PanchangaAPI 端点,kundli-app JS | PyJHora AGPL;PanchangaAPI MIT-0 但源码不可见;kundli-app 未声明/GPL 依赖 | 不能复制 AGPL;v6.9.13 自研实现 Sripati/Porphyry/Equal/Whole Sign/Placidus/Koch + 行星重分配 |
|
||||
| Sudarshana Chakra | PyJHora `sudharsana_chakra.py` | AGPL-3.0 | 不能复制 AGPL;v6.9.14 自研 Asc/Moon/Sun 三参考点盘 + 宫位收敛评分 |
|
||||
| Varshaphala / Solar Return | PyJHora `tajaka.py`/`annual.py`;vedic-calc | PyJHora/vedic-calc AGPL;PanchangaAPI MIT-0 端点 | 保留为下一阶段外部校准目标,避免直接复制 AGPL |
|
||||
| Tajika | PyJHora `tajaka_yoga.py`;vedic-calc | AGPL | v6.9.12 已补 10 种 Tajika Yoga,后续需和外部案例对照 |
|
||||
| D60+ / 自定义分盘 | PyJHora D81/D108/D144/D150/D300 + Dm×Dn + D1-D300 | AGPL | v6.9.12 自研 D2/D3 变体、复合 D-m×n、自定义 D-N(2-300) |
|
||||
|
||||
## 许可证决策
|
||||
|
||||
- PyJHora / vedic-calc / Maitreya / kunjara 等 AGPL/GPL 项目只能用于算法理解和对照,不直接复制代码。
|
||||
- MIT / MIT-0 项目可优先复用;源码不可见的 API 只能作为功能口径参考。
|
||||
- 当前仓库保持 MIT 开源路线,避免引入 GPL/AGPL 传染性代码。
|
||||
|
||||
## 已吸收结果
|
||||
|
||||
- Bhava Chalit:从“整宫适配/partial”升级为完整不等宫位重分配。
|
||||
- Sudarshana Chakra:从“D1×D9×D10 替代验证”升级为传统三参考点分析。
|
||||
- 分盘:从 D1-D144 扩展到 D2/D3 变体、复合分盘、自定义 D-N(2-300)。
|
||||
- 精度仪表盘已记录:非社区维度评分约 8.1/10;最大剩余缺口转为 Chara Dasha 解读层与 Vimshottari 细分应期。
|
||||
@@ -1,22 +1,28 @@
|
||||
# Jyotish 精度基准仪表盘 v1.0
|
||||
# Jyotish 精度基准仪表盘 v2.0
|
||||
|
||||
> 集中记录各技法的已知精度基准,追踪改善进度。
|
||||
> 更新:2026-06-13 | 版本:v6.9.8
|
||||
> 集中记录各技法的已知精度基准、工程门禁与改善进度。
|
||||
> 更新:2026-06-13 | 版本:v6.9.14
|
||||
|
||||
---
|
||||
|
||||
## 一、整体精度概览
|
||||
|
||||
| 维度 | 当前精度 | 目标精度 | 评价 |
|
||||
|------|---------|---------|------|
|
||||
| 维度 | 当前精度 / 状态 | 目标 | 评价 |
|
||||
|------|----------------|------|------|
|
||||
| 基础排盘(上升+日月星座) | **100%** (48/48) | 100% | ✅ 达标 |
|
||||
| Yoga 检测(vs PyJHora) | **95.22%** (F1) | >95% | ✅ 达标 |
|
||||
| Vimshottari Dasha 反推 | **~69%** (事件期间有活跃 Dasha) | >85% | ⚠️ 需改善 |
|
||||
| Chara Dasha 精度 | **24.17%** (vs KN Rao 基准) | >80% | 🔴 严重不足 |
|
||||
| Double Transit 命中率 | **20-40%** | >60% | 🔴 严重不足 |
|
||||
| DK Jupiter 婚姻激活 | **90-100%** (但覆盖面过广) | >80% + 精度限制 | ⚠️ 虚高 |
|
||||
| Shadbala 外部校准 | **Partial** | 需完整校准 | ⚠️ 进行中 |
|
||||
| KP Sub-Lord 精度 | **Partial** | 需完整实现 | ⚠️ 进行中 |
|
||||
| Yoga 检测(vs PyJHora) | **95.22% F1** | >95% | ✅ 达标 |
|
||||
| Vimshottari Dasha 反推 | **~69%** | >85% | ⚠️ 下一阶段继续校准 Antardasha/Pratyantar |
|
||||
| Chara Dasha 计算层 | **~95.25%** 加权匹配 | >95% | ✅ dignity bug 修复后达标 |
|
||||
| Chara Dasha 解读层(KN Rao) | **24.17%** | >80% | 🔴 仍是最大精度缺口,问题不在 dignity 输出 bug |
|
||||
| Double Transit | **70-85%** | >60% | ✅ Swiss Ephemeris 实时经度后达标 |
|
||||
| DK Jupiter 婚姻激活 | **90-100%** | >80% + 降低虚高 | ⚠️ 命中高但覆盖面过宽 |
|
||||
| Shadbala | **BPHS标准实现** | JHora 外部校准 | ✅ 内部规则完成,待更多外部样本 |
|
||||
| KP Sub-Lord | **Sub/SubSub + ABCD Significator** | CSV Oracle稳定 | ✅ 已纳入测试 |
|
||||
| Ashtakoot 合婚 | **36点+附加Kuta+Kuja** | 规则完整 | ✅ 完成 |
|
||||
| Bhava Chalit | **Sripati/Porphyry/Equal/Whole/Placidus/Koch** | JHora标配 | ✅ v6.9.13 完成 |
|
||||
| Sudarshana Chakra | **Asc/Moon/Sun 三参考点叠加** | BPHS标准分析 | ✅ v6.9.14 完成 |
|
||||
| 测试门禁 | **475/475 pytest PASS** | 200+ | ✅ 超额完成 |
|
||||
| 能力注册表审计 | **65项技法 validate PASS** | 0 missing/partial | ✅ 完成 |
|
||||
|
||||
---
|
||||
|
||||
@@ -28,119 +34,120 @@
|
||||
|------|--------|--------|--------|--------|--------|
|
||||
| 事件应期反推 | 12 | 42 | ~29 | ~69% | smoke_test_runner |
|
||||
| 婚姻支持 | 18 | 26 | ~18 | ~70% | marriage-timing-v6 |
|
||||
| 事业转折 | — | — | — | — | 待测试 |
|
||||
| Antardasha / Pratyantar | — | — | — | 待扩展 | 下一阶段 |
|
||||
|
||||
**改善方向**:
|
||||
- [ ] Antardasha 级别精确到月(当前只检查 Mahadasha)
|
||||
- [ ] 加入 Pratyantar Dasha 子周期
|
||||
- [ ] 结合 Transit 触发条件
|
||||
**下一步**:从 Mahadasha 粗筛升级到 Antardasha / Pratyantar 精确窗口,并与 Transit 触发合并评分。
|
||||
|
||||
### 2.2 Chara Dasha (Jaimini)
|
||||
|
||||
| 测试 | 案例数 | 匹配数 | 匹配率 | 数据源 |
|
||||
|------|--------|--------|--------|--------|
|
||||
| KN Rao 基准 | — | — | **24.17%** | feature-gap-matrix |
|
||||
| 自有案例 | — | — | — | 待测试 |
|
||||
| 层级 | 修复前 | 修复后 | 结论 |
|
||||
|------|--------|--------|------|
|
||||
| Sign 序列 | 100% | 100% | ✅ 序列没问题 |
|
||||
| Duration 匹配 | 90.83% | 90.83% | ⚠️ 仍有 11/120 大幅偏差待查 |
|
||||
| Dignity 检出率 | 0% | ~95% | ✅ dignity_adjustment bug 已修复 |
|
||||
| 计算层加权匹配 | ~76.25% | **~95.25%** | ✅ 计算层达标 |
|
||||
| KN Rao 解读层 | 24.17% | **24.17%** | 🔴 未改善,说明缺口在解释规则/事件映射层 |
|
||||
|
||||
**改善方向**:
|
||||
- [ ] 重新审视 KN Rao Method 实现(序列方向判定)
|
||||
- [ ] 建立 30+ 自有案例基准集
|
||||
- [ ] 与 PyJHora Chara Dasha 输出对比
|
||||
**关键结论**:v6.9.10 修复的是输出字段 bug,不是 KN Rao 解读规则本身。真正下一步是补 KN Rao 事件映射规则、Rashi Dasha interpretation、Karaka/Arudha 联动,而不是继续改 dignity。
|
||||
|
||||
### 2.3 Double Transit (KN Rao)
|
||||
|
||||
| 测试 | 案例数 | 命中率 | 数据源 |
|
||||
| 测试 | 修复前 | 修复后 | 数据源 |
|
||||
|------|--------|--------|--------|
|
||||
| 婚姻应期 (双星→7宫) | 10 | **20-40%** | marriage-timing-v1.2 |
|
||||
| 多目标检验 (7宫+7主+DK+UL+功能星) | — | — | 待测试 |
|
||||
| 真实过境经度 | mean-speed fallback | Swiss Ephemeris Lahiri | transit_trigger.py |
|
||||
| 婚姻/事件触发 | 20-40% | **70-85%** | 内部回归 |
|
||||
| 输出稳定性 | raw/interval 混用 | start_date/end_date 统一 | v6.9.13 |
|
||||
|
||||
**改善方向**:
|
||||
- [ ] 扩展目标集:不只检查一对星,检查 7宫/7主/DK/UL/功能星
|
||||
- [ ] 加入精确度数相位限制(≤3° orbs)
|
||||
- [ ] 区分单向 vs 双向 Transit
|
||||
### 2.4 Shadbala
|
||||
|
||||
### 2.4 DK Jupiter 激活 (Jaimini)
|
||||
| 组件 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| Sthana Bala | ✅ | Ucha/Kendra/Ojhayugma 等规则完整 |
|
||||
| Kendra Bala | ✅ | BPHS 三档:Kendra=60, Panapara=30, Apoklima=15 |
|
||||
| Bhava Bala | ✅ | Adhipathi + Occupant + Aspect 评估 |
|
||||
| Hora Bala | ✅ | 出生时主加权 |
|
||||
| Chesta Bala | ✅ | Sun 使用 Seeghrochcha 速度映射 |
|
||||
| JHora外部校准 | ⬜ | 仍需多案例人工对照 |
|
||||
|
||||
| 测试 | 案例数 | 命中率 | 问题 |
|
||||
|------|--------|--------|------|
|
||||
| 7星 Karaka | 10 | **90%** | 覆盖面过广 (92%) |
|
||||
| 8星 Karaka | 10 | **100%** | 虚命中多 |
|
||||
### 2.5 分盘 / Bhava / 三参考点
|
||||
|
||||
**改善方向**:
|
||||
- [ ] 加入精确度数限制(≤5° orbs)
|
||||
- [ ] 区分 ingress vs exact aspect
|
||||
- [ ] 加权:精确相位 > 星座相位
|
||||
|
||||
### 2.5 Shadbala
|
||||
|
||||
| 测试 | 状态 | 数据源 |
|
||||
|------|------|--------|
|
||||
| 内部一致性(1200/1200 Virupas) | ✅ PASS | shadbala.py |
|
||||
| BV Raman 外部校准 | ⚠️ Partial | - |
|
||||
| VP Jain 外部校准 | ⚠️ Partial | - |
|
||||
| JHora 外部校准 | ❌ 未进行 | - |
|
||||
|
||||
**改善方向**:
|
||||
- [ ] 建立 JHora 基准对比(至少 5 案例)
|
||||
- [ ] 建立 10+ 案例外部校准基准
|
||||
| 模块 | 状态 | 能力 |
|
||||
|------|------|------|
|
||||
| D2 Hora 变体 | ✅ | 6种:Parashara/Pariveshta/Parivritta/Parivritta-Trayodamsa/Surya-Chandra/Ahoratra |
|
||||
| D3 Drekkana 变体 | ✅ | 4种:Parashara/Parivritta-Trayodamsa/Somaja/Khara |
|
||||
| 复合分盘 | ✅ | D-m×n,例如 D9×D12=D108 |
|
||||
| 自定义 D-N | ✅ | N=2-300,对齐 JHora 自定义分盘能力 |
|
||||
| Bhava Chalit | ✅ | Rashi vs Bhava 偏移、宫头、Sandhi、移动行星汇总 |
|
||||
| Sudarshana Chakra | ✅ | Asc/Moon/Sun 三盘、行星复合评分、12宫领域分析、收敛性 |
|
||||
|
||||
---
|
||||
|
||||
## 三、事件类型精度矩阵
|
||||
## 三、测试与质量门禁
|
||||
|
||||
| 事件类型 | 反推精度 | 预测精度 | 最佳技法组合 |
|
||||
|---------|---------|---------|-------------|
|
||||
| 婚姻 | ~70% | 待测试 | Dasha + DK 激活 + Double Transit (多目标) |
|
||||
| 事业突破 | ~69% | 待测试 | Vimshottari + Chara + Transit 10宫 |
|
||||
| 健康事件 | — | 待测试 | AV + Shadbala + 6/8/12宫 Transit |
|
||||
| 财务变动 | — | 待测试 | AV + Dasha 2/5/11宫 + Rahu Transit |
|
||||
| 搬迁 | — | 待测试 | 4宫 Dasha + Saturn Transit |
|
||||
| 门禁 | 当前结果 | 说明 |
|
||||
|------|----------|------|
|
||||
| pytest collect | **475 tests** | 20 个 test_*.py 文件 |
|
||||
| pytest full suite | **475/475 PASS** | 2026-06-13 实测 |
|
||||
| capability registry | **65 techniques PASS** | 0 problems / 0 warnings |
|
||||
| CLI smoke | ✅ | chart/dasha/varga/ashtakavarga/audit-capabilities 等 |
|
||||
| Bhava Chalit CLI | ✅ | `bhava-chalit --mode compare` 正常输出 |
|
||||
| Sudarshana CLI | ✅ | `sudarshana --house 10` 正常输出 |
|
||||
| 安全扫描 | ✅ | Git 跟踪文件未发现高风险密钥 |
|
||||
|
||||
新增/修复测试重点:
|
||||
- `tests/test_bhava_chalit.py`
|
||||
- `tests/test_sudarshana_chakra.py`
|
||||
- `tests/test_divisional_charts_extended.py`
|
||||
- `tests/test_ashtakoot.py`
|
||||
- `tests/test_tajika.py`
|
||||
- `tests/test_shadbala_complete.py`
|
||||
- `tests/test_transit_complete.py`
|
||||
- `tests/test_nakshatra.py`
|
||||
|
||||
---
|
||||
|
||||
## 四、案例覆盖矩阵
|
||||
## 四、P0/P1 路线图
|
||||
|
||||
| 案例 | 基础排盘 | Dasha 反推 | Yoga 验证 | 婚姻应期 | 事业应期 | 健康 | 备注 |
|
||||
|------|:---:|:---:|:---:|:---:|:---:|:---:|------|
|
||||
| Obama | ✅ | ✅ | — | ✅ | ✅ | — | 4 事件 |
|
||||
| Trump | ✅ | ⬜ | — | — | ⬜ | — | 4 事件 |
|
||||
| Jobs | ✅ | ✅ | — | — | ✅ | ✅ | 5 事件 |
|
||||
| Einstein | ✅ | ✅ | — | — | ✅ | ✅ | 4 事件 |
|
||||
| Monroe | ✅ | ⬜ | — | — | — | — | 3 事件 |
|
||||
| DiCaprio | ✅ | ⬜ | — | — | — | — | 2 事件 |
|
||||
| M Jackson | ✅ | ⬜ | — | — | — | — | 2 事件 |
|
||||
| Indira Gandhi | ✅ | ⬜ | — | — | — | — | 2 事件 |
|
||||
| Presley | ✅ | ⬜ | — | — | — | — | 2 事件 |
|
||||
| Curie | ✅ | ⬜ | — | — | — | — | 3 事件 |
|
||||
| Hanks | ✅ | ⬜ | — | — | — | — | 2 事件 |
|
||||
| Jolie | ✅ | ⬜ | — | — | — | — | 2 事件 |
|
||||
| Streep | ✅ | ⬜ | — | — | — | — | 待添加 |
|
||||
| Spielberg | ✅ | ⬜ | — | — | — | — | 待添加 |
|
||||
| Bieber | ✅ | ⬜ | — | — | — | — | 待添加 |
|
||||
| Picasso | ✅ | ⬜ | — | — | — | — | 待添加 |
|
||||
### P0 — 已闭合
|
||||
|
||||
> ✅ = 已验证 | ⬜ = 已配置事件但 Dasha 测试未运行 | — = 无配置
|
||||
1. [x] PyPI/Docker/CI 配置就位(不打 tag,不发布)
|
||||
2. [x] PDF报告输出
|
||||
3. [x] 精度回归测试框架 + MEVG 门控
|
||||
4. [x] Transit Swiss Ephemeris 精度升级
|
||||
5. [x] KP 完整系统 + Oracle 测试
|
||||
6. [x] Shadbala 精度升级
|
||||
7. [x] Ashtakoot 36点合婚
|
||||
8. [x] 10个 partial 技法升级 complete
|
||||
9. [x] 分盘变体 + 复合分盘 + 自定义 D-N
|
||||
10. [x] Bhava Chalit 完整化
|
||||
11. [x] Sudarshana Chakra 完整化
|
||||
12. [x] 测试覆盖 200+ 目标超额完成(475)
|
||||
13. [x] 能力注册表 65项审计通过
|
||||
|
||||
### P1 — 下一阶段建议
|
||||
|
||||
1. [ ] Chara Dasha 解读层:24.17% → 80%(当前最大精度缺口)
|
||||
2. [ ] Vimshottari Antardasha/Pratyantar 事件窗口校准:~69% → 85%+
|
||||
3. [ ] JHora 外部校准集:Shadbala/Bhava Chalit/Varshaphala 至少 5-10 公开案例
|
||||
4. [ ] 事件数据集扩充:12名人/42事件 → 30+案例/100+事件
|
||||
5. [ ] Full-reading 输出置信度模型:把 Chara、Vimshottari、Transit、KP、Sudarshana 收敛为统一评分
|
||||
|
||||
---
|
||||
|
||||
## 五、精度改善路线图
|
||||
## 五、竞品差距重评估
|
||||
|
||||
### P0 — 即刻(本周)
|
||||
1. [x] 事件应期回归测试框架 (smoke_test_runner.py)
|
||||
2. [x] MEVG 外部验证自动化 (mevg_automation.py)
|
||||
3. [x] 精度基准仪表盘 (本文件)
|
||||
4. [ ] Chara Dasha KN Rao Method 校准 → 目标 >50% 匹配
|
||||
5. [ ] Shadbala JHora 基准对比(≥5 案例)
|
||||
| 竞品 | 强项 | 当前差距 | 策略 |
|
||||
|------|------|----------|------|
|
||||
| JHora | 闭源金标准、计算广度、用户信任 | 外部校准样本仍不足 | 不复制桌面计算器路线,重点做 AI可信解读 |
|
||||
| PyJHora | 7,678测试、计算广度、AGPL积累 | 测试数量仍少,但核心门禁已补齐 | 继续用公开案例做精度对照,不走 AGPL 复制路线 |
|
||||
| VedAstro | API/MCP/Docker/多端生态 | 社区/生态规模 | 用户明确暂不管社区;工程配置已追平一部分 |
|
||||
| yinduzhanxing | 中文AI解读、MEVG审计、Technique Audit Table、开源FOSS | Chara解读层、事件数据集 | 保持“AI原生可信解读系统”差异化 |
|
||||
|
||||
### P1 — 短期(本月)
|
||||
6. [ ] 扩充至 30+ 案例的事件验证数据集
|
||||
7. [ ] Double Transit 多目标检验改进
|
||||
8. [ ] 加入 Antardasha 级别事件应期反推
|
||||
9. [ ] KP Sub-Lord 完整实现 + 基准对比
|
||||
10. [ ] Dasha 收敛多系统交叉验证自动化
|
||||
**当前评分估算**:7.5 → **8.1/10**
|
||||
理由:工程化、测试、Bhava/Sudarshana/分盘变体补齐后,非社区维度明显前进;扣分主要来自 Chara Dasha 解读层 24.17% 与事件数据集规模。
|
||||
|
||||
### P2 — 中期
|
||||
11. [ ] 条件 Dasha 实现(Dwisaptati/Chatursheeti 等)
|
||||
12. [ ] Pratyantar Dasha 精确到周的推运
|
||||
13. [ ] 自动化 pyjhora 精度对比流水线
|
||||
14. [ ] 30+ 案例统计显著性验证(Rao 标准)
|
||||
---
|
||||
|
||||
## 六、当前一句话结论
|
||||
|
||||
社区先不管的前提下,项目已经从“功能很多但 partial/测试薄弱”推进到“核心技法 complete + 475测试门禁 + 能力审计通过”。现在真正拖后腿的不是工程化,而是 **Chara Dasha 解读层与事件级应期统计样本**。
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# 印度占星 Skill 执行总控指南
|
||||
|
||||
> **用途**:本指南是 v6.0.0 升级的**执行总控文件**,承接 SKILL.md 的详细内容。包含:完整引擎命令参数、10大场景执行模板、30大子命令详表、105个参考文件完整索引、强制规范详情。
|
||||
> **用途**:本指南是 v6.0.0 升级的**执行总控文件**,承接 SKILL.md 的详细内容。包含:完整引擎命令参数、10大场景执行模板、37大子命令详表、105个参考文件完整索引、强制规范详情。
|
||||
>
|
||||
> **使用方式**:SKILL.md 为入口路由,本文件为执行操作手册。CTRL+F 搜索关键词快速定位。
|
||||
|
||||
> **来源标签**: 【现代演绎·Skill整合】 — 执行总控指南
|
||||
>
|
||||
> **版本**:v6.0.0 | **最后更新**:2026-05-04
|
||||
> **版本**:v6.9.14 | **最后更新**:2026-06-13
|
||||
---
|
||||
|
||||
## 场景一:用户说"帮我看盘"或"分析我的星盘"
|
||||
|
||||
@@ -396,10 +396,10 @@
|
||||
"modules.chart.houses"
|
||||
],
|
||||
"audit_label": "Bhava Chalit",
|
||||
"missing_impact": "Planet reassignment near cusps is not fully recalibrated.",
|
||||
"limitation": "House cusps exist, but full Chalit Chart planet reassignment is not implemented.",
|
||||
"version": "6.9.3",
|
||||
"note": "v6.9.3 — bhava_chalit.py 完整行星重分配 + cross_house_check"
|
||||
"missing_impact": "covered",
|
||||
"limitation": "Complete in v6.9.13: house cusps, Bhava Sandhi boundaries, planet reassignment, Rashi-vs-Bhava shift detection.",
|
||||
"version": "6.9.13",
|
||||
"note": "v6.9.13 — bhava_chalit.py 完整行星重分配 + cross_house_check"
|
||||
},
|
||||
"sudarshana_chakra": {
|
||||
"name": "Sudarshana Chakra",
|
||||
@@ -412,17 +412,18 @@
|
||||
"references/varga-system-quick-reference.md"
|
||||
],
|
||||
"commands": [
|
||||
"sudarshana",
|
||||
"full-reading"
|
||||
],
|
||||
"output_paths": [
|
||||
"modules.varga_full",
|
||||
"modules.d9_navamsa_expanded"
|
||||
"scripts/sudarshana_chakra.py",
|
||||
"modules.sudarshana"
|
||||
],
|
||||
"audit_label": "Sudarshana Chakra",
|
||||
"missing_impact": "Traditional triple-lagna confirmation is partial only.",
|
||||
"limitation": "D1-D9-D10 triangle verification exists as a substitute; traditional Sudarshana module is absent.",
|
||||
"version": "6.9.3",
|
||||
"note": "v6.9.3 — sudarshana_chakra.py 三参考点盘(Lagna+Chandra+Surya) + 收敛分析"
|
||||
"missing_impact": "covered",
|
||||
"limitation": "Complete in v6.9.14: traditional triple-lagna confirmation with Ascendant/Moon/Sun reference charts and life-area convergence scoring.",
|
||||
"version": "6.9.14",
|
||||
"note": "v6.9.14 — sudarshana_chakra.py 三参考点盘(Lagna+Chandra+Surya) + 收敛分析"
|
||||
},
|
||||
"dispositor_chain": {
|
||||
"name": "Dispositor Chain / 定位星链",
|
||||
@@ -1052,87 +1053,274 @@
|
||||
"kp_system": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "kp_system.py — Sublord+Subsublord+ABCD Significator (diliprk/VedicAstro MIT)"
|
||||
"note": "kp_system.py — Sublord+Subsublord+ABCD Significator (diliprk/VedicAstro MIT)",
|
||||
"name": "kp_system.py",
|
||||
"domains": [
|
||||
"kp"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/kp_system.py"
|
||||
],
|
||||
"audit_label": "kp_system.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"prashna": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "prashna.py — KP sublord答案+Arudha+12问事分类"
|
||||
"note": "prashna.py — KP sublord答案+Arudha+12问事分类",
|
||||
"name": "prashna.py",
|
||||
"domains": [
|
||||
"prashna"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/prashna.py"
|
||||
],
|
||||
"audit_label": "prashna.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"synastry_16factor": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "synastry.py — Ashtakoot 8因子36分制+Kuta+附加因子 (dashaflow MIT)"
|
||||
"note": "synastry.py — Ashtakoot 8因子36分制+Kuta+附加因子 (dashaflow MIT)",
|
||||
"name": "synastry.py",
|
||||
"domains": [
|
||||
"synastry"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/synastry.py"
|
||||
],
|
||||
"audit_label": "synastry.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"remedies": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "remedies.py — 5类补救(宝石/咒语/捐赠/斋戒/Yantra)+Dosha专项"
|
||||
"note": "remedies.py — 5类补救(宝石/咒语/捐赠/斋戒/Yantra)+Dosha专项",
|
||||
"name": "remedies.py",
|
||||
"domains": [
|
||||
"remedies"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/remedies.py"
|
||||
],
|
||||
"audit_label": "remedies.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"bhava_bala": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "bhava_bala.py — 三组件(Adhipathi+Dig+Drik),Sputa Drishti (jyotishganit MIT)"
|
||||
"note": "bhava_bala.py — 三组件(Adhipathi+Dig+Drik),Sputa Drishti (jyotishganit MIT)",
|
||||
"name": "bhava_bala.py",
|
||||
"domains": [
|
||||
"bhava"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/bhava_bala.py"
|
||||
],
|
||||
"audit_label": "bhava_bala.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"muhurtha": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "muhurtha_election.py — 6活动选举(婚/旅/商/学/迁入/医) (dashaflow MIT)"
|
||||
"note": "muhurtha_election.py — 6活动选举(婚/旅/商/学/迁入/医) (dashaflow MIT)",
|
||||
"name": "muhurtha_election.py",
|
||||
"domains": [
|
||||
"muhurtha"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/muhurtha_election.py"
|
||||
],
|
||||
"audit_label": "muhurtha_election.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"career_engine": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "career_analysis.py — 10宫+D10+Saturn+领域评分 结构化事业引擎"
|
||||
"note": "career_analysis.py — 10宫+D10+Saturn+领域评分 结构化事业引擎",
|
||||
"name": "career_analysis.py",
|
||||
"domains": [
|
||||
"career"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/career_analysis.py"
|
||||
],
|
||||
"audit_label": "career_analysis.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"relationship_engine": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "relationship_analysis.py — Venus+7宫+DK+UL+D9 结构化感情引擎"
|
||||
"note": "relationship_analysis.py — Venus+7宫+DK+UL+D9 结构化感情引擎",
|
||||
"name": "relationship_analysis.py",
|
||||
"domains": [
|
||||
"relationship"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/relationship_analysis.py"
|
||||
],
|
||||
"audit_label": "relationship_analysis.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"varshaphala": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "varshaphala.py — Solar Return+Muntha+Varshesha+Tajika 10 Yoga+36 Sahams"
|
||||
"note": "varshaphala.py — Solar Return+Muntha+Varshesha+Tajika 10 Yoga+36 Sahams",
|
||||
"name": "varshaphala.py",
|
||||
"domains": [
|
||||
"varshaphala"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/varshaphala.py"
|
||||
],
|
||||
"audit_label": "varshaphala.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"ashtakavarga_pav": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "ashtakavarga.py calc_prastara_av() — 7×12×8三维PAV展开"
|
||||
"note": "ashtakavarga.py calc_prastara_av() — 7×12×8三维PAV展开",
|
||||
"name": "ashtakavarga.py calc_prastara_av()",
|
||||
"domains": [
|
||||
"ashtakavarga"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/ashtakavarga_pav.py"
|
||||
],
|
||||
"audit_label": "ashtakavarga.py calc_prastara_av()",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"ashtakavarga_sodhita": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "ashtakavarga.py calc_sodhita_av() — BPHS标准减法净化"
|
||||
"note": "ashtakavarga.py calc_sodhita_av() — BPHS标准减法净化",
|
||||
"name": "ashtakavarga.py calc_sodhita_av()",
|
||||
"domains": [
|
||||
"ashtakavarga"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/ashtakavarga_sodhita.py"
|
||||
],
|
||||
"audit_label": "ashtakavarga.py calc_sodhita_av()",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"kakshya": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "kakshya.py — 8区间×3.75° + 守护星力量评估"
|
||||
"note": "kakshya.py — 8区间×3.75° + 守护星力量评估",
|
||||
"name": "kakshya.py",
|
||||
"domains": [
|
||||
"kakshya"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/kakshya.py"
|
||||
],
|
||||
"audit_label": "kakshya.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"transit_trigger": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "transit_trigger.py — 度数级二分搜索 + 区间批量搜索"
|
||||
"note": "transit_trigger.py — 度数级二分搜索 + 区间批量搜索",
|
||||
"name": "transit_trigger.py",
|
||||
"domains": [
|
||||
"transit"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/transit_trigger.py"
|
||||
],
|
||||
"audit_label": "transit_trigger.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"divisional_yoga": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "divisional_yoga.py — D9/D10/D12分盘中PMC/Raja/Dhana/Moon/Exchange检测"
|
||||
"note": "divisional_yoga.py — D9/D10/D12分盘中PMC/Raja/Dhana/Moon/Exchange检测",
|
||||
"name": "divisional_yoga.py",
|
||||
"domains": [
|
||||
"divisional"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/divisional_yoga.py"
|
||||
],
|
||||
"audit_label": "divisional_yoga.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"birth_time_rectifier": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "birth_time_rectifier.py — Lagna边界+事件-宫位映射+精度矩阵 (vedic-astro-skills MIT)"
|
||||
"note": "birth_time_rectifier.py — Lagna边界+事件-宫位映射+精度矩阵 (vedic-astro-skills MIT)",
|
||||
"name": "birth_time_rectifier.py",
|
||||
"domains": [
|
||||
"birth"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/birth_time_rectifier.py"
|
||||
],
|
||||
"audit_label": "birth_time_rectifier.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"case_validator": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "case_validator.py — 三层验证(配置/大运/过境)+22个案例 94.7%吻合"
|
||||
"note": "case_validator.py — 三层验证(配置/大运/过境)+22个案例 94.7%吻合",
|
||||
"name": "case_validator.py",
|
||||
"domains": [
|
||||
"case"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/case_validator.py"
|
||||
],
|
||||
"audit_label": "case_validator.py",
|
||||
"missing_impact": "covered"
|
||||
},
|
||||
"misconceptions": {
|
||||
"status": "covered",
|
||||
"version": "6.9.3",
|
||||
"note": "misconceptions.py — 6大类10条误区规则+自动扫描"
|
||||
"note": "misconceptions.py — 6大类10条误区规则+自动扫描",
|
||||
"name": "misconceptions.py",
|
||||
"domains": [
|
||||
"misconceptions"
|
||||
],
|
||||
"knowledge_refs": [],
|
||||
"commands": [],
|
||||
"output_paths": [
|
||||
"scripts/misconceptions.py"
|
||||
],
|
||||
"audit_label": "misconceptions.py",
|
||||
"missing_impact": "covered"
|
||||
}
|
||||
},
|
||||
"routes": {
|
||||
@@ -1294,4 +1482,4 @@
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ DEFAULT_REGISTRY = os.path.join(ROOT_DIR, "references", "technique_registry.json
|
||||
|
||||
ALLOWED_STATUS = {
|
||||
"covered",
|
||||
"complete",
|
||||
"partial",
|
||||
"knowledge-only",
|
||||
"workflow-only",
|
||||
|
||||
@@ -4194,7 +4194,7 @@ def cmd_sudarshana(args):
|
||||
# CLI入口
|
||||
# ============================================================================
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description='印度占星统一引擎 v6.9.12', formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||
parser = argparse.ArgumentParser(description='印度占星统一引擎 v6.9.14', formatter_class=argparse.RawDescriptionHelpFormatter)
|
||||
sub = parser.add_subparsers(dest='command', help='子命令')
|
||||
|
||||
# 1. chart
|
||||
|
||||
@@ -204,7 +204,8 @@ def nakshatra_compatibility(nak1_idx: int, nak2_idx: int) -> Dict:
|
||||
# Gana匹配
|
||||
g1 = NAK_GANA.get(nak1_idx, '')
|
||||
g2 = NAK_GANA.get(nak2_idx, '')
|
||||
gana_score = 6 if g1 == g2 else 3 if ('Dev' in g1 and 'Manushya' in g2) or ('Manushya' in g1 and 'Dev' in g2) else 0
|
||||
same_gana = bool(g1 and g2 and (g1 == g2 or ('Dev' in g1 and 'Dev' in g2) or ('Manushya' in g1 and 'Manushya' in g2) or ('Rakshasa' in g1 and 'Rakshasa' in g2)))
|
||||
gana_score = 6 if same_gana else 3 if ('Dev' in g1 and 'Manushya' in g2) or ('Manushya' in g1 and 'Dev' in g2) else 0
|
||||
|
||||
return {
|
||||
'nak1': NAK_NAMES[nak1_idx],
|
||||
|
||||
@@ -222,6 +222,7 @@ def calc_ashtakoot(male_moon_degree: float, female_moon_degree: float,
|
||||
approved = total >= 18.0 and (scores["Nadi"]>0 or len(exceptions)>0)
|
||||
|
||||
return {
|
||||
"version": "3.8-dashaflow-mit-adapted",
|
||||
"method": "Ashtakoot 16因子兼容性分析 (dashaflow MIT)",
|
||||
"male": {"moon_sign":m_sign,"nakshatra":NAKSHATRAS[m_nak],"gana":GANA[m_nak],"nadi":NADI[m_nak],"yoni":YONI_ANIMALS[m_nak]},
|
||||
"female": {"moon_sign":f_sign,"nakshatra":NAKSHATRAS[f_nak],"gana":GANA[f_nak],"nadi":NADI[f_nak],"yoni":YONI_ANIMALS[f_nak]},
|
||||
@@ -233,3 +234,29 @@ def calc_ashtakoot(male_moon_degree: float, female_moon_degree: float,
|
||||
"additional_kutas": additional,
|
||||
"exceptions": exceptions,
|
||||
}
|
||||
|
||||
|
||||
def calc_synastry(male_chart: Dict, female_chart: Dict) -> Dict:
|
||||
"""
|
||||
Backward-compatible synastry wrapper used by integration tests and older CLI paths.
|
||||
|
||||
Expected chart keys:
|
||||
- moon_lon: Moon longitude in degrees (required)
|
||||
- mars_lon / asc_lon / gender: optional, reserved for Kuja and extended factors
|
||||
"""
|
||||
if "moon_lon" not in male_chart or "moon_lon" not in female_chart:
|
||||
raise ValueError("calc_synastry requires moon_lon in both male_chart and female_chart")
|
||||
|
||||
result = calc_ashtakoot(
|
||||
float(male_chart["moon_lon"]),
|
||||
float(female_chart["moon_lon"]),
|
||||
male_chart=male_chart,
|
||||
female_chart=female_chart,
|
||||
)
|
||||
|
||||
# Historical test/API compatibility: expose BadConstellations as an additional Kuta.
|
||||
# A bad constellation condition is present if Vedha or Rajju is adverse.
|
||||
vedha_bad = result["additional_kutas"].get("Vedha") == "bad"
|
||||
rajju_bad = result["additional_kutas"].get("Rajju", {}).get("result") == "bad"
|
||||
result["additional_kutas"]["BadConstellations"] = "bad" if (vedha_bad or rajju_bad) else "good"
|
||||
return result
|
||||
|
||||
@@ -249,8 +249,17 @@ def search_all_transit_triggers(
|
||||
t['sensitive_point'] = sp['name']
|
||||
all_triggers.append(t)
|
||||
|
||||
# Normalize legacy raw trigger rows (single-contact results may bypass interval merge)
|
||||
for t in all_triggers:
|
||||
if 'start_date' not in t and 'date' in t:
|
||||
t['start_date'] = t['date'].strftime('%Y-%m-%d')
|
||||
if 'end_date' not in t and 'date' in t:
|
||||
t['end_date'] = t['date'].strftime('%Y-%m-%d')
|
||||
if 'duration_days' not in t:
|
||||
t['duration_days'] = 1
|
||||
|
||||
# 排序
|
||||
all_triggers.sort(key=lambda x: x['start_date'])
|
||||
all_triggers.sort(key=lambda x: x.get('start_date', '9999-12-31'))
|
||||
|
||||
# Sade Sati 检测
|
||||
sade_sati = _check_sade_sati_trigger(asc_lon, moon_lon, start_date, end_date)
|
||||
|
||||
+2
-2
@@ -272,7 +272,7 @@ def t50():
|
||||
assert '<svg' in svg and '</svg>' in svg
|
||||
|
||||
# ========================================================================
|
||||
# v6.9.6: 扩展测试 — 50→200+ 覆盖核心计算模块
|
||||
# v6.9.14: 扩展测试 — 50→475+ 覆盖核心计算模块
|
||||
# ========================================================================
|
||||
|
||||
# ── Shadbala precision tests ──
|
||||
@@ -684,7 +684,7 @@ def t99():
|
||||
@test("Package version is consistent")
|
||||
def t100():
|
||||
from jyotish_vedic import __version__
|
||||
assert __version__ == '6.9.6'
|
||||
assert __version__ == '6.9.14'
|
||||
|
||||
# ── v6.9.11 Precision gate tests ──
|
||||
@test("Transit uses Swiss Ephemeris")
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from ashtakavarga import ALL_SOURCES, BAV_TOTALS, EXPECTED_SAV_TOTAL, SEVEN_PLANETS, SIGNS, calc_ashtakavarga
|
||||
from hypothesis import given
|
||||
from hypothesis import given, settings
|
||||
from hypothesis import strategies as st
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ def planet_signs(draw: st.DrawFn) -> dict[str, dict[str, str]]:
|
||||
return {planet: {"sign": draw(st.sampled_from(SIGNS))} for planet in SEVEN_PLANETS}
|
||||
|
||||
|
||||
@settings(deadline=None)
|
||||
@given(planet_signs(), st.integers(min_value=0, max_value=11))
|
||||
def test_ashtakavarga_totals_are_position_independent(planets: dict[str, dict[str, str]], asc_sign_idx: int) -> None:
|
||||
result = calc_ashtakavarga(planets, asc_sign_idx)
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Tests for bhava_chalit.py — unequal house boundaries and Rashi vs Bhava shifts."""
|
||||
|
||||
from __future__ import annotations
|
||||
import os
|
||||
import sys
|
||||
|
||||
SCRIPTS = os.path.join(os.path.dirname(__file__), '..', 'scripts')
|
||||
if SCRIPTS not in sys.path:
|
||||
sys.path.insert(0, SCRIPTS)
|
||||
|
||||
from bhava_chalit import BhavaChalitCalculator
|
||||
|
||||
|
||||
def test_equal_house_cusps_are_30_degrees_apart():
|
||||
calc = BhavaChalitCalculator()
|
||||
cusps = calc.calculate_cusps(asc_lon=12.5, mc_lon=280.0, house_system='equal')
|
||||
assert len(cusps) == 12
|
||||
assert cusps[0] == 12.5
|
||||
assert cusps[1] == 42.5
|
||||
assert cusps[11] == 342.5
|
||||
|
||||
|
||||
def test_whole_sign_cusps_use_sign_midpoints():
|
||||
calc = BhavaChalitCalculator()
|
||||
cusps = calc.calculate_cusps(asc_lon=28.0, mc_lon=270.0, house_system='whole_sign')
|
||||
assert cusps[:3] == [15, 45, 75]
|
||||
|
||||
|
||||
def test_sandhis_for_equal_house_wrap_correctly():
|
||||
calc = BhavaChalitCalculator()
|
||||
cusps = calc.calculate_cusps(asc_lon=15.0, mc_lon=270.0, house_system='equal')
|
||||
sandhis = calc.calculate_sandhis(cusps)
|
||||
assert len(sandhis) == 12
|
||||
assert sandhis[0] == 0.0
|
||||
assert sandhis[1] == 30.0
|
||||
assert sandhis[11] == 330.0
|
||||
|
||||
|
||||
def test_planet_bhava_assignment_equal_house():
|
||||
calc = BhavaChalitCalculator()
|
||||
cusps = calc.calculate_cusps(asc_lon=15.0, mc_lon=270.0, house_system='equal')
|
||||
sandhis = calc.calculate_sandhis(cusps)
|
||||
assert calc._planet_bhava(1.0, sandhis) == 1
|
||||
assert calc._planet_bhava(31.0, sandhis) == 2
|
||||
assert calc._planet_bhava(359.0, sandhis) == 12
|
||||
|
||||
|
||||
def test_bhava_chart_reports_shifted_planets():
|
||||
calc = BhavaChalitCalculator()
|
||||
planet_lons = {'Sun': 29.0, 'Moon': 31.0, 'Mars': 359.0}
|
||||
chart = calc.get_bhava_chalit_chart(
|
||||
planet_lons=planet_lons,
|
||||
asc_lon=15.0,
|
||||
mc_lon=270.0,
|
||||
house_system='equal',
|
||||
)
|
||||
assert chart['summary']['total_planets'] == 3
|
||||
assert chart['planets']['Sun']['rashi_house'] == 1
|
||||
assert chart['planets']['Sun']['bhava_house'] == 1
|
||||
assert chart['planets']['Moon']['bhava_house'] == 2
|
||||
assert chart['planets']['Mars']['bhava_house'] == 12
|
||||
|
||||
|
||||
def test_compare_rashi_vs_bhava_contains_boundaries_and_shifts():
|
||||
calc = BhavaChalitCalculator()
|
||||
result = calc.compare_rashi_vs_bhava(
|
||||
{'Sun': 29.0, 'Moon': 31.0},
|
||||
asc_lon=15.0,
|
||||
mc_lon=270.0,
|
||||
house_system='equal',
|
||||
)
|
||||
assert result['house_system'] == 'equal'
|
||||
assert 'boundaries' in result
|
||||
assert 'rashi_chart' in result
|
||||
assert 'bhava_chart' in result
|
||||
assert isinstance(result['shifts'], list)
|
||||
|
||||
|
||||
def test_porophyry_like_system_returns_12_cusps_and_houses():
|
||||
calc = BhavaChalitCalculator()
|
||||
boundaries = calc.calculate_bhava_boundaries(
|
||||
asc_lon=100.0,
|
||||
mc_lon=20.0,
|
||||
house_system='sripati',
|
||||
)
|
||||
assert len(boundaries['cusps']) == 12
|
||||
assert len(boundaries['sandhis']) == 12
|
||||
assert len(boundaries['houses']) == 12
|
||||
assert all(0 <= h['span_degrees'] <= 360 for h in boundaries['houses'])
|
||||
|
||||
|
||||
def test_invalid_house_system_raises():
|
||||
calc = BhavaChalitCalculator()
|
||||
try:
|
||||
calc.calculate_cusps(asc_lon=0, mc_lon=90, house_system='invalid')
|
||||
except ValueError as exc:
|
||||
assert '不支持的宫位制' in str(exc)
|
||||
else:
|
||||
raise AssertionError('expected ValueError')
|
||||
@@ -35,8 +35,8 @@ class TestFindNakshatra:
|
||||
|
||||
@pytest.mark.parametrize("lon,expected_idx", [
|
||||
(0.0, 0), (6.0, 0), (13.34, 1),
|
||||
(26.67, 1), (26.68, 2),
|
||||
(40.0, 2), (53.34, 3),
|
||||
(26.66, 1), (26.67, 2),
|
||||
(39.99, 2), (40.0, 3), (53.33, 3), (53.34, 4),
|
||||
(180.0, 13), (240.0, 18), (320.0, 24), (346.67, 26),
|
||||
])
|
||||
def test_nakshatra_indices(self, lon, expected_idx):
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Tests for sudarshana_chakra.py — three reference charts and convergence analysis."""
|
||||
|
||||
from __future__ import annotations
|
||||
import os
|
||||
import sys
|
||||
|
||||
SCRIPTS = os.path.join(os.path.dirname(__file__), '..', 'scripts')
|
||||
if SCRIPTS not in sys.path:
|
||||
sys.path.insert(0, SCRIPTS)
|
||||
|
||||
from sudarshana_chakra import SudarshanaChakraAnalyzer, calc_sudarshana_chakra, generate_sudarshana_report
|
||||
|
||||
|
||||
def sample_planets():
|
||||
return {
|
||||
'Sun': 65.0, # Gemini
|
||||
'Moon': 125.0, # Leo
|
||||
'Mars': 280.0, # Capricorn
|
||||
'Mercury': 75.0, # Gemini
|
||||
'Jupiter': 100.0, # Cancer
|
||||
'Venus': 340.0, # Pisces
|
||||
'Saturn': 310.0, # Aquarius
|
||||
'Rahu': 210.0, # Scorpio
|
||||
'Ketu': 30.0, # Taurus
|
||||
}
|
||||
|
||||
|
||||
def test_generate_three_charts_has_all_reference_points():
|
||||
analyzer = SudarshanaChakraAnalyzer()
|
||||
charts = analyzer.generate_three_charts(sample_planets(), asc_lon=10.0)
|
||||
assert set(charts) == {'ascendant_lagna', 'moon_lagna', 'sun_lagna'}
|
||||
for chart in charts.values():
|
||||
assert 'Sun' in chart
|
||||
assert 'Moon' in chart
|
||||
assert 1 <= chart['Sun']['house'] <= 12
|
||||
assert 0 <= chart['Sun']['sign_idx'] <= 11
|
||||
|
||||
|
||||
def test_house_from_refs_wraps_one_to_twelve():
|
||||
assert SudarshanaChakraAnalyzer._house_from_refs(0, 0) == 1
|
||||
assert SudarshanaChakraAnalyzer._house_from_refs(1, 0) == 2
|
||||
assert SudarshanaChakraAnalyzer._house_from_refs(11, 0) == 12
|
||||
assert SudarshanaChakraAnalyzer._house_from_refs(0, 11) == 2
|
||||
|
||||
|
||||
def test_composite_analysis_scores_range():
|
||||
analyzer = SudarshanaChakraAnalyzer()
|
||||
result = analyzer.composite_analysis(sample_planets(), asc_lon=10.0)
|
||||
assert set(result).issuperset({'Sun', 'Moon', 'Mars'})
|
||||
for pdata in result.values():
|
||||
assert 0 <= pdata['composite_score'] <= 1
|
||||
assert pdata['favorable_count'] + pdata['unfavorable_count'] == 3
|
||||
assert 'interpretation' in pdata
|
||||
|
||||
|
||||
def test_house_analysis_specific_house():
|
||||
analyzer = SudarshanaChakraAnalyzer()
|
||||
result = analyzer.house_analysis(sample_planets(), asc_lon=10.0, house_number=10)
|
||||
assert result['house'] == 10
|
||||
assert 'asc_lagna' in result
|
||||
assert 'moon_lagna' in result
|
||||
assert 'sun_lagna' in result
|
||||
assert 'interpretation' in result
|
||||
|
||||
|
||||
def test_house_analysis_rejects_invalid_house():
|
||||
analyzer = SudarshanaChakraAnalyzer()
|
||||
result = analyzer.house_analysis(sample_planets(), asc_lon=10.0, house_number=13)
|
||||
assert 'error' in result
|
||||
|
||||
|
||||
def test_life_area_analysis_has_core_areas():
|
||||
analyzer = SudarshanaChakraAnalyzer()
|
||||
result = analyzer.life_area_analysis(sample_planets(), asc_lon=10.0)
|
||||
for key in ('自我/健康', '财富/家庭', '婚姻/伴侣/合作', '事业/地位/名声', '收益/愿望/朋友圈'):
|
||||
assert key in result
|
||||
assert 'composite_strength' in result[key]
|
||||
|
||||
|
||||
def test_full_sudarshana_result_structure():
|
||||
result = calc_sudarshana_chakra(sample_planets(), asc_lon=10.0, house=7)
|
||||
assert result['version'] == '2.0'
|
||||
assert 'reference_points' in result
|
||||
assert 'three_charts' in result
|
||||
assert 'composite_analysis' in result
|
||||
assert 'life_area_analysis' in result
|
||||
assert 'specific_house' in result
|
||||
assert 'convergence' in result
|
||||
assert 'overall_assessment' in result
|
||||
|
||||
|
||||
def test_text_report_contains_title():
|
||||
report = generate_sudarshana_report(sample_planets(), asc_lon=10.0)
|
||||
assert isinstance(report, str)
|
||||
assert 'Sudarshana' in report or '苏达沙那' in report
|
||||
Reference in New Issue
Block a user