From bd9798342eaa2c538ad228f6116411d7b1d2422b Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Sun, 19 Jul 2026 22:40:15 +0800 Subject: [PATCH] feat: sync shadbala same unit normalizer --- .../evidence_packet_index_2026_07_19.json | 10 +- ...dbala_same_unit_normalizer_2026_07_19.json | 780 ++++++++++++++++++ scripts/shadbala_same_unit_normalizer.py | 144 ++++ tests/test_shadbala_same_unit_normalizer.py | 52 ++ 4 files changed, 985 insertions(+), 1 deletion(-) create mode 100644 references/oracle/shadbala_same_unit_normalizer_2026_07_19.json create mode 100644 scripts/shadbala_same_unit_normalizer.py create mode 100644 tests/test_shadbala_same_unit_normalizer.py diff --git a/references/oracle/evidence_packet_index_2026_07_19.json b/references/oracle/evidence_packet_index_2026_07_19.json index ff1a1192..bd359528 100644 --- a/references/oracle/evidence_packet_index_2026_07_19.json +++ b/references/oracle/evidence_packet_index_2026_07_19.json @@ -5,7 +5,7 @@ "production_tuning_allowed": false, "boundary": "Index of current governance packets only. Raw oracle artifacts remain in references/oracle/artifacts and are not all duplicated here.", "summary": { - "packet_count": 61, + "packet_count": 62, "blocked_or_partial_count": 40, "human_review_required_count": 1 }, @@ -497,6 +497,14 @@ "claim_status": "partial", "consumer_policy": "research_to_commercial_contract_only", "claim_boundary": "Maps Shadbala components across local/Xalen/jyotishganit/VedicAstro observations. Closed components can inform provenance; open/method-variant rows must not be treated as absolute error." + }, + { + "packet_id": "shadbala_same_unit_normalizer", + "path": "references/oracle/shadbala_same_unit_normalizer_2026_07_19.json", + "domain": "shadbala_component_closure", + "claim_status": "partial", + "consumer_policy": "research_to_commercial_contract_only", + "claim_boundary": "Normalizes local/Xalen/jyotishganit/VP Jain Shadbala rows into Virupa/Rupa where available; classifications are arbitration queues, not absolute truth." } ] } diff --git a/references/oracle/shadbala_same_unit_normalizer_2026_07_19.json b/references/oracle/shadbala_same_unit_normalizer_2026_07_19.json new file mode 100644 index 00000000..1acc6315 --- /dev/null +++ b/references/oracle/shadbala_same_unit_normalizer_2026_07_19.json @@ -0,0 +1,780 @@ +{ + "boundary": "All 42 rows are normalized to Virupa/Rupa fields where available. Classifications are arbitration queues, not absolute parity closure.", + "claim_status": "partial", + "created_at": "2026-07-19", + "matrix_hash": "c84396a4fff8ba610d8035696b9dca53a3fbc52a4dbf65962b84e6333116a659", + "production_tuning_allowed": false, + "rows": [ + { + "canonical_component": "Sthanabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "method_variant", + "component": "sthana", + "jyotishganit_rupa": 2.555683, + "jyotishganit_virupa": 153.341, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Sun", + "vp_jain_local_virupa": 157.05, + "vp_jain_published_rupa": 2.867333, + "vp_jain_published_virupa": 172.04, + "vp_jain_status": "method_variant", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Digbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "dig", + "jyotishganit_rupa": 0.48625, + "jyotishganit_virupa": 29.175, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Sun", + "vp_jain_local_virupa": 6.6, + "vp_jain_published_rupa": 0.109833, + "vp_jain_published_virupa": 6.59, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Kaalabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "kala", + "jyotishganit_rupa": 2.48155, + "jyotishganit_virupa": 148.893, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Sun", + "vp_jain_local_virupa": 81.8, + "vp_jain_published_rupa": 1.363333, + "vp_jain_published_virupa": 81.8, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Cheshtabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "method_variant", + "component": "chesta", + "jyotishganit_rupa": 0.617667, + "jyotishganit_virupa": 37.06, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Sun", + "vp_jain_local_virupa": 70.14, + "vp_jain_published_rupa": 0.0, + "vp_jain_published_virupa": 0.0, + "vp_jain_status": "method_variant", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Naisargikabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "within_1_virupa_observation", + "component": "naisargika", + "jyotishganit_rupa": 1.0, + "jyotishganit_virupa": 60.0, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Sun", + "vp_jain_local_virupa": 60.0, + "vp_jain_published_rupa": 1.0, + "vp_jain_published_virupa": 60.0, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Drikbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "drik", + "jyotishganit_rupa": -0.1077, + "jyotishganit_virupa": -6.462, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Sun", + "vp_jain_local_virupa": 11.25, + "vp_jain_published_rupa": 0.187333, + "vp_jain_published_virupa": 11.24, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Sthanabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "sthana", + "jyotishganit_rupa": 2.355683, + "jyotishganit_virupa": 141.341, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Moon", + "vp_jain_local_virupa": 77.17, + "vp_jain_published_rupa": 1.286167, + "vp_jain_published_virupa": 77.17, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Digbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "dig", + "jyotishganit_rupa": 0.335983, + "jyotishganit_virupa": 20.159, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Moon", + "vp_jain_local_virupa": 12.21, + "vp_jain_published_rupa": 0.203667, + "vp_jain_published_virupa": 12.22, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Kaalabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "kala", + "jyotishganit_rupa": 3.051867, + "jyotishganit_virupa": 183.112, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Moon", + "vp_jain_local_virupa": 205.96, + "vp_jain_published_rupa": 3.430833, + "vp_jain_published_virupa": 205.85, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Cheshtabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "method_variant", + "component": "chesta", + "jyotishganit_rupa": 0.177783, + "jyotishganit_virupa": 10.667, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Moon", + "vp_jain_local_virupa": 108.76, + "vp_jain_published_rupa": 0.0, + "vp_jain_published_virupa": 0.0, + "vp_jain_status": "method_variant", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Naisargikabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "within_1_virupa_observation", + "component": "naisargika", + "jyotishganit_rupa": 0.857167, + "jyotishganit_virupa": 51.43, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Moon", + "vp_jain_local_virupa": 51.43, + "vp_jain_published_rupa": 0.857167, + "vp_jain_published_virupa": 51.43, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Drikbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "drik", + "jyotishganit_rupa": 0.232433, + "jyotishganit_virupa": 13.946, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Moon", + "vp_jain_local_virupa": -0.33, + "vp_jain_published_rupa": -0.005333, + "vp_jain_published_virupa": -0.32, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Sthanabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "sthana", + "jyotishganit_rupa": 3.872967, + "jyotishganit_virupa": 232.378, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mars", + "vp_jain_local_virupa": 184.94, + "vp_jain_published_rupa": 3.082333, + "vp_jain_published_virupa": 184.94, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Digbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "dig", + "jyotishganit_rupa": 0.782583, + "jyotishganit_virupa": 46.955, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mars", + "vp_jain_local_virupa": 20.98, + "vp_jain_published_rupa": 0.349833, + "vp_jain_published_virupa": 20.99, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Kaalabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "kala", + "jyotishganit_rupa": 1.77345, + "jyotishganit_virupa": 106.407, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mars", + "vp_jain_local_virupa": 158.34, + "vp_jain_published_rupa": 2.634667, + "vp_jain_published_virupa": 158.08, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Cheshtabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "method_variant", + "component": "chesta", + "jyotishganit_rupa": 0.381067, + "jyotishganit_virupa": 22.864, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mars", + "vp_jain_local_virupa": 19.25, + "vp_jain_published_rupa": 0.348833, + "vp_jain_published_virupa": 20.93, + "vp_jain_status": "method_variant", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Naisargikabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "within_1_virupa_observation", + "component": "naisargika", + "jyotishganit_rupa": 0.285667, + "jyotishganit_virupa": 17.14, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mars", + "vp_jain_local_virupa": 17.14, + "vp_jain_published_rupa": 0.285667, + "vp_jain_published_virupa": 17.14, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Drikbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "drik", + "jyotishganit_rupa": 0.20805, + "jyotishganit_virupa": 12.483, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mars", + "vp_jain_local_virupa": -5.1, + "vp_jain_published_rupa": -0.085, + "vp_jain_published_virupa": -5.1, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Sthanabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "method_variant", + "component": "sthana", + "jyotishganit_rupa": 1.861733, + "jyotishganit_virupa": 111.704, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mercury", + "vp_jain_local_virupa": 223.16, + "vp_jain_published_rupa": 3.969333, + "vp_jain_published_virupa": 238.16, + "vp_jain_status": "method_variant", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Digbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "dig", + "jyotishganit_rupa": 0.132567, + "jyotishganit_virupa": 7.954, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mercury", + "vp_jain_local_virupa": 31.97, + "vp_jain_published_rupa": 0.532833, + "vp_jain_published_virupa": 31.97, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Kaalabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "kala", + "jyotishganit_rupa": 1.201483, + "jyotishganit_virupa": 72.089, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mercury", + "vp_jain_local_virupa": 211.48, + "vp_jain_published_rupa": 3.511333, + "vp_jain_published_virupa": 210.68, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Cheshtabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "method_variant", + "component": "chesta", + "jyotishganit_rupa": 0.589467, + "jyotishganit_virupa": 35.368, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mercury", + "vp_jain_local_virupa": 18.08, + "vp_jain_published_rupa": 0.479333, + "vp_jain_published_virupa": 28.76, + "vp_jain_status": "method_variant", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Naisargikabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "within_1_virupa_observation", + "component": "naisargika", + "jyotishganit_rupa": 0.4285, + "jyotishganit_virupa": 25.71, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mercury", + "vp_jain_local_virupa": 25.71, + "vp_jain_published_rupa": 0.4285, + "vp_jain_published_virupa": 25.71, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Drikbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "drik", + "jyotishganit_rupa": -0.183083, + "jyotishganit_virupa": -10.985, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Mercury", + "vp_jain_local_virupa": 4.29, + "vp_jain_published_rupa": 0.0715, + "vp_jain_published_virupa": 4.29, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Sthanabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "sthana", + "jyotishganit_rupa": 3.769633, + "jyotishganit_virupa": 226.178, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Jupiter", + "vp_jain_local_virupa": 152.97, + "vp_jain_published_rupa": 2.549667, + "vp_jain_published_virupa": 152.98, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Digbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "dig", + "jyotishganit_rupa": 0.734917, + "jyotishganit_virupa": 44.095, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Jupiter", + "vp_jain_local_virupa": 31.99, + "vp_jain_published_rupa": 0.533167, + "vp_jain_published_virupa": 31.99, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Kaalabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "kala", + "jyotishganit_rupa": 4.183067, + "jyotishganit_virupa": 250.984, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Jupiter", + "vp_jain_local_virupa": 143.34, + "vp_jain_published_rupa": 2.403667, + "vp_jain_published_virupa": 144.22, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Cheshtabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "method_variant", + "component": "chesta", + "jyotishganit_rupa": 0.607067, + "jyotishganit_virupa": 36.424, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Jupiter", + "vp_jain_local_virupa": 11.23, + "vp_jain_published_rupa": 0.1405, + "vp_jain_published_virupa": 8.43, + "vp_jain_status": "method_variant", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Naisargikabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "within_1_virupa_observation", + "component": "naisargika", + "jyotishganit_rupa": 0.5715, + "jyotishganit_virupa": 34.29, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Jupiter", + "vp_jain_local_virupa": 34.29, + "vp_jain_published_rupa": 0.5715, + "vp_jain_published_virupa": 34.29, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Drikbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "within_1_virupa_observation", + "component": "drik", + "jyotishganit_rupa": 0.067867, + "jyotishganit_virupa": 4.072, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Jupiter", + "vp_jain_local_virupa": 4.31, + "vp_jain_published_rupa": 0.072, + "vp_jain_published_virupa": 4.32, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Sthanabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "sthana", + "jyotishganit_rupa": 1.880267, + "jyotishganit_virupa": 112.816, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Venus", + "vp_jain_local_virupa": 198.09, + "vp_jain_published_rupa": 3.301333, + "vp_jain_published_virupa": 198.08, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Digbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "dig", + "jyotishganit_rupa": 0.7614, + "jyotishganit_virupa": 45.684, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Venus", + "vp_jain_local_virupa": 53.29, + "vp_jain_published_rupa": 0.888167, + "vp_jain_published_virupa": 53.29, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Kaalabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "kala", + "jyotishganit_rupa": 1.0531, + "jyotishganit_virupa": 63.186, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Venus", + "vp_jain_local_virupa": 135.84, + "vp_jain_published_rupa": 2.264833, + "vp_jain_published_virupa": 135.89, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Cheshtabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "chesta", + "jyotishganit_rupa": 0.774433, + "jyotishganit_virupa": 46.466, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Venus", + "vp_jain_local_virupa": 27.23, + "vp_jain_published_rupa": 0.469667, + "vp_jain_published_virupa": 28.18, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Naisargikabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "within_1_virupa_observation", + "component": "naisargika", + "jyotishganit_rupa": 0.714333, + "jyotishganit_virupa": 42.86, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Venus", + "vp_jain_local_virupa": 42.86, + "vp_jain_published_rupa": 0.714333, + "vp_jain_published_virupa": 42.86, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Drikbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "drik", + "jyotishganit_rupa": -0.075183, + "jyotishganit_virupa": -4.511, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Venus", + "vp_jain_local_virupa": -2.85, + "vp_jain_published_rupa": -0.047667, + "vp_jain_published_virupa": -2.86, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Sthanabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "sthana", + "jyotishganit_rupa": 2.5184, + "jyotishganit_virupa": 151.104, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Saturn", + "vp_jain_local_virupa": 206.3, + "vp_jain_published_rupa": 3.4385, + "vp_jain_published_virupa": 206.31, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Digbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "dig", + "jyotishganit_rupa": 0.405217, + "jyotishganit_virupa": 24.313, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Saturn", + "vp_jain_local_virupa": 26.66, + "vp_jain_published_rupa": 0.4445, + "vp_jain_published_virupa": 26.67, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Kaalabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "kala", + "jyotishganit_rupa": 1.198817, + "jyotishganit_virupa": 71.929, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Saturn", + "vp_jain_local_virupa": 139.63, + "vp_jain_published_rupa": 2.326, + "vp_jain_published_virupa": 139.56, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Cheshtabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "method_variant", + "component": "chesta", + "jyotishganit_rupa": 0.96895, + "jyotishganit_virupa": 58.137, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Saturn", + "vp_jain_local_virupa": 6.78, + "vp_jain_published_rupa": 0.084167, + "vp_jain_published_virupa": 5.05, + "vp_jain_status": "method_variant", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Naisargikabala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "within_1_virupa_observation", + "component": "naisargika", + "jyotishganit_rupa": 0.142833, + "jyotishganit_virupa": 8.57, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Saturn", + "vp_jain_local_virupa": 8.57, + "vp_jain_published_rupa": 0.142833, + "vp_jain_published_virupa": 8.57, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + }, + { + "canonical_component": "Drikbala", + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + "classification": "formula_or_unit_mismatch", + "component": "drik", + "jyotishganit_rupa": 0.134333, + "jyotishganit_virupa": 8.06, + "local_from_xalen_report_virupa": null, + "normalization_unit": "Virupa", + "planet": "Saturn", + "vp_jain_local_virupa": 5.83, + "vp_jain_published_rupa": 0.097, + "vp_jain_published_virupa": 5.82, + "vp_jain_status": "within_tolerance", + "xalen_rupa": null, + "xalen_status": null, + "xalen_virupa": null + } + ], + "scope": "shadbala_same_unit_normalizer", + "sources": { + "jyotishganit": "references/oracle/jyotishganit_shadbala_surface_probe_steve_jobs_2026_07_19.json", + "vp_jain": "references/oracle/vp_jain_shadbala_component_benchmark_2026_07_17.json", + "xalen": "references/oracle/xalen_shadbala_av_component_delta_report_2026_07_19.json" + }, + "status": "same_unit_matrix_ready", + "summary": { + "formula_or_unit_mismatch_count": 26, + "insufficient_numeric_sources_count": 0, + "method_variant_count": 8, + "row_count": 42, + "within_1_virupa_observation_count": 8 + }, + "truth_matrix_allowed": false +} diff --git a/scripts/shadbala_same_unit_normalizer.py b/scripts/shadbala_same_unit_normalizer.py new file mode 100644 index 00000000..e8f5a138 --- /dev/null +++ b/scripts/shadbala_same_unit_normalizer.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 +"""Normalize local/jyotishganit/Xalen/VP Jain Shadbala component rows. + +All component values are represented as Virupa plus derived Rupa=Virupa/60 +when numeric. The output classifies row-level deltas without declaring +absolute truth. +""" +from __future__ import annotations + +import hashlib +import json +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parents[1] +JYO = ROOT / "references/oracle/jyotishganit_shadbala_surface_probe_steve_jobs_2026_07_19.json" +XALEN = ROOT / "references/oracle/xalen_shadbala_av_component_delta_report_2026_07_19.json" +VPJ = ROOT / "references/oracle/vp_jain_shadbala_component_benchmark_2026_07_17.json" +PLANETS = ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn"] +COMPONENTS = { + "sthana": "Sthanabala", + "dig": "Digbala", + "kala": "Kaalabala", + "chesta": "Cheshtabala", + "naisargika": "Naisargikabala", + "drik": "Drikbala", +} + + +def stable(data: Any) -> str: + return json.dumps(data, ensure_ascii=False, sort_keys=True, separators=(",", ":"), default=str) + + +def rupa(v: float | None) -> float | None: + return None if v is None else round(v / 60.0, 6) + + +def get_jyo_value(jyo: dict[str, Any], planet: str, canonical: str) -> float | None: + val = jyo["raw"]["shadbala"].get(planet, {}).get(canonical) + if isinstance(val, dict): + val = val.get("Total") + return val if isinstance(val, (int, float)) else None + + +def xalen_index(xalen: dict[str, Any]) -> dict[tuple[str, str], dict[str, Any]]: + out: dict[tuple[str, str], dict[str, Any]] = {} + for group in xalen.get("component_groups", []): + component = group.get("component") + if component not in COMPONENTS: + continue + for row in group.get("rows", []): + planet = row.get("field") or row.get("planet") + out[(planet, component)] = row + return out + + +def vpj_index(vpj: dict[str, Any]) -> dict[tuple[str, str], dict[str, Any]]: + return { + (row.get("planet"), row.get("component")): row + for row in vpj.get("rows", []) + } + + +def classify(values: dict[str, float | None], statuses: dict[str, str | None]) -> str: + nums = {k: v for k, v in values.items() if isinstance(v, (int, float))} + if len(nums) < 2: + return "insufficient_numeric_sources" + span = max(nums.values()) - min(nums.values()) + if span <= 1.0: + return "within_1_virupa_observation" + if any(status == "method_variant" for status in statuses.values() if status): + return "method_variant" + return "formula_or_unit_mismatch" + + +def build() -> dict[str, Any]: + jyo = json.loads(JYO.read_text(encoding="utf-8")) + xalen = xalen_index(json.loads(XALEN.read_text(encoding="utf-8"))) + vpj = vpj_index(json.loads(VPJ.read_text(encoding="utf-8"))) + rows = [] + for planet in PLANETS: + for short, canonical in COMPONENTS.items(): + jyo_v = get_jyo_value(jyo, planet, canonical) + xrow = xalen.get((planet, short), {}) + vrow = vpj.get((planet, short), {}) + values = { + "jyotishganit_virupa": jyo_v, + "xalen_virupa": xrow.get("xalen_value"), + "local_from_xalen_report_virupa": xrow.get("local_value"), + "vp_jain_published_virupa": vrow.get("published_value"), + "vp_jain_local_virupa": vrow.get("local_value"), + } + statuses = { + "xalen_status": xrow.get("status"), + "vp_jain_status": vrow.get("status"), + } + rows.append( + { + "planet": planet, + "component": short, + "canonical_component": canonical, + **values, + "jyotishganit_rupa": rupa(jyo_v), + "xalen_rupa": rupa(xrow.get("xalen_value")), + "vp_jain_published_rupa": rupa(vrow.get("published_value")), + **statuses, + "normalization_unit": "Virupa", + "classification": classify(values, statuses), + "claim_boundary": "Same-unit row only; formula truth still requires source variant selection and public worked example.", + } + ) + summary = { + "row_count": len(rows), + "within_1_virupa_observation_count": sum(1 for r in rows if r["classification"] == "within_1_virupa_observation"), + "method_variant_count": sum(1 for r in rows if r["classification"] == "method_variant"), + "formula_or_unit_mismatch_count": sum(1 for r in rows if r["classification"] == "formula_or_unit_mismatch"), + "insufficient_numeric_sources_count": sum(1 for r in rows if r["classification"] == "insufficient_numeric_sources"), + } + return { + "scope": "shadbala_same_unit_normalizer", + "created_at": "2026-07-19", + "status": "same_unit_matrix_ready", + "claim_status": "partial", + "production_tuning_allowed": False, + "truth_matrix_allowed": False, + "sources": { + "jyotishganit": str(JYO.relative_to(ROOT)), + "xalen": str(XALEN.relative_to(ROOT)), + "vp_jain": str(VPJ.relative_to(ROOT)), + }, + "summary": summary, + "matrix_hash": hashlib.sha256(stable(rows).encode("utf-8")).hexdigest(), + "rows": rows, + "boundary": "All 42 rows are normalized to Virupa/Rupa fields where available. Classifications are arbitration queues, not absolute parity closure.", + } + + +def main() -> int: + print(json.dumps(build(), ensure_ascii=False, indent=2, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_shadbala_same_unit_normalizer.py b/tests/test_shadbala_same_unit_normalizer.py new file mode 100644 index 00000000..4f6345da --- /dev/null +++ b/tests/test_shadbala_same_unit_normalizer.py @@ -0,0 +1,52 @@ +import json +import subprocess +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +ARTIFACT = ROOT / "references/oracle/shadbala_same_unit_normalizer_2026_07_19.json" +INDEX = ROOT / "references/oracle/evidence_packet_index_2026_07_19.json" + + +def test_normalizer_outputs_42_same_unit_rows(): + data = json.loads(subprocess.check_output(["python3", "scripts/shadbala_same_unit_normalizer.py"], cwd=ROOT, text=True)) + assert data["scope"] == "shadbala_same_unit_normalizer" + assert data["summary"]["row_count"] == 42 + assert data["claim_status"] == "partial" + assert data["production_tuning_allowed"] is False + assert data["truth_matrix_allowed"] is False + assert data["matrix_hash"] + + +def test_normalizer_artifact_has_virupa_and_rupa_fields(): + data = json.loads(ARTIFACT.read_text(encoding="utf-8")) + first = data["rows"][0] + assert first["normalization_unit"] == "Virupa" + assert "jyotishganit_virupa" in first + assert "jyotishganit_rupa" in first + assert "vp_jain_published_virupa" in first + assert first["classification"] in { + "within_1_virupa_observation", + "method_variant", + "formula_or_unit_mismatch", + "insufficient_numeric_sources", + } + + +def test_normalizer_classifies_all_rows_without_truth_upgrade(): + data = json.loads(ARTIFACT.read_text(encoding="utf-8")) + total = ( + data["summary"]["within_1_virupa_observation_count"] + + data["summary"]["method_variant_count"] + + data["summary"]["formula_or_unit_mismatch_count"] + + data["summary"]["insufficient_numeric_sources_count"] + ) + assert total == 42 + assert data["summary"]["formula_or_unit_mismatch_count"] >= 1 + assert "not absolute parity closure" in data["boundary"] + + +def test_evidence_index_registers_same_unit_normalizer(): + index = json.loads(INDEX.read_text(encoding="utf-8")) + packets = {row["packet_id"]: row for row in index["packets"]} + assert packets["shadbala_same_unit_normalizer"]["claim_status"] == "partial"