diff --git a/SKILL.md b/SKILL.md index da1cdaf8..8cbe809d 100644 --- a/SKILL.md +++ b/SKILL.md @@ -143,11 +143,11 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力 **普通用户解释时必须显式区分基础排盘高可信与高阶绝对值待外部校准。** -- Dasha-only 外部证据已进入专项闭环:`dasha_external_oracle_evidence_validation.valid_dasha_packets: 2/3`;Steve Jobs / Lahiri 与 REDACTED_YEAR Lahiri 模板的 Vimshottari 起始边界来自 PyJHora 4.8.7 隔离黑盒 stdout artifact。 +- 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: 0`,`ready_for_calibration: 0`,因为 Shadbala 绝对 Rupa/Virupa 六分量尚未外部封顶。 - D1/D9/SAV 高可信;Dasha 精细日期可引用已验证 Dasha-only 样本的局部进度,但不得把全部大运边界、Shadbala 绝对值或全局精度说成已完成外部校准。 - `production_tuning_allowed: false` 前,禁止为了贴合单份 PDF、单个 JHora 截图或本仓库本地输出而改生产常数。 -- 对普通用户的建议话术:基础落座、D9、SAV 可作为稳定证据;Dasha 精细边界已有两个外部黑盒样本但仍需扩展,Shadbala 绝对值仍需 JHora/PyJHora/公开书例六分量证据后再提升置信度。 +- 对普通用户的建议话术:基础落座、D9、SAV 可作为稳定证据;当前 Dasha-only 目标集已完成外部黑盒验证,但多 Dasha 家族、Antardasha/Pratyantar 细边界仍需扩展;Shadbala 绝对值仍需 JHora/PyJHora/公开书例六分量证据后再提升置信度。 - 工作流要求:Dasha-only packet 用 `python3 scripts/dasha_oracle_evidence_validator.py --queue-file ` 验证;全局校准仍必须跑 `python3 scripts/oracle_evidence_validator.py --queue-file `,两者不可混用。 ### Ashtakavarga 口径冻结(v6.0.8-av-calibration) diff --git a/docs/research/oracle_closure_master_dashboard_latest.md b/docs/research/oracle_closure_master_dashboard_latest.md index c9ee516d..82ed08db 100644 --- a/docs/research/oracle_closure_master_dashboard_latest.md +++ b/docs/research/oracle_closure_master_dashboard_latest.md @@ -1,12 +1,12 @@ # Jyotish External Oracle Closure Master Dashboard -Generated: `2026-06-26T16:48:59.201221+00:00` +Generated: `2026-06-26T17:01:36.150782+00:00` ## Summary - total_tasks: `12` -- external_verified_tasks: `2` -- open_tasks: `10` +- external_verified_tasks: `3` +- open_tasks: `9` - can_claim_global_oracle_closure: `false` - production_tuning_allowed: `false` @@ -14,23 +14,12 @@ Generated: `2026-06-26T16:48:59.201221+00:00` | front | tasks | verified | first priority | missing fields | manual entries | metadata missing | target missing | |---|---:|---:|---|---:|---:|---:|---:| -| `dasha` | 3 | 2 | `template_historical_epoch_lahiri` | 6 | 6 | 5 | 1 | +| `dasha` | 3 | 3 | `complete` | 0 | 0 | 0 | 0 | | `tajika_sahams` | 5 | 0 | `template_steve_jobs_varshaphala_1984_lahiri` | 15 | 15 | 5 | 10 | | `shadbala` | 4 | 0 | `template_redacted_place_shadbala_raman` | 55 | 55 | 5 | 50 | ## Next Action Order -### dasha - -- case_id: `template_historical_epoch_lahiri` -- capture_id: `external_template_historical_epoch_lahiri` -- missing_field_count: `6` -- manual_entry_count: `6` - -```bash -python3 scripts/oracle_collection_queue.py --oracle-file references/oracle/dasha_shadbala_oracle_cases.json --apply-packet references/oracle/artifacts/pending_packets/external_template_historical_epoch_lahiri.json --format json -``` - ### tajika_sahams - case_id: `template_steve_jobs_varshaphala_1984_lahiri` diff --git a/docs/research/public_benchmark_dashboard_latest.md b/docs/research/public_benchmark_dashboard_latest.md index 87e249bf..6d2d1a3a 100644 --- a/docs/research/public_benchmark_dashboard_latest.md +++ b/docs/research/public_benchmark_dashboard_latest.md @@ -1,6 +1,6 @@ # Public Jyotish Benchmark Dashboard -Generated: `2026-06-26T16:48:58.727959+00:00` +Generated: `2026-06-26T17:01:59.939612+00:00` ## Capability Registry @@ -14,7 +14,7 @@ Generated: `2026-06-26T16:48:58.727959+00:00` - valid_packets: `0` - ready_for_calibration: `0` - production_tuning_allowed: `false` -- valid_dasha_packets: `2` +- valid_dasha_packets: `3` - total_dasha_packets: `3` ## Boundary Audit @@ -30,11 +30,11 @@ Generated: `2026-06-26T16:48:58.727959+00:00` ## Remaining Gap -Dasha-only external oracle readiness is 2/3; Shadbala absolute values still need component-level external evidence, and 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 absolute values still need component-level external evidence, and public long-term benchmark history is not yet comparable to the strongest global open-source projects. ## Next Actions -- Fill the next open external JHora/PyJHora packet under references/oracle/artifacts/pending_packets. +- Fill the next open Tajika/Sahams or Shadbala external packet under references/oracle/artifacts/pending_packets. - Run oracle_evidence_validator.py until at least one packet is valid. - Run oracle_boundary_audit.py to inspect Dasha/Shadbala deltas without tuning constants. - Publish this dashboard after each validated sample batch. diff --git a/docs/research/skill_gap_truth_audit_latest.md b/docs/research/skill_gap_truth_audit_latest.md index 49a9cc6d..b7b097ef 100644 --- a/docs/research/skill_gap_truth_audit_latest.md +++ b/docs/research/skill_gap_truth_audit_latest.md @@ -1,6 +1,6 @@ # Jyotish Skill Gap Truth Audit -Generated: `2026-06-26T16:49:33.796913+00:00` +Generated: `2026-06-26T17:01:36.751861+00:00` ## Public Claim Boundary @@ -19,8 +19,8 @@ Generated: `2026-06-26T16:49:33.796913+00:00` ## External Oracle Closure - total_tasks: `12` -- external_verified_tasks: `2` -- open_tasks: `10` +- external_verified_tasks: `3` +- open_tasks: `9` - can_claim_global_oracle_closure: `false` ## Remaining Hard Fronts @@ -29,8 +29,8 @@ Generated: `2026-06-26T16:49:33.796913+00:00` - id: `dasha_external_oracle` - priority: `P0` -- status: `active_partial_external_evidence` -- current_truth: Dasha engines are usable and Dasha-only external oracle evidence is partially closed at 2/3 packets; exact start dates, balance periods and sub-period boundaries cannot be called fully closed until the remaining packet and multi-family comparisons pass validation. +- status: `active_target_set_closed` +- current_truth: Dasha engines are usable and the current Dasha-only external oracle target set is closed at 3/3 packets; exact start dates beyond this target set, balance periods, sub-period boundaries and multi-family comparisons still need expansion before claiming software-grade Dasha timing accuracy. ### Long-term public benchmark diff --git a/references/oracle/artifacts/pending_packets/external_template_historical_epoch_lahiri_pyjhora_20260627.json b/references/oracle/artifacts/pending_packets/external_template_historical_epoch_lahiri_pyjhora_20260627.json new file mode 100644 index 00000000..e239b636 --- /dev/null +++ b/references/oracle/artifacts/pending_packets/external_template_historical_epoch_lahiri_pyjhora_20260627.json @@ -0,0 +1,51 @@ +{ + "capture_id": "external_template_historical_epoch_lahiri", + "status": "external_verified", + "case_id": "template_historical_epoch_lahiri", + "birth": { + "year": 1800, + "month": 1, + "day": 1, + "hour": 12, + "minute": 0, + "second": 0, + "lat": 28.6139, + "lon": 77.209, + "tz": 5.5 + }, + "settings": { + "ayanamsa": "lahiri", + "node_mode": "mean" + }, + "required_metadata_fields": [ + "tool_name", + "tool_version_or_url", + "capture_date", + "source_artifact", + "ayanamsa", + "node_mode", + "timezone", + "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_historical_epoch_dasha_stdout_20260627.txt", + "ayanamsa": "lahiri", + "node_mode": "PyJHora default", + "timezone": "UTC+05:30", + "operator_note": "Black-box stdout from isolated /tmp virtualenv. PyJHora AGPL code was not copied into this repository; only the generated output artifact is stored as external evidence." + }, + "target_placeholders": { + "target.vimshottari_start_date": "1787-01-19" + }, + "integrity_checks": { + "must_not_come_from_local_engine": true, + "requires_external_artifact": true, + "requires_status_external_verified_before_calibration": true, + "reject_global_shadbala_scaling": false + }, + "promotion_status_after_fill": "external_verified", + "operator_goal": "Fill one external Vimshottari start date only." +} diff --git a/references/oracle/artifacts/pyjhora_historical_epoch_dasha_stdout_20260627.txt b/references/oracle/artifacts/pyjhora_historical_epoch_dasha_stdout_20260627.txt new file mode 100644 index 00000000..1af1d6bb --- /dev/null +++ b/references/oracle/artifacts/pyjhora_historical_epoch_dasha_stdout_20260627.txt @@ -0,0 +1,12 @@ +panchanga /Users/wuyongnaren added to system path ['', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python311.zip', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/lib-dynload', '/private/tmp/jyotish_pyjhora_blackbox/lib/python3.11/site-packages', '/Users/wuyongnaren'] +/Users added to system path ['', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python311.zip', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11', '/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/lib-dynload', '/private/tmp/jyotish_pyjhora_blackbox/lib/python3.11/site-packages', '/Users/wuyongnaren', '/Users'] +PYJHORA_BLACKBOX_VERSION 4.8.7 +CASE_ID template_historical_epoch_lahiri +DOB (1800, 1, 1) +TOB (12, 0, 0) +PLACE Place(Place='Delhi historical epoch template', latitude=28.6139, longitude=77.209, timezone=5.5, elevation=None) +AYANAMSA LAHIRI +JD 2378497.0 +DASHA_START_RAW [4, 2373766.743017439] +DASHA_START_GREGORIAN (1787, 1, 19, 5.832418531179428) +BHUKTHI_HEAD ((3, 0, 18), [[(4, 4), (1787, 1, 19, 6.980898577719927), 2.1333333333332485], [(4, 6), (1789, 3, 8, 11.917546659708023), 2.5333333333329935], [(4, 3), (1791, 9, 19, 19.27981625497341), 2.2666666666664965], [(4, 8), (1793, 12, 25, 17.025004841387272), 0.9333333333327384], [(4, 5), (1794, 12, 1, 14.68478837236762), 2.6666666666662415], [(4, 0), (1797, 8, 1, 14.855598472058773), 0.79999999999949], [(4, 1), (1798, 5, 20, 19.706841498613358), 1.3333333333337583], [(4, 2), (1799, 9, 19, 19.79224655404687), 0.9333333333327384], [(4, 7), (1800, 8, 26, 17.452030085027218), 2.400000000002295], [(6, 6), (1803, 1, 20, 8.005759198218584), 3.0083333333338858], [(6, 3), (1806, 1, 23, 3.248454350978136), 2.6916666666666242], [(6, 8), (1808, 10, 2, 6.570865798741579), 1.1083333333328658], [(6, 5), (1809, 11, 11, 2.291858743876219), 3.1666666666662415], [(6, 0), (1813, 1, 10, 17.494695737957954), 0.95000000000051], [(6, 1), (1813, 12, 23, 17.25554684177041), 1.5833333333337583], [(6, 2), (1815, 7, 25, 0.8569653443992138), 1.1083333333328658], [(6, 7), (1816, 9, 1, 20.577958289533854), 2.850000000000255], [(6, 4), (1819, 7, 9, 19.86051158979535), 2.5333333333329935], [(3, 3), (1822, 1, 20, 3.2227811850607395), 2.4083333333336308], [(3, 8), (1824, 6, 17, 18.827044062316418), 0.9916666666661142], [(3, 5), (1825, 6, 14, 23.84056406468153), 2.8333333333337585], [(3, 0), (1828, 4, 14, 21.02204980328679), 0.850000000000255], [(3, 1), (1829, 2, 19, 8.176495525985956), 1.4166666666662417], [(3, 2), (1830, 7, 21, 18.76723838970065), 0.9916666666661142], [(3, 7), (1831, 7, 18, 23.780758392065763), 2.54999999999949], [(3, 4), (1834, 2, 4, 9.244095548987389), 2.2666666666664965], [(3, 6), (1836, 5, 12, 6.989284135401249), 2.691666666667899], [(8, 8), (1839, 1, 20, 10.311695594340563), 0.4083333333336308], [(8, 5), (1839, 6, 18, 13.787850894033909), 1.1666666666662417], [(8, 0), (1840, 8, 17, 16.862580310553312), 0.350000000000255], [(8, 1), (1840, 12, 23, 12.984999138861895), 0.5833333333337583], [(8, 2), (1841, 7, 24, 14.522363852709532), 0.4083333333336308], [(8, 7), (1841, 12, 20, 17.998519152402878), 1.04999999999949], [(8, 4), (1843, 1, 8, 6.365775626152754), 0.9333333333327384], [(8, 6), (1843, 12, 15, 4.025559157133102), 1.1083333333328658], [(8, 3), (1845, 1, 22, 23.746552102267742), 0.9916666666673891], [(5, 5), (1846, 1, 20, 4.760072115808725), 3.3333333333337585], [(5, 0), (1849, 5, 21, 16.97358474880457), 1.0], [(5, 1), (1850, 5, 21, 23.037638537585735), 1.6666666666662417], [(5, 2), (1852, 1, 20, 17.144394848495722), 1.1666666666662417], [(5, 7), (1853, 3, 21, 20.219124265015125), 3.0], [(5, 4), (1856, 3, 21, 14.411285631358624), 2.6666666666662415], [(5, 6), (1858, 11, 20, 14.582095731049776), 3.1666666666662415], [(5, 3), (1862, 1, 20, 5.784932725131512), 2.8333333333337585], [(5, 8), (1864, 11, 20, 2.9664184637367725), 1.1666666666675165], [(0, 0), (1866, 1, 20, 6.041147891432047), 0.29999999999949006], [(0, 1), (1866, 5, 9, 19.86036402359605), 0.5], [(0, 2), (1866, 11, 8, 10.892390917986631), 0.350000000000255], [(0, 7), (1867, 3, 16, 7.014809746295214), 0.899999999999745], [(0, 4), (1868, 2, 8, 0.472458153963089), 0.79999999999949], [(0, 6), (1868, 11, 26, 5.3237011805176735), 0.95000000000051], [(0, 3), (1869, 11, 8, 5.08455228433013), 0.850000000000255], [(0, 8), (1870, 9, 14, 16.238998007029295), 0.350000000000255], [(0, 5), (1871, 1, 20, 12.361416835337877), 1.0], [(1, 1), (1872, 1, 20, 18.425470624119043), 0.8333333333337583], [(1, 2), (1872, 11, 20, 3.478848785161972), 0.5833333333337583], [(1, 7), (1873, 6, 21, 5.016213499009609), 1.5], [(1, 4), (1874, 12, 21, 2.1122941821813583), 1.3333333333337583], [(1, 6), (1876, 4, 21, 2.19769923761487), 1.5833333333337583], [(1, 3), (1877, 11, 20, 9.799117740243673), 1.4166666666662417], [(1, 8), (1879, 4, 21, 20.38986060395837), 0.5833333333337583], [(1, 5), (1879, 11, 20, 21.927225317806005), 1.6666666666662417], [(1, 0), (1881, 7, 21, 16.033981628715992), 0.4999999999987251], [(2, 2), (1882, 1, 20, 7.066008511930704), 0.4083333333336308], [(2, 7), (1882, 6, 18, 10.54216381162405), 1.04999999999949], [(2, 4), (1883, 7, 6, 22.909420285373926), 0.9333333333327384], [(2, 6), (1884, 6, 11, 20.569203816354275), 1.1083333333328658], [(2, 3), (1885, 7, 21, 16.290196761488914), 0.9916666666661142], [(2, 8), (1886, 7, 18, 21.303716763854027), 0.4083333333336308], [(2, 5), (1886, 12, 15, 0.7798720635473728), 1.1666666666662417], [(2, 0), (1888, 2, 14, 3.8546014800667763), 0.350000000000255], [(2, 1), (1888, 6, 20, 23.97702030837536), 0.5833333333350332], [(7, 7), (1889, 1, 20, 1.5143850333988667), 2.70000000000051], [(7, 4), (1891, 10, 3, 5.887330267578363), 2.399999999999745], [(7, 6), (1894, 2, 25, 20.441059358417988), 2.850000000000255], [(7, 3), (1897, 1, 1, 19.723612658679485), 2.54999999999949], [(7, 8), (1899, 7, 22, 5.1869498156011105), 1.04999999999949], [(7, 5), (1900, 8, 9, 17.554206289350986), 3.0], [(7, 0), (1903, 8, 10, 11.746367655694485), 0.899999999999745], [(7, 1), (1904, 7, 4, 5.20401606336236), 1.5], [(7, 2), (1906, 1, 3, 2.300096746534109), 1.050000000000765]]) diff --git a/references/oracle/dasha_shadbala_oracle_cases.json b/references/oracle/dasha_shadbala_oracle_cases.json index a7de8e68..d403a638 100644 --- a/references/oracle/dasha_shadbala_oracle_cases.json +++ b/references/oracle/dasha_shadbala_oracle_cases.json @@ -142,7 +142,7 @@ }, { "id": "template_historical_epoch_lahiri", - "status": "template_only", + "status": "external_verified", "source": "JHora/PyJHora offline tool", "privacy": "synthetic_historical_epoch_template", "birth": { @@ -162,9 +162,23 @@ }, "target": { "sun_sidereal_longitude_deg": null, - "vimshottari_start_date": null + "vimshottari_start_date": "1787-01-19" }, - "verification_note": "Historical epoch precision case; fill targets only from external tool output." + "verification_note": "Historical epoch precision case; fill targets only from external tool output.", + "evidence_packet": { + "capture_id": "external_template_historical_epoch_lahiri", + "status": "external_verified", + "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_historical_epoch_dasha_stdout_20260627.txt", + "ayanamsa": "lahiri", + "node_mode": "PyJHora default", + "timezone": "UTC+05:30", + "operator_note": "Black-box stdout from isolated /tmp virtualenv. PyJHora AGPL code was not copied into this repository; only the generated output artifact is stored as external evidence." + } + } } ], "dasha_cases": [ diff --git a/references/skill_gap_truth_registry.json b/references/skill_gap_truth_registry.json index f5b2b49d..5d01774b 100644 --- a/references/skill_gap_truth_registry.json +++ b/references/skill_gap_truth_registry.json @@ -12,15 +12,15 @@ "dasha_external_oracle": { "title": "Dasha external oracle", "priority": "P0", - "status": "active_partial_external_evidence", - "current_truth": "Dasha engines are usable and Dasha-only external oracle evidence is partially closed at 2/3 packets; exact start dates, balance periods and sub-period boundaries cannot be called fully closed until the remaining packet and multi-family comparisons pass validation.", + "status": "active_target_set_closed", + "current_truth": "Dasha engines are usable and the current Dasha-only external oracle target set is closed at 3/3 packets; exact start dates beyond this target set, balance periods, sub-period boundaries and multi-family comparisons still need expansion before claiming software-grade Dasha timing accuracy.", "completion_standard": [ "All current Dasha-only external_verified packets are accepted by scripts/dasha_oracle_evidence_validator.py.", "Multiple Dasha families have versioned boundary comparisons.", "Differences between local output and external oracle output are documented without production tuning from local data." ], "forbidden_claims": [ - "Dasha external oracle alone is complete", + "Dasha external oracle alone proves global timing accuracy", "Exact Dasha dates are perfectly calibrated", "One local chart output proves software-grade timing accuracy" ], diff --git a/scripts/dasha_oracle_closure_status.py b/scripts/dasha_oracle_closure_status.py index ecc21816..fa158eac 100644 --- a/scripts/dasha_oracle_closure_status.py +++ b/scripts/dasha_oracle_closure_status.py @@ -132,35 +132,27 @@ def build_status(oracle_file: str) -> dict[str, Any]: task for task in dasha_tasks if not _dasha_target_filled(task, required_target_fields) ] - priority_pool = unverified_dasha_tasks or dasha_tasks + dasha_closed = bool(dasha_tasks) and not unverified_dasha_tasks + priority_pool = unverified_dasha_tasks if not dasha_closed else [] priority = next((task for task in priority_pool if task.get("case_id") == FIRST_PRIORITY_CASE_ID), None) if priority is None and priority_pool: priority = priority_pool[0] - if priority is None: + if priority is None and not dasha_closed: raise RuntimeError("No Dasha target task found") - - queue_packet = priority["evidence_packet"] - capture_id = queue_packet["capture_id"] - packet_path = f"references/oracle/artifacts/pending_packets/{capture_id}.json" - template_path = FIRST_PRIORITY_TEMPLATE_PATH if priority["case_id"] == FIRST_PRIORITY_CASE_ID else packet_path - packet = json.loads((ROOT / template_path).read_text(encoding="utf-8")) - missing_fields = _metadata_missing(packet) + _target_missing(packet, required_target_fields) - missing_groups = _group_missing_fields(missing_fields) external_verified = [ task for task in dasha_tasks if _dasha_target_filled(task, required_target_fields) ] - - return { - "scope": "dasha_external_oracle_closure_status", - "schema_version": 1, - "summary": { - "dasha_task_count": len(dasha_tasks), - "external_verified_dasha_tasks": len(external_verified), - "can_claim_dasha_oracle_closure": bool(dasha_tasks) and len(external_verified) == len(dasha_tasks), - "production_tuning_allowed": False, - }, - "first_priority": { + first_priority = None + if priority is not None: + queue_packet = priority["evidence_packet"] + capture_id = queue_packet["capture_id"] + packet_path = f"references/oracle/artifacts/pending_packets/{capture_id}.json" + template_path = FIRST_PRIORITY_TEMPLATE_PATH if priority["case_id"] == FIRST_PRIORITY_CASE_ID else packet_path + packet = json.loads((ROOT / template_path).read_text(encoding="utf-8")) + missing_fields = _metadata_missing(packet) + _target_missing(packet, required_target_fields) + missing_groups = _group_missing_fields(missing_fields) + first_priority = { "case_id": priority["case_id"], "capture_id": capture_id, "packet_path": packet_path, @@ -179,13 +171,28 @@ def build_status(oracle_file: str) -> dict[str, Any]: "artifact_policy": "Save redacted screenshots or stdout snippets under references/oracle/artifacts/.", "apply_command": _apply_command(packet_path, oracle_file), "validate_command": _validate_command(oracle_file), + } + next_actions = [ + "Dasha-only external oracle closure is complete for the current target set.", + "Keep global calibration blocked until Shadbala and other non-Dasha oracle packets pass validation.", + ] if dasha_closed else [ + "Open the first priority packet and fill metadata from an external oracle.", + "Fill target.vimshottari_start_date only from JHora/PyJHora/book example, not from this repository.", + "Set status to external_verified after the artifact path and Dasha target are filled.", + "Apply the packet, regenerate the queue, and run oracle_evidence_validator.py.", + ] + + return { + "scope": "dasha_external_oracle_closure_status", + "schema_version": 1, + "summary": { + "dasha_task_count": len(dasha_tasks), + "external_verified_dasha_tasks": len(external_verified), + "can_claim_dasha_oracle_closure": bool(dasha_tasks) and len(external_verified) == len(dasha_tasks), + "production_tuning_allowed": False, }, - "next_actions": [ - "Open the first priority packet and fill metadata from an external oracle.", - "Fill target.vimshottari_start_date only from JHora/PyJHora/book example, not from this repository.", - "Set status to external_verified after the artifact path and Dasha target are filled.", - "Apply the packet, regenerate the queue, and run oracle_evidence_validator.py.", - ], + "first_priority": first_priority, + "next_actions": next_actions, "boundary": ( "This board isolates the Dasha shortest path. Shadbala remains a separate absolute-value " "closure task and must not block collecting the first Dasha boundary date." @@ -204,6 +211,24 @@ def render_markdown(report: dict[str, Any]) -> str: f"- can_claim_dasha_oracle_closure: `{str(summary['can_claim_dasha_oracle_closure']).lower()}`", f"- production_tuning_allowed: `{str(summary['production_tuning_allowed']).lower()}`", "", + ] + if first is None: + lines.extend( + [ + "## First Priority Packet", + "", + "- none: Dasha-only external oracle closure is complete for the current target set.", + "", + "## Next Actions", + "", + ] + ) + lines.extend(f"- {item}" for item in report["next_actions"]) + lines.extend(["", "## Boundary", "", report["boundary"], ""]) + return "\n".join(lines) + + lines.extend( + [ "## First Priority Packet", "", f"- case_id: `{first['case_id']}`", @@ -221,7 +246,8 @@ def render_markdown(report: dict[str, Any]) -> str: f"- status: `{first['prefilled_fields']['status']}`", f"- promotion_status_after_fill: `{first['prefilled_fields']['promotion_status_after_fill']}`", "", - ] + ] + ) if first["prefilled_fields"]["metadata"]: lines.append("- metadata:") lines.append("") diff --git a/scripts/oracle_closure_master_dashboard.py b/scripts/oracle_closure_master_dashboard.py index 0ebfba48..73b579c6 100644 --- a/scripts/oracle_closure_master_dashboard.py +++ b/scripts/oracle_closure_master_dashboard.py @@ -35,6 +35,16 @@ def _front_from_status(name: str, status: dict[str, Any], task_key: str, verifie first = status["first_priority"] task_count = int(summary[task_key]) verified = int(summary[verified_key]) + if first is None: + return { + "front": name, + "task_count": task_count, + "external_verified_tasks": verified, + "open_tasks": task_count - verified, + "can_claim_closure": bool(summary[claim_key]), + "production_tuning_allowed": bool(summary.get("production_tuning_allowed", False)), + "first_priority": None, + } missing_fields = first.get("missing_fields", []) return { "front": name, @@ -120,7 +130,7 @@ def build_dashboard(dasha_oracle_file: str, tajika_oracle_file: str) -> dict[str "apply_command": front["first_priority"]["apply_command"], } for front in fronts.values() - if not front["can_claim_closure"] + if not front["can_claim_closure"] and front["first_priority"] is not None ], key=lambda item: item["missing_field_count"], ) @@ -167,6 +177,12 @@ def render_markdown(report: dict[str, Any]) -> str: for key in ["dasha", "tajika_sahams", "shadbala"]: front = report["fronts"][key] first = front["first_priority"] + if first is None: + lines.append( + f"| `{key}` | {front['task_count']} | {front['external_verified_tasks']} | `complete` | " + "0 | 0 | 0 | 0 |" + ) + continue missing_groups = first.get("missing_groups", {}) manual_fill_plan = first.get("manual_fill_plan", {}) lines.append( diff --git a/scripts/public_benchmark_dashboard.py b/scripts/public_benchmark_dashboard.py index 876b69cb..e263d20c 100644 --- a/scripts/public_benchmark_dashboard.py +++ b/scripts/public_benchmark_dashboard.py @@ -111,7 +111,7 @@ def build_dashboard(oracle_file: str) -> dict[str, Any]: }, "global_first_gap": global_first_gap, "next_actions": [ - "Fill the next open external JHora/PyJHora packet under references/oracle/artifacts/pending_packets.", + "Fill the next open Tajika/Sahams or Shadbala external packet under references/oracle/artifacts/pending_packets.", "Run oracle_evidence_validator.py until at least one packet is valid.", "Run oracle_boundary_audit.py to inspect Dasha/Shadbala deltas without tuning constants.", "Publish this dashboard after each validated sample batch.", diff --git a/tests/test_dasha_oracle_closure_status.py b/tests/test_dasha_oracle_closure_status.py index d2850f4c..45b69218 100644 --- a/tests/test_dasha_oracle_closure_status.py +++ b/tests/test_dasha_oracle_closure_status.py @@ -29,7 +29,7 @@ def run_status(*args: str) -> subprocess.CompletedProcess[str]: ) -def test_dasha_oracle_closure_status_identifies_first_shortest_packet() -> None: +def test_dasha_oracle_closure_status_reports_current_dasha_closure() -> None: completed = run_status("--format", "json") assert completed.returncode == 0, completed.stderr or completed.stdout @@ -37,21 +37,9 @@ def test_dasha_oracle_closure_status_identifies_first_shortest_packet() -> None: assert report["scope"] == "dasha_external_oracle_closure_status" assert report["schema_version"] == 1 assert report["summary"]["dasha_task_count"] == 3 - assert report["summary"]["external_verified_dasha_tasks"] == 2 - assert report["summary"]["can_claim_dasha_oracle_closure"] is False - assert report["first_priority"]["case_id"] == "template_historical_epoch_lahiri" - assert report["first_priority"]["capture_id"] == "external_template_historical_epoch_lahiri" - assert report["first_priority"]["required_target_fields"] == ["target.vimshottari_start_date"] - assert "metadata.tool_name" in report["first_priority"]["missing_fields"] - assert "target.vimshottari_start_date" in report["first_priority"]["missing_fields"] - assert report["first_priority"]["missing_groups"]["metadata"]["count"] == 5 - assert report["first_priority"]["missing_groups"]["target"]["count"] == 1 - assert report["first_priority"]["prefilled_fields"]["metadata"]["ayanamsa"] == "lahiri" - assert report["first_priority"]["prefilled_fields"]["metadata"]["timezone"] == 5.5 - assert report["first_priority"]["manual_fill_plan"]["status_value"] == "external_verified" - assert report["first_priority"]["manual_fill_plan"]["manual_entry_count"] == 6 - assert report["first_priority"]["apply_command"] - assert report["first_priority"]["validate_command"] + assert report["summary"]["external_verified_dasha_tasks"] == 3 + assert report["summary"]["can_claim_dasha_oracle_closure"] is True + assert report["first_priority"] is None def test_dasha_oracle_closure_status_markdown_can_be_written(tmp_path: Path) -> None: @@ -62,29 +50,19 @@ def test_dasha_oracle_closure_status_markdown_can_be_written(tmp_path: Path) -> assert output.exists() markdown = output.read_text(encoding="utf-8") assert "# Dasha External Oracle Closure Status" in markdown - assert "can_claim_dasha_oracle_closure: `false`" in markdown - assert "external_template_historical_epoch_lahiri" in markdown - assert "target.vimshottari_start_date" in markdown - assert "## Missing Summary" in markdown - assert "## Prefilled Fields" in markdown - assert "## Manual Fill Plan" in markdown + assert "can_claim_dasha_oracle_closure: `true`" in markdown + assert "none: Dasha-only external oracle closure is complete" in markdown + assert "Keep global calibration blocked" in markdown def test_dasha_oracle_closure_status_advances_after_first_packet_is_filled(tmp_path: Path) -> None: - oracle_file = tmp_path / "oracle_cases.json" - oracle_file.write_text( - (ROOT / "references/oracle/dasha_shadbala_oracle_cases.json").read_text(encoding="utf-8"), - encoding="utf-8", - ) - packet = ROOT / "references/oracle/artifacts/pending_packets/external_template_steve_jobs_dasha_lahiri_pyjhora_20260627.json" - apply_completed = subprocess.run( + queue_file = tmp_path / "queue.json" + queue_completed = subprocess.run( [ sys.executable, "scripts/oracle_collection_queue.py", "--oracle-file", - str(oracle_file), - "--apply-packet", - str(packet), + "references/oracle/dasha_shadbala_oracle_cases.json", "--format", "json", ], @@ -94,16 +72,15 @@ def test_dasha_oracle_closure_status_advances_after_first_packet_is_filled(tmp_p timeout=60, check=False, ) - assert apply_completed.returncode == 0, apply_completed.stderr or apply_completed.stdout + assert queue_completed.returncode == 0, queue_completed.stderr or queue_completed.stdout + queue_file.write_text(queue_completed.stdout, encoding="utf-8") completed = subprocess.run( [ sys.executable, - "scripts/dasha_oracle_closure_status.py", - "--oracle-file", - str(oracle_file), - "--format", - "json", + "scripts/dasha_oracle_evidence_validator.py", + "--queue-file", + str(queue_file), ], cwd=ROOT, text=True, @@ -114,6 +91,19 @@ def test_dasha_oracle_closure_status_advances_after_first_packet_is_filled(tmp_p assert completed.returncode == 0, completed.stderr or completed.stdout report = json.loads(completed.stdout) - assert report["summary"]["external_verified_dasha_tasks"] == 2 - assert report["first_priority"]["case_id"] == "template_historical_epoch_lahiri" - assert report["first_priority"]["missing_fields"] + assert report["summary"]["valid_dasha_packets"] == 3 + assert report["summary"]["all_dasha_packets_external_verified"] is True + + +def test_dasha_oracle_closure_status_has_no_first_priority_after_all_dasha_packets_are_filled() -> None: + completed = run_status("--format", "json") + + assert completed.returncode == 0, completed.stderr or completed.stdout + report = json.loads(completed.stdout) + assert report["summary"]["external_verified_dasha_tasks"] == 3 + assert report["summary"]["can_claim_dasha_oracle_closure"] is True + assert report["first_priority"] is None + assert report["next_actions"] == [ + "Dasha-only external oracle closure is complete for the current target set.", + "Keep global calibration blocked until Shadbala and other non-Dasha oracle packets pass validation.", + ] diff --git a/tests/test_oracle_closure_master_dashboard.py b/tests/test_oracle_closure_master_dashboard.py index afff2a93..351cdff2 100644 --- a/tests/test_oracle_closure_master_dashboard.py +++ b/tests/test_oracle_closure_master_dashboard.py @@ -39,25 +39,20 @@ def test_oracle_closure_master_dashboard_aggregates_all_hard_fronts() -> None: assert report["scope"] == "jyotish_external_oracle_closure_master_dashboard" assert report["schema_version"] == 1 assert report["summary"]["total_tasks"] == 12 - assert report["summary"]["external_verified_tasks"] == 2 - assert report["summary"]["open_tasks"] == 10 + assert report["summary"]["external_verified_tasks"] == 3 + assert report["summary"]["open_tasks"] == 9 assert report["summary"]["can_claim_global_oracle_closure"] is False assert report["fronts"]["dasha"]["task_count"] == 3 assert report["fronts"]["shadbala"]["task_count"] == 4 assert report["fronts"]["tajika_sahams"]["task_count"] == 5 - assert report["fronts"]["dasha"]["external_verified_tasks"] == 2 - assert report["fronts"]["dasha"]["first_priority"]["case_id"] == "template_historical_epoch_lahiri" + assert report["fronts"]["dasha"]["external_verified_tasks"] == 3 + assert report["fronts"]["dasha"]["first_priority"] is None assert report["fronts"]["shadbala"]["first_priority"]["case_id"] == "template_redacted_place_shadbala_raman" assert report["fronts"]["tajika_sahams"]["first_priority"]["case_id"] == "template_steve_jobs_varshaphala_1984_lahiri" - assert report["fronts"]["dasha"]["first_priority"]["missing_groups"]["metadata"]["count"] == 5 - assert report["fronts"]["dasha"]["first_priority"]["manual_fill_plan"]["manual_entry_count"] == 6 assert report["fronts"]["tajika_sahams"]["first_priority"]["missing_groups"]["target"]["count"] == 10 assert report["fronts"]["shadbala"]["first_priority"]["manual_fill_plan"]["manual_entry_count"] == 55 - assert report["next_action_order"][0]["front"] == "dasha" - assert report["next_action_order"][0]["missing_field_count"] == 6 - assert report["next_action_order"][0]["manual_entry_count"] == 6 - assert report["next_action_order"][1]["front"] == "tajika_sahams" - assert report["next_action_order"][2]["front"] == "shadbala" + assert report["next_action_order"][0]["front"] == "tajika_sahams" + assert report["next_action_order"][1]["front"] == "shadbala" def test_oracle_closure_master_dashboard_markdown_can_be_written(tmp_path: Path) -> None: @@ -70,7 +65,7 @@ def test_oracle_closure_master_dashboard_markdown_can_be_written(tmp_path: Path) assert "# Jyotish External Oracle Closure Master Dashboard" in markdown assert "total_tasks: `12`" in markdown assert "can_claim_global_oracle_closure: `false`" in markdown - assert "template_historical_epoch_lahiri" in markdown + assert "`dasha` | 3 | 3 | `complete`" in markdown assert "template_redacted_place_shadbala_raman" in markdown assert "template_steve_jobs_varshaphala_1984_lahiri" in markdown assert "manual entries" in markdown diff --git a/tests/test_public_benchmark_dashboard.py b/tests/test_public_benchmark_dashboard.py index 1715abbd..dc08a33c 100644 --- a/tests/test_public_benchmark_dashboard.py +++ b/tests/test_public_benchmark_dashboard.py @@ -42,10 +42,10 @@ def test_public_benchmark_dashboard_outputs_stable_json_summary() -> None: assert report["oracle_readiness"]["valid_packets"] == 0 assert report["oracle_readiness"]["ready_for_calibration"] == 0 assert report["oracle_readiness"]["production_tuning_allowed"] is False - assert report["dasha_oracle_readiness"]["valid_dasha_packets"] == 2 + assert report["dasha_oracle_readiness"]["valid_dasha_packets"] == 3 assert report["dasha_oracle_readiness"]["total_dasha_packets"] == 3 assert report["boundary_audit"]["production_tuning_recommended"] is False - assert "Dasha-only external oracle readiness is 2/3" in report["global_first_gap"] + assert "Dasha-only external oracle readiness is 3/3" in report["global_first_gap"] assert report["public_claim"]["can_claim_global_first"] is False assert report["public_claim"]["reason"] diff --git a/tests/test_skill_gap_truth_audit.py b/tests/test_skill_gap_truth_audit.py index bdf94c61..33ad37f7 100644 --- a/tests/test_skill_gap_truth_audit.py +++ b/tests/test_skill_gap_truth_audit.py @@ -31,7 +31,12 @@ def test_skill_gap_truth_registry_lists_hard_fronts_and_past_corrections() -> No assert required_fronts <= set(hard_fronts) for front_id in required_fronts: front = hard_fronts[front_id] - assert front["status"] in {"blocked_external_evidence", "active_gap", "active_partial_external_evidence"} + assert front["status"] in { + "blocked_external_evidence", + "active_gap", + "active_partial_external_evidence", + "active_target_set_closed", + } assert front["priority"] in {"P0", "P1", "P2"} assert front["completion_standard"] assert front["forbidden_claims"]