From bfebf50466dc095fb7696b5bad67684e84aee408 Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Fri, 26 Jun 2026 18:33:21 +0800 Subject: [PATCH] docs(oracle): add first shadbala packet operator card --- README.md | 4 +- ...ernal_oracle_closure_master_dashboard.json | 7 +-- ...xternal_oracle_closure_master_dashboard.md | 6 +-- ...xternal_absolute_value_closure_status.json | 3 ++ ..._external_absolute_value_closure_status.md | 5 ++- scripts/shadbala_oracle_closure_status.py | 26 +++++++++-- ...est_shadbala_first_packet_operator_card.py | 44 +++++++++++++++++++ tests/test_shadbala_oracle_closure_status.py | 6 ++- 8 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 tests/test_shadbala_first_packet_operator_card.py diff --git a/README.md b/README.md index 5e1c4cda..54942941 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,7 @@ python3 scripts/oracle_closure_master_dashboard.py \ --output docs/benchmark/jyotish_external_oracle_closure_master_dashboard.md ``` -当前总控看板固定输出 `total_tasks: 12`、`external_verified_tasks: 0`、`can_claim_global_oracle_closure: false`。推荐执行顺序是先填 Dasha 第一条 6 个字段,再填 Tajika/Sahams 第一条 15 个字段,最后填 Shadbala 第一条 54 个字段。 +当前总控看板固定输出 `total_tasks: 12`、`external_verified_tasks: 0`、`can_claim_global_oracle_closure: false`。推荐执行顺序是先填 Dasha 第一条 6 个字段,再填 Tajika/Sahams 第一条 15 个字段,最后填 Shadbala 第一条 55 个字段。 Dasha 外部 oracle 最短闭环状态板用于把“大运外部真值”从 Shadbala 绝对值大包中拆出来,优先推进第一条可验证边界日期: @@ -246,7 +246,7 @@ python3 scripts/shadbala_oracle_closure_status.py \ --output docs/benchmark/shadbala_external_absolute_value_closure_status.md ``` -当前第一优先级是 `external_template_redacted_place_shadbala_raman`。必须填写 Sun/Moon/Mars/Mercury/Jupiter/Venus/Saturn 的 `sthana`、`dig`、`kala`、`chesta`、`naisargika`、`drik`、`total_rupa`;验证器会检查分量和总分,不允许用一个全局倍率把本地输出硬缩放成外部值。 +当前第一优先级是 `external_template_redacted_place_shadbala_raman`。除了同一 oracle 行里的 `target.moon_sidereal_longitude_deg`,还必须填写 Sun/Moon/Mars/Mercury/Jupiter/Venus/Saturn 的 `sthana`、`dig`、`kala`、`chesta`、`naisargika`、`drik`、`total_rupa`;验证器会检查分量和总分,不允许用一个全局倍率把本地输出硬缩放成外部值。 Tajika/Sahams 年运系统使用独立的外部 oracle 队列,专门追踪 Varshaphala、太阳回归、Muntha、Year Lord、Mudda Dasha、Sahams 与 Tajika Yogas 的外部验证状态: diff --git a/docs/benchmark/jyotish_external_oracle_closure_master_dashboard.json b/docs/benchmark/jyotish_external_oracle_closure_master_dashboard.json index cf8a4d79..121a55c5 100644 --- a/docs/benchmark/jyotish_external_oracle_closure_master_dashboard.json +++ b/docs/benchmark/jyotish_external_oracle_closure_master_dashboard.json @@ -1,7 +1,7 @@ { "scope": "jyotish_external_oracle_closure_master_dashboard", "schema_version": 1, - "generated_at": "2026-06-26T10:13:06.681297+00:00", + "generated_at": "2026-06-26T10:31:36.549795+00:00", "summary": { "total_tasks": 12, "external_verified_tasks": 0, @@ -45,13 +45,14 @@ "case_id": "template_redacted_place_shadbala_raman", "capture_id": "external_template_redacted_place_shadbala_raman", "packet_path": "references/oracle/artifacts/pending_packets/external_template_redacted_place_shadbala_raman.json", - "missing_field_count": 54, + "missing_field_count": 55, "missing_fields": [ "metadata.tool_name", "metadata.tool_version_or_url", "metadata.capture_date", "metadata.operator_note", "metadata.source_artifact", + "target.moon_sidereal_longitude_deg", "target.shadbala_components.Sun.sthana", "target.shadbala_components.Sun.dig", "target.shadbala_components.Sun.kala", @@ -159,7 +160,7 @@ "front": "shadbala", "case_id": "template_redacted_place_shadbala_raman", "capture_id": "external_template_redacted_place_shadbala_raman", - "missing_field_count": 54, + "missing_field_count": 55, "apply_command": "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" } ], diff --git a/docs/benchmark/jyotish_external_oracle_closure_master_dashboard.md b/docs/benchmark/jyotish_external_oracle_closure_master_dashboard.md index f88381b5..c5e4ac1c 100644 --- a/docs/benchmark/jyotish_external_oracle_closure_master_dashboard.md +++ b/docs/benchmark/jyotish_external_oracle_closure_master_dashboard.md @@ -1,6 +1,6 @@ # Jyotish External Oracle Closure Master Dashboard -Generated: `2026-06-26T10:13:07.673185+00:00` +Generated: `2026-06-26T10:31:38.662077+00:00` ## Summary @@ -16,7 +16,7 @@ Generated: `2026-06-26T10:13:07.673185+00:00` |---|---:|---:|---|---:| | `dasha` | 3 | 0 | `template_steve_jobs_dasha_lahiri` | 6 | | `tajika_sahams` | 5 | 0 | `template_steve_jobs_varshaphala_1984_lahiri` | 15 | -| `shadbala` | 4 | 0 | `template_redacted_place_shadbala_raman` | 54 | +| `shadbala` | 4 | 0 | `template_redacted_place_shadbala_raman` | 55 | ## Next Action Order @@ -44,7 +44,7 @@ python3 scripts/tajika_annual_oracle_queue.py --oracle-file references/oracle/ta - case_id: `template_redacted_place_shadbala_raman` - capture_id: `external_template_redacted_place_shadbala_raman` -- missing_field_count: `54` +- missing_field_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 diff --git a/docs/benchmark/shadbala_external_absolute_value_closure_status.json b/docs/benchmark/shadbala_external_absolute_value_closure_status.json index 2d831885..682f143b 100644 --- a/docs/benchmark/shadbala_external_absolute_value_closure_status.json +++ b/docs/benchmark/shadbala_external_absolute_value_closure_status.json @@ -45,6 +45,7 @@ "node_mode": "mean" }, "required_target_fields": [ + "target.moon_sidereal_longitude_deg", "target.shadbala_components" ], "missing_fields": [ @@ -53,6 +54,7 @@ "metadata.capture_date", "metadata.operator_note", "metadata.source_artifact", + "target.moon_sidereal_longitude_deg", "target.shadbala_components.Sun.sthana", "target.shadbala_components.Sun.dig", "target.shadbala_components.Sun.kala", @@ -114,6 +116,7 @@ "validate_command": "python3 scripts/oracle_collection_queue.py --oracle-file references/oracle/dasha_shadbala_oracle_cases.json --format json > /tmp/jyotish_oracle_queue_filled.json && python3 scripts/oracle_evidence_validator.py --queue-file /tmp/jyotish_oracle_queue_filled.json" }, "next_actions": [ + "Fill any supporting target fields on the same oracle row, such as Moon sidereal longitude, before validator review.", "Fill all seven planets with Sthana, Dig, Kala, Chesta, Naisargika, Drik and total_rupa from an external oracle.", "Do not use a single global multiplier to force totals; validator checks component sums.", "Set status to external_verified only after artifact path and all Shadbala targets are filled.", diff --git a/docs/benchmark/shadbala_external_absolute_value_closure_status.md b/docs/benchmark/shadbala_external_absolute_value_closure_status.md index 20ef1672..c2bde452 100644 --- a/docs/benchmark/shadbala_external_absolute_value_closure_status.md +++ b/docs/benchmark/shadbala_external_absolute_value_closure_status.md @@ -10,8 +10,8 @@ - case_id: `template_redacted_place_shadbala_raman` - capture_id: `external_template_redacted_place_shadbala_raman` - packet_path: `references/oracle/artifacts/pending_packets/external_template_redacted_place_shadbala_raman.json` -- required_target_fields: `target.shadbala_components` -- missing_fields: `metadata.tool_name, metadata.tool_version_or_url, metadata.capture_date, metadata.operator_note, metadata.source_artifact, target.shadbala_components.Sun.sthana, target.shadbala_components.Sun.dig, target.shadbala_components.Sun.kala, target.shadbala_components.Sun.chesta, target.shadbala_components.Sun.naisargika, target.shadbala_components.Sun.drik, target.shadbala_components.Sun.total_rupa, target.shadbala_components.Moon.sthana, target.shadbala_components.Moon.dig, target.shadbala_components.Moon.kala, target.shadbala_components.Moon.chesta, target.shadbala_components.Moon.naisargika, target.shadbala_components.Moon.drik, target.shadbala_components.Moon.total_rupa, target.shadbala_components.Mars.sthana, target.shadbala_components.Mars.dig, target.shadbala_components.Mars.kala, target.shadbala_components.Mars.chesta, target.shadbala_components.Mars.naisargika, target.shadbala_components.Mars.drik, target.shadbala_components.Mars.total_rupa, target.shadbala_components.Mercury.sthana, target.shadbala_components.Mercury.dig, target.shadbala_components.Mercury.kala, target.shadbala_components.Mercury.chesta, target.shadbala_components.Mercury.naisargika, target.shadbala_components.Mercury.drik, target.shadbala_components.Mercury.total_rupa, target.shadbala_components.Jupiter.sthana, target.shadbala_components.Jupiter.dig, target.shadbala_components.Jupiter.kala, target.shadbala_components.Jupiter.chesta, target.shadbala_components.Jupiter.naisargika, target.shadbala_components.Jupiter.drik, target.shadbala_components.Jupiter.total_rupa, target.shadbala_components.Venus.sthana, target.shadbala_components.Venus.dig, target.shadbala_components.Venus.kala, target.shadbala_components.Venus.chesta, target.shadbala_components.Venus.naisargika, target.shadbala_components.Venus.drik, target.shadbala_components.Venus.total_rupa, target.shadbala_components.Saturn.sthana, target.shadbala_components.Saturn.dig, target.shadbala_components.Saturn.kala, target.shadbala_components.Saturn.chesta, target.shadbala_components.Saturn.naisargika, target.shadbala_components.Saturn.drik, target.shadbala_components.Saturn.total_rupa` +- required_target_fields: `target.moon_sidereal_longitude_deg, target.shadbala_components` +- missing_fields: `metadata.tool_name, metadata.tool_version_or_url, metadata.capture_date, metadata.operator_note, metadata.source_artifact, target.moon_sidereal_longitude_deg, target.shadbala_components.Sun.sthana, target.shadbala_components.Sun.dig, target.shadbala_components.Sun.kala, target.shadbala_components.Sun.chesta, target.shadbala_components.Sun.naisargika, target.shadbala_components.Sun.drik, target.shadbala_components.Sun.total_rupa, target.shadbala_components.Moon.sthana, target.shadbala_components.Moon.dig, target.shadbala_components.Moon.kala, target.shadbala_components.Moon.chesta, target.shadbala_components.Moon.naisargika, target.shadbala_components.Moon.drik, target.shadbala_components.Moon.total_rupa, target.shadbala_components.Mars.sthana, target.shadbala_components.Mars.dig, target.shadbala_components.Mars.kala, target.shadbala_components.Mars.chesta, target.shadbala_components.Mars.naisargika, target.shadbala_components.Mars.drik, target.shadbala_components.Mars.total_rupa, target.shadbala_components.Mercury.sthana, target.shadbala_components.Mercury.dig, target.shadbala_components.Mercury.kala, target.shadbala_components.Mercury.chesta, target.shadbala_components.Mercury.naisargika, target.shadbala_components.Mercury.drik, target.shadbala_components.Mercury.total_rupa, target.shadbala_components.Jupiter.sthana, target.shadbala_components.Jupiter.dig, target.shadbala_components.Jupiter.kala, target.shadbala_components.Jupiter.chesta, target.shadbala_components.Jupiter.naisargika, target.shadbala_components.Jupiter.drik, target.shadbala_components.Jupiter.total_rupa, target.shadbala_components.Venus.sthana, target.shadbala_components.Venus.dig, target.shadbala_components.Venus.kala, target.shadbala_components.Venus.chesta, target.shadbala_components.Venus.naisargika, target.shadbala_components.Venus.drik, target.shadbala_components.Venus.total_rupa, target.shadbala_components.Saturn.sthana, target.shadbala_components.Saturn.dig, target.shadbala_components.Saturn.kala, target.shadbala_components.Saturn.chesta, target.shadbala_components.Saturn.naisargika, target.shadbala_components.Saturn.drik, target.shadbala_components.Saturn.total_rupa` - reject_global_scaling: `true` ## Required Matrix @@ -31,6 +31,7 @@ python3 scripts/oracle_collection_queue.py --oracle-file references/oracle/dasha ## Next Actions +- Fill any supporting target fields on the same oracle row, such as Moon sidereal longitude, before validator review. - Fill all seven planets with Sthana, Dig, Kala, Chesta, Naisargika, Drik and total_rupa from an external oracle. - Do not use a single global multiplier to force totals; validator checks component sums. - Set status to external_verified only after artifact path and all Shadbala targets are filled. diff --git a/scripts/shadbala_oracle_closure_status.py b/scripts/shadbala_oracle_closure_status.py index ed628911..bdfd65c3 100644 --- a/scripts/shadbala_oracle_closure_status.py +++ b/scripts/shadbala_oracle_closure_status.py @@ -15,6 +15,7 @@ ROOT = Path(__file__).resolve().parents[1] PYTHON = sys.executable FIRST_PRIORITY_CASE_ID = "template_redacted_place_shadbala_raman" SHADBALA_TARGET_FIELD = "target.shadbala_components" +SUPPORTING_TARGET_FIELDS = ["target.moon_sidereal_longitude_deg"] REQUIRED_PLANETS = ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn"] REQUIRED_COMPONENTS = ["sthana", "dig", "kala", "chesta", "naisargika", "drik", "total_rupa"] @@ -69,6 +70,18 @@ def _shadbala_missing(packet: dict[str, Any]) -> list[str]: return missing +def _supporting_missing(packet: dict[str, Any], target_fields: list[str]) -> list[str]: + placeholders = packet.get("target_placeholders", {}) + missing: list[str] = [] + for field in SUPPORTING_TARGET_FIELDS: + if field not in target_fields: + continue + value = placeholders.get(field) + if value is None or value == "" or value == [] or value == {}: + missing.append(field) + return missing + + def _apply_command(packet_path: str, oracle_file: str) -> str: return ( "python3 scripts/oracle_collection_queue.py " @@ -101,10 +114,16 @@ def build_status(oracle_file: str) -> dict[str, Any]: packet = priority["evidence_packet"] capture_id = packet["capture_id"] packet_path = f"references/oracle/artifacts/pending_packets/{capture_id}.json" - missing_fields = _metadata_missing(packet) + _shadbala_missing(packet) + target_fields = priority.get("target_fields", []) + supporting_target_fields = [field for field in SUPPORTING_TARGET_FIELDS if field in target_fields] + missing_fields = _metadata_missing(packet) + _supporting_missing(packet, target_fields) + _shadbala_missing(packet) external_verified = [ task for task in shadbala_tasks - if task.get("status") == "external_verified" and not _shadbala_missing(task.get("evidence_packet", {})) + 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", {})) + ) ] return { @@ -124,7 +143,7 @@ def build_status(oracle_file: str) -> dict[str, Any]: "packet_path": packet_path, "birth": priority.get("birth", {}), "settings": priority.get("settings", {}), - "required_target_fields": [SHADBALA_TARGET_FIELD], + "required_target_fields": supporting_target_fields + [SHADBALA_TARGET_FIELD], "missing_fields": missing_fields, "external_sources": [ "JHora Shadbala component table screenshot", @@ -137,6 +156,7 @@ def build_status(oracle_file: str) -> dict[str, Any]: "validate_command": _validate_command(oracle_file), }, "next_actions": [ + "Fill any supporting target fields on the same oracle row, such as Moon sidereal longitude, before validator review.", "Fill all seven planets with Sthana, Dig, Kala, Chesta, Naisargika, Drik and total_rupa from an external oracle.", "Do not use a single global multiplier to force totals; validator checks component sums.", "Set status to external_verified only after artifact path and all Shadbala targets are filled.", diff --git a/tests/test_shadbala_first_packet_operator_card.py b/tests/test_shadbala_first_packet_operator_card.py new file mode 100644 index 00000000..efcbeff8 --- /dev/null +++ b/tests/test_shadbala_first_packet_operator_card.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +"""Tests for the first Shadbala external absolute-value operator card.""" + +from __future__ import annotations + +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +CARD = ROOT / "docs" / "benchmark" / "shadbala_redacted_place_raman_first_packet_operator_card.md" +PACKET = ROOT / "references" / "oracle" / "evidence_packet_templates" / "shadbala_redacted_place_raman_first_packet.json" + + +def test_shadbala_first_packet_operator_card_is_actionable() -> None: + text = CARD.read_text(encoding="utf-8") + + assert "# First Shadbala Absolute-Value Oracle Packet Operator Card" in text + assert "template_redacted_place_shadbala_raman" in text + assert "target.shadbala_components.Sun.sthana" in text + assert "target.shadbala_components.Saturn.total_rupa" in text + assert "target.moon_sidereal_longitude_deg" in text + assert "reject_global_scaling" in text + assert "Do not use a global multiplier" in text + assert "--apply-packet" in text + assert "oracle_evidence_validator.py" in text + + +def test_shadbala_first_packet_template_contains_complete_component_matrix() -> None: + packet = json.loads(PACKET.read_text(encoding="utf-8")) + + assert packet["capture_id"] == "external_template_redacted_place_shadbala_raman" + assert packet["status"] == "draft" + assert packet["case_id"] == "template_redacted_place_shadbala_raman" + assert packet["metadata"]["source_artifact"] == "references/oracle/artifacts/" + assert packet["settings"]["ayanamsa"] == "raman" + assert packet["target_placeholders"]["target.moon_sidereal_longitude_deg"] is None + shadbala = packet["target_placeholders"]["target.shadbala_components"] + assert set(shadbala) == {"Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn"} + for row in shadbala.values(): + assert set(row) == {"sthana", "dig", "kala", "chesta", "naisargika", "drik", "total_rupa"} + assert all(value is None for value in row.values()) + assert packet["operator_goal"] == "Fill one external Shadbala absolute-value component matrix." + assert packet["integrity_checks"]["reject_global_scaling"] is True diff --git a/tests/test_shadbala_oracle_closure_status.py b/tests/test_shadbala_oracle_closure_status.py index 8edfd22a..ef60e424 100644 --- a/tests/test_shadbala_oracle_closure_status.py +++ b/tests/test_shadbala_oracle_closure_status.py @@ -43,8 +43,12 @@ def test_shadbala_oracle_closure_status_identifies_first_absolute_value_packet() 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"]["required_target_fields"] == ["target.shadbala_components"] + assert report["first_priority"]["required_target_fields"] == [ + "target.moon_sidereal_longitude_deg", + "target.shadbala_components", + ] assert "metadata.tool_name" in report["first_priority"]["missing_fields"] + assert "target.moon_sidereal_longitude_deg" in report["first_priority"]["missing_fields"] assert "target.shadbala_components.Sun.sthana" in report["first_priority"]["missing_fields"] assert "target.shadbala_components.Saturn.total_rupa" in report["first_priority"]["missing_fields"] assert report["first_priority"]["reject_global_scaling"] is True