diff --git a/scripts/jyotish_engine.py b/scripts/jyotish_engine.py index c724536a..166d34c0 100644 --- a/scripts/jyotish_engine.py +++ b/scripts/jyotish_engine.py @@ -15532,12 +15532,11 @@ def cmd_full_reading(args): pada = _padas.get(key) if not pada: return {"error": f"jaimini.calc_arudha_padas 未给出 {key}"} - lord_deg = planet_lons.get(pada['source_house_lord'], 0) - degree = (pada['sign_idx'] * 30 + (lord_deg % 30)) % 360 return { - "degree": round(degree, 4), + "degree": None, + "coordinate_basis": "sign_only_arudha", "sign": pada['sign'], - "sign_degree": round(degree % 30, 4), + "sign_degree": None, "house": ((pada['sign_idx'] - asc_idx) % 12) + 1, "distance_from_source": pada['distance'], "exception_applied": pada['exception_triggered'], diff --git a/scripts/special_lagnas.py b/scripts/special_lagnas.py index e8c2f550..4f028c80 100644 --- a/scripts/special_lagnas.py +++ b/scripts/special_lagnas.py @@ -254,13 +254,14 @@ class SpecialLagnasCalculator: pada_sign = (pada_sign + 9) % 12 exception_applied = True - pada_degree = (pada_sign * 30 + (source_lord_degree % 30)) % 360 + # Sign counting determines a sign, not a longitude inside that sign. return { "label": label, "source_house": source_house, - "degree": round(pada_degree, 4), + "degree": None, + "coordinate_basis": "sign_only_arudha", "sign": self.SIGNS[pada_sign], - "sign_degree": round(pada_degree % 30, 4), + "sign_degree": None, "house": ((pada_sign - asc_sign) % 12) + 1, "source_sign": self.SIGNS[source_sign], "source_lord_sign": self.SIGNS[lord_sign], @@ -284,6 +285,10 @@ class SpecialLagnasCalculator: lines.append(f"{lagna_name}:") if "note" in data: lines.append(f" {data['note']}") + elif data.get("coordinate_basis") == "sign_only_arudha": + lines.append(f" Position: {data['sign']} (sign-level result); house {data['house']}") + lines.append(f" Formula: {data['formula']}") + lines.append(f" Meaning: {data['meaning']}") else: lines.append(f" Position: {data['sign']} {data['sign_degree']:.2f}° ({data['degree']:.2f}°)") lines.append(f" Formula: {data['formula']}") diff --git a/tests/test_upstream_sync9_special_lagnas_arudha_coordinates.py b/tests/test_upstream_sync9_special_lagnas_arudha_coordinates.py new file mode 100644 index 00000000..f378b85a --- /dev/null +++ b/tests/test_upstream_sync9_special_lagnas_arudha_coordinates.py @@ -0,0 +1,30 @@ +"""Arudha counting yields a sign, not a fabricated intra-sign longitude. + +Upstream calls calculate_arudha_lagna / calculate_upapada_lagna. This tree's +names are calculate_arudha_pada (house 1 and house 12) and calculate_a10. +""" + +from scripts.special_lagnas import SpecialLagnasCalculator + + +def test_arudha_outputs_are_explicitly_sign_level() -> None: + calculator = SpecialLagnasCalculator() + rows = ( + calculator.calculate_arudha_pada(15.0, 1, 95.0), + calculator.calculate_a10(15.0, 215.0), + calculator.calculate_arudha_pada(15.0, 12, 305.0, "Upapada"), + ) + + for row in rows: + assert row["coordinate_basis"] == "sign_only_arudha" + assert row["degree"] is None + assert row["sign_degree"] is None + + +def test_sign_level_arudha_is_not_rendered_as_a_degree() -> None: + calculator = SpecialLagnasCalculator() + arudha = calculator.calculate_arudha_pada(15.0, 1, 95.0) + rendered = calculator.format_output({"Arudha_Lagna": arudha}) + + assert "sign-level result" in rendered + assert "None°" not in rendered