diff --git a/SKILL.md b/SKILL.md index 8cbe809d..d0a3a2b2 100644 --- a/SKILL.md +++ b/SKILL.md @@ -144,10 +144,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: 0`,`ready_for_calibration: 0`,因为 Shadbala 绝对 Rupa/Virupa 六分量尚未外部封顶。 +- 全局 Dasha/Shadbala Calibration Status 仍未完成:`external_oracle_evidence_validation.valid_packets: 1`,`ready_for_calibration: 1`;首个 Shadbala 外部绝对值样本已通过,剩余 Shadbala rows 与非 Dasha 靶点尚未封顶。 - D1/D9/SAV 高可信;Dasha 精细日期可引用已验证 Dasha-only 样本的局部进度,但不得把全部大运边界、Shadbala 绝对值或全局精度说成已完成外部校准。 - `production_tuning_allowed: false` 前,禁止为了贴合单份 PDF、单个 JHora 截图或本仓库本地输出而改生产常数。 -- 对普通用户的建议话术:基础落座、D9、SAV 可作为稳定证据;当前 Dasha-only 目标集已完成外部黑盒验证,但多 Dasha 家族、Antardasha/Pratyantar 细边界仍需扩展;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) @@ -194,13 +194,13 @@ description: 印度占星(Jyotish)专业解盘与推运系统。核心能力 ### Shadbala 能力边界(v6.9.14-shadbala) -**当前 Shadbala 在注册表中为 covered,主输出为 absolute Rupa 分量求和,可作为内部一致的相对强弱参考;但不得声称已完成外部绝对值校准。** +**当前 Shadbala 在注册表中为 covered,主输出为 absolute Rupa 分量求和,可作为内部一致的相对强弱参考;首个外部绝对值六分量样本已通过,但不得声称全部 Shadbala 绝对值已完成校准。** - 当前 benchmark 验证 `shadbala` 子命令与 `full-reading.modules.shadbala` 的六重分量求和、Virupa/Rupa 换算和 total invariant;用户样本已输出 absolute Rupa。 - v6.9.12 已升级 Nathonnata Bala 连续化与 Drik Bala Sputa Drishti 精确相位,v6.9.14 注册表状态为 `covered`。 - 通过项包括:结构完整性、六重力量组件范围、总分聚合、Virupa/Rupa 换算、排名、full-reading 一致性。 - 仍需保留边界:部分 Saptavargaja 子分盘与 Chesta Bala 速度分档仍需更多外部绝对值对标。 -- 因此 `technique_registry.json` 中 Shadbala 状态为 `covered`,但涉及精确力量断语时必须加置信度上限,直到接入 JHora/公开书例等完整外部绝对值对标。 +- 因此 `technique_registry.json` 中 Shadbala 状态为 `covered`,但涉及精确力量断语时必须加置信度上限,直到更多 JHora/公开书例等完整外部绝对值对标通过。 --- diff --git a/docs/research/oracle_closure_master_dashboard_latest.md b/docs/research/oracle_closure_master_dashboard_latest.md index 82ed08db..81911d5e 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-26T17:01:36.150782+00:00` +Generated: `2026-06-26T17:25:44.270300+00:00` ## Summary - total_tasks: `12` -- external_verified_tasks: `3` -- open_tasks: `9` +- external_verified_tasks: `4` +- open_tasks: `8` - can_claim_global_oracle_closure: `false` - production_tuning_allowed: `false` @@ -16,7 +16,7 @@ Generated: `2026-06-26T17:01:36.150782+00:00` |---|---:|---:|---|---:|---:|---:|---:| | `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 | +| `shadbala` | 4 | 1 | `template_user_REDACTED_YEAR_moon_longitude_lahiri` | 55 | 55 | 5 | 50 | ## Next Action Order @@ -33,13 +33,13 @@ python3 scripts/tajika_annual_oracle_queue.py --oracle-file references/oracle/ta ### shadbala -- case_id: `template_redacted_place_shadbala_raman` -- capture_id: `external_template_redacted_place_shadbala_raman` +- case_id: `template_user_REDACTED_YEAR_moon_longitude_lahiri` +- capture_id: `external_template_user_REDACTED_YEAR_moon_longitude_lahiri` - missing_field_count: `55` - manual_entry_count: `55` ```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_redacted_place_shadbala_raman.json --format json +python3 scripts/oracle_collection_queue.py --oracle-file references/oracle/dasha_shadbala_oracle_cases.json --apply-packet references/oracle/artifacts/pending_packets/external_template_user_REDACTED_YEAR_moon_longitude_lahiri.json --format json ``` ## Boundary diff --git a/docs/research/public_benchmark_dashboard_latest.md b/docs/research/public_benchmark_dashboard_latest.md index 6d2d1a3a..e62a9ef5 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-26T17:01:59.939612+00:00` +Generated: `2026-06-26T17:25:43.800702+00:00` ## Capability Registry @@ -11,16 +11,18 @@ Generated: `2026-06-26T17:01:59.939612+00:00` ## Dasha/Shadbala Oracle Readiness - total_packets: `5` -- valid_packets: `0` -- ready_for_calibration: `0` +- valid_packets: `1` +- ready_for_calibration: `1` - production_tuning_allowed: `false` - valid_dasha_packets: `3` - total_dasha_packets: `3` +- external_verified_shadbala_tasks: `1` +- shadbala_task_count: `4` ## Boundary Audit -- external_verified_template_cases: `0` -- template_comparison_count: `0` +- external_verified_template_cases: `1` +- template_comparison_count: `1` - production_tuning_recommended: `false` ## Global First Claim @@ -30,7 +32,7 @@ Generated: `2026-06-26T17:01:59.939612+00:00` ## Remaining Gap -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. +Dasha-only external oracle readiness is 3/3; Shadbala external absolute-value readiness is 1/4; public long-term benchmark history is not yet comparable to the strongest global open-source projects. ## Next Actions diff --git a/docs/research/skill_gap_truth_audit_latest.md b/docs/research/skill_gap_truth_audit_latest.md index b7b097ef..8b6da026 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-26T17:01:36.751861+00:00` +Generated: `2026-06-26T17:25:44.917972+00:00` ## Public Claim Boundary @@ -19,8 +19,8 @@ Generated: `2026-06-26T17:01:36.751861+00:00` ## External Oracle Closure - total_tasks: `12` -- external_verified_tasks: `3` -- open_tasks: `9` +- external_verified_tasks: `4` +- open_tasks: `8` - can_claim_global_oracle_closure: `false` ## Remaining Hard Fronts @@ -43,8 +43,8 @@ Generated: `2026-06-26T17:01:36.751861+00:00` - id: `shadbala_external_absolute_values` - priority: `P0` -- status: `blocked_external_evidence` -- current_truth: Internal six-component Rupa/Virupa aggregation is usable, but external absolute-value closure is not complete. +- status: `active_partial_external_evidence` +- current_truth: Internal six-component Rupa/Virupa aggregation is usable and the first external Shadbala absolute-value packet is accepted; remaining Shadbala rows and broader source comparisons are not complete. ### Tajika / Sahams annual closure diff --git a/references/oracle/dasha_shadbala_oracle_cases.json b/references/oracle/dasha_shadbala_oracle_cases.json index d403a638..91ec0e19 100644 --- a/references/oracle/dasha_shadbala_oracle_cases.json +++ b/references/oracle/dasha_shadbala_oracle_cases.json @@ -90,7 +90,7 @@ }, { "id": "template_redacted_place_shadbala_raman", - "status": "template_only", + "status": "external_verified", "source": "JHora/PyJHora/VedAstro API", "privacy": "synthetic_location_template", "birth": { @@ -109,10 +109,88 @@ "node_mode": "mean" }, "target": { - "moon_sidereal_longitude_deg": null, - "shadbala_components": null + "moon_sidereal_longitude_deg": 63.228185, + "shadbala_components": { + "Sun": { + "sthana": 2.439, + "dig": 1.9718, + "kala": 1.0337, + "chesta": 0.0, + "naisargika": 1.0, + "drik": -0.0113, + "total_rupa": 6.4332 + }, + "Moon": { + "sthana": 3.1445, + "dig": 2.1273, + "kala": 1.0472, + "chesta": 0.0, + "naisargika": 0.8572, + "drik": -0.361, + "total_rupa": 6.8152 + }, + "Mars": { + "sthana": 2.7263, + "dig": 1.7472, + "kala": 0.3898, + "chesta": 0.7592, + "naisargika": 0.2857, + "drik": 0.1142, + "total_rupa": 6.0224 + }, + "Mercury": { + "sthana": 3.1745, + "dig": 2.1688, + "kala": 0.453, + "chesta": 0.1417, + "naisargika": 0.4285, + "drik": -0.0113, + "total_rupa": 6.3552 + }, + "Jupiter": { + "sthana": 3.3232, + "dig": 3.8015, + "kala": 0.1472, + "chesta": 0.6942, + "naisargika": 0.5715, + "drik": 0.0903, + "total_rupa": 8.6279 + }, + "Venus": { + "sthana": 2.7498, + "dig": 2.2482, + "kala": 0.2098, + "chesta": 0.3582, + "naisargika": 0.7143, + "drik": 0.0598, + "total_rupa": 6.3401 + }, + "Saturn": { + "sthana": 3.7492, + "dig": 1.3578, + "kala": 1.0538, + "chesta": 0.6068, + "naisargika": 0.1428, + "drik": 0.1852, + "total_rupa": 7.0956 + } + } }, - "verification_note": "Validate Raman ayanamsa effects with external Shadbala component rows before promotion." + "verification_note": "Validate Raman ayanamsa effects with external Shadbala component rows before promotion.", + "evidence_packet": { + "capture_id": "external_template_redacted_place_shadbala_raman", + "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_redacted_place_shadbala_raman_stdout_20260627.txt", + "ayanamsa": "raman", + "node_mode": "PyJHora default", + "timezone": "UTC+08:00", + "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. Shadbala raw values are Virupa; packet stores Rupa values by dividing by 60." + } + } }, { "id": "template_extreme_latitude_kp", diff --git a/references/skill_gap_truth_registry.json b/references/skill_gap_truth_registry.json index 5d01774b..a2acc1ee 100644 --- a/references/skill_gap_truth_registry.json +++ b/references/skill_gap_truth_registry.json @@ -33,8 +33,8 @@ "shadbala_external_absolute_values": { "title": "Shadbala external absolute values", "priority": "P0", - "status": "blocked_external_evidence", - "current_truth": "Internal six-component Rupa/Virupa aggregation is usable, but external absolute-value closure is not complete.", + "status": "active_partial_external_evidence", + "current_truth": "Internal six-component Rupa/Virupa aggregation is usable and the first external Shadbala absolute-value packet is accepted; remaining Shadbala rows and broader source comparisons are not complete.", "completion_standard": [ "All seven visible planets have external Sthana, Dig, Kala, Chesta, Naisargika, Drik and total Rupa evidence.", "Component sums match validated packet structure.", @@ -46,8 +46,8 @@ "Global scaling alone fixes Shadbala" ], "next_actions": [ - "Use scripts/shadbala_oracle_closure_status.py for the first absolute-value packet.", - "Fill the REDACTED_PLACE/Raman or equivalent component table from an external oracle.", + "Use scripts/shadbala_oracle_closure_status.py for the next absolute-value packet.", + "Fill the remaining component tables from external oracles.", "Reject production constant changes until component-level evidence is accepted." ] }, diff --git a/scripts/oracle_evidence_validator.py b/scripts/oracle_evidence_validator.py index c8a063c3..25d92f45 100644 --- a/scripts/oracle_evidence_validator.py +++ b/scripts/oracle_evidence_validator.py @@ -27,6 +27,7 @@ LOCAL_ENGINE_MARKERS = [ SHADBALA_REQUIRED_PLANETS = ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn"] SHADBALA_REQUIRED_COMPONENTS = ["sthana", "dig", "kala", "chesta", "naisargika", "drik"] SHADBALA_COMPONENT_MAX_RUPA = 20.0 +SHADBALA_DRIK_MIN_RUPA = -20.0 SHADBALA_TOTAL_TOLERANCE_RUPA = 0.05 ASHTAKOOT_SCORE_RANGES = { "target.total_score": (0.0, 36.0), @@ -153,7 +154,10 @@ def _validate_shadbala_components(value: Any) -> list[str]: if not isinstance(component_value, (int, float)) or isinstance(component_value, bool): problems.append(f"invalid_shadbala_component_type:{planet}.{component}") continue - if component_value < 0: + if component == "drik" and component_value < SHADBALA_DRIK_MIN_RUPA: + problems.append(f"invalid_shadbala_component_range:{planet}.{component}") + continue + if component != "drik" and component_value < 0: problems.append(f"invalid_shadbala_component_negative:{planet}.{component}") continue if component_value > SHADBALA_COMPONENT_MAX_RUPA: diff --git a/scripts/public_benchmark_dashboard.py b/scripts/public_benchmark_dashboard.py index e263d20c..3849d15c 100644 --- a/scripts/public_benchmark_dashboard.py +++ b/scripts/public_benchmark_dashboard.py @@ -58,6 +58,18 @@ def _dasha_readiness(oracle_file: str) -> dict[str, Any]: return validation["summary"] +def _shadbala_readiness(oracle_file: str) -> dict[str, Any]: + report = _run_json([ + PYTHON, + "scripts/shadbala_oracle_closure_status.py", + "--oracle-file", + oracle_file, + "--format", + "json", + ]) + return report["summary"] + + def _boundary_audit(oracle_file: str) -> dict[str, Any]: report = _run_json([PYTHON, "scripts/oracle_boundary_audit.py", "--oracle-file", oracle_file]) summary = report["summary"] @@ -78,10 +90,12 @@ def build_dashboard(oracle_file: str) -> dict[str, Any]: oracle = _oracle_readiness(oracle_file) boundary = _boundary_audit(oracle_file) dasha = _dasha_readiness(oracle_file) + shadbala = _shadbala_readiness(oracle_file) global_first_gap = ( f"Dasha-only external oracle readiness is {dasha['valid_dasha_packets']}/" - f"{dasha['total_dasha_packets']}; Shadbala absolute values still need component-level " - "external evidence, and public long-term benchmark history is not yet comparable to the strongest " + f"{dasha['total_dasha_packets']}; Shadbala external absolute-value readiness is " + f"{shadbala['external_verified_shadbala_tasks']}/{shadbala['shadbala_task_count']}; " + "public long-term benchmark history is not yet comparable to the strongest " "global open-source projects." ) can_claim_global_first = bool( @@ -101,6 +115,7 @@ def build_dashboard(oracle_file: str) -> dict[str, Any]: }, "oracle_readiness": oracle, "dasha_oracle_readiness": dasha, + "shadbala_oracle_readiness": shadbala, "boundary_audit": boundary, "public_claim": { "can_claim_global_first": can_claim_global_first, @@ -122,6 +137,7 @@ def build_dashboard(oracle_file: str) -> dict[str, Any]: def render_markdown(report: dict[str, Any]) -> str: oracle = report["oracle_readiness"] dasha = report["dasha_oracle_readiness"] + shadbala = report["shadbala_oracle_readiness"] boundary = report["boundary_audit"] claim = report["public_claim"] lines = [ @@ -143,6 +159,8 @@ def render_markdown(report: dict[str, Any]) -> str: f"- production_tuning_allowed: `{str(oracle['production_tuning_allowed']).lower()}`", f"- valid_dasha_packets: `{dasha['valid_dasha_packets']}`", f"- total_dasha_packets: `{dasha['total_dasha_packets']}`", + f"- external_verified_shadbala_tasks: `{shadbala['external_verified_shadbala_tasks']}`", + f"- shadbala_task_count: `{shadbala['shadbala_task_count']}`", "", "## Boundary Audit", "", diff --git a/scripts/shadbala_oracle_closure_status.py b/scripts/shadbala_oracle_closure_status.py index 3ab78f4d..90fddb5e 100644 --- a/scripts/shadbala_oracle_closure_status.py +++ b/scripts/shadbala_oracle_closure_status.py @@ -83,6 +83,15 @@ def _supporting_missing(packet: dict[str, Any], target_fields: list[str]) -> lis return missing +def _shadbala_target_filled(task: dict[str, Any]) -> bool: + packet = task.get("evidence_packet", {}) + return ( + task.get("status") == "external_verified" + and not _supporting_missing(packet, task.get("target_fields", [])) + and not _shadbala_missing(packet) + ) + + def _group_missing_fields(missing_fields: list[str]) -> dict[str, Any]: metadata_fields = [field for field in missing_fields if field.startswith("metadata.")] target_fields = [field for field in missing_fields if field.startswith("target.")] @@ -167,9 +176,14 @@ def build_status(oracle_file: str) -> dict[str, Any]: task for task in queue.get("tasks", []) if SHADBALA_TARGET_FIELD in task.get("target_fields", []) ] - priority = next((task for task in shadbala_tasks if task.get("case_id") == FIRST_PRIORITY_CASE_ID), None) - if priority is None and shadbala_tasks: - priority = shadbala_tasks[0] + unverified_shadbala_tasks = [ + task for task in shadbala_tasks + if not _shadbala_target_filled(task) + ] + priority_pool = unverified_shadbala_tasks or shadbala_tasks + 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: raise RuntimeError("No Shadbala target task found") @@ -184,11 +198,7 @@ def build_status(oracle_file: str) -> dict[str, Any]: missing_groups = _group_missing_fields(missing_fields) external_verified = [ task for task in shadbala_tasks - if ( - task.get("status") == "external_verified" - and not _supporting_missing(task.get("evidence_packet", {}), task.get("target_fields", [])) - and not _shadbala_missing(task.get("evidence_packet", {})) - ) + if _shadbala_target_filled(task) ] return { diff --git a/tests/test_oracle_closure_master_dashboard.py b/tests/test_oracle_closure_master_dashboard.py index 351cdff2..9c6311d9 100644 --- a/tests/test_oracle_closure_master_dashboard.py +++ b/tests/test_oracle_closure_master_dashboard.py @@ -39,15 +39,16 @@ 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"] == 3 - assert report["summary"]["open_tasks"] == 9 + assert report["summary"]["external_verified_tasks"] == 4 + assert report["summary"]["open_tasks"] == 8 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"] == 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"]["shadbala"]["external_verified_tasks"] == 1 + assert report["fronts"]["shadbala"]["first_priority"]["case_id"] == "template_user_REDACTED_YEAR_moon_longitude_lahiri" assert report["fronts"]["tajika_sahams"]["first_priority"]["case_id"] == "template_steve_jobs_varshaphala_1984_lahiri" 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 @@ -66,7 +67,7 @@ def test_oracle_closure_master_dashboard_markdown_can_be_written(tmp_path: Path) assert "total_tasks: `12`" in markdown assert "can_claim_global_oracle_closure: `false`" in markdown assert "`dasha` | 3 | 3 | `complete`" in markdown - assert "template_redacted_place_shadbala_raman" in markdown + assert "template_user_REDACTED_YEAR_moon_longitude_lahiri" in markdown assert "template_steve_jobs_varshaphala_1984_lahiri" in markdown assert "manual entries" in markdown assert "metadata missing" in markdown diff --git a/tests/test_oracle_evidence_validator.py b/tests/test_oracle_evidence_validator.py index 6f3897fe..ec27d0f4 100644 --- a/tests/test_oracle_evidence_validator.py +++ b/tests/test_oracle_evidence_validator.py @@ -90,15 +90,14 @@ def test_validator_rejects_draft_packets_without_external_artifacts(tmp_path: Pa report = json.loads(completed.stdout) assert report["scope"] == "external_oracle_evidence_validation" assert report["summary"]["total_packets"] == 5 - assert report["summary"]["valid_packets"] == 0 - assert report["summary"]["ready_for_calibration"] == 0 + assert report["summary"]["valid_packets"] == 1 + assert report["summary"]["ready_for_calibration"] == 1 assert report["summary"]["all_packets_external_verified"] is False first = report["packets"][0] assert first["capture_id"] == "external_template_user_REDACTED_YEAR_moon_longitude_lahiri" assert first["valid"] is False - assert "missing_metadata:tool_name" in first["problems"] - assert "missing_external_artifact" in first["problems"] assert "placeholder_unfilled:target.moon_sidereal_longitude_deg" in first["problems"] + assert "missing_shadbala_component:Sun.sthana" in first["problems"] def test_validator_accepts_filled_external_packet_but_not_whole_queue(tmp_path: Path) -> None: @@ -128,8 +127,8 @@ def test_validator_accepts_filled_external_packet_but_not_whole_queue(tmp_path: assert completed.returncode == 0, completed.stderr or completed.stdout report = json.loads(completed.stdout) - assert report["summary"]["valid_packets"] == 1 - assert report["summary"]["ready_for_calibration"] == 1 + assert report["summary"]["valid_packets"] == 2 + assert report["summary"]["ready_for_calibration"] == 2 assert report["summary"]["all_packets_external_verified"] is False first = report["packets"][0] assert first["valid"] is True @@ -211,6 +210,40 @@ def test_validator_rejects_non_numeric_or_negative_shadbala_components(tmp_path: assert "invalid_shadbala_component_negative:Moon.dig" in first["problems"] +def test_validator_accepts_negative_drik_bala_when_component_sum_matches(tmp_path: Path) -> None: + queue = build_queue() + packet = queue["tasks"][0]["evidence_packet"] + shadbala = complete_shadbala_components() + shadbala["Sun"]["drik"] = -0.25 + shadbala["Sun"]["total_rupa"] = round(sum(shadbala["Sun"][component] for component in SHADBALA_COMPONENTS), 4) + packet["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_shadbala_stdout.txt", + "ayanamsa": "raman", + "node_mode": "PyJHora default", + "timezone": "UTC+08:00", + "operator_note": "Black-box external stdout; Drik Bala can be negative.", + } + packet["target_placeholders"] = { + "target.moon_sidereal_longitude_deg": 311.7897, + "target.vimshottari_start_date": "1986-05-18", + "target.shadbala_components": shadbala, + } + packet["status"] = "external_verified" + queue_path = tmp_path / "queue.json" + queue_path.write_text(json.dumps(queue, ensure_ascii=False), encoding="utf-8") + + completed = run_validator(queue_path) + + assert completed.returncode == 0, completed.stderr or completed.stdout + report = json.loads(completed.stdout) + first = report["packets"][0] + assert first["valid"] is True + assert first["problems"] == [] + + def test_validator_rejects_missing_shadbala_total_rupa(tmp_path: Path) -> None: queue = build_queue() packet = queue["tasks"][0]["evidence_packet"] @@ -488,8 +521,8 @@ def test_validator_accepts_external_verified_packet_generated_from_oracle_file(t assert completed.returncode == 0, completed.stderr or completed.stdout report = json.loads(completed.stdout) - assert report["summary"]["valid_packets"] == 1 - assert report["summary"]["ready_for_calibration"] == 1 + assert report["summary"]["valid_packets"] == 2 + assert report["summary"]["ready_for_calibration"] == 2 assert report["summary"]["production_tuning_allowed"] is False assert report["packets"][0]["valid"] is True assert report["packets"][0]["problems"] == [] diff --git a/tests/test_public_benchmark_dashboard.py b/tests/test_public_benchmark_dashboard.py index dc08a33c..8ed20128 100644 --- a/tests/test_public_benchmark_dashboard.py +++ b/tests/test_public_benchmark_dashboard.py @@ -39,13 +39,14 @@ def test_public_benchmark_dashboard_outputs_stable_json_summary() -> None: assert report["summary"]["technique_count"] >= 60 assert report["summary"]["capability_valid"] is True assert report["oracle_readiness"]["total_packets"] == 5 - assert report["oracle_readiness"]["valid_packets"] == 0 - assert report["oracle_readiness"]["ready_for_calibration"] == 0 + assert report["oracle_readiness"]["valid_packets"] == 1 + assert report["oracle_readiness"]["ready_for_calibration"] == 1 assert report["oracle_readiness"]["production_tuning_allowed"] is False 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 3/3" in report["global_first_gap"] + assert "Shadbala external absolute-value readiness is 1/4" 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_shadbala_oracle_closure_status.py b/tests/test_shadbala_oracle_closure_status.py index a6595510..eabda5ad 100644 --- a/tests/test_shadbala_oracle_closure_status.py +++ b/tests/test_shadbala_oracle_closure_status.py @@ -37,12 +37,12 @@ def test_shadbala_oracle_closure_status_identifies_first_absolute_value_packet() assert report["scope"] == "shadbala_external_absolute_value_closure_status" assert report["schema_version"] == 1 assert report["summary"]["shadbala_task_count"] == 4 - assert report["summary"]["external_verified_shadbala_tasks"] == 0 + assert report["summary"]["external_verified_shadbala_tasks"] == 1 assert report["summary"]["can_claim_shadbala_absolute_closure"] is False assert report["summary"]["required_planets"] == ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn"] assert report["summary"]["required_components"] == ["sthana", "dig", "kala", "chesta", "naisargika", "drik", "total_rupa"] - assert report["first_priority"]["case_id"] == "template_redacted_place_shadbala_raman" - assert report["first_priority"]["capture_id"] == "external_template_redacted_place_shadbala_raman" + assert report["first_priority"]["case_id"] == "template_user_REDACTED_YEAR_moon_longitude_lahiri" + assert report["first_priority"]["capture_id"] == "external_template_user_REDACTED_YEAR_moon_longitude_lahiri" assert report["first_priority"]["required_target_fields"] == [ "target.moon_sidereal_longitude_deg", "target.shadbala_components", @@ -54,7 +54,7 @@ def test_shadbala_oracle_closure_status_identifies_first_absolute_value_packet() assert report["first_priority"]["missing_groups"]["metadata"]["count"] == 5 assert report["first_priority"]["missing_groups"]["target"]["count"] == 50 assert report["first_priority"]["missing_groups"]["bodies"]["Sun"]["count"] == 7 - assert report["first_priority"]["prefilled_fields"]["metadata"]["ayanamsa"] == "Raman" + assert report["first_priority"]["prefilled_fields"]["metadata"]["ayanamsa"] == "lahiri" assert report["first_priority"]["manual_fill_plan"]["status_value"] == "external_verified" assert report["first_priority"]["manual_fill_plan"]["manual_entry_count"] == 55 assert report["first_priority"]["reject_global_scaling"] is True @@ -70,7 +70,7 @@ def test_shadbala_oracle_closure_status_markdown_can_be_written(tmp_path: Path) markdown = output.read_text(encoding="utf-8") assert "# Shadbala External Absolute-Value Closure Status" in markdown assert "can_claim_shadbala_absolute_closure: `false`" in markdown - assert "external_template_redacted_place_shadbala_raman" in markdown + assert "external_template_user_REDACTED_YEAR_moon_longitude_lahiri" in markdown assert "target.shadbala_components.Sun.sthana" in markdown assert "## Missing Summary" in markdown assert "## Prefilled Fields" in markdown