176 lines
6.4 KiB
Python
176 lines
6.4 KiB
Python
#!/usr/bin/env python3
|
|
"""Regression tests for MCP career event adjudication."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from mcp_server import _collect_strict_evidence
|
|
|
|
|
|
def _base_career_result() -> dict:
|
|
return {
|
|
"modules": {
|
|
"varga_full": {"D10_Dasamsa": {"summary": "career varga present"}},
|
|
"special_lagnas": {"A10_Karma_Pada": {"sign": "Capricorn", "lord": "Saturn"}},
|
|
"jaimini": {
|
|
"karakas": {
|
|
"Amatyakaraka": {"planet": "Mercury"},
|
|
"Atmakaraka": {"planet": "Sun"},
|
|
},
|
|
"karakamsha": {"karakamsha_sign": "Leo", "karakamsha_lord": "Sun"},
|
|
},
|
|
"dasha": {"current_dasha": {"mahadasha": "Mercury", "antardasha": "Sun"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Capricorn", "lord": "Saturn"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"career_status": {"convergence_level": "L2", "probability": "35-50%"}
|
|
}
|
|
},
|
|
"argala": {
|
|
"houses": {
|
|
"house_10": {
|
|
"net_result": "supported",
|
|
"argala_count": 2,
|
|
"virodhargala_count": 0,
|
|
}
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
|
|
def test_career_collects_a10_amk_karakamsha_as_strict_evidence() -> None:
|
|
strict = _collect_strict_evidence("career", _base_career_result())
|
|
|
|
assert strict["question_type"] == "career"
|
|
assert strict["present_evidence"]["d10_dasamsa"] == {"summary": "career varga present"}
|
|
assert strict["present_evidence"]["a10_karma_pada"] == {"sign": "Capricorn", "lord": "Saturn"}
|
|
assert strict["present_evidence"]["amatyakaraka"] == {"planet": "Mercury"}
|
|
assert strict["present_evidence"]["karakamsha"] == {
|
|
"karakamsha_sign": "Leo",
|
|
"karakamsha_lord": "Sun",
|
|
}
|
|
assert strict["event_judgement"]["event_family"] == "career"
|
|
assert strict["event_judgement"]["dominant_label"] == "career_status"
|
|
assert strict["event_judgement"]["secondary_context"] == [
|
|
"a10_active",
|
|
"amk_active",
|
|
"karakamsha_context",
|
|
"argala_support",
|
|
]
|
|
|
|
|
|
def test_career_blocks_label_when_d10_is_missing_but_preserves_jaimini_context() -> None:
|
|
result = _base_career_result()
|
|
del result["modules"]["varga_full"]["D10_Dasamsa"]
|
|
|
|
strict = _collect_strict_evidence("career", result)
|
|
|
|
assert "d10_dasamsa" in strict["missing_evidence"]
|
|
assert strict["blocked"] is True
|
|
assert strict["event_judgement"]["dominant_label"] is None
|
|
assert strict["event_judgement"]["secondary_context"] == [
|
|
"a10_active",
|
|
"amk_active",
|
|
"karakamsha_context",
|
|
"argala_support",
|
|
]
|
|
|
|
|
|
def test_career_argala_bridge_uses_tenth_house_as_modifier_only() -> None:
|
|
result = _base_career_result()
|
|
|
|
strict = _collect_strict_evidence("career", result)
|
|
|
|
assert strict["present_evidence"]["argala_support"] == {
|
|
"level": "supportive",
|
|
"target_house": 10,
|
|
"source": "argala_house_bridge_v1",
|
|
"signals": ["argala_support"],
|
|
"raw": {
|
|
"net_result": "supported",
|
|
"argala_count": 2,
|
|
"virodhargala_count": 0,
|
|
},
|
|
}
|
|
assert strict["event_judgement"]["dominant_label"] == "career_status"
|
|
assert "argala_support" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_career_kakshya_support_adds_small_score_bump_without_label_override() -> None:
|
|
base_result = _base_career_result()
|
|
base_result["modules"]["dasa_convergence"]["domain_activations"]["career_status"] = {
|
|
"convergence_level": "L1",
|
|
"probability": "+15-20%",
|
|
}
|
|
base = _collect_strict_evidence("career", base_result)
|
|
result = _base_career_result()
|
|
result["modules"]["dasa_convergence"]["domain_activations"]["career_status"] = {
|
|
"convergence_level": "L1",
|
|
"probability": "+15-20%",
|
|
}
|
|
result["modules"]["kakshya"] = {
|
|
"summary": {"average_strength": 6.7},
|
|
"planets": {"Sun": {"kakshya_strength": 7.0}},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("career", result)
|
|
|
|
assert strict["present_evidence"]["kakshya_career_support"] == {
|
|
"level": "supportive",
|
|
"source": "kakshya_career_bridge_v1",
|
|
"signals": ["kakshya_career_support"],
|
|
"average_strength": 6.7,
|
|
}
|
|
assert strict["event_judgement"]["dominant_label"] == "career_status"
|
|
assert strict["event_judgement"]["score"] >= base["event_judgement"]["score"]
|
|
assert "kakshya_career_support" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_career_caps_confidence_when_provided_shadbala_components_are_incomplete() -> None:
|
|
result = _base_career_result()
|
|
result["modules"]["dasa_convergence"]["domain_activations"]["career_status"] = {
|
|
"convergence_level": "L4",
|
|
"probability": "70-85%",
|
|
}
|
|
result["modules"]["shadbala"] = {"planets": {"Mercury": {"total_rupa": 7.5}}}
|
|
|
|
strict = _collect_strict_evidence("career", result)
|
|
|
|
assert strict["present_evidence"]["shadbala_component_audit"] == {
|
|
"status": "incomplete",
|
|
"source": "shadbala.planets",
|
|
"required_components": ["sthana", "dig", "kala", "chesta", "naisargika", "drik"],
|
|
"missing": {"Mercury": ["sthana", "dig", "kala", "chesta", "naisargika", "drik"]},
|
|
}
|
|
assert strict["confidence_cap"] == "low"
|
|
assert "shadbala_component_gap" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_career_accepts_complete_shadbala_components_without_cap_penalty() -> None:
|
|
result = _base_career_result()
|
|
result["modules"]["dasa_convergence"]["domain_activations"]["career_status"] = {
|
|
"convergence_level": "L4",
|
|
"probability": "70-85%",
|
|
}
|
|
result["modules"]["shadbala"] = {
|
|
"planets": {
|
|
"Mercury": {
|
|
"components": {
|
|
"sthana": 1.0,
|
|
"dig": 0.8,
|
|
"kala": 1.2,
|
|
"chesta": 0.7,
|
|
"naisargika": 0.5,
|
|
"drik": 0.3,
|
|
},
|
|
"total_rupa": 4.5,
|
|
}
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("career", result)
|
|
|
|
assert strict["present_evidence"]["shadbala_component_audit"]["status"] == "complete"
|
|
assert strict["confidence_cap"] == "medium-high"
|
|
assert "shadbala_component_gap" not in strict["event_judgement"]["secondary_context"]
|