254 lines
9.5 KiB
Python
254 lines
9.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Regression tests for MCP relationship event adjudication."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from mcp_server import _collect_strict_evidence
|
|
|
|
|
|
def _base_relationship_result() -> dict:
|
|
return {
|
|
"modules": {
|
|
"varga_full": {"D9_Navamsa": {"summary": "ok"}},
|
|
"special_lagnas": {"Upapada_Lagna": {"sign": "Libra", "lord": "Venus"}},
|
|
"jaimini": {
|
|
"darakaraka": {"planet": "Venus", "house": 7},
|
|
"marriage_support": {"dk_7h_link": True},
|
|
},
|
|
"vivah_saham": {"sign": "Taurus", "house": 7},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Moon"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Libra", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"marriage_partnership": {"convergence_level": "L1", "probability": "+15-20%"}
|
|
}
|
|
},
|
|
"argala": {
|
|
"houses": {
|
|
"house_7": {
|
|
"net_result": "obstructed",
|
|
"argala_count": 1,
|
|
"virodhargala_count": 2,
|
|
}
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
|
|
def test_relationship_jaimini_bridge_lifts_legal_marriage_label() -> None:
|
|
strict = _collect_strict_evidence("relationship", _base_relationship_result())
|
|
|
|
assert strict["present_evidence"]["jaimini_marriage_support"] == {
|
|
"level": "moderate",
|
|
"signals": ["darakaraka_active", "dk_7h_link"],
|
|
"source": "jaimini_bridge_v1",
|
|
}
|
|
assert strict["event_judgement"]["dominant_label"] == "legal_marriage"
|
|
assert strict["event_judgement"]["secondary_context"] == [
|
|
"darakaraka_active",
|
|
"jaimini_support",
|
|
"ul_support",
|
|
"virodhargala_obstruction",
|
|
]
|
|
|
|
|
|
def test_relationship_jaimini_bridge_stays_context_only_when_d9_missing() -> None:
|
|
result = _base_relationship_result()
|
|
del result["modules"]["varga_full"]["D9_Navamsa"]
|
|
|
|
strict = _collect_strict_evidence("relationship", result)
|
|
|
|
assert strict["present_evidence"]["jaimini_marriage_support"] == {
|
|
"level": "moderate",
|
|
"signals": ["darakaraka_active", "dk_7h_link"],
|
|
"source": "jaimini_bridge_v1",
|
|
}
|
|
assert strict["event_judgement"]["dominant_label"] is None
|
|
assert strict["event_judgement"]["secondary_context"] == [
|
|
"darakaraka_active",
|
|
"jaimini_support",
|
|
"ul_support",
|
|
"virodhargala_obstruction",
|
|
]
|
|
|
|
|
|
def test_relationship_argala_bridge_uses_seventh_house_as_modifier_only() -> None:
|
|
result = _base_relationship_result()
|
|
|
|
strict = _collect_strict_evidence("relationship", result)
|
|
|
|
assert strict["present_evidence"]["argala_support"] == {
|
|
"level": "obstructive",
|
|
"target_house": 7,
|
|
"source": "argala_house_bridge_v1",
|
|
"signals": ["virodhargala_obstruction"],
|
|
"raw": {
|
|
"net_result": "obstructed",
|
|
"argala_count": 1,
|
|
"virodhargala_count": 2,
|
|
},
|
|
}
|
|
assert strict["event_judgement"]["dominant_label"] == "legal_marriage"
|
|
assert "virodhargala_obstruction" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_relationship_collects_vedastro_range_scan_as_external_activation_context() -> None:
|
|
result = _base_relationship_result()
|
|
result["modules"]["external_activation"] = {
|
|
"evidence_ledger": [
|
|
{
|
|
"source": "vedastro_service_adapter_candidate",
|
|
"operation": "range_scan",
|
|
"domain": "marriage",
|
|
"event_id": "jupiter_7h_window",
|
|
"score": 72,
|
|
}
|
|
]
|
|
}
|
|
|
|
strict = _collect_strict_evidence("relationship", result)
|
|
|
|
assert strict["present_evidence"]["external_activation"]["level"] == "moderate"
|
|
assert strict["present_evidence"]["external_activation"]["source"] == "vedastro_service_adapter_candidate"
|
|
assert "external_activation_support" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_relationship_synastry_bridge_adds_context_and_small_score_bump_without_overriding_label_gate() -> None:
|
|
base = _collect_strict_evidence("relationship", _base_relationship_result())
|
|
result = _base_relationship_result()
|
|
result["modules"]["synastry"] = {
|
|
"total_score": 29.0,
|
|
"max_score": 36.0,
|
|
"is_approved": True,
|
|
"additional_kutas": {
|
|
"Mahendra": "good",
|
|
"StreeDeergha": "good",
|
|
"Vedha": "good",
|
|
"Rajju": {"result": "good", "group": None, "effect": ""},
|
|
"BadConstellations": "good",
|
|
},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("relationship", result)
|
|
|
|
assert strict["present_evidence"]["synastry_relationship_support"] == {
|
|
"level": "supportive",
|
|
"source": "synastry_relationship_bridge_v1",
|
|
"signals": ["ashtakoot_approved", "ashtakoot_high_score", "kuta_exception_clean"],
|
|
"total_score": 29.0,
|
|
"approved": True,
|
|
}
|
|
assert strict["event_judgement"]["dominant_label"] == "legal_marriage"
|
|
assert strict["event_judgement"]["score"] == base["event_judgement"]["score"] + 5
|
|
assert "synastry_support" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_relationship_synastry_bridge_cannot_lift_label_when_core_marriage_layers_are_missing() -> None:
|
|
result = _base_relationship_result()
|
|
del result["modules"]["varga_full"]["D9_Navamsa"]
|
|
del result["modules"]["special_lagnas"]["Upapada_Lagna"]
|
|
result["modules"]["synastry"] = {
|
|
"total_score": 31.0,
|
|
"is_approved": True,
|
|
"additional_kutas": {
|
|
"Vedha": "good",
|
|
"Rajju": {"result": "good"},
|
|
"BadConstellations": "good",
|
|
},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("relationship", result)
|
|
|
|
assert strict["present_evidence"]["synastry_relationship_support"]["level"] == "supportive"
|
|
assert strict["event_judgement"]["dominant_label"] is None
|
|
assert "synastry_support" in strict["event_judgement"]["secondary_context"]
|
|
assert "d9_navamsa" in strict["missing_evidence"]
|
|
assert "upapada_lagna" in strict["missing_evidence"]
|
|
|
|
|
|
def test_relationship_dignity_guardrail_ignores_non_relevant_planets() -> None:
|
|
result = _base_relationship_result()
|
|
result["modules"]["chart"] = {
|
|
"ascendant": {"sign": "Leo"},
|
|
"planets": {
|
|
"Mars": {"status": "落陷取消(Neecha Bhanga)"},
|
|
"Mercury": {"status": "极敌(Great Enemy)"},
|
|
"Venus": {"status": "中性(Neutral)"},
|
|
"Jupiter": {"status": "中性(Neutral)"},
|
|
},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("relationship", result)
|
|
|
|
assert strict["present_evidence"]["dignity_guardrail"]["score_delta"] == 0
|
|
assert strict["event_judgement"]["dominant_label"] == "legal_marriage"
|
|
assert "dignity_supportive_recovery" not in strict["event_judgement"]["secondary_context"]
|
|
assert "dignity_high_friction" not in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_relationship_dignity_guardrail_uses_relevant_planets_only() -> None:
|
|
result = _base_relationship_result()
|
|
result["modules"]["chart"] = {
|
|
"ascendant": {"sign": "Aries"},
|
|
"planets": {
|
|
"Venus": {"status": "落陷取消(Neecha Bhanga)"},
|
|
"Jupiter": {"status": "中性(Neutral)"},
|
|
"Saturn": {"status": "极敌(Great Enemy)"},
|
|
},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("relationship", result)
|
|
|
|
assert strict["present_evidence"]["dignity_guardrail"]["score_delta"] == 5
|
|
assert "dignity_supportive_recovery" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_relationship_caps_confidence_when_provided_shadbala_components_are_incomplete() -> None:
|
|
result = _base_relationship_result()
|
|
result["modules"]["dasa_convergence"]["domain_activations"]["marriage_partnership"] = {
|
|
"convergence_level": "L4",
|
|
"probability": "70-85%",
|
|
}
|
|
result["modules"]["shadbala"] = {"planets": {"Venus": {"total_rupa": 8.2}}}
|
|
|
|
strict = _collect_strict_evidence("relationship", result)
|
|
|
|
assert strict["present_evidence"]["shadbala_component_audit"] == {
|
|
"status": "incomplete",
|
|
"source": "shadbala.planets",
|
|
"required_components": ["sthana", "dig", "kala", "chesta", "naisargika", "drik"],
|
|
"missing": {"Venus": ["sthana", "dig", "kala", "chesta", "naisargika", "drik"]},
|
|
}
|
|
assert strict["confidence_cap"] == "low"
|
|
assert "shadbala_component_gap" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_relationship_accepts_complete_shadbala_components_without_cap_penalty() -> None:
|
|
result = _base_relationship_result()
|
|
result["modules"]["dasa_convergence"]["domain_activations"]["marriage_partnership"] = {
|
|
"convergence_level": "L4",
|
|
"probability": "70-85%",
|
|
}
|
|
result["modules"]["shadbala"] = {
|
|
"planets": {
|
|
"Venus": {
|
|
"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("relationship", 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"]
|