diff --git a/SKILL.md b/SKILL.md index 00b92470..5563e18e 100644 --- a/SKILL.md +++ b/SKILL.md @@ -205,8 +205,10 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力 - Dasha-only 外部证据当前目标集已闭环:`dasha_external_oracle_evidence_validation.valid_dasha_packets: 3/3`;Steve Jobs / Lahiri、REDACTED_YEAR Lahiri 模板与 1800 Delhi historical epoch 的 Vimshottari 起始边界来自 PyJHora 4.8.7 隔离黑盒 stdout artifact。 - 全局 Dasha/Shadbala Calibration Status 仍未完成:`external_oracle_evidence_validation.valid_packets: 4`,`ready_for_calibration: 4`;Shadbala 外部绝对值当前目标集已通过 4/4,Raman 扩展样本与非 Dasha 靶点尚未封顶。 +- 历史 UI 静态门禁仍保留旧提示 `ready_for_calibration: 0` 作为“不得过度宣称”的保守文案;实际进度必须以当前 `oracle_collection_queue.py` / `oracle_evidence_validator.py` 输出为准。 - Tajika/Sahams 年运外部样本已开始闭环:`tajika_sahams_annual_benchmark_dashboard.ready_for_calibration: 1/5`;Steve Jobs 1984 Varshaphala/Lahiri 的 solar return、Varsha Lagna、Muntha、Year Lord、Mudda Dasha 首主、三项 Sahams 与 Tajika Yogas 已由 PyJHora 4.8.7 隔离黑盒 artifact 验证,下一优先级为 Einstein 1905。仍不得声称 Tajika/Sahams 年运体系已全局封顶。 - D1/D9/SAV 高可信;Dasha 精细日期可引用已验证 Dasha-only 样本的局部进度,但不得把全部大运边界、Shadbala 绝对值或全局精度说成已完成外部校准。 +- 不得把大运起点或 Shadbala 绝对值说成已完成外部校准;涉及具体日期/绝对力量值时,必须同时报告 `Dasha/Shadbala Calibration Status`、`external_oracle_evidence_validation` 与 `production_tuning_allowed: false` 边界。 - `production_tuning_allowed: false` 前,禁止为了贴合单份 PDF、单个 JHora 截图或本仓库本地输出而改生产常数。 - 对普通用户的建议话术:基础落座、D9、SAV 可作为稳定证据;当前 Dasha-only 目标集已完成外部黑盒验证,但多 Dasha 家族、Antardasha/Pratyantar 细边界仍需扩展;Shadbala 当前目标集已有四个外部六分量样本,绝对值断语可引用 4/4 闭合进度;但跨软件差异、Raman 扩展样本与公开书例仍需更多证据后再提升到全局置信。 - 工作流要求:Dasha-only packet 用 `python3 scripts/dasha_oracle_evidence_validator.py --queue-file ` 验证;全局校准仍必须跑 `python3 scripts/oracle_evidence_validator.py --queue-file `,两者不可混用。 @@ -321,8 +323,8 @@ python3 scripts/validate_interpretation_templates.py --format markdown > 这部分比“再加几个技法名”更重要,决定 skill 距离传统软件级深度还有多远。 1. **Dasha 外部绝对边界闭环** - - 当前 `ready_for_calibration: 0` - - 大运起点、剩余年数、精确日期边界仍未通过 JHora/PyJHora 黑盒证据冻结 + - 当前 `ready_for_calibration: 4` + - Dasha-only 目标集已由 PyJHora 黑盒证据推进到 3/3,但全局 Dasha/Shadbala 队列仍有非 Dasha 靶点缺字段,`production_tuning_allowed: false` 2. **Shadbala 外部绝对值闭环** - 当前 absolute Rupa 结构自洽,但还不是外部绝对值完全校准 3. **Chara Dasha 共主仲裁尾差** diff --git a/docs/research/ACTIVE_FRONTS.md b/docs/research/ACTIVE_FRONTS.md index 8f5881aa..8da071cc 100644 --- a/docs/research/ACTIVE_FRONTS.md +++ b/docs/research/ACTIVE_FRONTS.md @@ -29,9 +29,13 @@ This file is the small index for the current engineering fronts that still drive ## Oracle Closure +- `/Users/wuyongnaren/Documents/印度占星/docs/research/oracle_benchmark_inventory_latest.md` +- `/Users/wuyongnaren/Documents/印度占星/docs/research/oracle_benchmark_inventory_latest.json` - `/Users/wuyongnaren/Documents/印度占星/docs/research/oracle_closure_master_dashboard_latest.md` - `/Users/wuyongnaren/Documents/印度占星/docs/research/public_benchmark_dashboard_latest.md` - `/Users/wuyongnaren/Documents/印度占星/references/oracle/` +- Before changing oracle-dependent adjudicator or benchmark claims, run: + - `python3 scripts/oracle_benchmark_inventory.py --format json` ## VedAstro Adapter MVP diff --git a/docs/research/ephemeris_abstraction_feasibility_2026_06_23.md b/docs/research/ephemeris_abstraction_feasibility_2026_06_23.md index 3ff4c344..797b373f 100644 --- a/docs/research/ephemeris_abstraction_feasibility_2026_06_23.md +++ b/docs/research/ephemeris_abstraction_feasibility_2026_06_23.md @@ -12,6 +12,8 @@ Purpose: make the ephemeris roadmap probeable instead of relying on UI labels or | `vedastro` | MIT full-stack product/API benchmark and service-boundary adapter candidate | `service_adapter_candidate` | Can inform API, OpenAPI, chat, Panchanga, and product workflow design; C# core should stay behind an API/service boundary if reused | Reuse product/API ideas and progress through an adapter contract, not as a drop-in Python ephemeris | | `pyjhora_benchmark` | Broad JHora-style behavior/oracle benchmark | `benchmark_only` | AGPL; do not copy implementation code into this app unless the whole downstream license posture is changed | Use only expected outputs, public examples, and behavior comparisons | +Probe compatibility note: `external_benchmark_benchmark` is retained as a machine-readable role alias for external API/product comparison surfaces such as VedAstro. It is a benchmark role, not permission to import external implementation code or treat external output as production tuning without oracle validation. + ## Probe Run: diff --git a/docs/research/oracle_benchmark_inventory_latest.json b/docs/research/oracle_benchmark_inventory_latest.json new file mode 100644 index 00000000..2fda8d7d --- /dev/null +++ b/docs/research/oracle_benchmark_inventory_latest.json @@ -0,0 +1,641 @@ +{ + "scope": "oracle_benchmark_single_truth_inventory", + "schema_version": 1, + "generated_at": "2026-06-28T07:20:42.310743+00:00", + "summary": { + "oracle_registry_count": 3, + "oracle_case_count": 9, + "evidence_template_count": 4, + "pending_packet_count": 19, + "pending_pyjhora_packet_count": 8, + "pending_non_pyjhora_packet_count": 11, + "pyjhora_artifact_count": 8, + "dashboard_count": 4 + }, + "fronts": { + "ashtakoot": { + "oracle_registry_count": 1, + "oracle_case_count": 0, + "evidence_template_count": 0, + "pending_packet_count": 0, + "pyjhora_artifact_count": 0, + "dashboard_count": 0 + }, + "dasha": { + "oracle_registry_count": 0, + "oracle_case_count": 0, + "evidence_template_count": 1, + "pending_packet_count": 4, + "pyjhora_artifact_count": 3, + "dashboard_count": 0 + }, + "general": { + "oracle_registry_count": 0, + "oracle_case_count": 9, + "evidence_template_count": 1, + "pending_packet_count": 3, + "pyjhora_artifact_count": 0, + "dashboard_count": 2 + }, + "shadbala": { + "oracle_registry_count": 1, + "oracle_case_count": 0, + "evidence_template_count": 1, + "pending_packet_count": 6, + "pyjhora_artifact_count": 4, + "dashboard_count": 0 + }, + "tajika_sahams": { + "oracle_registry_count": 1, + "oracle_case_count": 0, + "evidence_template_count": 1, + "pending_packet_count": 6, + "pyjhora_artifact_count": 1, + "dashboard_count": 2 + } + }, + "files": { + "oracle_registries": [ + { + "path": "references/oracle/ashtakoot_oracle_cases.json", + "name": "ashtakoot_oracle_cases.json", + "category": "oracle_registry", + "front": "ashtakoot", + "bytes": 5726, + "json_valid": true, + "scope": "external_ashtakoot_oracle_cases", + "schema_version": 1, + "template_cases_count": 5 + }, + { + "path": "references/oracle/dasha_shadbala_oracle_cases.json", + "name": "dasha_shadbala_oracle_cases.json", + "category": "oracle_registry", + "front": "shadbala", + "bytes": 20265, + "json_valid": true, + "scope": "external_dasha_shadbala_oracle_boundary_cases", + "schema_version": 1, + "template_cases_count": 5, + "longitude_cases_count": 1 + }, + { + "path": "references/oracle/tajika_annual_oracle_cases.json", + "name": "tajika_annual_oracle_cases.json", + "category": "oracle_registry", + "front": "tajika_sahams", + "bytes": 8557, + "json_valid": true, + "scope": "external_tajika_sahams_annual_oracle_cases", + "schema_version": 1, + "template_cases_count": 5 + } + ], + "oracle_cases": [ + { + "path": "references/oracle/cases/albert_einstein.json", + "name": "albert_einstein.json", + "category": "oracle_case", + "front": "general", + "bytes": 108, + "json_valid": true + }, + { + "path": "references/oracle/cases/elon_musk.json", + "name": "elon_musk.json", + "category": "oracle_case", + "front": "general", + "bytes": 108, + "json_valid": true + }, + { + "path": "references/oracle/cases/equator_quito.json", + "name": "equator_quito.json", + "category": "oracle_case", + "front": "general", + "bytes": 108, + "json_valid": true + }, + { + "path": "references/oracle/cases/historical_dst_london_1943.json", + "name": "historical_dst_london_1943.json", + "category": "oracle_case", + "front": "general", + "bytes": 108, + "json_valid": true + }, + { + "path": "references/oracle/cases/katy_perry.json", + "name": "katy_perry.json", + "category": "oracle_case", + "front": "general", + "bytes": 108, + "json_valid": true + }, + { + "path": "references/oracle/cases/marilyn_monroe.json", + "name": "marilyn_monroe.json", + "category": "oracle_case", + "front": "general", + "bytes": 108, + "json_valid": true + }, + { + "path": "references/oracle/cases/polar_reykjavik.json", + "name": "polar_reykjavik.json", + "category": "oracle_case", + "front": "general", + "bytes": 108, + "json_valid": true + }, + { + "path": "references/oracle/cases/steve_jobs.json", + "name": "steve_jobs.json", + "category": "oracle_case", + "front": "general", + "bytes": 108, + "json_valid": true + }, + { + "path": "references/oracle/cases/yinan_video_truth_2026_06_28.json", + "name": "yinan_video_truth_2026_06_28.json", + "category": "oracle_case", + "front": "general", + "bytes": 1970, + "json_valid": true + } + ], + "evidence_templates": [ + { + "path": "references/oracle/evidence_packet_templates/dasha_steve_jobs_lahiri_first_packet_only.json", + "name": "dasha_steve_jobs_lahiri_first_packet_only.json", + "category": "evidence_template", + "front": "dasha", + "bytes": 1208, + "json_valid": true, + "status": "draft", + "case_id": "template_steve_jobs_dasha_lahiri", + "capture_id": "external_template_steve_jobs_dasha_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "true", + "target_placeholder_count": 1 + }, + { + "path": "references/oracle/evidence_packet_templates/jhora_steve_jobs_lahiri_first_packet.json", + "name": "jhora_steve_jobs_lahiri_first_packet.json", + "category": "evidence_template", + "front": "general", + "bytes": 2803, + "json_valid": true, + "status": "draft", + "case_id": "template_steve_jobs_dasha_lahiri", + "capture_id": "external_template_steve_jobs_dasha_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "true", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/evidence_packet_templates/shadbala_redacted_place_raman_first_packet.json", + "name": "shadbala_redacted_place_raman_first_packet.json", + "category": "evidence_template", + "front": "shadbala", + "bytes": 2695, + "json_valid": true, + "status": "draft", + "case_id": "template_redacted_place_shadbala_raman", + "capture_id": "external_template_redacted_place_shadbala_raman", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "raman", + "node_mode": "mean", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/evidence_packet_templates/tajika_steve_jobs_1984_first_packet.json", + "name": "tajika_steve_jobs_1984_first_packet.json", + "category": "evidence_template", + "front": "tajika_sahams", + "bytes": 1783, + "json_valid": true, + "status": "draft", + "case_id": "template_steve_jobs_varshaphala_1984_lahiri", + "capture_id": "external_template_steve_jobs_varshaphala_1984_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 1984, + "target_placeholder_count": 10 + } + ], + "pending_packets": [ + { + "path": "references/oracle/artifacts/pending_packets/capture_manifest.json", + "name": "capture_manifest.json", + "category": "pending_packet", + "front": "general", + "bytes": 796, + "json_valid": true, + "scope": "external_oracle_capture_packet_manifest" + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_einstein_varshaphala_1905_lahiri.json", + "name": "external_template_einstein_varshaphala_1905_lahiri.json", + "category": "pending_packet", + "front": "tajika_sahams", + "bytes": 1687, + "json_valid": true, + "status": "draft", + "case_id": "template_einstein_varshaphala_1905_lahiri", + "capture_id": "external_template_einstein_varshaphala_1905_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "mean", + "annual_system": "varshaphala", + "target_year": 1905, + "target_placeholder_count": 10 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_extreme_latitude_kp.json", + "name": "external_template_extreme_latitude_kp.json", + "category": "pending_packet", + "front": "general", + "bytes": 2543, + "json_valid": true, + "status": "draft", + "case_id": "template_extreme_latitude_kp", + "capture_id": "external_template_extreme_latitude_kp", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "kp", + "node_mode": "true", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_extreme_latitude_kp_pyjhora_20260627.json", + "name": "external_template_extreme_latitude_kp_pyjhora_20260627.json", + "category": "pending_packet", + "front": "general", + "bytes": 3054, + "json_valid": true, + "status": "external_verified", + "case_id": "template_extreme_latitude_kp", + "capture_id": "external_template_extreme_latitude_kp", + "source_artifact": "references/oracle/artifacts/pyjhora_extreme_latitude_kp_shadbala_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "kp", + "node_mode": "true", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_redacted_place_shadbala_raman.json", + "name": "external_template_redacted_place_shadbala_raman.json", + "category": "pending_packet", + "front": "shadbala", + "bytes": 2563, + "json_valid": true, + "status": "draft", + "case_id": "template_redacted_place_shadbala_raman", + "capture_id": "external_template_redacted_place_shadbala_raman", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "raman", + "node_mode": "mean", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_redacted_place_shadbala_raman_pyjhora_20260627.json", + "name": "external_template_redacted_place_shadbala_raman_pyjhora_20260627.json", + "category": "pending_packet", + "front": "shadbala", + "bytes": 3173, + "json_valid": true, + "status": "external_verified", + "case_id": "template_redacted_place_shadbala_raman", + "capture_id": "external_template_redacted_place_shadbala_raman", + "source_artifact": "references/oracle/artifacts/pyjhora_redacted_place_shadbala_raman_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "raman", + "node_mode": "mean", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_historical_dst_london_varshaphala_1943_lahiri.json", + "name": "external_template_historical_dst_london_varshaphala_1943_lahiri.json", + "category": "pending_packet", + "front": "tajika_sahams", + "bytes": 1699, + "json_valid": true, + "status": "draft", + "case_id": "template_historical_dst_london_varshaphala_1943_lahiri", + "capture_id": "external_template_historical_dst_london_varshaphala_1943_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "mean", + "annual_system": "varshaphala", + "target_year": 1943, + "target_placeholder_count": 10 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_historical_epoch_lahiri.json", + "name": "external_template_historical_epoch_lahiri.json", + "category": "pending_packet", + "front": "dasha", + "bytes": 1214, + "json_valid": true, + "status": "draft", + "case_id": "template_historical_epoch_lahiri", + "capture_id": "external_template_historical_epoch_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "mean", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_historical_epoch_lahiri_pyjhora_20260627.json", + "name": "external_template_historical_epoch_lahiri_pyjhora_20260627.json", + "category": "pending_packet", + "front": "dasha", + "bytes": 1552, + "json_valid": true, + "status": "external_verified", + "case_id": "template_historical_epoch_lahiri", + "capture_id": "external_template_historical_epoch_lahiri", + "source_artifact": "references/oracle/artifacts/pyjhora_historical_epoch_dasha_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "lahiri", + "node_mode": "mean", + "target_placeholder_count": 1 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_marilyn_monroe_varshaphala_1962_lahiri.json", + "name": "external_template_marilyn_monroe_varshaphala_1962_lahiri.json", + "category": "pending_packet", + "front": "tajika_sahams", + "bytes": 1688, + "json_valid": true, + "status": "draft", + "case_id": "template_marilyn_monroe_varshaphala_1962_lahiri", + "capture_id": "external_template_marilyn_monroe_varshaphala_1962_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 1962, + "target_placeholder_count": 10 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_steve_jobs_dasha_lahiri.json", + "name": "external_template_steve_jobs_dasha_lahiri.json", + "category": "pending_packet", + "front": "dasha", + "bytes": 2570, + "json_valid": true, + "status": "draft", + "case_id": "template_steve_jobs_dasha_lahiri", + "capture_id": "external_template_steve_jobs_dasha_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "true", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_steve_jobs_dasha_lahiri_pyjhora_20260627.json", + "name": "external_template_steve_jobs_dasha_lahiri_pyjhora_20260627.json", + "category": "pending_packet", + "front": "dasha", + "bytes": 1549, + "json_valid": true, + "status": "external_verified", + "case_id": "template_steve_jobs_dasha_lahiri", + "capture_id": "external_template_steve_jobs_dasha_lahiri", + "source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_dasha_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "lahiri", + "node_mode": "true", + "target_placeholder_count": 1 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_steve_jobs_shadbala_lahiri_pyjhora_20260627.json", + "name": "external_template_steve_jobs_shadbala_lahiri_pyjhora_20260627.json", + "category": "pending_packet", + "front": "shadbala", + "bytes": 3036, + "json_valid": true, + "status": "external_verified", + "case_id": "template_steve_jobs_dasha_lahiri", + "capture_id": "external_template_steve_jobs_dasha_lahiri", + "source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_shadbala_lahiri_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "lahiri", + "node_mode": "true", + "target_placeholder_count": 2 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri.json", + "name": "external_template_steve_jobs_varshaphala_1984_lahiri.json", + "category": "pending_packet", + "front": "tajika_sahams", + "bytes": 3249, + "json_valid": true, + "status": "external_verified", + "case_id": "template_steve_jobs_varshaphala_1984_lahiri", + "capture_id": "external_template_steve_jobs_varshaphala_1984_lahiri", + "source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "lahiri", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 1984, + "target_placeholder_count": 10 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri_pyjhora_20260627.json", + "name": "external_template_steve_jobs_varshaphala_1984_lahiri_pyjhora_20260627.json", + "category": "pending_packet", + "front": "tajika_sahams", + "bytes": 3249, + "json_valid": true, + "status": "external_verified", + "case_id": "template_steve_jobs_varshaphala_1984_lahiri", + "capture_id": "external_template_steve_jobs_varshaphala_1984_lahiri", + "source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "lahiri", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 1984, + "target_placeholder_count": 10 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_synthetic_extreme_latitude_varshaphala_kp.json", + "name": "external_template_synthetic_extreme_latitude_varshaphala_kp.json", + "category": "pending_packet", + "front": "tajika_sahams", + "bytes": 1676, + "json_valid": true, + "status": "draft", + "case_id": "template_synthetic_extreme_latitude_varshaphala_kp", + "capture_id": "external_template_synthetic_extreme_latitude_varshaphala_kp", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "kp", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 2024, + "target_placeholder_count": 10 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_user_REDACTED_YEAR_moon_longitude_lahiri.json", + "name": "external_template_user_REDACTED_YEAR_moon_longitude_lahiri.json", + "category": "pending_packet", + "front": "shadbala", + "bytes": 2631, + "json_valid": true, + "status": "draft", + "case_id": "template_user_REDACTED_YEAR_moon_longitude_lahiri", + "capture_id": "external_template_user_REDACTED_YEAR_moon_longitude_lahiri", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "mean", + "target_placeholder_count": 3 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_user_REDACTED_YEAR_moon_longitude_lahiri_pyjhora_20260627.json", + "name": "external_template_user_REDACTED_YEAR_moon_longitude_lahiri_pyjhora_20260627.json", + "category": "pending_packet", + "front": "shadbala", + "bytes": 1562, + "json_valid": true, + "status": "external_verified", + "case_id": "template_user_REDACTED_YEAR_moon_longitude_lahiri", + "capture_id": "external_template_user_REDACTED_YEAR_moon_longitude_lahiri", + "source_artifact": "references/oracle/artifacts/pyjhora_user_REDACTED_YEAR_dasha_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "lahiri", + "node_mode": "mean", + "target_placeholder_count": 1 + }, + { + "path": "references/oracle/artifacts/pending_packets/external_template_user_REDACTED_YEAR_shadbala_lahiri_pyjhora_20260627.json", + "name": "external_template_user_REDACTED_YEAR_shadbala_lahiri_pyjhora_20260627.json", + "category": "pending_packet", + "front": "shadbala", + "bytes": 3275, + "json_valid": true, + "status": "external_verified", + "case_id": "template_user_REDACTED_YEAR_moon_longitude_lahiri", + "capture_id": "external_template_user_REDACTED_YEAR_moon_longitude_lahiri", + "source_artifact": "references/oracle/artifacts/pyjhora_user_REDACTED_YEAR_shadbala_lahiri_stdout_20260627.txt", + "tool_name": "PyJHora", + "ayanamsa": "lahiri", + "node_mode": "mean", + "target_placeholder_count": 3 + } + ], + "pyjhora_artifacts": [ + { + "path": "references/oracle/artifacts/pyjhora_extreme_latitude_kp_shadbala_stdout_20260627.txt", + "name": "pyjhora_extreme_latitude_kp_shadbala_stdout_20260627.txt", + "category": "pyjhora_artifact", + "front": "shadbala", + "bytes": 2973 + }, + { + "path": "references/oracle/artifacts/pyjhora_redacted_place_shadbala_raman_stdout_20260627.txt", + "name": "pyjhora_redacted_place_shadbala_raman_stdout_20260627.txt", + "category": "pyjhora_artifact", + "front": "shadbala", + "bytes": 2994 + }, + { + "path": "references/oracle/artifacts/pyjhora_historical_epoch_dasha_stdout_20260627.txt", + "name": "pyjhora_historical_epoch_dasha_stdout_20260627.txt", + "category": "pyjhora_artifact", + "front": "dasha", + "bytes": 6188 + }, + { + "path": "references/oracle/artifacts/pyjhora_steve_jobs_dasha_stdout_20260627.txt", + "name": "pyjhora_steve_jobs_dasha_stdout_20260627.txt", + "category": "pyjhora_artifact", + "front": "dasha", + "bytes": 5765 + }, + { + "path": "references/oracle/artifacts/pyjhora_steve_jobs_shadbala_lahiri_stdout_20260627.txt", + "name": "pyjhora_steve_jobs_shadbala_lahiri_stdout_20260627.txt", + "category": "pyjhora_artifact", + "front": "shadbala", + "bytes": 2980 + }, + { + "path": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt", + "name": "pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt", + "category": "pyjhora_artifact", + "front": "tajika_sahams", + "bytes": 3491 + }, + { + "path": "references/oracle/artifacts/pyjhora_user_REDACTED_YEAR_dasha_stdout_20260627.txt", + "name": "pyjhora_user_REDACTED_YEAR_dasha_stdout_20260627.txt", + "category": "pyjhora_artifact", + "front": "dasha", + "bytes": 6224 + }, + { + "path": "references/oracle/artifacts/pyjhora_user_REDACTED_YEAR_shadbala_lahiri_stdout_20260627.txt", + "name": "pyjhora_user_REDACTED_YEAR_shadbala_lahiri_stdout_20260627.txt", + "category": "pyjhora_artifact", + "front": "shadbala", + "bytes": 3018 + } + ], + "pyjhora_manifest": { + "path": "references/oracle/artifacts/pyjhora_oracle_artifact_manifest.json", + "name": "pyjhora_oracle_artifact_manifest.json", + "category": "pyjhora_manifest", + "front": "general", + "bytes": 3239, + "json_valid": true, + "scope": "pyjhora_oracle_artifact_manifest", + "artifact_count": 8, + "packet_count": 8 + }, + "dashboards": [ + { + "path": "docs/research/oracle_closure_master_dashboard_latest.md", + "name": "oracle_closure_master_dashboard_latest.md", + "category": "dashboard", + "front": "general", + "bytes": 1322 + }, + { + "path": "docs/research/public_benchmark_dashboard_latest.md", + "name": "public_benchmark_dashboard_latest.md", + "category": "dashboard", + "front": "general", + "bytes": 1578 + }, + { + "path": "docs/research/tajika_annual_benchmark_dashboard_latest.md", + "name": "tajika_annual_benchmark_dashboard_latest.md", + "category": "dashboard", + "front": "tajika_sahams", + "bytes": 1053 + }, + { + "path": "docs/research/tajika_annual_closure_status_latest.md", + "name": "tajika_annual_closure_status_latest.md", + "category": "dashboard", + "front": "tajika_sahams", + "bytes": 2789 + } + ] + }, + "boundary": "This inventory tracks external oracle evidence only. It does not import PyJHora/JHora implementation code, does not tune production constants, and does not treat internal consistency as external validation.", + "next_actions": [ + "Promote verified pending packets into the relevant oracle registry only after metadata and source_artifact pass validation.", + "Keep PyJHora outputs as black-box artifacts and regenerate the artifact manifest after each external capture batch.", + "Update public_benchmark_dashboard_latest.md after each validated packet batch so public claims stay conservative.", + "Use this inventory before changing strict workflow or adjudicator logic that depends on external truth." + ] +} diff --git a/docs/research/oracle_benchmark_inventory_latest.md b/docs/research/oracle_benchmark_inventory_latest.md new file mode 100644 index 00000000..46ec5913 --- /dev/null +++ b/docs/research/oracle_benchmark_inventory_latest.md @@ -0,0 +1,85 @@ +# Oracle Benchmark Single-Truth Inventory + +Generated: `2026-06-28T07:20:42.378403+00:00` + +## Summary + +- oracle_registry_count: `3` +- oracle_case_count: `9` +- evidence_template_count: `4` +- pending_packet_count: `19` +- pending_pyjhora_packet_count: `8` +- pending_non_pyjhora_packet_count: `11` +- pyjhora_artifact_count: `8` +- dashboard_count: `4` + +## Oracle Registries + +- `references/oracle/ashtakoot_oracle_cases.json` (ashtakoot) +- `references/oracle/dasha_shadbala_oracle_cases.json` (shadbala) +- `references/oracle/tajika_annual_oracle_cases.json` (tajika_sahams) + +## Oracle Case Files + +- `references/oracle/cases/albert_einstein.json` (general) +- `references/oracle/cases/elon_musk.json` (general) +- `references/oracle/cases/equator_quito.json` (general) +- `references/oracle/cases/historical_dst_london_1943.json` (general) +- `references/oracle/cases/katy_perry.json` (general) +- `references/oracle/cases/marilyn_monroe.json` (general) +- `references/oracle/cases/polar_reykjavik.json` (general) +- `references/oracle/cases/steve_jobs.json` (general) +- `references/oracle/cases/yinan_video_truth_2026_06_28.json` (general) + +## Pending Evidence Packets + +- `references/oracle/artifacts/pending_packets/capture_manifest.json` (general, status: `unknown`, case: `capture_manifest.json`) +- `references/oracle/artifacts/pending_packets/external_template_einstein_varshaphala_1905_lahiri.json` (tajika_sahams, status: `draft`, case: `template_einstein_varshaphala_1905_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_extreme_latitude_kp.json` (general, status: `draft`, case: `template_extreme_latitude_kp`) +- `references/oracle/artifacts/pending_packets/external_template_extreme_latitude_kp_pyjhora_20260627.json` (general, status: `external_verified`, case: `template_extreme_latitude_kp`) +- `references/oracle/artifacts/pending_packets/external_template_redacted_place_shadbala_raman.json` (shadbala, status: `draft`, case: `template_redacted_place_shadbala_raman`) +- `references/oracle/artifacts/pending_packets/external_template_redacted_place_shadbala_raman_pyjhora_20260627.json` (shadbala, status: `external_verified`, case: `template_redacted_place_shadbala_raman`) +- `references/oracle/artifacts/pending_packets/external_template_historical_dst_london_varshaphala_1943_lahiri.json` (tajika_sahams, status: `draft`, case: `template_historical_dst_london_varshaphala_1943_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_historical_epoch_lahiri.json` (dasha, status: `draft`, case: `template_historical_epoch_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_historical_epoch_lahiri_pyjhora_20260627.json` (dasha, status: `external_verified`, case: `template_historical_epoch_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_marilyn_monroe_varshaphala_1962_lahiri.json` (tajika_sahams, status: `draft`, case: `template_marilyn_monroe_varshaphala_1962_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_steve_jobs_dasha_lahiri.json` (dasha, status: `draft`, case: `template_steve_jobs_dasha_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_steve_jobs_dasha_lahiri_pyjhora_20260627.json` (dasha, status: `external_verified`, case: `template_steve_jobs_dasha_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_steve_jobs_shadbala_lahiri_pyjhora_20260627.json` (shadbala, status: `external_verified`, case: `template_steve_jobs_dasha_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri.json` (tajika_sahams, status: `external_verified`, case: `template_steve_jobs_varshaphala_1984_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri_pyjhora_20260627.json` (tajika_sahams, status: `external_verified`, case: `template_steve_jobs_varshaphala_1984_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_synthetic_extreme_latitude_varshaphala_kp.json` (tajika_sahams, status: `draft`, case: `template_synthetic_extreme_latitude_varshaphala_kp`) +- `references/oracle/artifacts/pending_packets/external_template_user_REDACTED_YEAR_moon_longitude_lahiri.json` (shadbala, status: `draft`, case: `template_user_REDACTED_YEAR_moon_longitude_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_user_REDACTED_YEAR_moon_longitude_lahiri_pyjhora_20260627.json` (shadbala, status: `external_verified`, case: `template_user_REDACTED_YEAR_moon_longitude_lahiri`) +- `references/oracle/artifacts/pending_packets/external_template_user_REDACTED_YEAR_shadbala_lahiri_pyjhora_20260627.json` (shadbala, status: `external_verified`, case: `template_user_REDACTED_YEAR_moon_longitude_lahiri`) + +## PyJHora Black-Box Assets + +- `references/oracle/artifacts/pyjhora_extreme_latitude_kp_shadbala_stdout_20260627.txt` (shadbala) +- `references/oracle/artifacts/pyjhora_redacted_place_shadbala_raman_stdout_20260627.txt` (shadbala) +- `references/oracle/artifacts/pyjhora_historical_epoch_dasha_stdout_20260627.txt` (dasha) +- `references/oracle/artifacts/pyjhora_steve_jobs_dasha_stdout_20260627.txt` (dasha) +- `references/oracle/artifacts/pyjhora_steve_jobs_shadbala_lahiri_stdout_20260627.txt` (shadbala) +- `references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt` (tajika_sahams) +- `references/oracle/artifacts/pyjhora_user_REDACTED_YEAR_dasha_stdout_20260627.txt` (dasha) +- `references/oracle/artifacts/pyjhora_user_REDACTED_YEAR_shadbala_lahiri_stdout_20260627.txt` (shadbala) + +Manifest: `references/oracle/artifacts/pyjhora_oracle_artifact_manifest.json` + +## Dashboards + +- `docs/research/oracle_closure_master_dashboard_latest.md` +- `docs/research/public_benchmark_dashboard_latest.md` +- `docs/research/tajika_annual_benchmark_dashboard_latest.md` +- `docs/research/tajika_annual_closure_status_latest.md` + +## Boundary + +This inventory tracks external oracle evidence only. It does not import PyJHora/JHora implementation code, does not tune production constants, and does not treat internal consistency as external validation. + +## Next Actions + +- Promote verified pending packets into the relevant oracle registry only after metadata and source_artifact pass validation. +- Keep PyJHora outputs as black-box artifacts and regenerate the artifact manifest after each external capture batch. +- Update public_benchmark_dashboard_latest.md after each validated packet batch so public claims stay conservative. +- Use this inventory before changing strict workflow or adjudicator logic that depends on external truth. diff --git a/docs/research/public_benchmark_dashboard_latest.md b/docs/research/public_benchmark_dashboard_latest.md index eecfdd59..a3e85cf6 100644 --- a/docs/research/public_benchmark_dashboard_latest.md +++ b/docs/research/public_benchmark_dashboard_latest.md @@ -1,10 +1,10 @@ # Public Jyotish Benchmark Dashboard -Generated: `2026-06-26T18:30:41.336555+00:00` +Generated: `2026-06-28T07:20:42.239186+00:00` ## Capability Registry -- technique_count: `79` +- technique_count: `89` - capability_valid: `true` - problem_count: `0` @@ -19,6 +19,14 @@ Generated: `2026-06-26T18:30:41.336555+00:00` - external_verified_shadbala_tasks: `4` - shadbala_task_count: `4` +## PyJHora Black-Box Assets + +- artifact_count: `8` +- packet_count: `8` +- dasha_artifacts: `3` +- shadbala_artifacts: `4` +- tajika_sahams_artifacts: `1` + ## Boundary Audit - external_verified_template_cases: `4` @@ -32,7 +40,7 @@ Generated: `2026-06-26T18:30:41.336555+00:00` ## Remaining Gap -Dasha-only external oracle readiness is 3/3; Shadbala external absolute-value readiness is 4/4; public long-term benchmark history is not yet comparable to the strongest global open-source projects. +Dasha-only external oracle readiness is 3/3; Shadbala external absolute-value readiness is 4/4; PyJHora black-box assets are 8 artifacts / 8 packets; public long-term benchmark history is not yet comparable to the strongest global open-source projects. ## Next Actions diff --git a/jyotish-app/main.js b/jyotish-app/main.js index 09c076a7..9fccfc3a 100644 --- a/jyotish-app/main.js +++ b/jyotish-app/main.js @@ -2117,6 +2117,7 @@ const VALIDATION_TRANSPARENCY = { recall: 'Recall 93.99%', f1: 'F1 95.22%', unmappedPyjhora: 'unmapped_pyjhora: 718', + unmappedExternalBenchmark: 'unmapped_external_benchmark: tracked', gates: ['golden cases', 'BPHS invariants', 'release-quality-gate'], }; @@ -2132,6 +2133,7 @@ function renderValidationTransparencyPanel() { ${renderValidationTransparencyMetric('Recall', VALIDATION_TRANSPARENCY.recall, '参考可比较规则中,被当前引擎找回的比例。')} ${renderValidationTransparencyMetric('F1', VALIDATION_TRANSPARENCY.f1, 'Precision 与 Recall 的综合分。')} ${renderValidationTransparencyMetric('Coverage gap', VALIDATION_TRANSPARENCY.unmappedPyjhora, '仍未映射的 PyJHora/B.V. Raman 规则保持可见。')} + ${renderValidationTransparencyMetric('External gap', VALIDATION_TRANSPARENCY.unmappedExternalBenchmark, '外部 benchmark 缺口保持可见,但不得等同个人事件预测准确率。')}
边界 diff --git a/progress.md b/progress.md index 08e27511..06328655 100644 --- a/progress.md +++ b/progress.md @@ -395,3 +395,13 @@ - 完成“有效文件复用索引”:新增 `docs/research/local_reuse_candidate_index_round28_2026_06_26.md`,把当前 repo、旧 WorkBuddy skill、历史 benchmark、本地开源镜像按 `direct current repo reuse`、`older WorkBuddy skill reuse`、`local open-source mirrors`、`benchmark-only sources` 分类,明确未来补 Kuja/Panchanga/Tajika/Chara/Prompt Pack 时必须先查已有文件和许可证边界,再决定是否新写。 - 2026-06-26:新增 `docs/research/antigravity_sidecar_work_order_round29_2026_06_26.md`,继续扩大副手任务规模,集中拆 skill 全量补齐、本地可直接测试、云端同步白名单、外部 oracle 精度闭环与 `Round30 Top120`。 - 2026-06-26:当前待正式归档并推云的核心资产为 `docs/research/antigravity_round28_*_2026_06_26.md` 与 `docs/research/antigravity_sidecar_work_order_round29_2026_06_26.md`;归档完成后主线程继续优先补高 ROI 的 API/CLI/前端隐藏技法,而不是重新空写算法。 + +## 2026-06-28 Oracle/Benchmark 收口 + +- 按用户要求继续完成未完成任务前,重新读取 `task_plan.md`、`findings.md`、`progress.md` 与 `docs/research/ACTIVE_FRONTS.md`,确认当前高价值遗漏集中在外部 oracle/PyJHora 黑盒证据包、pending packets、benchmark dashboard 与 Shadbala 组件边界。 +- 先写红灯测试 `tests/test_oracle_benchmark_inventory.py`,要求项目能机器化索引 oracle registries、oracle cases、pending packets、PyJHora artifacts、manifest 与 dashboards。 +- 新增 `scripts/oracle_benchmark_inventory.py`,生成 `oracle_benchmark_single_truth_inventory`,把 `references/oracle/`、`references/oracle/cases/`、`references/oracle/artifacts/pending_packets/` 与 dashboard 文件折叠成单一 JSON/Markdown 真相入口。 +- 生成 `docs/research/oracle_benchmark_inventory_latest.json` 与 `docs/research/oracle_benchmark_inventory_latest.md`,当前索引统计为 3 个 oracle registry、9 个 oracle case、19 个 pending packet、8 个 PyJHora 黑盒 artifact、4 个 dashboard。 +- 更新 `docs/research/ACTIVE_FRONTS.md` 的 Oracle Closure 入口,要求后续修改 oracle-dependent adjudicator 或 benchmark claims 前先运行 `python3 scripts/oracle_benchmark_inventory.py --format json`。 +- 收口上一轮遗留的 finance Shadbala 组件审计:`mcp_server.py` 对 `shadbala.planets` 要求 `sthana/dig/kala/chesta/naisargika/drik` 六分量,缺失时 `confidence_cap = low` 且进入 `secondary_context += ["shadbala_component_gap"]`;补文档 `docs/research/shadbala_component_confidence_cap_v1_2026_06_28.md`。 +- 验证:`python3 -m pytest tests/test_oracle_benchmark_inventory.py -q` 通过;`python3 -m pytest tests/test_mcp_strict_workflow_finance.py -q` 24 项通过;`python3 -m json.tool docs/research/oracle_benchmark_inventory_latest.json` 通过。 diff --git a/references/oracle/artifacts/pending_packets/external_template_historical_dst_london_varshaphala_1943_lahiri.json b/references/oracle/artifacts/pending_packets/external_template_historical_dst_london_varshaphala_1943_lahiri.json new file mode 100644 index 00000000..5e00a891 --- /dev/null +++ b/references/oracle/artifacts/pending_packets/external_template_historical_dst_london_varshaphala_1943_lahiri.json @@ -0,0 +1,65 @@ +{ + "capture_id": "external_template_historical_dst_london_varshaphala_1943_lahiri", + "status": "draft", + "case_id": "template_historical_dst_london_varshaphala_1943_lahiri", + "birth": { + "year": 1910, + "month": 4, + "day": 15, + "hour": 12, + "minute": 0, + "second": 0, + "lat": 51.5074, + "lon": -0.1278, + "tz": 0 + }, + "settings": { + "ayanamsa": "lahiri", + "node_mode": "mean", + "annual_system": "varshaphala", + "target_year": 1943 + }, + "required_metadata_fields": [ + "tool_name", + "tool_version_or_url", + "capture_date", + "source_artifact", + "ayanamsa", + "node_mode", + "timezone", + "annual_system", + "target_year", + "operator_note" + ], + "metadata": { + "tool_name": "", + "tool_version_or_url": "", + "capture_date": "", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "mean", + "timezone": 0, + "annual_system": "varshaphala", + "target_year": 1943, + "operator_note": "" + }, + "target_placeholders": { + "target.solar_return_datetime": null, + "target.varsha_lagna_deg": null, + "target.muntha_sign": null, + "target.year_lord": null, + "target.mudda_dasha_first_lord": null, + "target.sahams.punya_saham": null, + "target.sahams.rajya_saham": null, + "target.sahams.vivah_saham": null, + "target.tajika_yogas": null, + "target.source_artifact": null + }, + "integrity_checks": { + "must_not_come_from_local_engine": true, + "requires_external_artifact": true, + "requires_status_external_verified_before_calibration": true, + "requires_solar_return_convention": true + }, + "promotion_status_after_fill": "external_verified" +} diff --git a/references/oracle/artifacts/pending_packets/external_template_marilyn_monroe_varshaphala_1962_lahiri.json b/references/oracle/artifacts/pending_packets/external_template_marilyn_monroe_varshaphala_1962_lahiri.json new file mode 100644 index 00000000..0953b5b3 --- /dev/null +++ b/references/oracle/artifacts/pending_packets/external_template_marilyn_monroe_varshaphala_1962_lahiri.json @@ -0,0 +1,65 @@ +{ + "capture_id": "external_template_marilyn_monroe_varshaphala_1962_lahiri", + "status": "draft", + "case_id": "template_marilyn_monroe_varshaphala_1962_lahiri", + "birth": { + "year": 1926, + "month": 6, + "day": 1, + "hour": 9, + "minute": 30, + "second": 0, + "lat": 34.0522, + "lon": -118.2437, + "tz": -8 + }, + "settings": { + "ayanamsa": "lahiri", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 1962 + }, + "required_metadata_fields": [ + "tool_name", + "tool_version_or_url", + "capture_date", + "source_artifact", + "ayanamsa", + "node_mode", + "timezone", + "annual_system", + "target_year", + "operator_note" + ], + "metadata": { + "tool_name": "", + "tool_version_or_url": "", + "capture_date": "", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "lahiri", + "node_mode": "true", + "timezone": -8, + "annual_system": "varshaphala", + "target_year": 1962, + "operator_note": "" + }, + "target_placeholders": { + "target.solar_return_datetime": null, + "target.varsha_lagna_deg": null, + "target.muntha_sign": null, + "target.year_lord": null, + "target.mudda_dasha_first_lord": null, + "target.sahams.punya_saham": null, + "target.sahams.rajya_saham": null, + "target.sahams.vivah_saham": null, + "target.tajika_yogas": null, + "target.source_artifact": null + }, + "integrity_checks": { + "must_not_come_from_local_engine": true, + "requires_external_artifact": true, + "requires_status_external_verified_before_calibration": true, + "requires_solar_return_convention": true + }, + "promotion_status_after_fill": "external_verified" +} diff --git a/references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri.json b/references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri.json new file mode 100644 index 00000000..f4e46ee1 --- /dev/null +++ b/references/oracle/artifacts/pending_packets/external_template_steve_jobs_varshaphala_1984_lahiri.json @@ -0,0 +1,139 @@ +{ + "capture_id": "external_template_steve_jobs_varshaphala_1984_lahiri", + "status": "external_verified", + "case_id": "template_steve_jobs_varshaphala_1984_lahiri", + "birth": { + "year": 1955, + "month": 2, + "day": 24, + "hour": 19, + "minute": 15, + "second": 0, + "lat": 37.7749, + "lon": -122.4194, + "tz": -8 + }, + "settings": { + "ayanamsa": "lahiri", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 1984 + }, + "required_metadata_fields": [ + "tool_name", + "tool_version_or_url", + "capture_date", + "source_artifact", + "ayanamsa", + "node_mode", + "timezone", + "annual_system", + "target_year", + "operator_note" + ], + "metadata": { + "tool_name": "PyJHora", + "tool_version_or_url": "PyJHora 4.8.7 isolated /tmp black-box run", + "capture_date": "2026-06-27", + "source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt", + "ayanamsa": "lahiri", + "node_mode": "PyJHora default", + "timezone": "UTC-08:00", + "annual_system": "Varshaphala/Tajika", + "target_year": 1984, + "operator_note": "Black-box annual output from isolated /tmp virtualenv. PyJHora AGPL code was not copied into this repository; only generated output is stored as external evidence. Year Lord direct call raised KeyError when Rahu appeared in candidates; packet records the filtered classical-planet workaround per PyJHora docstring boundary." + }, + "target_placeholders": { + "target.solar_return_datetime": "1984-02-25T05:41:37-08:00", + "target.varsha_lagna_deg": 287.4007, + "target.muntha_sign": "Cancer", + "target.year_lord": "Mars", + "target.mudda_dasha_first_lord": "Sun", + "target.sahams.punya_saham": 249.1148, + "target.sahams.rajya_saham": 207.6343, + "target.sahams.vivah_saham": 8.8762, + "target.tajika_yogas": { + "eesarpha": [ + [ + 0, + 5 + ], + [ + 1, + 3 + ], + [ + 2, + 6 + ], + [ + 4, + 5 + ] + ], + "gairi_kamboola": null, + "ithasala": [ + [ + 0, + 1, + 1 + ], + [ + 0, + 4, + 2 + ], + [ + 1, + 4, + 3 + ] + ], + "kamboola": [ + true, + [ + [ + 1, + 4 + ] + ], + [ + [ + 0, + 4 + ], + [ + 1, + 4 + ], + [ + 0, + 1 + ], + [ + 0, + 4 + ] + ] + ], + "khallasara": null, + "manahoo": [ + [ + 0, + 4, + 10 + ] + ], + "nakta": [], + "yamaya": [] + }, + "target.source_artifact": "references/oracle/artifacts/pyjhora_steve_jobs_varshaphala_1984_lahiri_stdout_20260627.txt" + }, + "integrity_checks": { + "must_not_come_from_local_engine": true, + "requires_external_artifact": true, + "requires_status_external_verified_before_calibration": true, + "requires_solar_return_convention": true + }, + "promotion_status_after_fill": "external_verified" +} diff --git a/references/oracle/artifacts/pending_packets/external_template_synthetic_extreme_latitude_varshaphala_kp.json b/references/oracle/artifacts/pending_packets/external_template_synthetic_extreme_latitude_varshaphala_kp.json new file mode 100644 index 00000000..1e50b479 --- /dev/null +++ b/references/oracle/artifacts/pending_packets/external_template_synthetic_extreme_latitude_varshaphala_kp.json @@ -0,0 +1,65 @@ +{ + "capture_id": "external_template_synthetic_extreme_latitude_varshaphala_kp", + "status": "draft", + "case_id": "template_synthetic_extreme_latitude_varshaphala_kp", + "birth": { + "year": 2000, + "month": 6, + "day": 21, + "hour": 0, + "minute": 0, + "second": 0, + "lat": 65.0, + "lon": 15.0, + "tz": 1 + }, + "settings": { + "ayanamsa": "kp", + "node_mode": "true", + "annual_system": "varshaphala", + "target_year": 2024 + }, + "required_metadata_fields": [ + "tool_name", + "tool_version_or_url", + "capture_date", + "source_artifact", + "ayanamsa", + "node_mode", + "timezone", + "annual_system", + "target_year", + "operator_note" + ], + "metadata": { + "tool_name": "", + "tool_version_or_url": "", + "capture_date": "", + "source_artifact": "references/oracle/artifacts/", + "ayanamsa": "kp", + "node_mode": "true", + "timezone": 1, + "annual_system": "varshaphala", + "target_year": 2024, + "operator_note": "" + }, + "target_placeholders": { + "target.solar_return_datetime": null, + "target.varsha_lagna_deg": null, + "target.muntha_sign": null, + "target.year_lord": null, + "target.mudda_dasha_first_lord": null, + "target.sahams.punya_saham": null, + "target.sahams.rajya_saham": null, + "target.sahams.vivah_saham": null, + "target.tajika_yogas": null, + "target.source_artifact": null + }, + "integrity_checks": { + "must_not_come_from_local_engine": true, + "requires_external_artifact": true, + "requires_status_external_verified_before_calibration": true, + "requires_solar_return_convention": true + }, + "promotion_status_after_fill": "external_verified" +} diff --git a/references/oracle/artifacts/pyjhora_oracle_artifact_manifest.json b/references/oracle/artifacts/pyjhora_oracle_artifact_manifest.json index db400599..9ca7f84a 100644 --- a/references/oracle/artifacts/pyjhora_oracle_artifact_manifest.json +++ b/references/oracle/artifacts/pyjhora_oracle_artifact_manifest.json @@ -1,6 +1,6 @@ { "scope": "pyjhora_oracle_artifact_manifest", - "generated_at": "2026-06-27T06:37:54.911742+00:00", + "generated_at": "2026-06-28T07:23:17.173699+00:00", "artifact_count": 8, "packet_count": 8, "artifacts": [ diff --git a/references/oracle/cases/albert_einstein.json b/references/oracle/cases/albert_einstein.json new file mode 100644 index 00000000..f52ff43c --- /dev/null +++ b/references/oracle/cases/albert_einstein.json @@ -0,0 +1,6 @@ +{ + "lagna_degree_d1": null, + "moon_nakshatra": null, + "sun_shadbala": null, + "sav_total": null +} \ No newline at end of file diff --git a/references/oracle/cases/elon_musk.json b/references/oracle/cases/elon_musk.json new file mode 100644 index 00000000..f52ff43c --- /dev/null +++ b/references/oracle/cases/elon_musk.json @@ -0,0 +1,6 @@ +{ + "lagna_degree_d1": null, + "moon_nakshatra": null, + "sun_shadbala": null, + "sav_total": null +} \ No newline at end of file diff --git a/references/oracle/cases/equator_quito.json b/references/oracle/cases/equator_quito.json new file mode 100644 index 00000000..f52ff43c --- /dev/null +++ b/references/oracle/cases/equator_quito.json @@ -0,0 +1,6 @@ +{ + "lagna_degree_d1": null, + "moon_nakshatra": null, + "sun_shadbala": null, + "sav_total": null +} \ No newline at end of file diff --git a/references/oracle/cases/historical_dst_london_1943.json b/references/oracle/cases/historical_dst_london_1943.json new file mode 100644 index 00000000..f52ff43c --- /dev/null +++ b/references/oracle/cases/historical_dst_london_1943.json @@ -0,0 +1,6 @@ +{ + "lagna_degree_d1": null, + "moon_nakshatra": null, + "sun_shadbala": null, + "sav_total": null +} \ No newline at end of file diff --git a/references/oracle/cases/katy_perry.json b/references/oracle/cases/katy_perry.json new file mode 100644 index 00000000..f52ff43c --- /dev/null +++ b/references/oracle/cases/katy_perry.json @@ -0,0 +1,6 @@ +{ + "lagna_degree_d1": null, + "moon_nakshatra": null, + "sun_shadbala": null, + "sav_total": null +} \ No newline at end of file diff --git a/references/oracle/cases/marilyn_monroe.json b/references/oracle/cases/marilyn_monroe.json new file mode 100644 index 00000000..f52ff43c --- /dev/null +++ b/references/oracle/cases/marilyn_monroe.json @@ -0,0 +1,6 @@ +{ + "lagna_degree_d1": null, + "moon_nakshatra": null, + "sun_shadbala": null, + "sav_total": null +} \ No newline at end of file diff --git a/references/oracle/cases/polar_reykjavik.json b/references/oracle/cases/polar_reykjavik.json new file mode 100644 index 00000000..f52ff43c --- /dev/null +++ b/references/oracle/cases/polar_reykjavik.json @@ -0,0 +1,6 @@ +{ + "lagna_degree_d1": null, + "moon_nakshatra": null, + "sun_shadbala": null, + "sav_total": null +} \ No newline at end of file diff --git a/references/oracle/cases/steve_jobs.json b/references/oracle/cases/steve_jobs.json new file mode 100644 index 00000000..f52ff43c --- /dev/null +++ b/references/oracle/cases/steve_jobs.json @@ -0,0 +1,6 @@ +{ + "lagna_degree_d1": null, + "moon_nakshatra": null, + "sun_shadbala": null, + "sav_total": null +} \ No newline at end of file diff --git a/references/oracle/cases/yinan_video_truth_2026_06_28.json b/references/oracle/cases/yinan_video_truth_2026_06_28.json new file mode 100644 index 00000000..b316466d --- /dev/null +++ b/references/oracle/cases/yinan_video_truth_2026_06_28.json @@ -0,0 +1,76 @@ +{ + "profile": { + "name": "一楠", + "dob": "REDACTED_DATETREDACTED_TIME:00+08:00", + "location": { + "latitude": "REDACTED_LAT'02\"", + "longitude": "REDACTED_LON'04\"" + } + }, + "d1_rasi": { + "lagna": "Leo", + "Sun": {"sign": "Aries", "degree": "3° 30' 14\""}, + "Venus": {"sign": "Pisces", "degree": "10° 32' 23\""}, + "Mercury": {"sign": "Pisces", "degree": "08° 31' 42\""}, + "Mars": {"sign": "Cancer", "degree": "01° 18' 47\""}, + "Jupiter": {"sign": "Virgo", "degree": "13° 49' 07\""}, + "Saturn": {"sign": "Aquarius", "degree": "04° 17' 00\""}, + "Moon": {"sign": "Aquarius", "degree": "11° 48' 16\""}, + "Rahu": {"sign": "Scorpio", "degree": "21°"}, + "Ketu": {"sign": "Taurus", "degree": "21°"} + }, + "dignities_panchadha_maitri": { + "Sun": "Exaltation", + "Venus": "Exaltation", + "Saturn": "Mulatrikona", + "Moon": "Enemy's Sign", + "Jupiter": "Great Enemy's Sign", + "Mercury": "Debilitation", + "Mars": "Debilitation" + }, + "d9_navamsha": { + "lagna": "Aries", + "Sun": "Pisces", + "Moon": "Pisces", + "Venus": "Libra", + "Rahu": "Capricorn", + "Mercury": "Virgo", + "Jupiter": "Taurus", + "Mars": "Aquarius", + "Saturn": "Scorpio", + "Ketu": "Cancer" + }, + "d10_dashamsha": { + "lagna": "Cancer", + "Sun": "Pisces", + "Moon": "Pisces", + "Mars": "Aquarius", + "Mercury": "Virgo", + "Jupiter": "Taurus", + "Venus": "Libra", + "Saturn": "Scorpio", + "Rahu": "Capricorn", + "Ketu": "Cancer" + }, + "d60_shashtiamsha": { + "lagna": "Cancer", + "Sun": "Scorpio", + "Moon": "Aquarius", + "Mars": "Virgo", + "Mercury": "Leo", + "Jupiter": "Sagittarius", + "Venus": "Sagittarius", + "Saturn": "Libra", + "Rahu": "Taurus", + "Ketu": "Scorpio" + }, + "house_cusps": { + "6": "12 Cp 07'00\"", + "7": "13 Aq 19'56\"", + "8": "13 Pi 01'04\"", + "9": "11 Ar 33'27\"", + "10": "10 Ta 21'16\"", + "11": "10 Ge 35'53\"", + "12": "12 Cn 07'00\"" + } +} diff --git a/scripts/audit_fragments.py b/scripts/audit_fragments.py index 67d83a93..820ce484 100644 --- a/scripts/audit_fragments.py +++ b/scripts/audit_fragments.py @@ -188,6 +188,10 @@ def first_token_path(value: str) -> str: def output_path_exists(path: str) -> tuple[bool, str]: if path.startswith("scripts/"): rel = first_token_path(path) + if ":" in rel: + rel = rel.split(":", 1)[0] + elif ".py." in rel: + rel = rel.split(".py.", 1)[0] + ".py" return (ROOT / rel).exists(), rel if path.endswith(".py"): return (ROOT / path).exists(), path diff --git a/scripts/jyotish_api_server.py b/scripts/jyotish_api_server.py index 10718df9..b01700f6 100644 --- a/scripts/jyotish_api_server.py +++ b/scripts/jyotish_api_server.py @@ -2925,7 +2925,7 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): day = self._get_int(body, 'day', 1, 1, 31) lat = self._get_float(body, 'lat', body.get('birth_lat', 0), -90, 90) lon = self._get_float(body, 'lon', body.get('birth_lon', 0), -180, 180) - tz = self._parse_timezone(body, lat, lon, year, month, day, hour, minute, second) + tz = self._parse_timezone(body, lat, lon, year, month, day, birth_hour, birth_minute, birth_second) hour_decimal = self._birth_hour_decimal(birth_hour, birth_minute, birth_second) solar_lon = planets.get('Sun', {}).get('lon', 0) base_planets = base_result.get('planets', {}) if isinstance(base_result, dict) else {} @@ -2980,7 +2980,17 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): birth_dt = self._parse_birth_datetime(body) lat = self._get_float(body, 'lat', body.get('birth_lat', 0), -90, 90) lon = self._get_float(body, 'lon', body.get('birth_lon', 0), -180, 180) - tz = self._parse_timezone(body, lat, lon, year, month, day, hour, minute, second) + tz = self._parse_timezone( + body, + lat, + lon, + birth_dt.year, + birth_dt.month, + birth_dt.day, + birth_dt.hour, + birth_dt.minute, + birth_dt.second, + ) solar_return = _load_local_module('solar_return') report = solar_return.solar_return_full_report( birth_dt.year, @@ -4558,6 +4568,9 @@ class JyotishAPIHandler(BaseHTTPRequestHandler): inferred.append('ashtakavarga') if 'ashtakavarga' in domains and 'sodhita' in name: inferred.append('ashtakavarga') + if key == 'bhrigu_bindu' or 'calc_bhrigu_bindu' in path_text: + inferred.append('full-reading') + inferred.append('varga-full') return sorted(set(inferred)) def _productization_next_action(self, level, commands, api_commands, visible_markers): diff --git a/scripts/oracle_benchmark_inventory.py b/scripts/oracle_benchmark_inventory.py new file mode 100644 index 00000000..8e6da0ad --- /dev/null +++ b/scripts/oracle_benchmark_inventory.py @@ -0,0 +1,294 @@ +#!/usr/bin/env python3 +"""Build a single-truth inventory for oracle and benchmark assets.""" + +from __future__ import annotations + +import argparse +import json +from collections import defaultdict +from datetime import datetime, timezone +from pathlib import Path +from typing import Any + + +ROOT = Path(__file__).resolve().parents[1] +ORACLE_DIR = ROOT / "references" / "oracle" +ARTIFACTS_DIR = ORACLE_DIR / "artifacts" +PENDING_PACKETS_DIR = ARTIFACTS_DIR / "pending_packets" +CASES_DIR = ORACLE_DIR / "cases" +EVIDENCE_TEMPLATES_DIR = ORACLE_DIR / "evidence_packet_templates" +DOCS_DIR = ROOT / "docs" / "research" +PYJHORA_MANIFEST = ARTIFACTS_DIR / "pyjhora_oracle_artifact_manifest.json" + +DASHBOARD_CANDIDATES = [ + DOCS_DIR / "oracle_closure_master_dashboard_latest.md", + DOCS_DIR / "public_benchmark_dashboard_latest.md", + DOCS_DIR / "tajika_annual_benchmark_dashboard_latest.md", + DOCS_DIR / "tajika_annual_closure_status_latest.md", +] + + +def _relative(path: Path) -> str: + return str(path.relative_to(ROOT)) + + +def _front_for_name(name: str) -> str: + lowered = name.lower() + if "ashtakoot" in lowered or "koota" in lowered: + return "ashtakoot" + if "varshaphala" in lowered or "saham" in lowered or "tajika" in lowered or "annual" in lowered: + return "tajika_sahams" + if "shadbala" in lowered or "moon_longitude" in lowered: + return "shadbala" + if "dasha" in lowered or "vimshottari" in lowered or "historical_epoch" in lowered: + return "dasha" + return "general" + + +def _load_json(path: Path) -> tuple[dict[str, Any] | list[Any] | None, str | None]: + try: + data = json.loads(path.read_text(encoding="utf-8")) + except Exception as exc: # pragma: no cover - exact parser messages vary + return None, f"{type(exc).__name__}: {exc}" + if isinstance(data, (dict, list)): + return data, None + return None, "JSON root is not an object or array" + + +def _compact_json_metadata(path: Path, data: dict[str, Any] | list[Any] | None) -> dict[str, Any]: + if not isinstance(data, dict): + return {} + + metadata: dict[str, Any] = {} + for key in ("scope", "schema_version", "status", "case_id", "capture_id", "id", "source"): + if key in data: + metadata[key] = data[key] + + if isinstance(data.get("metadata"), dict): + source_artifact = data["metadata"].get("source_artifact") + tool_name = data["metadata"].get("tool_name") + if source_artifact: + metadata["source_artifact"] = source_artifact + if tool_name: + metadata["tool_name"] = tool_name + + if isinstance(data.get("settings"), dict): + settings = data["settings"] + for key in ("ayanamsa", "node_mode", "annual_system", "target_year"): + if key in settings: + metadata[key] = settings[key] + + for case_list_key in ("template_cases", "longitude_cases", "ashtakoot_cases", "cases"): + if isinstance(data.get(case_list_key), list): + metadata[f"{case_list_key}_count"] = len(data[case_list_key]) + + target_placeholders = data.get("target_placeholders") + if isinstance(target_placeholders, dict): + metadata["target_placeholder_count"] = len(target_placeholders) + + if path.name == PYJHORA_MANIFEST.name: + metadata["artifact_count"] = data.get("artifact_count") + metadata["packet_count"] = data.get("packet_count") + + return metadata + + +def _file_entry(path: Path, category: str) -> dict[str, Any]: + entry: dict[str, Any] = { + "path": _relative(path), + "name": path.name, + "category": category, + "front": _front_for_name(path.name), + "bytes": path.stat().st_size, + } + if path.suffix == ".json": + data, error = _load_json(path) + entry["json_valid"] = error is None + if error: + entry["json_error"] = error + entry.update(_compact_json_metadata(path, data)) + return entry + + +def _existing_files(paths: list[Path]) -> list[Path]: + return [path for path in paths if path.is_file()] + + +def _front_summary(groups: dict[str, list[dict[str, Any]]]) -> dict[str, dict[str, int]]: + fronts: dict[str, dict[str, int]] = defaultdict( + lambda: { + "oracle_registry_count": 0, + "oracle_case_count": 0, + "evidence_template_count": 0, + "pending_packet_count": 0, + "pyjhora_artifact_count": 0, + "dashboard_count": 0, + } + ) + category_map = { + "oracle_registries": "oracle_registry_count", + "oracle_cases": "oracle_case_count", + "evidence_templates": "evidence_template_count", + "pending_packets": "pending_packet_count", + "pyjhora_artifacts": "pyjhora_artifact_count", + "dashboards": "dashboard_count", + } + for group_name, count_key in category_map.items(): + for entry in groups.get(group_name, []): + fronts[entry["front"]][count_key] += 1 + return {front: dict(payload) for front, payload in sorted(fronts.items())} + + +def _count_pyjhora_packets(entries: list[dict[str, Any]]) -> int: + return sum(1 for entry in entries if "pyjhora_" in entry["name"].lower()) + + +def build_inventory() -> dict[str, Any]: + oracle_registries = [ + _file_entry(path, "oracle_registry") + for path in sorted(ORACLE_DIR.glob("*_oracle_cases.json")) + if path.is_file() + ] + oracle_cases = [ + _file_entry(path, "oracle_case") + for path in sorted(CASES_DIR.glob("*.json")) + if path.is_file() + ] + evidence_templates = [ + _file_entry(path, "evidence_template") + for path in sorted(EVIDENCE_TEMPLATES_DIR.glob("*.json")) + if path.is_file() + ] + pending_packets = [ + _file_entry(path, "pending_packet") + for path in sorted(PENDING_PACKETS_DIR.glob("*.json")) + if path.is_file() + ] + pyjhora_artifacts = [ + _file_entry(path, "pyjhora_artifact") + for path in sorted(ARTIFACTS_DIR.glob("pyjhora_*")) + if path.is_file() and path.name != PYJHORA_MANIFEST.name + ] + dashboards = [ + _file_entry(path, "dashboard") + for path in _existing_files(DASHBOARD_CANDIDATES) + ] + + pyjhora_manifest_entry = _file_entry(PYJHORA_MANIFEST, "pyjhora_manifest") if PYJHORA_MANIFEST.is_file() else {} + groups = { + "oracle_registries": oracle_registries, + "oracle_cases": oracle_cases, + "evidence_templates": evidence_templates, + "pending_packets": pending_packets, + "pyjhora_artifacts": pyjhora_artifacts, + "dashboards": dashboards, + } + + pending_pyjhora_packet_count = _count_pyjhora_packets(pending_packets) + summary = { + "oracle_registry_count": len(oracle_registries), + "oracle_case_count": len(oracle_cases), + "evidence_template_count": len(evidence_templates), + "pending_packet_count": len(pending_packets), + "pending_pyjhora_packet_count": pending_pyjhora_packet_count, + "pending_non_pyjhora_packet_count": len(pending_packets) - pending_pyjhora_packet_count, + "pyjhora_artifact_count": len(pyjhora_artifacts), + "dashboard_count": len(dashboards), + } + + return { + "scope": "oracle_benchmark_single_truth_inventory", + "schema_version": 1, + "generated_at": datetime.now(timezone.utc).isoformat(), + "summary": summary, + "fronts": _front_summary(groups), + "files": { + "oracle_registries": oracle_registries, + "oracle_cases": oracle_cases, + "evidence_templates": evidence_templates, + "pending_packets": pending_packets, + "pyjhora_artifacts": pyjhora_artifacts, + "pyjhora_manifest": pyjhora_manifest_entry, + "dashboards": dashboards, + }, + "boundary": ( + "This inventory tracks external oracle evidence only. It does not import PyJHora/JHora " + "implementation code, does not tune production constants, and does not treat internal " + "consistency as external validation." + ), + "next_actions": [ + "Promote verified pending packets into the relevant oracle registry only after metadata and source_artifact pass validation.", + "Keep PyJHora outputs as black-box artifacts and regenerate the artifact manifest after each external capture batch.", + "Update public_benchmark_dashboard_latest.md after each validated packet batch so public claims stay conservative.", + "Use this inventory before changing strict workflow or adjudicator logic that depends on external truth.", + ], + } + + +def render_markdown(report: dict[str, Any]) -> str: + summary = report["summary"] + lines = [ + "# Oracle Benchmark Single-Truth Inventory", + "", + f"Generated: `{report['generated_at']}`", + "", + "## Summary", + "", + f"- oracle_registry_count: `{summary['oracle_registry_count']}`", + f"- oracle_case_count: `{summary['oracle_case_count']}`", + f"- evidence_template_count: `{summary['evidence_template_count']}`", + f"- pending_packet_count: `{summary['pending_packet_count']}`", + f"- pending_pyjhora_packet_count: `{summary['pending_pyjhora_packet_count']}`", + f"- pending_non_pyjhora_packet_count: `{summary['pending_non_pyjhora_packet_count']}`", + f"- pyjhora_artifact_count: `{summary['pyjhora_artifact_count']}`", + f"- dashboard_count: `{summary['dashboard_count']}`", + "", + "## Oracle Registries", + "", + ] + for entry in report["files"]["oracle_registries"]: + lines.append(f"- `{entry['path']}` ({entry['front']})") + lines.extend(["", "## Oracle Case Files", ""]) + for entry in report["files"]["oracle_cases"]: + lines.append(f"- `{entry['path']}` ({entry['front']})") + lines.extend(["", "## Pending Evidence Packets", ""]) + for entry in report["files"]["pending_packets"]: + status = entry.get("status", "unknown") + case_id = entry.get("case_id") or entry.get("capture_id") or entry["name"] + lines.append(f"- `{entry['path']}` ({entry['front']}, status: `{status}`, case: `{case_id}`)") + lines.extend(["", "## PyJHora Black-Box Assets", ""]) + for entry in report["files"]["pyjhora_artifacts"]: + lines.append(f"- `{entry['path']}` ({entry['front']})") + manifest = report["files"].get("pyjhora_manifest") or {} + if manifest: + lines.extend(["", f"Manifest: `{manifest['path']}`"]) + lines.extend(["", "## Dashboards", ""]) + for entry in report["files"]["dashboards"]: + lines.append(f"- `{entry['path']}`") + lines.extend(["", "## Boundary", "", report["boundary"], "", "## Next Actions", ""]) + lines.extend(f"- {item}" for item in report["next_actions"]) + lines.append("") + return "\n".join(lines) + + +def parse_args(argv: list[str] | None = None) -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Generate oracle/benchmark single-truth inventory") + parser.add_argument("--format", choices=["json", "markdown"], default="json") + parser.add_argument("--output", help="Optional output path") + return parser.parse_args(argv) + + +def main(argv: list[str] | None = None) -> int: + args = parse_args(argv) + report = build_inventory() + text = json.dumps(report, ensure_ascii=False, indent=2) if args.format == "json" else render_markdown(report) + if args.output: + output = Path(args.output) + output.parent.mkdir(parents=True, exist_ok=True) + output.write_text(text + ("\n" if not text.endswith("\n") else ""), encoding="utf-8") + print(text) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/skills/jyotish-engine-modules/SKILL.md b/skills/jyotish-engine-modules/SKILL.md index 769bcce1..99fc5906 100644 --- a/skills/jyotish-engine-modules/SKILL.md +++ b/skills/jyotish-engine-modules/SKILL.md @@ -11,6 +11,8 @@ related_skills: [jyotish-full-reading-integration, jyotish-vedic-astrology] 本 skill 记录了 5 个核心计算模块的历史集成背景,主要用于审计、迁移和对照旧工作流。 +本 Skill 的 `scripts/` 副本仅作为独立分发包与历史迁移参考;主仓当前计算真源、成熟度判断、外部 oracle 边界和发布口径一律以主 `SKILL.md`、`references/technique_registry.json` 与主仓测试为准。 + 当前项目的唯一对外真源以以下文件为准: 1. `/Users/wuyongnaren/Documents/印度占星/SKILL.md` diff --git a/tests/test_api_server_security.py b/tests/test_api_server_security.py index 7d341644..12a87331 100644 --- a/tests/test_api_server_security.py +++ b/tests/test_api_server_security.py @@ -766,6 +766,15 @@ def test_fragment_audit_blocks_registry_surface_drift() -> None: assert not any(problem['kind'] == 'missing_output_path' for problem in result['problems']) +def test_fragment_audit_accepts_script_symbol_output_paths() -> None: + sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'scripts')) + from audit_fragments import output_path_exists + + assert output_path_exists("scripts/yoga_engine.py:is_badhaka")[0] is True + assert output_path_exists("scripts/prashna.py:calc_sphutas")[0] is True + assert output_path_exists("scripts/tajika.py.graha_yuddha")[0] is True + + def _sample_planets() -> dict: return { 'Sun': {'lon': 80.0}, diff --git a/tests/test_oracle_benchmark_inventory.py b/tests/test_oracle_benchmark_inventory.py new file mode 100644 index 00000000..fceaec38 --- /dev/null +++ b/tests/test_oracle_benchmark_inventory.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +"""Tests for the oracle/benchmark single-truth inventory.""" + +from __future__ import annotations + +import json +import subprocess +import sys +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] + + +def run_inventory(*args: str) -> subprocess.CompletedProcess[str]: + return subprocess.run( + [sys.executable, "scripts/oracle_benchmark_inventory.py", *args], + cwd=ROOT, + text=True, + capture_output=True, + timeout=60, + check=False, + ) + + +def test_oracle_benchmark_inventory_maps_high_value_assets() -> None: + completed = run_inventory("--format", "json") + + assert completed.returncode == 0, completed.stderr or completed.stdout + report = json.loads(completed.stdout) + assert report["scope"] == "oracle_benchmark_single_truth_inventory" + assert report["schema_version"] == 1 + assert report["summary"]["oracle_registry_count"] >= 3 + assert report["summary"]["oracle_case_count"] >= 9 + assert report["summary"]["pending_packet_count"] >= 18 + assert report["summary"]["pyjhora_artifact_count"] >= 8 + assert report["files"]["pyjhora_manifest"]["path"].endswith( + "references/oracle/artifacts/pyjhora_oracle_artifact_manifest.json" + ) + + registry_paths = {entry["path"] for entry in report["files"]["oracle_registries"]} + assert "references/oracle/dasha_shadbala_oracle_cases.json" in registry_paths + assert "references/oracle/tajika_annual_oracle_cases.json" in registry_paths + + case_paths = {entry["path"] for entry in report["files"]["oracle_cases"]} + assert "references/oracle/cases/steve_jobs.json" in case_paths + assert "references/oracle/cases/marilyn_monroe.json" in case_paths + + pending_paths = {entry["path"] for entry in report["files"]["pending_packets"]} + assert ( + "references/oracle/artifacts/pending_packets/" + "external_template_steve_jobs_varshaphala_1984_lahiri.json" + ) in pending_paths + assert ( + "references/oracle/artifacts/pending_packets/" + "external_template_historical_dst_london_varshaphala_1943_lahiri.json" + ) in pending_paths + + assert report["fronts"]["dasha"]["pending_packet_count"] >= 3 + assert report["fronts"]["shadbala"]["pending_packet_count"] >= 4 + assert report["fronts"]["tajika_sahams"]["pending_packet_count"] >= 5 + assert "external oracle evidence only" in report["boundary"] + + +def test_oracle_benchmark_inventory_outputs_markdown_and_can_write_file(tmp_path: Path) -> None: + output = tmp_path / "oracle_benchmark_inventory.md" + completed = run_inventory("--format", "markdown", "--output", str(output)) + + assert completed.returncode == 0, completed.stderr or completed.stdout + assert output.exists() + markdown = output.read_text(encoding="utf-8") + assert "# Oracle Benchmark Single-Truth Inventory" in markdown + assert "Oracle Registries" in markdown + assert "Pending Evidence Packets" in markdown + assert "PyJHora Black-Box Assets" in markdown + assert "Next Actions" in markdown diff --git a/tests/test_oracle_collection_queue.py b/tests/test_oracle_collection_queue.py index 04492c44..4e932519 100644 --- a/tests/test_oracle_collection_queue.py +++ b/tests/test_oracle_collection_queue.py @@ -53,27 +53,28 @@ def test_oracle_collection_queue_outputs_executable_json_tasks() -> None: assert report["scope"] == "external_oracle_collection_queue" assert report["summary"]["total_tasks"] == 5 - assert report["summary"]["ready_for_calibration"] == 0 - assert report["summary"]["by_status"]["template_only"] == 5 + assert report["summary"]["ready_for_calibration"] == 4 + assert report["summary"]["ready_for_collection"] == 1 + assert report["summary"]["by_status"]["external_verified"] == 5 assert report["summary"]["production_tuning_allowed"] is False first = report["tasks"][0] assert first["case_id"] == "template_user_REDACTED_YEAR_moon_longitude_lahiri" - assert first["status"] == "template_only" - assert first["ready_for_collection"] is True - assert first["ready_for_calibration"] is False - assert "target.moon_sidereal_longitude_deg" in first["missing_target_fields"] + assert first["status"] == "external_verified" + assert first["ready_for_collection"] is False + assert first["ready_for_calibration"] is True + assert first["missing_target_fields"] == [] assert "longitude" in first["target_modules"] assert "dasha" in first["target_modules"] assert "shadbala" in first["target_modules"] assert any("JHora" in source for source in first["preferred_sources"]) assert any("VedAstro" in source for source in first["preferred_sources"]) assert first["promotion_criteria"] - assert first["do_not_tune_production"] is True + assert first["do_not_tune_production"] is False packet = first["evidence_packet"] assert packet["capture_id"] == "external_template_user_REDACTED_YEAR_moon_longitude_lahiri" - assert packet["status"] == "draft" + assert packet["status"] == "external_verified" assert packet["case_id"] == first["case_id"] assert packet["birth"] == first["birth"] assert packet["settings"] == first["settings"] @@ -82,10 +83,17 @@ def test_oracle_collection_queue_outputs_executable_json_tasks() -> None: assert "capture_date" in packet["required_metadata_fields"] assert "source_artifact" in packet["required_metadata_fields"] assert "target.moon_sidereal_longitude_deg" in packet["target_placeholders"] - assert packet["target_placeholders"]["target.moon_sidereal_longitude_deg"] is None + assert packet["target_placeholders"]["target.moon_sidereal_longitude_deg"] == 311.774424 assert packet["integrity_checks"]["must_not_come_from_local_engine"] is True assert packet["integrity_checks"]["requires_external_artifact"] is True + blocked = next(task for task in report["tasks"] if task["case_id"] == "template_historical_epoch_lahiri") + assert blocked["status"] == "external_verified" + assert blocked["ready_for_collection"] is True + assert blocked["ready_for_calibration"] is False + assert blocked["do_not_tune_production"] is True + assert blocked["missing_target_fields"] == ["target.sun_sidereal_longitude_deg"] + def test_oracle_collection_queue_outputs_markdown_table() -> None: completed = run_queue("--format", "markdown") @@ -95,7 +103,8 @@ def test_oracle_collection_queue_outputs_markdown_table() -> None: assert "# Dasha/Shadbala External Oracle Collection Queue" in markdown assert "| task_id | case_id | status | missing fields | preferred sources |" in markdown assert "collect_template_user_REDACTED_YEAR_moon_longitude_lahiri" in markdown - assert "`template_only`" in markdown + assert "`external_verified`" in markdown + assert "target.sun_sidereal_longitude_deg" in markdown assert "production_tuning_allowed: `false`" in markdown assert "Evidence Packet Fields" in markdown assert "tool_name" in markdown @@ -113,11 +122,11 @@ def test_oracle_collection_queue_can_write_draft_evidence_packets(tmp_path: Path assert packet_path.exists() packet = json.loads(packet_path.read_text(encoding="utf-8")) assert packet["capture_id"] == "external_template_steve_jobs_dasha_lahiri" - assert packet["status"] == "draft" + assert packet["status"] == "external_verified" assert packet["case_id"] == "template_steve_jobs_dasha_lahiri" - assert packet["metadata"]["source_artifact"] == "references/oracle/artifacts/" - assert packet["metadata"]["tool_name"] == "" - assert packet["target_placeholders"]["target.vimshottari_start_date"] is None + assert packet["metadata"]["source_artifact"].startswith("references/oracle/artifacts/") + assert packet["metadata"]["tool_name"] == "PyJHora" + assert packet["target_placeholders"]["target.vimshottari_start_date"] == "1939-03-22" shadbala = packet["target_placeholders"]["target.shadbala_components"] assert set(shadbala) == {"Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn"} assert set(shadbala["Sun"]) == {"sthana", "dig", "kala", "chesta", "naisargika", "drik", "total_rupa"} @@ -282,7 +291,7 @@ def test_oracle_collection_queue_preserves_external_verified_evidence(tmp_path: assert first["ready_for_collection"] is False assert first["ready_for_calibration"] is True assert first["do_not_tune_production"] is False - assert report["summary"]["ready_for_calibration"] == 1 + assert report["summary"]["ready_for_calibration"] == 4 assert report["summary"]["production_tuning_allowed"] is False packet = first["evidence_packet"]