Astrologer ruling 甲11. Muntha stays natal Lagna + completed years (test pins it on the main path; muntha.calc_muntha_from_sun_sign is imported nowhere). Panchavargiya is not implemented (native producer blocked). Consultation annual layer gains varshesha_basis '暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入' (card keys and the workflow allowlist carry it); reader report 'Selection basis' row says the same in both annual sections (zh/en). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N4f2nya58RoRu4yEmJgRGE
69 lines
3.6 KiB
Python
69 lines
3.6 KiB
Python
"""Year lord is labelled as a Muntha-lord stand-in for Panchavargiya (BUG-1212).
|
|
|
|
Astrologer rulings 2026-10-03 甲11: Muntha = natal Lagna + completed years
|
|
(kept); year lord by Panchavargiya is not implemented (native producer blocked),
|
|
so every surface that shows the year lord says so. Fictional chart.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import copy
|
|
import re
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
from scripts.consultation_native_layers import YEAR_LORD_BASIS, build_annual_tajika
|
|
from scripts.pl9_reader_export import _pl9_export_markdown_for_edition
|
|
from scripts.solar_return import SIGNS, solar_return_full_report
|
|
from tests.test_report_english_edition import CASES, _packet
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def test_report_shows_the_basis_in_both_editions() -> None:
|
|
packet = _packet(CASES["day"])
|
|
zh = _pl9_export_markdown_for_edition(copy.deepcopy(packet), "reader_main")
|
|
english = copy.deepcopy(packet)
|
|
english["report_language"] = "en"
|
|
en = _pl9_export_markdown_for_edition(english, "reader_main")
|
|
assert zh.count("| Selection basis | 暂用 Muntha 主星;占星师口径为 Panchavargiya,待接入 |") >= 1
|
|
assert "| Selection basis | Muntha sign lord for now; the astrologer's rule is Panchavargiya, not yet wired |" in en
|
|
assert zh.count("| Varshesha |") == zh.count("| Selection basis |")
|
|
|
|
|
|
def test_consultation_annual_card_carries_the_basis() -> None:
|
|
case = CASES["day"]
|
|
payload = {key: case[key] for key in ("year", "month", "day", "hour", "minute", "second", "lat", "lon", "tz", "ayanamsa", "node_mode")}
|
|
from scripts.jyotish_engine import compute_chart_data
|
|
chart, *_ = compute_chart_data(case["year"], case["month"], case["day"], case["hour"], case["minute"],
|
|
case["lat"], case["lon"], case["tz"], ayanamsa_name=case["ayanamsa"])
|
|
annual = build_annual_tajika(payload, chart, reference=datetime(2026, 10, 3))
|
|
assert annual["status"] == "parameter_sensitive"
|
|
assert annual["varshesha_basis"] == YEAR_LORD_BASIS
|
|
card = (ROOT / "frontend/src/lib/consultation-evidence-card.ts").read_text(encoding="utf-8")
|
|
assert '"varshesha", "varshesha_basis"' in card
|
|
workflow = (ROOT / "frontend/src/mastra/consultation-workflow.ts").read_text(encoding="utf-8")
|
|
assert '"varsheshabasis"' in workflow
|
|
|
|
|
|
def test_main_path_muntha_is_natal_lagna_plus_completed_years() -> None:
|
|
from scripts.jyotish_engine import compute_chart_data
|
|
|
|
case = CASES["day"]
|
|
report = solar_return_full_report(case["year"], case["month"], case["day"], case["hour"], case["minute"],
|
|
case["lat"], case["lon"], case["tz"], 2026, ayanamsa_name="raman")
|
|
_chart, natal_asc, *_ = compute_chart_data(case["year"], case["month"], case["day"], case["hour"], case["minute"],
|
|
case["lat"], case["lon"], case["tz"], ayanamsa_name="raman")
|
|
muntha = report["muntha"]
|
|
completed = 2026 - case["year"]
|
|
assert (muntha["natal_asc_sign_idx"], muntha["age"]) == (natal_asc, completed)
|
|
assert muntha["muntha_sign_idx"] == (natal_asc + completed) % 12
|
|
assert muntha["muntha_sign"] == SIGNS[muntha["muntha_sign_idx"]]
|
|
assert report["year_lord"]["year_lord"] == muntha["muntha_lord"]
|
|
|
|
|
|
def test_sun_sign_muntha_variant_is_off_the_main_path() -> None:
|
|
pattern = re.compile(r"^\s*(from\s+(scripts\.)?muntha\s+import|import\s+(scripts\.)?muntha\b)|_load_local_module\(['\"]muntha['\"]\)", re.MULTILINE)
|
|
offenders = [path.name for path in (ROOT / "scripts").glob("*.py") if path.name != "muntha.py" and pattern.search(path.read_text(encoding="utf-8"))]
|
|
assert offenders == []
|