diff --git a/docs/research/antigravity_sidecar_work_order_round32_2026_06_26.md b/docs/research/antigravity_sidecar_work_order_round32_2026_06_26.md new file mode 100644 index 00000000..dceb1595 --- /dev/null +++ b/docs/research/antigravity_sidecar_work_order_round32_2026_06_26.md @@ -0,0 +1,160 @@ +# Antigravity AI 副手任务单 Round 32(2026-06-26) + +## 本轮目标 + +Round 32 不再重复做能力清点。 + +这一轮只做三类“直接减轻 Codex 主线算力和注意力负担”的重任务: + +1. 把已有报告压缩成 **代码可执行清单**,尤其是 API / CLI / 前端 / 同步 / oracle 五条线。 +2. 按“本地立即可测准确率”优先级,给出 **最短开发路径与最短人工验证路径**。 +3. 继续全网检索和本机复用,找出 **可以合法直接复制** 的高 ROI 常量、数据表、接口设计与非 GPL 文档结构。 + +## 严格边界 + +禁止: + +- 不要修改任何 `scripts/`、`tests/`、`jyotish-app/`、`README.md`、`SKILL.md`、`references/`、`.gitignore`。 +- 不要 push / commit / rebase / reset / stash / 删除 / 移动任何文件。 +- 不要输出任何 token、cookie、SSH 私钥、浏览器本地凭证、系统账号隐私。 +- 不要把 GPL / AGPL / LGPL / 闭源代码列入可直接复制区。 + +允许: + +- 只新增 `docs/research/antigravity_round32_*_2026_06_26.md` +- 运行只读命令、联网检索、license 检查、目录扫描、黑盒测试、对照分析。 + +## 必跑命令 + +```bash +git status --short --branch +git log --oneline --decorate -n 30 +git ls-remote ssh://git@ssh.github.com:443/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 4 -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 -maxdepth 6 -type f \( -name 'SKILL.md' -o -name 'technique_registry.json' -o -name 'strict-workflow-router.md' \) 2>/dev/null | sort +find /Users/wuyongnaren -maxdepth 7 -type f \( -name 'SKILL.md' -o -name 'technique_registry.json' -o -name 'strict-workflow-router.md' \) 2>/dev/null | rg "jyotish|vedic|占星|印度占星|workbuddy|skill" +rg -n "Tajika|Varshaphala|Jaimini|Chara Dasha|Narayana|Kalachakra|KP|Prashna|Shadbala|Bhava Bala|Ashtakavarga|Yoga Pinda|Panchanga|Muhurta|Porutham|Synastry|Ayanamsa|oracle|external_verified|artifacts|table|tabulate|timezone|DST|polar" 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|benchmark_only" 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_round32_*_2026_06_26.md` + +每份报告至少包含: + +- 25 个检查点 +- 10 条命令 / URL / 文件路径 +- 10 条 Codex 可直接执行任务 +- 3 条继续交给下一轮副手的任务 +- 1 条必须人工外部 oracle / JHora / PyJHora / 真实截图参与的任务 +- 1 个明确状态:`已成立` / `部分成立` / `未成立` / `需要人工外部工具` / `license_blocked` + +## 指定工作包 + +### A. API 直接编码任务 Top 40 +输出:`antigravity_round32_api_direct_coding_top40_2026_06_26.md` + +要求: +- 每条都必须精确到 endpoint、payload、预期响应字段、对应测试文件。 +- 特别关注 `/api/dasha/chara`、`/api/tajika`、`/api/muhurta`、`/api/varga_full`、`/api/jaimini`。 + +### B. CLI 直接编码任务 Top 40 +输出:`antigravity_round32_cli_direct_coding_top40_2026_06_26.md` + +重点: +- 哪些命令最该补 `--table` +- 哪些 CLI 错误信息最该做人类可读化 +- 哪些命令本地测试价值最高 + +### C. 前端直接编码任务 Top 40 +输出:`antigravity_round32_frontend_direct_coding_top40_2026_06_26.md` + +重点: +- 后端已存在、但前端还没暴露的高 ROI 技能 +- 哪些最能让用户立刻感知“能力完整” + +### D. 云端/本地/WorkBuddy 同步执行脚本建议 +输出:`antigravity_round32_sync_script_blueprint_2026_06_26.md` + +要求: +- 给出 `rsync` / `ln -sf` / 白名单同步建议 +- 明确哪些文件必须同步,哪些必须排除 +- 严禁建议同步源码缓存、日志、测试输出、dist 垃圾 + +### E. MIT 可直接搬运代码资产 Top 100 +输出:`antigravity_round32_copy_allowed_assets_top100_2026_06_26.md` + +要求: +- 精确到仓库、文件、函数、常量、数据表、API schema +- 每项都给出 license 判断和用途 + +### F. GPL/AGPL/LGPL 黑名单隔离复核 +输出:`antigravity_round32_license_blacklist_recheck_2026_06_26.md` + +### G. 本地立即测准确率最短链路终稿 +输出:`antigravity_round32_local_accuracy_shortest_chain_final_2026_06_26.md` + +要求: +- 只保留真正影响“今天就测”的事项 +- 把无关项全部后移 + +### H. 真实 oracle 样本推进矩阵 +输出:`antigravity_round32_oracle_sample_push_matrix_2026_06_26.md` + +### I. JHora / PyJHora 截图与人工录入流程压缩版 +输出:`antigravity_round32_jhora_pyjhora_fast_capture_pipeline_2026_06_26.md` + +### J. 时区 / DST / 极地异常直接落地任务 +输出:`antigravity_round32_timezone_dst_polar_direct_tasks_2026_06_26.md` + +要求: +- 不要再泛讲风险 +- 必须给出具体异常输入、预期防御、建议测试 + +### K. 传统技法真缺口再排序 Top 20 +输出:`antigravity_round32_true_missing_techniques_rerank_top20_2026_06_26.md` + +### L. 用户本地使用体验直接优化 Top 30 +输出:`antigravity_round32_local_ux_direct_top30_2026_06_26.md` + +### M. 可复用碎片第五轮排查 +输出:`antigravity_round32_whole_machine_fragment_reuse_fifth_pass_2026_06_26.md` + +### N. Codex Round 33 Top 200 +输出:`antigravity_round32_codex_round33_top200_2026_06_26.md` + +### O. 最终执行总板 +输出:`antigravity_round32_final_execution_board_2026_06_26.md` + +必须明确: +1. 今天最该写代码的前 20 项 +2. 今天最该同步的前 10 项 +3. 今天最该压给副手的前 20 项 +4. 哪些必须等待人工 oracle +5. 哪些看起来热闹但应推迟 + +## 额外 4 份补充报告 + +副手还必须自选 4 份高影响补充报告,主题只能从以下范围选择: + +- 本地离线模式 / API fallback +- 性能/内存/超大 JSON 压力 +- 多语言/i18n/术语译名 +- 真实用户的精度验证阻塞 + +## 状态定义 + +只有当报告真正能被 Codex “直接翻译成代码/同步命令/验证步骤”时,才能写: + +`已成立` + +否则只能写: + +`部分成立` / `未成立` / `需要人工外部工具` / `license_blocked` diff --git a/scripts/jyotish_api_server.py b/scripts/jyotish_api_server.py index d6a13412..35ea3621 100644 --- a/scripts/jyotish_api_server.py +++ b/scripts/jyotish_api_server.py @@ -62,6 +62,7 @@ API_COMMAND_MAP = { 'synastry': '/api/synastry', 'ashtakoot': '/api/synastry', 'dasha': '/api/dasha', + 'chara-dasha': '/api/dasha/chara', 'remedies': '/api/remedies', 'sade_sati': '/api/sade_sati', 'pancha_mahapurusha': '/api/pancha_mahapurusha', @@ -100,6 +101,7 @@ TECHNIQUE_EXAMPLE_ENDPOINTS = { '/api/career', '/api/case_validation', '/api/dasha', + '/api/dasha/chara', '/api/divisional_yoga', '/api/deep_varga_avastha', '/api/jaimini', @@ -229,6 +231,9 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): elif path == '/api/dasha': result = self._compute_dasha_system(body) self._json(result) + elif path == '/api/dasha/chara': + result = self._compute_chara_dasha(body) + self._json(result) elif path == '/api/sade_sati': result = self._compute_sade_sati(body) self._json(result) @@ -2944,6 +2949,16 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): 'alias_of': 'annual', } + def _compute_chara_dasha(self, body): + payload = dict(body or {}) + payload['mode'] = 'dasha' + result = self._compute_jaimini(payload) + return { + **result, + 'endpoint': 'chara_dasha', + 'alias_of': 'jaimini', + } + 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') @@ -3747,6 +3762,8 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): for command in commands if API_COMMAND_MAP.get(command) in api_endpoints ] + if technique.get('id') == 'jaimini_chara_dasha' and '/api/dasha/chara' in api_endpoints: + mapped.append('/api/dasha/chara') runnable = [endpoint for endpoint in mapped if endpoint in TECHNIQUE_EXAMPLE_ENDPOINTS] primary_endpoint = self._primary_catalog_endpoint(technique, mapped, runnable) rows.append({ @@ -3787,6 +3804,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): ('/api/relationship', ['relationship', 'spouse', '婚姻', '感情']), ('/api/career', ['career', '事业']), ('/api/dasha', ['dasha', 'vimshottari']), + ('/api/dasha/chara', ['chara dasha', 'chara_dasha', 'jaimini dasha']), ('/api/yogas', ['yoga', 'dosha']), ('/api/shadbala', ['shadbala']), ('/api/deep_varga_avastha', ['deep_varga_avastha', 'deep varga', 'avastha', 'sayanadi', 'shayanadi', 'd24', 'd30', 'd60']), @@ -3864,6 +3882,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): '/api/career': self._compute_career, '/api/case_validation': self._compute_case_validation, '/api/dasha': self._compute_dasha_system, + '/api/dasha/chara': self._compute_chara_dasha, '/api/deep_varga_avastha': self._compute_deep_varga_avastha, '/api/divisional_yoga': self._compute_divisional_yoga, '/api/jaimini': self._compute_jaimini, @@ -3985,6 +4004,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): '/api/career': 'Compute career analysis from planets and ascendant', '/api/case_validation': 'Run case validation and MEVG gate status', '/api/dasha': 'Compute Dasha periods and Vimshottari analysis layer', + '/api/dasha/chara': 'Compute explicit Jaimini Chara Dasha timing layer', '/api/deep_varga_avastha': 'Compute Sayanadi/Shayanadi avastha and D24/D30/D60 templates', '/api/divisional_yoga': 'Detect D9/D10/D12 divisional yogas', '/api/jaimini': 'Compute Jaimini karaka, arudha, dasha, and karakamsha data', @@ -4042,6 +4062,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): '/api/career': {'planets': SAMPLE_PLANETS, 'asc_sign': 'Aries'}, '/api/case_validation': {**base, 'current_md': 'Jupiter', 'predicted_events': ['事业巅峰', '关系发展'], 'transit_desc': 'Double Jupiter Saturn activation'}, '/api/dasha': {**base, **birth, 'dasha': 'vimshottari'}, + '/api/dasha/chara': {**base, **birth, 'antardasha': True}, '/api/deep_varga_avastha': base, '/api/divisional_yoga': {**base, 'divisions': ['D9', 'D10', 'D12']}, '/api/jaimini': {**base, **birth, 'mode': 'all'}, diff --git a/tests/test_api_server_security.py b/tests/test_api_server_security.py index 2bc83910..07ac497f 100644 --- a/tests/test_api_server_security.py +++ b/tests/test_api_server_security.py @@ -627,6 +627,49 @@ def test_technique_catalog_exposes_runnable_api_examples() -> None: handler._compute_technique_example({'endpoint': '/api/report_artifact'}) +def test_chara_dasha_endpoint_alias_returns_jaimini_dasha_payload() -> None: + handler = _handler() + result = handler._compute_chara_dasha({ + 'planets': jyotish_api_server.SAMPLE_PLANETS, + 'ascendant': jyotish_api_server.SAMPLE_ASCENDANT, + 'year': 1990, + 'month': 1, + 'day': 1, + 'hour': 12, + 'minute': 0, + 'lat': 28.6, + 'lon': 77.2, + 'tz': 5.5, + 'antardasha': True, + }) + + assert result['success'] is True + assert result['endpoint'] == 'chara_dasha' + assert result['alias_of'] == 'jaimini' + assert result['mode'] == 'dasha' + assert result['result']['chara_dasha'] + + +def test_capability_audit_lists_chara_dasha_endpoint() -> None: + handler = _handler() + audit = handler._capability_audit() + + assert '/api/dasha/chara' in audit['surfaces']['api_endpoints'] + + +def test_technique_catalog_exposes_chara_dasha_example() -> None: + handler = _handler() + catalog = handler._technique_catalog() + + assert '/api/dasha/chara' in catalog['filters']['api_endpoints'] + assert catalog['example_payloads']['/api/dasha/chara']['antardasha'] is True + + result = handler._compute_technique_example({'endpoint': '/api/dasha/chara'}) + assert result['success'] is True + assert result['target_endpoint'] == '/api/dasha/chara' + assert result['result']['result']['chara_dasha'] + + def test_thematic_report_declares_orchestrator_fragments() -> None: handler = _handler() result = handler._compute_thematic_report({'theme': 'marriage'})