Land relationship narrative and dynamic hook workflow
This commit is contained in:
@@ -299,6 +299,20 @@ def test_full_reading_reports_ayanamsa_metadata_and_ai_prompt_pack() -> None:
|
||||
assert strength_rows
|
||||
assert strength_rows[0]["status"] == "used"
|
||||
assert "Shadbala" in strength_rows[0]["note"]
|
||||
relationship_synastry_rows = [row for row in audit_table if row["technique"] == "Relationship Synastry Taxonomy"]
|
||||
assert relationship_synastry_rows
|
||||
assert relationship_synastry_rows[0]["status"] in {"used", "blocked"}
|
||||
assert "relationship secondary_context" in relationship_synastry_rows[0]["note"]
|
||||
assert "compatibility support" in relationship_synastry_rows[0]["note"]
|
||||
assert "protective kuta support" in relationship_synastry_rows[0]["note"]
|
||||
relationship_narrative = prompt_pack["evidence_snapshot"]["relationship_narrative"]
|
||||
assert relationship_narrative["headline"]
|
||||
assert isinstance(relationship_narrative["strengths"], list)
|
||||
assert isinstance(relationship_narrative["risks"], list)
|
||||
assert isinstance(relationship_narrative["boundaries"], list)
|
||||
assert relationship_narrative["markdown"]
|
||||
assert "D9" in "".join(relationship_narrative["boundaries"])
|
||||
assert "dual dasha" in relationship_narrative["markdown"]
|
||||
oracle_progress = prompt_pack["evidence_snapshot"]["oracle_progress"]
|
||||
assert oracle_progress["scope"] == "external_oracle_evidence_validation"
|
||||
assert oracle_progress["valid_packets"] >= 4
|
||||
|
||||
@@ -3,8 +3,16 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from mcp_server import _collect_strict_evidence
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "scripts"))
|
||||
|
||||
import jyotish_engine # noqa: E402
|
||||
|
||||
|
||||
def _base_relationship_result() -> dict:
|
||||
return {
|
||||
@@ -50,6 +58,7 @@ def test_relationship_jaimini_bridge_lifts_legal_marriage_label() -> None:
|
||||
"jaimini_support",
|
||||
"ul_support",
|
||||
"virodhargala_obstruction",
|
||||
"vedastro_range_scan_missing",
|
||||
]
|
||||
|
||||
|
||||
@@ -70,9 +79,62 @@ def test_relationship_jaimini_bridge_stays_context_only_when_d9_missing() -> Non
|
||||
"jaimini_support",
|
||||
"ul_support",
|
||||
"virodhargala_obstruction",
|
||||
"vedastro_range_scan_missing",
|
||||
]
|
||||
|
||||
|
||||
def test_relationship_jaimini_bridge_cannot_lift_legal_marriage_when_narayana_is_missing() -> None:
|
||||
result = _base_relationship_result()
|
||||
del result["modules"]["narayana_dasha"]
|
||||
|
||||
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 "jaimini_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "public_formalization_candidate" not in strict["event_judgement"]["secondary_context"]
|
||||
|
||||
|
||||
def test_relationship_jaimini_bridge_uses_public_formalization_as_context_only_when_marriage_gate_is_open_but_label_support_missing() -> None:
|
||||
result = _base_relationship_result()
|
||||
del result["modules"]["vivah_saham"]
|
||||
del result["modules"]["dasa_convergence"]
|
||||
result["modules"]["external_activation"] = {
|
||||
"evidence_ledger": [
|
||||
{
|
||||
"source": "vedastro_service_adapter_candidate",
|
||||
"operation": "range_scan",
|
||||
"domain": "marriage",
|
||||
"event_id": "public_relationship_window",
|
||||
"signal_key": "public_relationship_window",
|
||||
"score": 78,
|
||||
}
|
||||
]
|
||||
}
|
||||
result["modules"]["synastry"] = {
|
||||
"total_score": 28.0,
|
||||
"max_score": 36.0,
|
||||
"is_approved": True,
|
||||
"additional_kutas": {
|
||||
"Mahendra": "good",
|
||||
"Vedha": "good",
|
||||
"Rajju": {"result": "good", "group": None, "effect": ""},
|
||||
},
|
||||
}
|
||||
|
||||
strict = _collect_strict_evidence("relationship", result)
|
||||
|
||||
assert strict["event_judgement"]["dominant_label"] is None
|
||||
assert "jaimini_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "external_activation_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "public_formalization_candidate" in strict["event_judgement"]["secondary_context"]
|
||||
|
||||
|
||||
def test_relationship_argala_bridge_uses_seventh_house_as_modifier_only() -> None:
|
||||
result = _base_relationship_result()
|
||||
|
||||
@@ -135,7 +197,16 @@ def test_relationship_synastry_bridge_adds_context_and_small_score_bump_without_
|
||||
assert strict["present_evidence"]["synastry_relationship_support"] == {
|
||||
"level": "supportive",
|
||||
"source": "synastry_relationship_bridge_v1",
|
||||
"signals": ["ashtakoot_approved", "ashtakoot_high_score", "kuta_exception_clean"],
|
||||
"signals": [
|
||||
"ashtakoot_approved",
|
||||
"ashtakoot_high_score",
|
||||
"mahendra_support",
|
||||
"stree_deergha_support",
|
||||
"vedha_clean",
|
||||
"rajju_clean",
|
||||
"bad_constellations_clean",
|
||||
"kuta_exception_clean",
|
||||
],
|
||||
"total_score": 29.0,
|
||||
"approved": True,
|
||||
}
|
||||
@@ -188,11 +259,252 @@ def test_relationship_synastry_bridge_understands_nested_bad_constellations_and_
|
||||
assert strict["present_evidence"]["synastry_relationship_support"] == {
|
||||
"level": "moderate",
|
||||
"source": "synastry_relationship_bridge_v1",
|
||||
"signals": ["ashtakoot_approved", "exception_mitigated_match", "kuta_exception_clean"],
|
||||
"signals": [
|
||||
"ashtakoot_approved",
|
||||
"exception_mitigated_match",
|
||||
"mahendra_support",
|
||||
"stree_deergha_support",
|
||||
"vedha_clean",
|
||||
"rajju_clean",
|
||||
"bad_constellations_clean",
|
||||
"kuta_exception_clean",
|
||||
],
|
||||
"total_score": 18.0,
|
||||
"approved": True,
|
||||
}
|
||||
assert "synastry_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_compatibility_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_protective_kuta_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_exception_mitigated" in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_kuta_exception_clean" in strict["event_judgement"]["secondary_context"]
|
||||
assert "mahendra_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "stree_deergha_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "vedha_clean" in strict["event_judgement"]["secondary_context"]
|
||||
assert "rajju_clean" in strict["event_judgement"]["secondary_context"]
|
||||
assert "bad_constellations_clean" in strict["event_judgement"]["secondary_context"]
|
||||
|
||||
|
||||
def test_relationship_synastry_exception_alone_cannot_create_false_lift_or_clean_kuta_context() -> None:
|
||||
result = _base_relationship_result()
|
||||
del result["modules"]["varga_full"]["D9_Navamsa"]
|
||||
del result["modules"]["special_lagnas"]["Upapada_Lagna"]
|
||||
del result["modules"]["vivah_saham"]
|
||||
del result["modules"]["narayana_dasha"]
|
||||
result["modules"]["synastry"] = {
|
||||
"total_score": 14.0,
|
||||
"max_score": 36.0,
|
||||
"is_approved": False,
|
||||
"exceptions": ["Nadi exception discussed but not fully mitigated."],
|
||||
"additional_kutas": {
|
||||
"Mahendra": "good",
|
||||
"StreeDeergha": "good",
|
||||
"Vedha": "bad",
|
||||
"Rajju": {"result": "bad", "group": "same", "effect": "dosha"},
|
||||
"BadConstellations": {"result": "bad", "issues": ["vedha clash"]},
|
||||
},
|
||||
}
|
||||
|
||||
strict = _collect_strict_evidence("relationship", result)
|
||||
|
||||
assert strict["present_evidence"]["synastry_relationship_support"] == {
|
||||
"level": "none",
|
||||
"source": "synastry_relationship_bridge_v1",
|
||||
"signals": [
|
||||
"exception_mitigated_match",
|
||||
"mahendra_support",
|
||||
"stree_deergha_support",
|
||||
],
|
||||
"total_score": 14.0,
|
||||
"approved": False,
|
||||
}
|
||||
assert strict["event_judgement"]["dominant_label"] is None
|
||||
assert "synastry_support" not in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_compatibility_support" not in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_protective_kuta_support" not in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_exception_mitigated" not in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_kuta_exception_clean" not in strict["event_judgement"]["secondary_context"]
|
||||
assert "mahendra_support" not in strict["event_judgement"]["secondary_context"]
|
||||
assert "rajju_clean" not in strict["event_judgement"]["secondary_context"]
|
||||
|
||||
|
||||
def test_relationship_good_kutas_cannot_override_weak_core_marriage_promise() -> None:
|
||||
result = _base_relationship_result()
|
||||
del result["modules"]["vivah_saham"]
|
||||
del result["modules"]["dasa_convergence"]
|
||||
result["modules"]["jaimini"] = {
|
||||
"darakaraka": {"planet": "Venus", "house": 3},
|
||||
}
|
||||
result["modules"]["synastry"] = {
|
||||
"total_score": 31.0,
|
||||
"max_score": 36.0,
|
||||
"is_approved": True,
|
||||
"additional_kutas": {
|
||||
"Mahendra": "good",
|
||||
"StreeDeergha": "good",
|
||||
"Vedha": "good",
|
||||
"Rajju": {"result": "good", "group": None, "effect": ""},
|
||||
"BadConstellations": {"result": "good", "issues": []},
|
||||
},
|
||||
}
|
||||
|
||||
strict = _collect_strict_evidence("relationship", result)
|
||||
|
||||
assert strict["present_evidence"]["jaimini_marriage_support"] == {
|
||||
"level": "weak",
|
||||
"signals": ["darakaraka_active"],
|
||||
"source": "jaimini_bridge_v1",
|
||||
}
|
||||
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 "synastry_compatibility_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "synastry_protective_kuta_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert "jaimini_support" not in strict["event_judgement"]["secondary_context"]
|
||||
|
||||
|
||||
def test_relationship_protective_kutas_do_not_block_confidence_downgrade_when_timing_layers_conflict() -> None:
|
||||
result = _base_relationship_result()
|
||||
result["modules"]["synastry"] = {
|
||||
"total_score": 31.0,
|
||||
"max_score": 36.0,
|
||||
"is_approved": True,
|
||||
"additional_kutas": {
|
||||
"Mahendra": "good",
|
||||
"StreeDeergha": "good",
|
||||
"Vedha": "good",
|
||||
"Rajju": {"result": "good", "group": None, "effect": ""},
|
||||
"BadConstellations": {"result": "good", "issues": []},
|
||||
},
|
||||
}
|
||||
result["modules"]["external_activation"] = {
|
||||
"evidence_ledger": [
|
||||
{
|
||||
"source": "vedastro_service_adapter_candidate",
|
||||
"operation": "range_scan",
|
||||
"domain": "career",
|
||||
"event_id": "career_window_only",
|
||||
"signal_key": "career_only_external_window",
|
||||
"score": 74,
|
||||
}
|
||||
]
|
||||
}
|
||||
result["modules"]["dasa_convergence"] = {
|
||||
"domain_activations": {
|
||||
"career_status": {"convergence_level": "L4", "probability": "70-85%"}
|
||||
}
|
||||
}
|
||||
|
||||
strict = _collect_strict_evidence("relationship", result)
|
||||
|
||||
assert "synastry_protective_kuta_support" in strict["event_judgement"]["secondary_context"]
|
||||
assert strict["event_judgement"]["dominant_label"] == "legal_marriage"
|
||||
assert strict["confidence_cap"] == "low"
|
||||
|
||||
|
||||
def test_relationship_narrative_payload_turns_synastry_taxonomy_into_user_readable_boundary() -> None:
|
||||
strict = _collect_strict_evidence("relationship", _base_relationship_result())
|
||||
strict["present_evidence"]["synastry_relationship_support"] = {
|
||||
"level": "supportive",
|
||||
"source": "synastry_relationship_bridge_v1",
|
||||
"signals": [
|
||||
"ashtakoot_approved",
|
||||
"mahendra_support",
|
||||
"stree_deergha_support",
|
||||
"vedha_clean",
|
||||
"rajju_clean",
|
||||
],
|
||||
"total_score": 29.0,
|
||||
"approved": True,
|
||||
}
|
||||
strict["event_judgement"]["secondary_context"] = strict["event_judgement"]["secondary_context"] + [
|
||||
"synastry_support",
|
||||
"synastry_compatibility_support",
|
||||
"synastry_protective_kuta_support",
|
||||
]
|
||||
strict["confidence_cap"] = "low"
|
||||
|
||||
payload = jyotish_engine._build_relationship_narrative_payload(strict)
|
||||
|
||||
assert "婚恋" in payload["headline"]
|
||||
assert any("合盘" in item for item in payload["strengths"])
|
||||
assert any("protective kuta" in item.lower() for item in payload["strengths"])
|
||||
assert any("dual dasha" in item.lower() for item in payload["risks"])
|
||||
assert any("legal_marriage" in item for item in payload["boundaries"])
|
||||
assert "D9" in payload["markdown"]
|
||||
assert "dual dasha" in payload["markdown"]
|
||||
|
||||
|
||||
def test_relationship_narrative_payload_exposes_public_formalization_candidate_as_context_only() -> None:
|
||||
strict = _collect_strict_evidence("relationship", _base_relationship_result())
|
||||
strict["event_judgement"]["dominant_label"] = None
|
||||
strict["event_judgement"]["secondary_context"] = [
|
||||
"darakaraka_active",
|
||||
"jaimini_support",
|
||||
"ul_support",
|
||||
"external_activation_support",
|
||||
"public_formalization_candidate",
|
||||
]
|
||||
strict["present_evidence"].pop("vivah_saham", None)
|
||||
strict["present_evidence"].pop("marriage_convergence", None)
|
||||
strict["confidence_cap"] = "low"
|
||||
|
||||
payload = jyotish_engine._build_relationship_narrative_payload(strict)
|
||||
|
||||
assert any("public_formalization" in item for item in payload["strengths"])
|
||||
assert any("不等于法律婚姻" in item for item in payload["boundaries"])
|
||||
assert "public_formalization_candidate" in payload["markdown"]
|
||||
assert "legal_marriage" in payload["markdown"]
|
||||
|
||||
|
||||
def test_relationship_narrative_payload_for_public_formalization_candidate_with_timing_conflict_explicitly_warns_not_to_misread_as_near_marriage() -> None:
|
||||
strict = _collect_strict_evidence("relationship", _base_relationship_result())
|
||||
strict["event_judgement"]["dominant_label"] = None
|
||||
strict["event_judgement"]["secondary_context"] = [
|
||||
"darakaraka_active",
|
||||
"jaimini_support",
|
||||
"ul_support",
|
||||
"external_activation_support",
|
||||
"public_formalization_candidate",
|
||||
]
|
||||
strict["present_evidence"].pop("vivah_saham", None)
|
||||
strict["present_evidence"].pop("marriage_convergence", None)
|
||||
strict["confidence_cap"] = "low"
|
||||
|
||||
payload = jyotish_engine._build_relationship_narrative_payload(strict)
|
||||
|
||||
assert any("public_formalization_candidate" in item for item in payload["strengths"])
|
||||
assert any("不能误读成接近结婚" in item for item in payload["risks"])
|
||||
assert any("不等于法律婚姻" in item for item in payload["boundaries"])
|
||||
assert "不能误读成接近结婚" in payload["markdown"]
|
||||
|
||||
|
||||
def test_relationship_narrative_payload_does_not_translate_public_formalization_candidate_plus_synastry_support_plus_weak_core_promise_into_marriage_approach() -> None:
|
||||
strict = _collect_strict_evidence("relationship", _base_relationship_result())
|
||||
strict["event_judgement"]["dominant_label"] = None
|
||||
strict["event_judgement"]["secondary_context"] = [
|
||||
"darakaraka_active",
|
||||
"ul_support",
|
||||
"synastry_support",
|
||||
"synastry_compatibility_support",
|
||||
"public_formalization_candidate",
|
||||
]
|
||||
strict["present_evidence"]["jaimini_marriage_support"] = {
|
||||
"level": "weak",
|
||||
"signals": ["darakaraka_active"],
|
||||
"source": "jaimini_bridge_v1",
|
||||
}
|
||||
strict["present_evidence"].pop("vivah_saham", None)
|
||||
strict["present_evidence"].pop("marriage_convergence", None)
|
||||
strict["confidence_cap"] = "low"
|
||||
|
||||
payload = jyotish_engine._build_relationship_narrative_payload(strict)
|
||||
|
||||
assert any("合盘支持已进入婚恋主链" in item for item in payload["strengths"])
|
||||
assert any("公开化/关系可见度候选" in item for item in payload["strengths"])
|
||||
assert any("不能误读成接近结婚" in item for item in payload["risks"])
|
||||
assert any("不得越权抬升 legal_marriage" in item for item in payload["boundaries"])
|
||||
assert "public_formalization_candidate" in payload["markdown"]
|
||||
assert "legal_marriage" in payload["markdown"]
|
||||
|
||||
|
||||
def test_relationship_dignity_guardrail_ignores_non_relevant_planets() -> None:
|
||||
|
||||
Reference in New Issue
Block a user