Files
Jyotisha/scripts/kp_ezine159_full_cusp_comparator.py
T
2026-07-23 12:03:58 +08:00

101 lines
4.7 KiB
Python

#!/usr/bin/env python3
"""Compare transcribed KP Ezine 159 cusp lord rows with VedicAstro raw.
The public source is treated as a partial worked example: eleven cusp rows have
usable sign/star/sub/sub-sub labels, but this is still observation-only and does
not validate KP timing or prediction claims.
"""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from typing import Any
FIELDS = ("RasiLord", "Nakshatra", "NakshatraLord", "SubLord", "SubSubLord")
TRANSCRIBED_ROWS: dict[int, dict[str, str]] = {
1: {"Rasi": "Aquarius", "RasiLord": "Saturn", "Nakshatra": "Dhanishta", "NakshatraLord": "Mars", "SubLord": "Venus", "SubSubLord": "Ketu"},
2: {"Rasi": "Pisces", "RasiLord": "Jupiter", "Nakshatra": "Revati", "NakshatraLord": "Mercury", "SubLord": "Mercury", "SubSubLord": "Ketu"},
3: {"Rasi": "Aries", "RasiLord": "Mars", "Nakshatra": "Bharani", "NakshatraLord": "Venus", "SubLord": "Jupiter", "SubSubLord": "Jupiter"},
4: {"Rasi": "Taurus", "RasiLord": "Venus", "Nakshatra": "Rohini", "NakshatraLord": "Moon", "SubLord": "Saturn", "SubSubLord": "Mercury"},
5: {"Rasi": "Gemini", "RasiLord": "Mercury", "Nakshatra": "Ardra", "NakshatraLord": "Rahu", "SubLord": "Jupiter", "SubSubLord": "Saturn"},
6: {"Rasi": "Cancer", "RasiLord": "Moon", "Nakshatra": "Pushya", "NakshatraLord": "Saturn", "SubLord": "Saturn", "SubSubLord": "Saturn"},
7: {"Rasi": "Leo", "RasiLord": "Sun", "Nakshatra": "Maghā", "NakshatraLord": "Ketu", "SubLord": "Mars", "SubSubLord": "Rahu"},
8: {"Rasi": "Virgo", "RasiLord": "Mercury", "Nakshatra": "Hasta", "NakshatraLord": "Moon", "SubLord": "Saturn", "SubSubLord": "Moon"},
9: {"Rasi": "Libra", "RasiLord": "Venus", "Nakshatra": "Vishakha", "NakshatraLord": "Jupiter", "SubLord": "Jupiter", "SubSubLord": "Jupiter"},
10: {"Rasi": "Scorpio", "RasiLord": "Mars", "Nakshatra": "Anuradha", "NakshatraLord": "Saturn", "SubLord": "Jupiter", "SubSubLord": "Sun"},
11: {"Rasi": "Sagittarius", "RasiLord": "Jupiter", "Nakshatra": "Mula", "NakshatraLord": "Ketu", "SubLord": "Jupiter", "SubSubLord": "Rahu"},
}
def _houses_by_number(raw: dict[str, Any]) -> dict[int, dict[str, Any]]:
return {int(row["HouseNr"]): row for row in raw["raw"]["houses"]}
def build_report(raw: dict[str, Any]) -> dict[str, Any]:
houses = _houses_by_number(raw)
comparisons = []
for house_nr, expected in TRANSCRIBED_ROWS.items():
observed = houses[house_nr]
for field in FIELDS:
comparisons.append(
{
"house": house_nr,
"field": field,
"public_value": expected[field],
"vedicastro_value": observed.get(field),
"matches": observed.get(field) == expected[field],
}
)
matched = sum(row["matches"] for row in comparisons)
mismatched = len(comparisons) - matched
return {
"scope": "kp_ezine159_full_cusp_label_comparison",
"status": (
"public_kp_eleven_cusp_lord_rows_match_observation"
if mismatched == 0
else "public_kp_eleven_cusp_lord_rows_mismatch_observation"
),
"claim_status": "observation_only",
"consumer_policy": "research_observation_only",
"production_tuning_allowed": False,
"truth_matrix_allowed": False,
"public_source": {
"url": "https://www.scribd.com/document/462272035/KP-Ezine-159-April-2020",
"source_boundary": "Publicly visible table rows were transcribed only for available cusp lord labels; this packet does not establish a complete numeric KP oracle.",
},
"summary": {
"transcribed_cusp_count": len(TRANSCRIBED_ROWS),
"matched_field_count": matched,
"mismatched_field_count": mismatched,
"untranscribed_cusps": [12],
},
"comparisons": comparisons,
"claim_boundary": (
"Eleven public cusp label rows agree with one isolated VedicAstro replay. "
"Exact longitudes, the twelfth cusp row, software identity, full KP event "
"significator workflow, and timing outcome validation remain blocked."
),
}
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--vedicastro-raw", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
args = parser.parse_args()
report = build_report(json.loads(args.vedicastro_raw.read_text(encoding="utf-8")))
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
return 0
if __name__ == "__main__":
raise SystemExit(main())