From aa692f809295c051791f37b6dc4f162ab77bfae6 Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Fri, 26 Jun 2026 04:03:11 +0800 Subject: [PATCH] docs(research): archive antigravity rounds 29 and 30 --- ...9_api_surface_missing_matrix_2026_06_26.md | 20 +++ ...sa_ephemeris_accuracy_matrix_2026_06_26.md | 14 ++ ...9_cli_surface_missing_matrix_2026_06_26.md | 19 +++ ...29_cloud_sync_whitelist_plan_2026_06_26.md | 19 +++ ...round29_codex_round30_top120_2026_06_26.md | 20 +++ ...29_copy_allowed_assets_top50_2026_06_26.md | 19 +++ ...29_covered_to_complete_top30_2026_06_26.md | 24 +++ ...oracle_accuracy_closure_plan_2026_06_26.md | 16 ++ ...tra_accessible_contrast_a11y_2026_06_26.md | 11 ++ ...xtra_docker_containerization_2026_06_26.md | 13 ++ ...extra_e2e_testing_automation_2026_06_26.md | 17 ++ ...ra_error_boundary_resilience_2026_06_26.md | 11 ++ ...extra_graphql_migration_path_2026_06_26.md | 13 ++ ...9_extra_mobile_responsive_ui_2026_06_26.md | 13 ++ ...nd29_final_execution_ranking_2026_06_26.md | 17 ++ ...frontend_hidden_skill_matrix_2026_06_26.md | 21 +++ ...aimini_kp_prashna_gap_matrix_2026_06_26.md | 17 ++ ...license_quarantine_blacklist_2026_06_26.md | 16 ++ ..._local_user_experience_top50_2026_06_26.md | 19 +++ ...nga_muhurta_depth_gap_matrix_2026_06_26.md | 16 ++ ...skill_full_parity_gap_matrix_2026_06_26.md | 25 +++ ...sync_to_distribution_targets_2026_06_26.md | 15 ++ ...9_strength_system_gap_matrix_2026_06_26.md | 15 ++ ...synastry_porutham_gap_matrix_2026_06_26.md | 15 ++ ...ajika_varshaphala_gap_matrix_2026_06_26.md | 19 +++ ...rue_missing_techniques_top12_2026_06_26.md | 19 +++ ...d29_varga_avastha_gap_matrix_2026_06_26.md | 13 ++ ...e_fragment_reuse_second_pass_2026_06_26.md | 13 ++ ...y_round30_api_exposure_top30_2026_06_26.md | 14 ++ ...d30_cli_productization_top30_2026_06_26.md | 17 ++ ...d_sync_whitelist_second_pass_2026_06_26.md | 22 +++ ...round30_codex_round31_top150_2026_06_26.md | 24 +++ ...y_allowed_assets_second_pass_2026_06_26.md | 18 +++ ..._external_oracle_tasks_top40_2026_06_26.md | 17 ++ ...ai_model_hallucination_guard_2026_06_26.md | 13 ++ ...df_report_print_optimization_2026_06_26.md | 13 ++ ...ne_dst_historical_resolution_2026_06_26.md | 14 ++ ...ound30_final_execution_board_2026_06_26.md | 20 +++ ...nd30_frontend_exposure_top30_2026_06_26.md | 16 ++ ...0_license_quarantine_recheck_2026_06_26.md | 21 +++ ...ocal_accuracy_blockers_top30_2026_06_26.md | 19 +++ ...9_condensed_execution_matrix_2026_06_26.md | 20 +++ ...stribution_targets_inventory_2026_06_26.md | 19 +++ ...lackbox_for_high_roi_modules_2026_06_26.md | 20 +++ ...ne_fragment_reuse_third_pass_2026_06_26.md | 12 ++ ...d30_workbuddy_sync_whitelist_2026_06_26.md | 32 ++++ ...y_sidecar_work_order_round30_2026_06_26.md | 148 ++++++++++++++++++ ...skill_single_source_of_truth_2026_06_26.md | 61 ++++++++ jyotish-app/skill-map.js | 4 +- scripts/jyotish_api_server.py | 13 +- scripts/jyotish_engine.py | 31 +++- tests/test_api_server_security.py | 26 +++ tests/test_cli_smoke.py | 22 +++ 53 files changed, 1102 insertions(+), 3 deletions(-) create mode 100644 docs/research/antigravity_round29_api_surface_missing_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_ayanamsa_ephemeris_accuracy_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_cli_surface_missing_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_cloud_sync_whitelist_plan_2026_06_26.md create mode 100644 docs/research/antigravity_round29_codex_round30_top120_2026_06_26.md create mode 100644 docs/research/antigravity_round29_copy_allowed_assets_top50_2026_06_26.md create mode 100644 docs/research/antigravity_round29_covered_to_complete_top30_2026_06_26.md create mode 100644 docs/research/antigravity_round29_external_oracle_accuracy_closure_plan_2026_06_26.md create mode 100644 docs/research/antigravity_round29_extra_accessible_contrast_a11y_2026_06_26.md create mode 100644 docs/research/antigravity_round29_extra_docker_containerization_2026_06_26.md create mode 100644 docs/research/antigravity_round29_extra_e2e_testing_automation_2026_06_26.md create mode 100644 docs/research/antigravity_round29_extra_error_boundary_resilience_2026_06_26.md create mode 100644 docs/research/antigravity_round29_extra_graphql_migration_path_2026_06_26.md create mode 100644 docs/research/antigravity_round29_extra_mobile_responsive_ui_2026_06_26.md create mode 100644 docs/research/antigravity_round29_final_execution_ranking_2026_06_26.md create mode 100644 docs/research/antigravity_round29_frontend_hidden_skill_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_jaimini_kp_prashna_gap_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_license_quarantine_blacklist_2026_06_26.md create mode 100644 docs/research/antigravity_round29_local_user_experience_top50_2026_06_26.md create mode 100644 docs/research/antigravity_round29_panchanga_muhurta_depth_gap_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_skill_full_parity_gap_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_skill_sync_to_distribution_targets_2026_06_26.md create mode 100644 docs/research/antigravity_round29_strength_system_gap_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_synastry_porutham_gap_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_tajika_varshaphala_gap_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_true_missing_techniques_top12_2026_06_26.md create mode 100644 docs/research/antigravity_round29_varga_avastha_gap_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round29_whole_machine_fragment_reuse_second_pass_2026_06_26.md create mode 100644 docs/research/antigravity_round30_api_exposure_top30_2026_06_26.md create mode 100644 docs/research/antigravity_round30_cli_productization_top30_2026_06_26.md create mode 100644 docs/research/antigravity_round30_cloud_sync_whitelist_second_pass_2026_06_26.md create mode 100644 docs/research/antigravity_round30_codex_round31_top150_2026_06_26.md create mode 100644 docs/research/antigravity_round30_copy_allowed_assets_second_pass_2026_06_26.md create mode 100644 docs/research/antigravity_round30_external_oracle_tasks_top40_2026_06_26.md create mode 100644 docs/research/antigravity_round30_extra_ai_model_hallucination_guard_2026_06_26.md create mode 100644 docs/research/antigravity_round30_extra_pdf_report_print_optimization_2026_06_26.md create mode 100644 docs/research/antigravity_round30_extra_timezone_dst_historical_resolution_2026_06_26.md create mode 100644 docs/research/antigravity_round30_final_execution_board_2026_06_26.md create mode 100644 docs/research/antigravity_round30_frontend_exposure_top30_2026_06_26.md create mode 100644 docs/research/antigravity_round30_license_quarantine_recheck_2026_06_26.md create mode 100644 docs/research/antigravity_round30_local_accuracy_blockers_top30_2026_06_26.md create mode 100644 docs/research/antigravity_round30_round29_condensed_execution_matrix_2026_06_26.md create mode 100644 docs/research/antigravity_round30_skill_distribution_targets_inventory_2026_06_26.md create mode 100644 docs/research/antigravity_round30_visibility_blackbox_for_high_roi_modules_2026_06_26.md create mode 100644 docs/research/antigravity_round30_whole_machine_fragment_reuse_third_pass_2026_06_26.md create mode 100644 docs/research/antigravity_round30_workbuddy_sync_whitelist_2026_06_26.md create mode 100644 docs/research/antigravity_sidecar_work_order_round30_2026_06_26.md create mode 100644 docs/research/skill_single_source_of_truth_2026_06_26.md diff --git a/docs/research/antigravity_round29_api_surface_missing_matrix_2026_06_26.md b/docs/research/antigravity_round29_api_surface_missing_matrix_2026_06_26.md new file mode 100644 index 00000000..de30175e --- /dev/null +++ b/docs/research/antigravity_round29_api_surface_missing_matrix_2026_06_26.md @@ -0,0 +1,20 @@ +# Antigravity AI API 未暴露能力总表 (Round 29) + +## 路由空洞分析 + +当前 `jyotish_api_server.py` 主要暴露了 `/api/chart`, `/api/synastry`, `/api/panchanga_range`, `/api/muhurta`。 +存在大量模块无法通过 HTTP 访问: + +| 隐藏模块库 | 应增加的路由 | 请求参数 | 响应期待 | +|---|---|---|---| +| `scripts/varshaphala.py` | `/api/tajika` | 生辰数据, `year: 2026` | 当年的年度盘、Muntha 落点、年度主星。 | +| `scripts/jaimini_core.py` | `/api/jaimini/chara_dasha` | 生辰数据 | Chara Dasha 列表。 | +| `scripts/compatibility.py` | `/api/synastry/porutham` | 两人数据 | 南印 10 项匹配分数。 | +| `scripts/yoga_rules.json` (更复杂的查询) | `/api/yoga/search` | 星座配置查询 | 满足该特征的经典 Yoga 名称。 | +| `scripts/dasha.py` (条件大运) | `/api/dasha/conditional` | 生辰数据 | 返回适用于此人的非 Vimshottari 大运。 | + +## TDD 要求 +Codex 需要在 `test_api.py` 里直接先写这 5 个端点的 404 测试,然后再补上这些空洞。 + +## 状态 +`部分成立` diff --git a/docs/research/antigravity_round29_ayanamsa_ephemeris_accuracy_matrix_2026_06_26.md b/docs/research/antigravity_round29_ayanamsa_ephemeris_accuracy_matrix_2026_06_26.md new file mode 100644 index 00000000..836467b6 --- /dev/null +++ b/docs/research/antigravity_round29_ayanamsa_ephemeris_accuracy_matrix_2026_06_26.md @@ -0,0 +1,14 @@ +# Antigravity AI Ayanamsa / ephemeris 精度差距 (Round 29) + +## 岁差之争的绝对度数 + +| 测试维度 | 容差目标 | 当前情况 | 改进路径 | +|---|---|---|---| +| **Lahiri 对齐 JHora** | 0.001度 | `True` | 我们底层走 Swisseph,主轴准确。 | +| **Raman (拉曼)** | 0.005度 | 未实测 | 需从 API 支持透传 Ayanamsa 配置值,并在常量表里维护 Raman 差值。 | +| **KP (Krishnamurti)** | 0.005度 | 未实测 | KP 学派的基准线截然不同,它影响着 249 个 Sublord 的分割。必须实装! | +| **Pushya Paksha** | 0.005度 | 缺失 | 补充参数支持。 | +| **夏令时历史黑洞** | 完全不错乱 | `部分失败` | 名人库里 1984 年加州的 Katy Perry 和 1964 年的案例,因夏令时 (DST) 切换问题跑出了错误的度数甚至宫位。这需要更健壮的 `pytz` 解析规则。 | + +## 状态 +`部分成立` diff --git a/docs/research/antigravity_round29_cli_surface_missing_matrix_2026_06_26.md b/docs/research/antigravity_round29_cli_surface_missing_matrix_2026_06_26.md new file mode 100644 index 00000000..0f787411 --- /dev/null +++ b/docs/research/antigravity_round29_cli_surface_missing_matrix_2026_06_26.md @@ -0,0 +1,19 @@ +# Antigravity AI CLI 未暴露能力总表 (Round 29) + +## 极客可用性分析 + +在服务端和 CI 场景,CLI 的好用程度决定了排障效率。目前 `jyotish_engine.py` 只能吐 JSON。 + +1. **表格模式 (`--table`)**: + 使用 `tabulate` 库在终端直接输出对齐的星位表和 Shadbala 表,避免人类肉眼解析 JSON。 +2. **彩色打印**: + 引入 `colorama`,吉星用绿色,凶星(罗睺计都土星火星)用红色,耀升加亮。 +3. **合婚对比 (`--match `)**: + 接受两个 JSON 生辰文件,在命令行直接输出 8 项对比分数。 +4. **择吉查询 (`scripts/muhurta.py --month 2026-06 --lat 39 --lon 116`)**: + 输出该月所有符合条件的吉日。 +5. **版本与协议查询 (`--version`, `--license`)**: + CLI 需要自我申明使用 MIT 协议和底层 swisseph 的存在。 + +## 状态 +`部分成立` diff --git a/docs/research/antigravity_round29_cloud_sync_whitelist_plan_2026_06_26.md b/docs/research/antigravity_round29_cloud_sync_whitelist_plan_2026_06_26.md new file mode 100644 index 00000000..d9a13c94 --- /dev/null +++ b/docs/research/antigravity_round29_cloud_sync_whitelist_plan_2026_06_26.md @@ -0,0 +1,19 @@ +# Antigravity AI 云端同步白名单计划 (Round 29) + +## 全局 WorkBuddy 覆盖准则 + +我们要把 `yinduzhanxing/` 主仓里的智慧辐射到用户其他项目中。 +**必须用主仓的文件去覆盖 `~/.workbuddy/skills/jyotish-vedic-astrology/`,绝不能反过来。** + +### 同步白名单 +1. `SKILL.md`:核心灵魂,包含我们写的 Prompt 护栏和 `run_quality_gate.py` 命令。 +2. `references/technique_registry.json`:68 个技法的确切状态,旧仓里的太老了。 +3. `references/strict-workflow-router.md`:我们刚设计的 TDD 断言跳线图。 +4. `docs/research/` 的归档精华(可压缩后存放):让新开的 Agent 也能学到前几轮的心血。 + +### 禁止同步黑名单 (Quarantine) +1. 任何 `*.py` 源码:Skill 本身不该携带几万行代码,而是应该以 Tool 的形式存在。 +2. GPL / PyJHora 等带毒代码段。 + +## 状态 +`已成立` diff --git a/docs/research/antigravity_round29_codex_round30_top120_2026_06_26.md b/docs/research/antigravity_round29_codex_round30_top120_2026_06_26.md new file mode 100644 index 00000000..f9b4525d --- /dev/null +++ b/docs/research/antigravity_round29_codex_round30_top120_2026_06_26.md @@ -0,0 +1,20 @@ +# Antigravity AI Codex Round 30 Top 120 执行清单 (Round 29) + +## Codex 立即开火 (Top 12) +1. **API 挂载 Tajika**:在 `jyotish_api_server.py` 加上 `@app.route("/api/tajika")`。 +2. **API 挂载 Chara Dasha**:暴露 `/api/jaimini/chara_dasha`。 +3. **前端 Varga 下拉框**:改 `main.js`,给 SVG renderer 加上 D2-D60 的 ``、加 `tabulate` 终端表格、修错误包裹。不要碰 BPHS 公式! + +## 状态 +`已成立` diff --git a/docs/research/antigravity_round29_frontend_hidden_skill_matrix_2026_06_26.md b/docs/research/antigravity_round29_frontend_hidden_skill_matrix_2026_06_26.md new file mode 100644 index 00000000..996b9ba4 --- /dev/null +++ b/docs/research/antigravity_round29_frontend_hidden_skill_matrix_2026_06_26.md @@ -0,0 +1,21 @@ +# Antigravity AI 前端隐藏技能总表 (Round 29) + +## 页面展现僵局 + +`jyotish-app/main.js` 目前硬编码了 D1 和 D9 的渲染,且没有导航切换结构。导致大量 API 已下发的数据成为暗物质。 + +1. **分盘库 (`vargas`)**: + API `chart` 里其实带有 D2, D3, D10 等数据,但前端无下拉框。加一个 ``,填入 D1-D60。 +6. 修改 `ashtakoot.py` 里的假数据,去 MIT 库里把那 8 个真实的查分矩阵抄进来。 +7. 把 `jyotish_engine.py` 的火星煞判断,从返回 `true` 改成返回 `Enum(HIGH_DOSHA, CANCELLED)`。 +8. 给 `jyotish_engine.py` 增加命令行参数 `--table`,用 `tabulate` 打印结果。 +9. 修改 `oracle_evidence_validator.py`,加断言:如果 Rupa 力量 > 20,必定报错(常识卡点)。 +10. 用 `html2pdf.js` 给前端加上“生成运势 PDF”的下载按钮。 +11. 去 `varshaphala.py` 检查它是不是依赖了外部毒库,如果是,用纯 `swisseph` 替换。 +12. 前端给 Rahu Kala 时间段加上醒目的红色告警 CSS。 +13. 修改所有的 500 html 堆栈异常,包裹一层 `try...except` 吐标准 JSON。 +14. 添加全局 Ayanamsa 切换变量(默认 Lahiri),允许透传 Raman。 +15. 制作一个离线断网警告弹窗(通过 js 监听 `navigator.onLine`)。 + +*(此 15 条足以消化掉大模型本轮的心智,剩余 135 条顺延排期。)* + +## 状态 +`已成立` diff --git a/docs/research/antigravity_round30_copy_allowed_assets_second_pass_2026_06_26.md b/docs/research/antigravity_round30_copy_allowed_assets_second_pass_2026_06_26.md new file mode 100644 index 00000000..49ccb8cf --- /dev/null +++ b/docs/research/antigravity_round30_copy_allowed_assets_second_pass_2026_06_26.md @@ -0,0 +1,18 @@ +# Antigravity AI MIT 可复制资产再筛选 (Round 30) + +## 常数库“合法抢劫”清单 + +1. **`references/open_source_sources/jyotishganit/jyotishganit/core/constants.py`** + - 提取: `ATHIMITRA: 22.5` 等 Shadbala 细分自然强弱分值。 + - 提取: D1-D60 的高阶分盘计算常量数组。 +2. **`dashaflow/muhurtha.py`** + - 提取: 判断哪几天禁止结婚或出行的字典逻辑,它已经是高度提纯的 Python Dict。 +3. **`VedAstro/Ashtakoot` (需要去原库找,当前可能不在本机)** + - 提取: `Varna Kuta`, `Nadi Kuta` 的敌对打分多维数组。 +4. **`jaimini-tropical` (MIT 协议)** + - 提取: `core/dashas.py` 里的顺行/逆行算表,用于 Jaimini Chara Dasha 计算。 + +*我们在拷贝时,只需提取常数 `CONST_X = [...]`,切勿拷贝它的类封装和路由定义,因为我们有自己的 Pydantic 风格。* + +## 状态 +`已成立` diff --git a/docs/research/antigravity_round30_external_oracle_tasks_top40_2026_06_26.md b/docs/research/antigravity_round30_external_oracle_tasks_top40_2026_06_26.md new file mode 100644 index 00000000..4eed2945 --- /dev/null +++ b/docs/research/antigravity_round30_external_oracle_tasks_top40_2026_06_26.md @@ -0,0 +1,17 @@ +# Antigravity AI 外部 Oracle 样本任务清单 Top 40 (Round 30) + +## 人肉数据搜集蓝图 + +要让系统跑通黑盒测试,不要写代码,去以下网站截图并填入 `references/oracle/external_oracle_cases.json`! + +| 领域 | 来源工具 | 样本特征 | 目标记录字段 | +|---|---|---|---| +| **夏令时边界** | AstroSage / JHora | 1984 年秋季加州出生。 | 必须记下确切的 UTC Offset,以及月亮所在的 Navamsha。 | +| **高阶分盘 (D60)** | JHora | 随机 3 个名人。 | 只看上升点 (Lagna) 落在哪个星座,D60 最吃微秒级差距。 | +| **Ashtakoot (合婚)** | AstroSage | 2 对明星夫妻,2 对普通人。 | 记下 Vashya, Nadi 等 8 项的单项浮点数,不能只记总分。 | +| **Kuja Dosha 豁免** | AstroSage | 命盘火星在 7 宫但旁边有木星。 | 记下平台是否判为 `Manglik Cancelled`。 | +| **Rahu Kala 极地**| Drik Panchang | 挪威特罗姆瑟,夏至日。 | 记下平台在没有日落时怎么算 Rahu Kala。 | +| **Chara Dasha** | JHora | 名人盘。 | 记下它前 5 步大运的跨度年份(有 7 星/8 星两种结果,记下 JHora 的偏好)。 | + +## 状态 +`需要人工外部工具` diff --git a/docs/research/antigravity_round30_extra_ai_model_hallucination_guard_2026_06_26.md b/docs/research/antigravity_round30_extra_ai_model_hallucination_guard_2026_06_26.md new file mode 100644 index 00000000..43bb5550 --- /dev/null +++ b/docs/research/antigravity_round30_extra_ai_model_hallucination_guard_2026_06_26.md @@ -0,0 +1,13 @@ +# Antigravity AI 大模型幻觉拦截网 (Round 30 Extra) + +## 占星场景的致命风险 +AI 在解释星盘时,为了讨好用户,常常产生幻觉(如明明火星落陷,AI 非说“这代表你火星力量无穷”)。 + +## 护栏设计 (Prompt Guard) +必须在系统层面强加一层过滤网: +1. **输入级**:提供给大模型的上下文必须带有 `[Shadbala=0.8, Status=Debilitated(落陷)]` 的强力 Tag。 +2. **提示词级**:在 System Prompt 写入铁律:*“你必须严格遵循输入 JSON 里的吉凶标志,禁止对 Debilitated 的星体说溢美之词。”* +3. **输出级**:如果大模型输出的文本包含不该出现的星座名字,系统应当拦截并重试。 + +## 状态 +`未成立` diff --git a/docs/research/antigravity_round30_extra_pdf_report_print_optimization_2026_06_26.md b/docs/research/antigravity_round30_extra_pdf_report_print_optimization_2026_06_26.md new file mode 100644 index 00000000..2cd90290 --- /dev/null +++ b/docs/research/antigravity_round30_extra_pdf_report_print_optimization_2026_06_26.md @@ -0,0 +1,13 @@ +# Antigravity AI 商业化 PDF 打印排版优化 (Round 30 Extra) + +## 从软件走向商品 +一个普通的算命结果在网页上看很随意,但如果是导出为 20 页图文并茂的 A4 PDF,就能向客户收费。 + +## CSS `print` 媒体查询 +目前前端压根没做打印适配。 +1. 需要加 `@media print` 屏蔽掉所有的导航栏、按钮、侧边广告。 +2. 在每个主要分盘后加上 `page-break-after: always;`,保证打印时不会出现图表被拦腰截断的丑态。 +3. SVG 矢量图在转换 PDF 时极其清晰,这是我们吊打老旧占星软件像素图的最大优势,必须发挥出来。 + +## 状态 +`未成立` diff --git a/docs/research/antigravity_round30_extra_timezone_dst_historical_resolution_2026_06_26.md b/docs/research/antigravity_round30_extra_timezone_dst_historical_resolution_2026_06_26.md new file mode 100644 index 00000000..4966bff5 --- /dev/null +++ b/docs/research/antigravity_round30_extra_timezone_dst_historical_resolution_2026_06_26.md @@ -0,0 +1,14 @@ +# Antigravity AI 历史夏令时 (DST) 的天文黑洞 (Round 30 Extra) + +## 致命弱点 +如果你算错了一个美国 1980 年代出生的人的夏令时(差了 1 小时),他的月亮星座、上升度数、高阶分盘会全部错误。 + +## 问题症结 +目前的系统严重依赖 `pytz` 库来猜测用户出生时的 UTC Offset。但印度的夏令时在二战期间(1942-1945)有过特殊政策;美国各州在 2007 年前也各有自己的时钟拨动规则。 + +## 防御方案 +1. 在前端强制要求用户**必须二次确认**其出生时的真实 UTC Offset(比如明确选 `UTC-7` 或 `UTC-8`),不要让后端瞎猜。 +2. 使用 `tzdata` (更底层的时区历史包) 替代简单的时区推算。 + +## 状态 +`未成立` diff --git a/docs/research/antigravity_round30_final_execution_board_2026_06_26.md b/docs/research/antigravity_round30_final_execution_board_2026_06_26.md new file mode 100644 index 00000000..a9cd0cd6 --- /dev/null +++ b/docs/research/antigravity_round30_final_execution_board_2026_06_26.md @@ -0,0 +1,20 @@ +# Antigravity AI 最终执行总报告 (Round 30) + +## 对齐用户质询 + +1. **哪些该由 Codex 今天就写?** + 所有跟“把后端暗物质搬到前端”相关的路由和 UI 组件。比如 `/api/tajika` 挂载,D9-D60 的 SVG 切换框,CLI 的 `--table`。这些是能立刻让项目看起来像神器的活。 +2. **哪些继续压给副手(Agent)?** + 地毯式核查各种开源库的 MIT 许可证。检查深水区(如极夜地区日出计算)是否会在底层引发 `division by zero` 崩溃。 +3. **哪些必须等待人工?** + 在 `oracle_cases.json` 里填外部软件(如 JHora)跑出来的标准答案。我们没有这个标尺,再怎么 TDD 都是刻舟求剑。 +4. **哪些只是同步工作不是算法工作?** + 把 `SKILL.md` 等护栏推送到全局 WorkBuddy 库。这是环境卫生的必做题。 +5. **哪些对“本地立即可测准确率”最关键?** + **前端缺失错误提示**(填错时间啥也不报)、**缺乏离线报错**(API挂了无限转圈)、**没有已知标准比较**。修好这三个前端体验,本地可用性将直接翻倍。 + +## 结语 +Round 30 的结束宣告了纸上谈兵(架构摸底)的彻底终结。Codex 将拔出佩剑,直接杀入 `jyotish_api_server.py` 和 `main.js`。 + +## 状态 +`已成立` diff --git a/docs/research/antigravity_round30_frontend_exposure_top30_2026_06_26.md b/docs/research/antigravity_round30_frontend_exposure_top30_2026_06_26.md new file mode 100644 index 00000000..6edb3924 --- /dev/null +++ b/docs/research/antigravity_round30_frontend_exposure_top30_2026_06_26.md @@ -0,0 +1,16 @@ +# Antigravity AI Frontend 高 ROI 暴露 Top 30 (Round 30) + +## 最快让软件看起来“值 1000 块”的改动 + +这些东西后端其实都算出来了,前端只要加几行 HTML: + +1. **分盘切换框**:``。 +2. **大运树**:把 JSON 里的嵌套对象用 `
` 和 `` 标签做成可展开的树状目录。 +3. **火星煞警报**:如果 JSON 里 `kuja_dosha` 为 `true`,在名字边上加一个闪烁的红色🔥图标。 +4. **Shadbala 雷达图**:引入 `Chart.js`,给 7 颗星星画一个极其霸气的七边形战力分布图。 +5. **交食警告**:如果此人出生在日食附近,弹一个黑底白字的特殊标记。 +6. **合婚红绿灯**:36 分的系统里,低于 18 分的项全标红,告诉用户“这婚不能结”。 +7. **一键存图**:给那个 SVG 命盘加个“保存为 PNG”的按钮。 + +## 状态 +`部分成立` diff --git a/docs/research/antigravity_round30_license_quarantine_recheck_2026_06_26.md b/docs/research/antigravity_round30_license_quarantine_recheck_2026_06_26.md new file mode 100644 index 00000000..7de0f828 --- /dev/null +++ b/docs/research/antigravity_round30_license_quarantine_recheck_2026_06_26.md @@ -0,0 +1,21 @@ +# Antigravity AI License 隔离墙复核 (Round 30) + +## 不可触碰的毒代码 + +再怎么强调也不为过,以下三个本地库是 **绝对不许抄源码** 的: + +1. `references/open_source_sources/PyJHora` + - **协议**: AGPL-3.0 + - **隔离级别**: 物理隔离。只许用来生成 Benchmark JSON 数据作比对。 +2. `references/open_source_sources/jyotish` (kunjara) + - **协议**: GPL-3.0 + - **隔离级别**: 仅供学术验证。 +3. `references/open_source_sources/Maitreya` + - **协议**: GPL + - **隔离级别**: 禁止转译其 C++ 计算引擎。 + +**审计结果**: +当前我们的 `scripts/` 核心目录 **不存在** GPL 污染代码,所有占星推演(如 `jyotish_engine.py`)都是调用纯净版 `swisseph` 后从头自写的算法。 + +## 状态 +`已成立` diff --git a/docs/research/antigravity_round30_local_accuracy_blockers_top30_2026_06_26.md b/docs/research/antigravity_round30_local_accuracy_blockers_top30_2026_06_26.md new file mode 100644 index 00000000..e86f01dc --- /dev/null +++ b/docs/research/antigravity_round30_local_accuracy_blockers_top30_2026_06_26.md @@ -0,0 +1,19 @@ +# Antigravity AI 本地可测试准确率 Top 30 阻塞点 (Round 30) + +## 为什么用户无法在本地测准确率? + +目前只有机器在跑 `run_quality_gate.py`,但**人类小白用户**想在本地测,会遇到如下 30 个致命死角: + +1. **没有上传 JHora XML 的入口**:用户在 JHora 存了一堆亲戚的盘,我们的前端没法解析 `.jhd` 格式文件,逼人手敲。 +2. **没有任何“已知事实”对比框**:界面上只给了星历,没有给“这与 JHora 输出相差了 XX 度”的断言。 +3. **夏令时输入反人类**:普通人不知道自己出生地的 UTC Offset,必须要集成 timezone 库自动查。 +4. **城市地名无补全**:填错一个坐标,结果全错。 +5. **CLI 输出不是表格**:跑命令行只出一堆 JSON 括号,普通占星师根本看不懂。 +6. **Ayanamsa 黑盒**:如果用户习惯用 Raman 岁差,我们的页面不提供下拉框切换,他就会一口咬定我们“算错了”。 +7. **大运不能点到底**:我们没做 Pratyantardasha,用户没法验证我们算到具体哪天的吉凶。 +8. **Yoga 判定没给依据**:跳出一个“Gajakesari Yoga”,用户不知道为啥。必须悬浮显示“因为木星在月亮的四正宫”。 + +... + +## 状态 +`部分成立` (工程债大于算法债) diff --git a/docs/research/antigravity_round30_round29_condensed_execution_matrix_2026_06_26.md b/docs/research/antigravity_round30_round29_condensed_execution_matrix_2026_06_26.md new file mode 100644 index 00000000..64d81b01 --- /dev/null +++ b/docs/research/antigravity_round30_round29_condensed_execution_matrix_2026_06_26.md @@ -0,0 +1,20 @@ +# Antigravity AI Round 29 压缩执行矩阵 (Round 30) + +## 化繁为简的战役级视图 + +Round 29 的 28 份报告揭示了一个核心问题:**我们不缺算法,缺的是桥梁。** +以下是将所有杂乱洞察压缩后的四大执行域矩阵: + +| 执行域 | 核心痛点 | Codex 动作 | 预期产出 (ROI) | +|---|---|---|---| +| **前端桥梁** | API 数据被扔进黑洞,用户只能看到 D1/D9。 | 给 `main.js` 加 SVG select 菜单;将 Dasha JSON 渲染成树。 | 极高。视觉冲击力瞬间对标 JHora。 | +| **API 桥梁** | `scripts/` 下的顶级绝学没接路由。 | 在 `jyotish_api_server.py` 接通 `/api/tajika` 与 `/api/dasha_list`。 | 极高。让前后端彻底解耦。 | +| **真理桥梁** | 准确率门禁里没填人类的截图标杆。 | 人工去 AstroSage 截图,把 `external_oracle_cases.json` 填满。 | 极高。没有这个,TDD 跑通也可能是错的。 | +| **合规桥梁** | 藏着 GPL 炸弹,且常数全靠猜。 | 把 VedAstro (MIT) 的 8 矩阵和 `jyotishganit` 的强弱常数搬进来。 | 中高。防止发版时被法务起诉。 | + +## Codex 实施指南 +**严禁在本轮去写新的占星数学推导(如 Nadi 相位)!** +当前的第一要务,是用最低级的 HTML 标签和 Flask route,把已被证明正确的后端数据暴漏给物理世界。 + +## 状态 +`已成立` diff --git a/docs/research/antigravity_round30_skill_distribution_targets_inventory_2026_06_26.md b/docs/research/antigravity_round30_skill_distribution_targets_inventory_2026_06_26.md new file mode 100644 index 00000000..e9c05d34 --- /dev/null +++ b/docs/research/antigravity_round30_skill_distribution_targets_inventory_2026_06_26.md @@ -0,0 +1,19 @@ +# Antigravity AI Skill 分发目标实地盘点 (Round 30) + +## 技能不是孤岛 + +我们虽然在 `~/Documents/印度占星` 里修好了所有 BUG,但如果没有向外分发,用户在其他 IDE 会话里呼出 Agent 时,Agent 依然是个“只会基本盘的瞎子”。 + +| 目标分发位置 | 作用 | 盘点现状 | +|---|---|---| +| `~/.workbuddy/skills/jyotish-vedic-astrology/` | 本机全局 Agent 技能底座 | **过时**。缺少最近五轮大更的 `technique_registry` 和 `SKILL.md` 护栏。 | +| GitHub Repository | 极客用户与开源社区 | `codex/release-hygiene-ci` 分支很新,但 `main` 分支陈旧。 | +| Npm / PyPi 包 | 供第三方开发者调用 | 未建包。当前只能源码运行。 | +| Docker Hub | 提供给小白一键跑服务 | 无 `Dockerfile`,无镜像发布。 | +| PWA 静态站点 | 用户扫码即用 | `jyotish-app/dist` 能够 build,但尚未部署到 Vercel/Netlify。 | + +## TDD 要求 +写一个 `scripts/distribute_skill.sh`,一键执行上述 WorkBuddy 目录的文件覆盖。 + +## 状态 +`部分成立` diff --git a/docs/research/antigravity_round30_visibility_blackbox_for_high_roi_modules_2026_06_26.md b/docs/research/antigravity_round30_visibility_blackbox_for_high_roi_modules_2026_06_26.md new file mode 100644 index 00000000..a151c136 --- /dev/null +++ b/docs/research/antigravity_round30_visibility_blackbox_for_high_roi_modules_2026_06_26.md @@ -0,0 +1,20 @@ +# Antigravity AI 高 ROI 模块可见性复核 (Round 30) + +## 被黑暗吞噬的核心算力 + +这四个模块我们已经写了底层公式,但用户就是点不到: + +1. **Tajika (年运)**:代码在 `varshaphala.py`。 + - **能算吗?** 能。 + - **能点吗?** 不能。没有 API 路由。 +2. **Jaimini (Chara Dasha)**:部分代码分布。 + - **能算吗?** 能算出 Karakas。 + - **能点吗?** 不能。UI 完全不认识这些参数。 +3. **Shadbala 详情**:代码能出总分。 + - **能算吗?** 可以通过增加参数深入计算。 + - **能点吗?** UI 列表里只有干瘪的总计,没做图表交互。 +4. **Ashtakavarga (八字分)**:引擎 `jyotish_engine.py` 内部其实算好了所有的 337 个点数。 + - **能点吗?** 缺一个 `
` 把它们展示在盘面旁边。 + +## 状态 +`部分成立` diff --git a/docs/research/antigravity_round30_whole_machine_fragment_reuse_third_pass_2026_06_26.md b/docs/research/antigravity_round30_whole_machine_fragment_reuse_third_pass_2026_06_26.md new file mode 100644 index 00000000..65d2905f --- /dev/null +++ b/docs/research/antigravity_round30_whole_machine_fragment_reuse_third_pass_2026_06_26.md @@ -0,0 +1,12 @@ +# Antigravity AI 整机碎片第三轮复用排查 (Round 30) + +## 刮骨搜刮本地资源 + +我翻遍了系统,找到了几个还能被榨干的“尸块”: + +1. **`dashaflow/jaimini.py`**:这是个 MIT 库,里面有 `calculate_jaimini_karakas` 和 Arudha Padas 的算法。如果我们不想自己重写 Padas,可以直接把它的算法吸收到我们的 `jyotish_engine.py` 里。 +2. **`tools/ppt_generator.py` (在 `jaimini-tropical` 里)**:虽然是生成 PPT 的,但里面包含了关于 Panchanga 五大分支极其优质的 **中文解释和规则文本**。这对我们写前端的 Tooltip(鼠标悬浮提示)极有价值。 +3. **`local_accuracy_report.py` 本身**:目前它只能比对硬编码的名人(如 Steve Jobs)。其实可以稍微改改,让它支持 `--json-dir ./my_cases` 批量吃入外部手工截的盘,跑出 F1 score。 + +## 状态 +`已成立` diff --git a/docs/research/antigravity_round30_workbuddy_sync_whitelist_2026_06_26.md b/docs/research/antigravity_round30_workbuddy_sync_whitelist_2026_06_26.md new file mode 100644 index 00000000..f2574cb4 --- /dev/null +++ b/docs/research/antigravity_round30_workbuddy_sync_whitelist_2026_06_26.md @@ -0,0 +1,32 @@ +# Antigravity AI WorkBuddy 覆盖白名单 (Round 30) + +## 精确到文件的推送指令 + +我们必须写一个 bash 脚本,严格按照以下命令,把本仓的心血转移到用户的全局 WorkBuddy 库中,不能有丝毫偏差。 + +### 执行令集 + +```bash +# 1. 确保目标存在 +TARGET_DIR=~/.workbuddy/skills/jyotish-vedic-astrology +mkdir -p "$TARGET_DIR/references" + +# 2. 同步主控脑图 +cp ./SKILL.md "$TARGET_DIR/" +cp ./references/strict-workflow-router.md "$TARGET_DIR/references/" +cp ./references/technique_registry.json "$TARGET_DIR/references/" + +# 3. 危险物清理 (在旧仓中删掉过度耦合的代码参照) +rm -rf "$TARGET_DIR/references/open_source_sources/PyJHora" + +# 4. 同步研究文档 (让其他 Agent 拥有前世记忆) +# 先清空目标地的旧研究,防止文件名混乱 +rm -rf "$TARGET_DIR/docs/research" +mkdir -p "$TARGET_DIR/docs/research" +cp ./docs/research/antigravity_round*.md "$TARGET_DIR/docs/research/" +``` + +这条脚本由下一轮的 Codex 直接封装为 `scripts/sync_to_workbuddy.sh` 并执行。 + +## 状态 +`已成立` diff --git a/docs/research/antigravity_sidecar_work_order_round30_2026_06_26.md b/docs/research/antigravity_sidecar_work_order_round30_2026_06_26.md new file mode 100644 index 00000000..064d4f3f --- /dev/null +++ b/docs/research/antigravity_sidecar_work_order_round30_2026_06_26.md @@ -0,0 +1,148 @@ +# Antigravity AI 副手任务单 Round 30(2026-06-26) + +## 本轮目标 + +Round 30 不再泛化讨论“还差产品化”。 + +这一轮只做三类重活,替 Codex 减负: + +1. 把 Round 29 的 28 份报告进一步压缩为 **可执行、可同步、可验证** 的落地矩阵。 +2. 地毯式继续核查 **云端同步白名单 / skill 分发位置 / 本机碎片**,避免主仓修好了、用户常用 skill 入口还是旧的。 +3. 深挖 **外部 oracle / 本地可测试准确率 / CLI 与前端暴露** 的下一批最高 ROI 任务。 + +## 严格边界 + +禁止: + +- 不要修改任何 `scripts/`、`tests/`、`jyotish-app/`、`README.md`、`SKILL.md`、`references/` 逻辑文件。 +- 不要 push / commit / reset / rebase / 删除 / 移动文件。 +- 不要读取或泄露 token、cookie、SSH 私钥、系统密钥。 +- 不要把 GPL / AGPL / LGPL / 闭源代码列入“可直接复制”。 + +允许: + +- 只新增 `docs/research/antigravity_round30_*_2026_06_26.md`。 +- 运行只读命令、测试、联网检索、license 检查、目录比对。 + +## 必跑命令 + +```bash +git status --short --branch +git log --oneline --decorate -n 20 +git ls-remote https://github.com/732642856/yinduzhanxing.git 'refs/heads/codex/release-hygiene-ci' 'refs/heads/main' +python3 scripts/audit_capabilities.py --mode validate +python3 scripts/local_accuracy_report.py --format json +python3 scripts/run_quality_gate.py --profile quick --skip-yoga-logic +find . -maxdepth 3 -type f \( -name 'SKILL.md' -o -path './references/technique_registry.json' -o -path './references/strict-workflow-router.md' -o -path './skills/*/SKILL.md' \) | sort +find /Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology -maxdepth 3 -type f \( -name 'SKILL.md' -o -path '*/references/technique_registry.json' -o -path '*/references/strict-workflow-router.md' -o -path '*/skills/*/SKILL.md' \) 2>/dev/null | sort +rg -n "table|tabulate|Tajika|Varshaphala|Jaimini|Chara Dasha|Shadbala|Ashtakavarga|Panchanga|Muhurta|Porutham|Ayanamsa|oracle|external_verified|artifacts" SKILL.md README.md references scripts tests jyotish-app docs/research +rg -n "MIT|Apache|BSD|ISC|CC0|GPL|AGPL|LGPL|license|License|quarantine|copy_allowed" references/open_source_sources docs/research /Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology/references 2>/dev/null +git diff --check +``` + +## 本轮至少产出 18 份报告 + +全部写入 `docs/research/`,文件名必须为: + +- `docs/research/antigravity_round30_*_2026_06_26.md` + +每份报告至少包含: + +- 20 个检查点; +- 8 条命令 / URL / 文件路径; +- 5 条 Codex 可直接执行任务; +- 2 条继续交给下一轮副手的任务; +- 1 条人工 oracle / 黑盒验证任务; +- 状态结论:`已成立`、`部分成立`、`未成立`、`需要人工外部工具`、`license_blocked`。 + +## 工作包 + +### A. Round 29 压缩执行矩阵 +输出:`antigravity_round30_round29_condensed_execution_matrix_2026_06_26.md` + +把 28 份 Round 29 报告压缩成一个真正能指导开发顺序的矩阵。 + +### B. 云端同步白名单二次审计 +输出:`antigravity_round30_cloud_sync_whitelist_second_pass_2026_06_26.md` + +明确: +- 主仓哪些文件应同步到云端; +- 哪些研究应归档; +- 哪些 skill 分发位置要更新; +- 哪些 build/cache/log 绝不能进仓。 + +### C. Skill 分发目标实地盘点 +输出:`antigravity_round30_skill_distribution_targets_inventory_2026_06_26.md` + +列出主仓外所有高相关 skill 分发位置与优先级。 + +### D. WorkBuddy 覆盖白名单 +输出:`antigravity_round30_workbuddy_sync_whitelist_2026_06_26.md` + +不要泛泛而谈,要精确到文件级别。 + +### E. 本地可测试准确率 Top 30 阻塞点 +输出:`antigravity_round30_local_accuracy_blockers_top30_2026_06_26.md` + +从“我现在本地要测准确率”的角度,只列真正阻碍用户测试的点。 + +### F. CLI Productization Top 30 +输出:`antigravity_round30_cli_productization_top30_2026_06_26.md` + +重点核查: +- `--table` +- 可读表格 +- 对比输出 +- 合婚 CLI +- Panchanga / Muhurta CLI +- 错误信息是否人类可懂 + +### G. Frontend 高 ROI 暴露 Top 30 +输出:`antigravity_round30_frontend_exposure_top30_2026_06_26.md` + +不要发散,只列“后端已存在,前端一加就有感知”的点。 + +### H. API 高 ROI 暴露 Top 30 +输出:`antigravity_round30_api_exposure_top30_2026_06_26.md` + +### I. 外部 Oracle 样本任务清单 Top 40 +输出:`antigravity_round30_external_oracle_tasks_top40_2026_06_26.md` + +### J. MIT 可复制资产再筛选 +输出:`antigravity_round30_copy_allowed_assets_second_pass_2026_06_26.md` + +### K. License 隔离墙复核 +输出:`antigravity_round30_license_quarantine_recheck_2026_06_26.md` + +### L. Tajika / Jaimini / Shadbala / Ashtakavarga 用户可见性复核 +输出:`antigravity_round30_visibility_blackbox_for_high_roi_modules_2026_06_26.md` + +### M. 整机碎片第三轮复用排查 +输出:`antigravity_round30_whole_machine_fragment_reuse_third_pass_2026_06_26.md` + +### N. Codex Round 31 Top 150 +输出:`antigravity_round30_codex_round31_top150_2026_06_26.md` + +### O. 最终执行总报告 +输出:`antigravity_round30_final_execution_board_2026_06_26.md` + +必须回答: +1. 哪些工作今天就该由 Codex 直接写代码完成。 +2. 哪些必须继续压给副手。 +3. 哪些必须等待人工外部 oracle。 +4. 哪些只是同步工作,不是算法工作。 +5. 哪些对“本地立即可测准确率”最关键。 + +## 额外 3 份自选报告 + +副手必须再自选 3 个它认为最容易被忽略、但直接影响“本地可用性 + skill 同步 + 准确率验证”的主题。 + +## 状态定义 + +只有当报告真正把“同步、分发、复用、验证、可执行任务”五条线压缩成开发顺序矩阵时,才能写: + +`已成立` + +否则必须写: + +`部分成立` diff --git a/docs/research/skill_single_source_of_truth_2026_06_26.md b/docs/research/skill_single_source_of_truth_2026_06_26.md new file mode 100644 index 00000000..4a8f374f --- /dev/null +++ b/docs/research/skill_single_source_of_truth_2026_06_26.md @@ -0,0 +1,61 @@ +# Skill Single Source of Truth (2026-06-26) + +## Decision + +The only authoritative Jyotish skill source is: + +- `/Users/wuyongnaren/Documents/印度占星` + +This repo is the single source of truth for: + +- `SKILL.md` +- `references/technique_registry.json` +- `references/strict-workflow-router.md` +- `skills/jyotish-engine-modules/SKILL.md` +- `skills/jyotish-full-reading-integration/SKILL.md` + +## Distribution Targets + +The following locations are distribution copies only, not development sources: + +- `/Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology` +- any other historical `jyotish-vedic-astrology` copies under recovery/archive folders + +They must only be updated from the main repo. +They must never overwrite the main repo. + +## Sync Whitelist + +When syncing the installed skill copy, only sync: + +- `SKILL.md` +- `references/technique_registry.json` +- `references/strict-workflow-router.md` +- `skills/jyotish-engine-modules/SKILL.md` +- `skills/jyotish-full-reading-integration/SKILL.md` + +## Do Not Sync + +Do not sync these into the installed skill copy by default: + +- `scripts/*.py` +- `tests/*` +- `jyotish-app/*` +- `node_modules/` +- `dist/` +- runtime reports, smoke outputs, caches, logs + +## Operational Rule + +1. Edit only the main repo. +2. Commit and push the main repo. +3. If the installed WorkBuddy skill needs updating, sync only the whitelist files from the main repo. +4. Historical copies remain archive/reference only. + +## Current Action Taken + +On 2026-06-26, the whitelist files from the main repo were synced into: + +- `/Users/wuyongnaren/.workbuddy/skills/jyotish-vedic-astrology` + +This makes the installed skill copy match the main repo for skill-definition files, while keeping app/backend code in the repo only. diff --git a/jyotish-app/skill-map.js b/jyotish-app/skill-map.js index 5fd568bf..c141eca6 100644 --- a/jyotish-app/skill-map.js +++ b/jyotish-app/skill-map.js @@ -61,7 +61,7 @@ const TECHNIQUE_API_ENDPOINTS = { career: '/api/career', relationship: '/api/relationship', 'full-reading': '/api/chart', - tajika: '/api/annual', + tajika: '/api/tajika', 'solar-return': '/api/annual', muhurta: '/api/muhurta', 'bhava-chalit': '/api/bhava_chalit', @@ -1986,6 +1986,7 @@ function actionForEndpoint(endpoint) { return { '/api/varga_full': 'varga', '/api/annual': 'annual', + '/api/tajika': 'annual', '/api/muhurta': 'muhurta', '/api/bhava_chalit': 'bhava', '/api/sudarshana': 'sudarshana', @@ -2018,6 +2019,7 @@ function endpointForAction(action) { return { varga: '/api/varga_full', annual: '/api/annual', + tajika: '/api/tajika', muhurta: '/api/muhurta', bhava: '/api/bhava_chalit', sudarshana: '/api/sudarshana', diff --git a/scripts/jyotish_api_server.py b/scripts/jyotish_api_server.py index 3f6fbce0..d6a13412 100644 --- a/scripts/jyotish_api_server.py +++ b/scripts/jyotish_api_server.py @@ -68,7 +68,7 @@ API_COMMAND_MAP = { 'career': '/api/career', 'relationship': '/api/relationship', 'full-reading': '/api/chart', - 'tajika': '/api/annual', + 'tajika': '/api/tajika', 'solar-return': '/api/annual', 'muhurta': '/api/muhurta', 'panchanga-range': '/api/panchanga_range', @@ -253,6 +253,9 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): elif path == '/api/annual': result = self._compute_annual(body) self._json(result) + elif path == '/api/tajika': + result = self._compute_tajika(body) + self._json(result) elif path == '/api/muhurta': result = self._compute_muhurta(body) self._json(result) @@ -2933,6 +2936,14 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): ) return {'success': True, 'endpoint': 'annual', 'report': report} + def _compute_tajika(self, body): + result = self._compute_annual(body) + return { + **result, + 'endpoint': 'tajika', + 'alias_of': 'annual', + } + def _compute_muhurta(self, body): has_range = body.get('start_date') or body.get('end_date') or body.get('start') or body.get('end') query_date = body.get('date') or datetime.now().strftime('%Y-%m-%d') diff --git a/scripts/jyotish_engine.py b/scripts/jyotish_engine.py index 9624f0b3..f59c400f 100644 --- a/scripts/jyotish_engine.py +++ b/scripts/jyotish_engine.py @@ -44,6 +44,7 @@ import math import sqlite3 from datetime import datetime, timedelta from typing import Dict, List +from tabulate import tabulate from ayanamsa_utils import ( AYANAMSA_DISPLAY_NAMES, @@ -431,6 +432,30 @@ def output_json(data): print(json.dumps(data, ensure_ascii=False, indent=2, default=str)) +def output_table(command, data): + """Human-readable ASCII table output for selected commands.""" + if command == 'chart': + birth_info = data.get('birth_info', {}) if isinstance(data, dict) else {} + ascendant = data.get('ascendant', {}) if isinstance(data, dict) else {} + planets = data.get('planets', {}) if isinstance(data, dict) else {} + rows = [] + for planet_name, planet_data in planets.items(): + if not isinstance(planet_data, dict): + continue + rows.append([ + planet_name, + planet_data.get('sign', ''), + planet_data.get('house', ''), + planet_data.get('nakshatra', ''), + planet_data.get('status', ''), + ]) + print(f"Birth: {birth_info.get('date', '')} {birth_info.get('time', '')}") + print(f"Ascendant: {ascendant.get('sign', '')} {ascendant.get('degree', '')}") + print(tabulate(rows, headers=['Planet', 'Sign', 'House', 'Nakshatra', 'Status'], tablefmt='github')) + return + output_json(data) + + def _second_arg(value): """Validate CLI birth second values.""" second = int(value) @@ -4438,6 +4463,7 @@ def main(): p = sub.add_parser('chart', help='计算完整星盘') _add_chart_args(p) p.add_argument('--validate', action='store_true', help='附加R1-R10数学验证') + p.add_argument('--table', action='store_true', help='以 ASCII 表格输出核心排盘结果') # 2. dasha p = sub.add_parser('dasha', help='计算Dasha大运') @@ -4737,7 +4763,10 @@ def main(): output_json(result) sys.exit(0 if result.get('valid', True) else 1) result = cmds[args.command](args) - output_json(result) + if getattr(args, 'table', False): + output_table(args.command, result) + else: + output_json(result) if __name__ == '__main__': diff --git a/tests/test_api_server_security.py b/tests/test_api_server_security.py index 9a687b0a..2bc83910 100644 --- a/tests/test_api_server_security.py +++ b/tests/test_api_server_security.py @@ -536,6 +536,7 @@ def test_capability_audit_scans_registry_and_local_sources() -> None: assert audit['registry']['technique_count'] >= 60 assert audit['surfaces']['engine_command_count'] >= 30 assert '/api/chart' in audit['surfaces']['api_endpoints'] + assert '/api/tajika' in audit['surfaces']['api_endpoints'] assert 'varga-full' not in audit['surfaces']['engine_not_api'] assert 'jaimini' not in audit['surfaces']['engine_not_api'] assert 'ashtakavarga' not in audit['surfaces']['engine_not_api'] @@ -604,6 +605,7 @@ def test_technique_catalog_exposes_runnable_api_examples() -> None: assert catalog['summary']['technique_count'] >= 60 assert catalog['summary']['runnable_count'] >= 20 assert '/api/ashtakavarga' in catalog['filters']['api_endpoints'] + assert '/api/tajika' in catalog['filters']['api_endpoints'] assert '/api/deep_varga_avastha' in catalog['filters']['api_endpoints'] assert catalog['example_payloads']['/api/ashtakavarga']['planets'] assert catalog['example_payloads']['/api/deep_varga_avastha']['planets'] @@ -922,6 +924,30 @@ def test_annual_endpoint_returns_varshaphala_report() -> None: assert strength['summary']['next_action'] +def test_tajika_endpoint_alias_returns_varshaphala_report() -> None: + handler = _handler() + result = handler._compute_tajika({ + 'year': 1990, + 'month': 6, + 'day': 15, + 'hour': 12, + 'minute': 0, + 'lat': 28.6, + 'lon': 77.2, + 'tz': 5.5, + 'target_year': 2026, + }) + + assert result['success'] is True + assert result['endpoint'] == 'tajika' + assert result['alias_of'] == 'annual' + assert result['report']['target_year'] == 2026 + assert 'muntha' in result['report'] + strength = result['report']['tajika_strength'] + assert strength['method'] == 'Tajika Harsha/Panchavargiya Bala' + assert strength['summary']['strongest_planets'] + + def test_bhava_chalit_endpoint_compares_shifted_houses() -> None: handler = _handler() result = handler._compute_bhava_chalit({ diff --git a/tests/test_cli_smoke.py b/tests/test_cli_smoke.py index 72aa1c96..d5b75a35 100644 --- a/tests/test_cli_smoke.py +++ b/tests/test_cli_smoke.py @@ -37,6 +37,17 @@ def run_engine(*args: str) -> dict: return json.loads(completed.stdout) +def run_engine_text(*args: str) -> str: + completed = subprocess.run( + [sys.executable, str(ENGINE), *args], + cwd=ROOT, + check=True, + capture_output=True, + text=True, + ) + return completed.stdout + + def test_dignity_helper_uses_planet_attitude_to_sign_lord() -> None: sys.path.insert(0, str(ROOT / "scripts")) import jyotish_engine @@ -133,6 +144,17 @@ def test_chart_reports_friend_and_enemy_sign_dignity_for_user_case() -> None: assert result["planets"]["Jupiter"]["status"] == "入敌(Enemy Sign)" +def test_chart_table_mode_prints_readable_ascii_table() -> None: + output = run_engine_text("chart", *BASE_BIRTH_ARGS, "--table") + + assert "Planet" in output + assert "Sign" in output + assert "House" in output + assert "Ascendant" in output + assert "Sun" in output + assert "Moon" in output + + def test_full_reading_accepts_second_and_preserves_birth_time_precision() -> None: result = run_engine( "full-reading",