1515 lines
65 KiB
Python
1515 lines
65 KiB
Python
#!/usr/bin/env python3
|
|
"""Regression tests for MCP finance event adjudication."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import jyotish_engine
|
|
|
|
from mcp_server import (
|
|
_collect_strict_evidence,
|
|
_derive_event_judgement,
|
|
_derive_wealth_promise_strength,
|
|
_derive_yogi_wealth_support,
|
|
)
|
|
|
|
SOURCE_LAYER_CONTEXT = {
|
|
"dasha_timing_layer_used",
|
|
"varga_strength_layer_used",
|
|
"annual_special_layer_context",
|
|
"modifier_obstacle_layer_used",
|
|
}
|
|
|
|
|
|
def _assert_context_contains(context: list[str], expected: set[str]) -> None:
|
|
assert expected <= set(context)
|
|
assert SOURCE_LAYER_CONTEXT <= set(context)
|
|
|
|
|
|
def test_finance_public_wealth_label_requires_at_least_moderate_window() -> None:
|
|
judgement = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Mercury"},
|
|
"narayana_current": {"sign": "Taurus", "lord": "Venus"},
|
|
},
|
|
[],
|
|
)
|
|
|
|
assert judgement["event_family"] == "finance"
|
|
assert judgement["score"] == 40
|
|
assert judgement["verdict"] == "weak_window_needs_confirmation"
|
|
assert judgement["payout_label"] is None
|
|
assert judgement["dominant_label"] is None
|
|
assert set(judgement["secondary_context"]) == SOURCE_LAYER_CONTEXT
|
|
|
|
|
|
def test_finance_strict_contract_attaches_existing_interpretation_source_pack() -> None:
|
|
strict = _collect_strict_evidence("finance", {"modules": {}})
|
|
|
|
source_pack = strict["present_evidence"]["interpretation_source_pack"]
|
|
assert source_pack["status"] == "used"
|
|
assert "lakshmi_dhana_activation_chain" in source_pack["template_registry"]["template_ids"]
|
|
assert "yogi_asc_tight_orb_wealth" in source_pack["template_registry"]["template_ids"]
|
|
assert source_pack["bphs_raman_layer"]["status"] == "available"
|
|
assert source_pack["frontend_planet_house_details"]["coverage"] == "9_planets_x_12_houses"
|
|
assert source_pack["interpretation_source_inventory"]["status"] == "used"
|
|
assert source_pack["frontend_interpretation_layer"]["status"] == "available"
|
|
assert source_pack["yoga_rule_layer"]["status"] == "available"
|
|
assert source_pack["qa_governance_layer"]["status"] == "available"
|
|
|
|
audit = strict["technique_audit_summary"]
|
|
assert audit["interpretation_source_pack"]["used"] is True
|
|
assert audit["mevg_global_web_evidence"]["effect_on_confidence"] == "blocks_or_downgrades_interpretive_claims_until_completed"
|
|
assert audit["real_case_calibration"]["effect_on_confidence"] == "caps_confidence_without_matching_cases"
|
|
|
|
|
|
def test_finance_public_wealth_label_can_lift_visible_wealth_cases() -> None:
|
|
judgement = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L2", "probability": "35-50%"},
|
|
"career_convergence": {"convergence_level": "L2", "probability": "35-50%"},
|
|
"vimshottari_current": {"mahadasha": "Jupiter", "antardasha": "Venus"},
|
|
"narayana_current": {"sign": "Libra", "lord": "Venus"},
|
|
},
|
|
[],
|
|
)
|
|
|
|
assert judgement["event_family"] == "finance"
|
|
assert judgement["score"] == 60
|
|
assert judgement["verdict"] == "moderate_probability_window"
|
|
assert judgement["payout_label"] == "public_wealth_status"
|
|
assert judgement["dominant_label"] == "public_wealth_status"
|
|
_assert_context_contains(judgement["secondary_context"], {"career_status", "gains_wishes"})
|
|
|
|
|
|
def test_finance_prefers_income_growth_when_gains_outrun_public_status_signals() -> None:
|
|
judgement = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L3", "probability": "50-65%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Moon"},
|
|
"narayana_current": {"sign": "Gemini", "lord": "Mercury"},
|
|
},
|
|
[],
|
|
)
|
|
|
|
assert judgement["event_family"] == "finance"
|
|
assert judgement["score"] == 80
|
|
assert judgement["verdict"] == "moderate_probability_window"
|
|
assert judgement["payout_label"] == "income_growth"
|
|
assert judgement["dominant_label"] == "income_growth"
|
|
_assert_context_contains(judgement["secondary_context"], {"wealth_family"})
|
|
|
|
|
|
def test_finance_strong_wealth_promise_can_unlock_public_wealth_status() -> None:
|
|
judgement = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Mercury"},
|
|
"narayana_current": {"sign": "Taurus", "lord": "Venus"},
|
|
"wealth_promise_strength": {
|
|
"level": "strong",
|
|
"primary_source": "dhana_yogas",
|
|
"supporting_sources": ["dhana"],
|
|
"source_diversity": 1,
|
|
"count": 1,
|
|
},
|
|
},
|
|
[],
|
|
)
|
|
|
|
assert judgement["event_family"] == "finance"
|
|
assert judgement["score"] == 60
|
|
assert judgement["verdict"] == "moderate_probability_window"
|
|
assert judgement["payout_label"] == "public_wealth_status"
|
|
assert judgement["dominant_label"] == "public_wealth_status"
|
|
_assert_context_contains(judgement["secondary_context"], {"career_status", "gains_wishes"})
|
|
|
|
|
|
def test_finance_source_diversity_adds_small_bump_without_changing_verdict_band() -> None:
|
|
low_diversity = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Mercury"},
|
|
"narayana_current": {"sign": "Taurus", "lord": "Venus"},
|
|
"wealth_promise_strength": {
|
|
"level": "strong",
|
|
"primary_source": "dhana_yogas",
|
|
"supporting_sources": ["dhana"],
|
|
"source_diversity": 1,
|
|
"count": 2,
|
|
},
|
|
},
|
|
[],
|
|
)
|
|
high_diversity = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Mercury"},
|
|
"narayana_current": {"sign": "Taurus", "lord": "Venus"},
|
|
"wealth_promise_strength": {
|
|
"level": "strong",
|
|
"primary_source": "dhana_lakshmi_hooks",
|
|
"supporting_sources": ["dhana", "lakshmi"],
|
|
"source_diversity": 2,
|
|
"count": 2,
|
|
},
|
|
},
|
|
[],
|
|
)
|
|
|
|
assert low_diversity["verdict"] == "moderate_probability_window"
|
|
assert high_diversity["verdict"] == "moderate_probability_window"
|
|
assert high_diversity["score"] == low_diversity["score"] + 5
|
|
|
|
|
|
def test_finance_strict_contract_surfaces_official_block_and_local_fallback_usage() -> None:
|
|
strict = _collect_strict_evidence("finance", {"modules": {"source_priority": {"mode": "local_fallback_official_blocked"}}})
|
|
|
|
assert "official_primary_chart_blocked" in strict["blocked_items"]
|
|
assert isinstance(strict["fallback_used"], list)
|
|
assert isinstance(strict["conflicts"], list)
|
|
|
|
|
|
def test_finance_strict_contract_exposes_adjudication_stages_and_multi_reference_summary() -> None:
|
|
strict = _collect_strict_evidence("finance", {"modules": {"source_priority": {"mode": "local_fallback_official_blocked"}}})
|
|
|
|
assert strict["adjudication_stages"]["promise"]["status"] in {"present", "weak", "missing"}
|
|
assert strict["adjudication_stages"]["activation"]["required_timing_systems"] == ["Vimshottari", "Narayana"]
|
|
assert "multi_reference_reading_summary" in strict
|
|
summary = strict["multi_reference_reading_summary"]
|
|
assert "root_frame" in summary
|
|
assert "divisional_frame" in summary
|
|
assert "visibility_frame" in summary
|
|
assert "karaka_frame" in summary
|
|
assert "timing_frame" in summary
|
|
assert "modifier_frame" in summary
|
|
assert "conflict_frame" in summary
|
|
|
|
|
|
def test_finance_strict_contract_exposes_monthly_adjudication_summary() -> None:
|
|
strict = _collect_strict_evidence(
|
|
"finance",
|
|
{
|
|
"modules": {
|
|
"source_priority": {"mode": "vedastro_official_primary"},
|
|
"varga_full": {
|
|
"D2_Hora": {"summary": "hora ready"},
|
|
"D10_Dasamsa": {"summary": "dasamsa ready"},
|
|
},
|
|
"shadbala": {
|
|
"planets": {
|
|
"Venus": {
|
|
"components": {
|
|
"sthana": 1,
|
|
"dig": 1,
|
|
"kala": 1,
|
|
"chesta": 1,
|
|
"naisargika": 1,
|
|
"drik": 1,
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"ashtakavarga": {"house_scores": {"2": {"sav_score": 33}, "11": {"sav_score": 35}}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L2", "probability": "35-50%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"chart": {"ascendant": {"sign": "Leo"}},
|
|
"dhana_yogas": [{"name": "Dhana Yoga"}],
|
|
"lakshmi_yoga": {"present": True},
|
|
"vedastro_range_scan_result": {
|
|
"backend": "vedastro_service_adapter_candidate",
|
|
"status": "ok",
|
|
"operation": "range_scan",
|
|
"domain": "wealth",
|
|
"evidence_ledger": [],
|
|
"daily_windows": [
|
|
{
|
|
"date": "2026-10-04",
|
|
"domain": "wealth",
|
|
"score": 5,
|
|
"confidence": "high",
|
|
"event_count": 2,
|
|
"signal_families": ["wealth_trigger"],
|
|
"event_ids": ["GoodForBorrowingMoneyForBusiness", "GoodForLendingMoney"],
|
|
"top_signal_label": "Good for borrowing money for business",
|
|
},
|
|
{
|
|
"date": "2026-10-20",
|
|
"domain": "wealth",
|
|
"score": 2,
|
|
"confidence": "medium",
|
|
"event_count": 1,
|
|
"signal_families": ["wealth_pressure"],
|
|
"event_ids": ["BadForSellingForProfit"],
|
|
"top_signal_label": "Bad for selling for profit",
|
|
},
|
|
],
|
|
"top_daily_window": {
|
|
"date": "2026-10-04",
|
|
"domain": "wealth",
|
|
"score": 5,
|
|
"confidence": "high",
|
|
"event_count": 2,
|
|
"signal_families": ["wealth_trigger"],
|
|
"event_ids": ["GoodForBorrowingMoneyForBusiness", "GoodForLendingMoney"],
|
|
"top_signal_label": "Good for borrowing money for business",
|
|
},
|
|
"source_metadata": {},
|
|
},
|
|
}
|
|
},
|
|
)
|
|
|
|
summary = strict["monthly_adjudication_summary"]
|
|
assert summary["route"] == "finance"
|
|
assert summary["primary_state"]["value"] in {"推进", "启动", "整固", "收束", "观察"}
|
|
assert summary["manifestation_mode"]["value"]
|
|
assert summary["friction_source"]["value"]
|
|
assert summary["time_confidence"]["value"] in {"day_supported", "month_supported", "month_only", "blocked"}
|
|
assert isinstance(summary["supporting_days"], list)
|
|
assert summary["supporting_days"][0]["date"] == "2026-10-04"
|
|
|
|
|
|
def test_finance_summary_modifier_frame_includes_yogi_and_ashtakavarga_only_as_modifiers() -> None:
|
|
modules = {
|
|
"source_priority": {"mode": "vedastro_official_primary"},
|
|
"varga_full": {
|
|
"D2_Hora": {"summary": "hora ready"},
|
|
"D10_Dasamsa": {"summary": "dasamsa ready"},
|
|
},
|
|
"shadbala": {"planets": {"Venus": {"components": {"sthana": 1, "dig": 1, "kala": 1, "chesta": 1, "naisargika": 1, "drik": 1}}}},
|
|
"ashtakavarga": {"house_scores": {"2": {"sav_score": 33}, "11": {"sav_score": 35}}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {"domain_activations": {"wealth_family": {"convergence_level": "L1"}}},
|
|
"chart": {"ascendant": {"sign": "Leo"}},
|
|
"source_priority": {"mode": "vedastro_official_primary"},
|
|
"dhana_yogas": [{"name": "Dhana Yoga"}],
|
|
"lakshmi_yoga": {"present": True},
|
|
}
|
|
strict = _collect_strict_evidence("finance", {"modules": modules})
|
|
|
|
modifier = strict["multi_reference_reading_summary"]["modifier_frame"]
|
|
assert "functional_benefic_malefic" in modifier
|
|
assert modifier["ashtakavarga_finance_support"]["source"] == "ashtakavarga_house_scores_bridge_v1"
|
|
assert modifier["yogi_support"]["role"] == "modifier_only"
|
|
|
|
|
|
def test_finance_strict_contract_compact_audit_marks_dual_dasha_gate() -> None:
|
|
strict = _collect_strict_evidence("finance", {"modules": {"source_priority": {"mode": "local_fallback_official_blocked"}}})
|
|
|
|
audit = strict["technique_audit_summary"]
|
|
assert audit["vimshottari_narayana_crosscheck"]["gate"] == "hard"
|
|
assert "official_primary_chart_blocked" in audit["source_priority_boundary"]["blocked_items"]
|
|
|
|
|
|
def test_finance_external_activation_derives_wealth_day_signals() -> None:
|
|
strict = _collect_strict_evidence(
|
|
"finance",
|
|
{
|
|
"modules": {
|
|
"source_priority": {"mode": "vedastro_official_primary"},
|
|
"varga_full": {
|
|
"D2_Hora": {"summary": "hora ready"},
|
|
"D10_Dasamsa": {"summary": "dasamsa ready"},
|
|
},
|
|
"shadbala": {
|
|
"planets": {
|
|
"Venus": {
|
|
"components": {
|
|
"sthana": 1,
|
|
"dig": 1,
|
|
"kala": 1,
|
|
"chesta": 1,
|
|
"naisargika": 1,
|
|
"drik": 1,
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"ashtakavarga": {"house_scores": {"2": {"sav_score": 33}, "11": {"sav_score": 35}}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L2", "probability": "35-50%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"chart": {"ascendant": {"sign": "Leo"}},
|
|
"vedastro_range_scan_result": {
|
|
"backend": "vedastro_service_adapter_candidate",
|
|
"status": "ok",
|
|
"operation": "range_scan",
|
|
"domain": "wealth",
|
|
"evidence_ledger": [],
|
|
"daily_windows": [
|
|
{
|
|
"date": "2026-10-04",
|
|
"domain": "wealth",
|
|
"score": 5,
|
|
"confidence": "high",
|
|
"event_count": 2,
|
|
"signal_families": ["wealth_trigger"],
|
|
"event_ids": ["GoodForBorrowingMoneyForBusiness", "GoodForLendingMoney"],
|
|
"top_signal_label": "Good for borrowing money for business",
|
|
},
|
|
{
|
|
"date": "2026-10-20",
|
|
"domain": "wealth",
|
|
"score": 2,
|
|
"confidence": "medium",
|
|
"event_count": 1,
|
|
"signal_families": ["wealth_pressure"],
|
|
"event_ids": ["BadForSellingForProfit"],
|
|
"top_signal_label": "Bad for selling for profit",
|
|
},
|
|
],
|
|
"top_daily_window": {
|
|
"date": "2026-10-04",
|
|
"domain": "wealth",
|
|
"score": 5,
|
|
"confidence": "high",
|
|
"event_count": 2,
|
|
"signal_families": ["wealth_trigger"],
|
|
"event_ids": ["GoodForBorrowingMoneyForBusiness", "GoodForLendingMoney"],
|
|
"top_signal_label": "Good for borrowing money for business",
|
|
},
|
|
"source_metadata": {},
|
|
},
|
|
}
|
|
},
|
|
)
|
|
|
|
external = strict["present_evidence"]["external_activation"]
|
|
assert external["official_day_signals"][0]["date"] == "2026-10-04"
|
|
assert external["official_day_signals"][0]["day_type"] == "opportunity"
|
|
assert external["official_day_signals"][0]["summary"] == "财富机会日"
|
|
assert external["official_day_signals"][1]["day_type"] == "risk"
|
|
|
|
|
|
def test_finance_deep_ashtakavarga_supports_add_small_score_bump_without_label_override() -> None:
|
|
base = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Mercury"},
|
|
"narayana_current": {"sign": "Taurus", "lord": "Venus"},
|
|
"wealth_promise_strength": {
|
|
"level": "strong",
|
|
"primary_source": "dhana_yogas",
|
|
"supporting_sources": ["dhana", "lakshmi"],
|
|
"source_diversity": 2,
|
|
"count": 1,
|
|
},
|
|
},
|
|
[],
|
|
)
|
|
weighted = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Mercury"},
|
|
"narayana_current": {"sign": "Taurus", "lord": "Venus"},
|
|
"wealth_promise_strength": {
|
|
"level": "strong",
|
|
"primary_source": "dhana_yogas",
|
|
"supporting_sources": ["dhana", "lakshmi"],
|
|
"source_diversity": 2,
|
|
"count": 1,
|
|
},
|
|
"pav_finance_support": {
|
|
"level": "supportive",
|
|
"source": "ashtakavarga_pav_bridge_v1",
|
|
"signals": ["pav_finance_support"],
|
|
"top_planets": ["Venus"],
|
|
},
|
|
"kakshya_finance_support": {
|
|
"level": "supportive",
|
|
"source": "kakshya_finance_bridge_v1",
|
|
"signals": ["kakshya_finance_support"],
|
|
"average_strength": 6.8,
|
|
},
|
|
},
|
|
[],
|
|
)
|
|
|
|
assert base["dominant_label"] == "public_wealth_status"
|
|
assert weighted["dominant_label"] == "public_wealth_status"
|
|
assert weighted["score"] == base["score"] + 4
|
|
|
|
|
|
def test_finance_sodhita_and_kakshya_friction_reduce_score_without_forcing_label_swap() -> None:
|
|
base = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Mercury"},
|
|
"narayana_current": {"sign": "Taurus", "lord": "Venus"},
|
|
"wealth_promise_strength": {
|
|
"level": "strong",
|
|
"primary_source": "dhana_yogas",
|
|
"supporting_sources": ["dhana", "lakshmi"],
|
|
"source_diversity": 2,
|
|
"count": 1,
|
|
},
|
|
},
|
|
[],
|
|
)
|
|
weighted = _derive_event_judgement(
|
|
"finance",
|
|
{
|
|
"wealth_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_convergence": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"vimshottari_current": {"mahadasha": "Venus", "antardasha": "Mercury"},
|
|
"narayana_current": {"sign": "Taurus", "lord": "Venus"},
|
|
"wealth_promise_strength": {
|
|
"level": "strong",
|
|
"primary_source": "dhana_yogas",
|
|
"supporting_sources": ["dhana", "lakshmi"],
|
|
"source_diversity": 2,
|
|
"count": 1,
|
|
},
|
|
"sodhita_finance_support": {
|
|
"level": "obstructive",
|
|
"source": "ashtakavarga_sodhita_bridge_v1",
|
|
"signals": ["sodhita_wealth_friction"],
|
|
"target_houses": [2, 11],
|
|
"raw_scores": {"2": 18, "11": 17},
|
|
},
|
|
"kakshya_finance_support": {
|
|
"level": "obstructive",
|
|
"source": "kakshya_finance_bridge_v1",
|
|
"signals": ["kakshya_finance_friction"],
|
|
"average_strength": 4.1,
|
|
},
|
|
},
|
|
[],
|
|
)
|
|
|
|
assert base["dominant_label"] == "public_wealth_status"
|
|
assert weighted["dominant_label"] == "public_wealth_status"
|
|
assert weighted["score"] == base["score"] - 4
|
|
|
|
|
|
def test_collect_strict_evidence_finance_derives_wealth_promise_from_dhana_yogas() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [
|
|
{"type": "Dhana Yoga", "strength": "strong"},
|
|
{"type": "Dhana Yoga", "strength": "moderate"},
|
|
],
|
|
"summary": "Dhana Yoga检测:共2个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
present = strict["present_evidence"]
|
|
assert present["wealth_promise_strength"] == {
|
|
"level": "strong",
|
|
"primary_source": "dhana_yogas",
|
|
"count": 2,
|
|
"source_diversity": 1,
|
|
"supporting_sources": ["dhana"],
|
|
"yogi_support": None,
|
|
}
|
|
assert strict["event_judgement"]["score"] == 100
|
|
assert strict["event_judgement"]["verdict"] == "moderate_probability_window"
|
|
assert strict["event_judgement"]["payout_label"] == "public_wealth_status"
|
|
|
|
|
|
def test_collect_strict_evidence_finance_folds_wealth_ashtakavarga_support() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {
|
|
"house_scores": {
|
|
"2": 33,
|
|
"11": 35,
|
|
"10": {"sav": 32},
|
|
}
|
|
},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "moderate"}],
|
|
"summary": "Dhana Yoga检测:共1个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["ashtakavarga_finance_support"] == {
|
|
"level": "supportive",
|
|
"source": "ashtakavarga_house_scores_bridge_v1",
|
|
"target_houses": [2, 11],
|
|
"signals": ["wealth_sav_support"],
|
|
"raw_scores": {"2": 33, "11": 35},
|
|
}
|
|
assert "ashtakavarga_wealth_support" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_caps_confidence_when_shadbala_components_missing() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 33, "11": 35}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L4", "probability": "70-85%"},
|
|
"gains_wishes": {"convergence_level": "L4", "probability": "70-85%"},
|
|
"career_status": {"convergence_level": "L4", "probability": "70-85%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "strong"}],
|
|
"summary": "Dhana Yoga检测:共1个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", 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_collect_strict_evidence_finance_accepts_complete_shadbala_components() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {
|
|
"planets": {
|
|
"Venus": {
|
|
"components": {
|
|
"sthana": 1.2,
|
|
"dig": 0.8,
|
|
"kala": 1.1,
|
|
"chesta": 0.9,
|
|
"naisargika": 0.7,
|
|
"drik": 0.4,
|
|
},
|
|
"total_rupa": 5.1,
|
|
}
|
|
}
|
|
},
|
|
"ashtakavarga": {"house_scores": {"2": 33, "11": 35}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L4", "probability": "70-85%"},
|
|
"gains_wishes": {"convergence_level": "L4", "probability": "70-85%"},
|
|
"career_status": {"convergence_level": "L4", "probability": "70-85%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "strong"}],
|
|
"summary": "Dhana Yoga检测:共1个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["shadbala_component_audit"] == {
|
|
"status": "complete",
|
|
"source": "shadbala.planets",
|
|
"required_components": ["sthana", "dig", "kala", "chesta", "naisargika", "drik"],
|
|
"missing": {},
|
|
}
|
|
assert strict["confidence_cap"] == "medium-high"
|
|
assert "shadbala_component_gap" not in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_adds_pav_and_kakshya_support_as_secondary_context() -> None:
|
|
result = {
|
|
"modules": {
|
|
"chart": {"ascendant": {"sign": "Aries"}},
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {
|
|
"planets": {
|
|
"Venus": {
|
|
"components": {
|
|
"sthana": 1.2,
|
|
"dig": 0.8,
|
|
"kala": 1.1,
|
|
"chesta": 0.9,
|
|
"naisargika": 0.7,
|
|
"drik": 0.4,
|
|
},
|
|
"total_rupa": 5.1,
|
|
}
|
|
}
|
|
},
|
|
"ashtakavarga": {
|
|
"house_scores": {"2": 33, "11": 35},
|
|
"pav": {
|
|
"pav_summary": {
|
|
"Venus": {"Jupiter": 5, "Venus": 6, "Lagna": 5},
|
|
"Saturn": {"Saturn": 2},
|
|
}
|
|
},
|
|
},
|
|
"kakshya": {
|
|
"summary": {"average_strength": 6.8},
|
|
"planets": {
|
|
"Venus": {"kakshya_strength": 7.4},
|
|
"Jupiter": {"kakshya_strength": 6.9},
|
|
},
|
|
},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "strong"}],
|
|
"summary": "Dhana Yoga检测:共1个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["pav_finance_support"] == {
|
|
"level": "supportive",
|
|
"source": "ashtakavarga_pav_bridge_v1",
|
|
"signals": ["pav_finance_support"],
|
|
"top_planets": ["Venus"],
|
|
}
|
|
assert strict["present_evidence"]["kakshya_finance_support"] == {
|
|
"level": "supportive",
|
|
"source": "kakshya_finance_bridge_v1",
|
|
"signals": ["kakshya_finance_support"],
|
|
"average_strength": 6.8,
|
|
}
|
|
assert "pav_finance_support" in strict["event_judgement"]["secondary_context"]
|
|
assert "kakshya_finance_support" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_flags_sodhita_wealth_friction() -> None:
|
|
result = {
|
|
"modules": {
|
|
"chart": {"ascendant": {"sign": "Aries"}},
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {
|
|
"planets": {
|
|
"Venus": {
|
|
"components": {
|
|
"sthana": 1.2,
|
|
"dig": 0.8,
|
|
"kala": 1.1,
|
|
"chesta": 0.9,
|
|
"naisargika": 0.7,
|
|
"drik": 0.4,
|
|
},
|
|
"total_rupa": 5.1,
|
|
}
|
|
}
|
|
},
|
|
"ashtakavarga": {
|
|
"house_scores": {"2": 33, "11": 35},
|
|
"sodhita": {
|
|
"sodhita_sav": {
|
|
"assessment": [
|
|
{"sign": "Taurus", "score": 18, "level": "挑战"},
|
|
{"sign": "Aquarius", "score": 17, "level": "挑战"},
|
|
]
|
|
}
|
|
},
|
|
},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "strong"}],
|
|
"summary": "Dhana Yoga检测:共1个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["sodhita_finance_support"] == {
|
|
"level": "obstructive",
|
|
"source": "ashtakavarga_sodhita_bridge_v1",
|
|
"signals": ["sodhita_wealth_friction"],
|
|
"target_houses": [2, 11],
|
|
"raw_scores": {"2": 18, "11": 17},
|
|
}
|
|
assert "sodhita_wealth_friction" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_flags_kakshya_friction_as_secondary_only() -> None:
|
|
result = {
|
|
"modules": {
|
|
"chart": {"ascendant": {"sign": "Aries"}},
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {
|
|
"planets": {
|
|
"Venus": {
|
|
"components": {
|
|
"sthana": 1.2,
|
|
"dig": 0.8,
|
|
"kala": 1.1,
|
|
"chesta": 0.9,
|
|
"naisargika": 0.7,
|
|
"drik": 0.4,
|
|
},
|
|
"total_rupa": 5.1,
|
|
}
|
|
}
|
|
},
|
|
"ashtakavarga": {"house_scores": {"2": 33, "11": 35}},
|
|
"kakshya": {
|
|
"summary": {"average_strength": 4.1},
|
|
"planets": {
|
|
"Venus": {"kakshya_strength": 4.0},
|
|
},
|
|
},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "strong"}],
|
|
"summary": "Dhana Yoga检测:共1个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["kakshya_finance_support"] == {
|
|
"level": "obstructive",
|
|
"source": "kakshya_finance_bridge_v1",
|
|
"signals": ["kakshya_finance_friction"],
|
|
"average_strength": 4.1,
|
|
}
|
|
assert strict["event_judgement"]["dominant_label"] == "public_wealth_status"
|
|
assert "kakshya_finance_friction" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_flags_low_wealth_ashtakavarga_friction() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"house_2": {"sav": 23}, "house_11": {"sav": 22}}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "strong"}],
|
|
"summary": "Dhana Yoga检测:共1个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["ashtakavarga_finance_support"] == {
|
|
"level": "obstructive",
|
|
"source": "ashtakavarga_house_scores_bridge_v1",
|
|
"target_houses": [2, 11],
|
|
"signals": ["wealth_sav_low"],
|
|
"raw_scores": {"2": 23, "11": 22},
|
|
}
|
|
assert "ashtakavarga_wealth_friction" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_combines_dhana_and_lakshmi_hooks() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [
|
|
{"type": "Dhana Yoga", "strength": "moderate"},
|
|
{"type": "Lakshmi Yoga", "strength": "strong"},
|
|
],
|
|
"summary": "Dhana/Lakshmi检测:共2个格局",
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
assert strict["present_evidence"]["wealth_promise_strength"] == {
|
|
"level": "strong",
|
|
"primary_source": "dhana_lakshmi_hooks",
|
|
"count": 2,
|
|
"source_diversity": 2,
|
|
"supporting_sources": ["dhana", "lakshmi"],
|
|
"yogi_support": None,
|
|
}
|
|
|
|
|
|
def test_collect_strict_evidence_finance_collects_vedastro_range_scan_as_external_activation_context() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"external_activation": {
|
|
"evidence_ledger": [
|
|
{
|
|
"source": "vedastro_service_adapter_candidate",
|
|
"operation": "range_scan",
|
|
"domain": "wealth",
|
|
"event_id": "jupiter_2h_11h_window",
|
|
"score": 76,
|
|
}
|
|
]
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", 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_finance_dignity_guardrail_conflict_caps_to_zero_delta() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"chart": {
|
|
"ascendant": {"sign": "Leo"},
|
|
"planets": {
|
|
"Mercury": {"status": "落陷取消(Neecha Bhanga)"},
|
|
"Venus": {"status": "极敌(Great Enemy)"},
|
|
"Jupiter": {"status": "中性(Neutral)"},
|
|
},
|
|
},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["dignity_guardrail"]["status"] == "conflict"
|
|
assert strict["present_evidence"]["dignity_guardrail"]["score_delta"] == 0
|
|
assert "dignity_conflict" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_finance_dignity_guardrail_ignores_non_relevant_planets() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"chart": {
|
|
"ascendant": {"sign": "Leo"},
|
|
"planets": {
|
|
"Mars": {"status": "落陷取消(Neecha Bhanga)"},
|
|
"Saturn": {"status": "极敌(Great Enemy)"},
|
|
"Venus": {"status": "中性(Neutral)"},
|
|
"Jupiter": {"status": "中性(Neutral)"},
|
|
},
|
|
},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["dignity_guardrail"]["score_delta"] == 0
|
|
assert "dignity_supportive_recovery" not in strict["event_judgement"]["secondary_context"]
|
|
assert "dignity_high_friction" not in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_ignores_non_matching_external_activation_domains() -> None:
|
|
result = {
|
|
"modules": {
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"external_activation": {
|
|
"evidence_ledger": [
|
|
{
|
|
"source": "vedastro_service_adapter_candidate",
|
|
"operation": "range_scan",
|
|
"domain": "marriage",
|
|
"event_id": "relationship_window",
|
|
"score": 95,
|
|
}
|
|
]
|
|
},
|
|
}
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
|
|
assert strict["present_evidence"]["external_activation"]["level"] == "none"
|
|
assert "external_activation_support" not in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_derive_yogi_wealth_support_detects_strong_native_hook() -> None:
|
|
modules = {
|
|
"chart": {
|
|
"ascendant": {"sign": "Aries", "degree_raw": 20.0},
|
|
"planets": {
|
|
"Sun": {"degree_raw": 140.0},
|
|
"Moon": {"degree_raw": 240.0},
|
|
"Venus": {"house": 11, "sign": "Aquarius", "status": "入友(Friendly Sign)"},
|
|
"Saturn": {"house": 6, "sign": "Virgo", "status": "中性"},
|
|
}
|
|
},
|
|
}
|
|
support = _derive_yogi_wealth_support(modules)
|
|
assert support is not None
|
|
assert support["level"] == "strong"
|
|
assert support["source"] == "yogi_asc_tight_orb_wealth"
|
|
assert support["yogi_planet"] == "Venus"
|
|
assert support["duplicate_yogi"] == "Mars"
|
|
assert support["avayogi"] == "Saturn"
|
|
assert support["yogi_point_house"] == 1
|
|
assert support["tight_orb_hits"] == ["lagna_yogi_tight_orb"]
|
|
assert support["wealth_lord_links"] == ["yogi_planet_is_2l"]
|
|
assert support["risk_flags"] == []
|
|
assert support["signals"] == [
|
|
"yogi_planet_in_wealth_house",
|
|
"yogi_planet_is_2l",
|
|
"lagna_yogi_tight_orb",
|
|
]
|
|
|
|
|
|
def test_wealth_folding_dhana_keeps_yogi_quiet_when_native_support_is_weak() -> None:
|
|
modules = {
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "dhana", "strength": "strong"}]
|
|
}
|
|
},
|
|
"chart": {
|
|
"ascendant": {"sign": "Taurus", "degree_raw": 45.0},
|
|
"planets": {
|
|
"Sun": {"degree_raw": 20.0},
|
|
"Moon": {"degree_raw": 20.0},
|
|
"Venus": {"house": 3, "sign": "Cancer", "status": "中性"},
|
|
"Saturn": {"house": 8, "sign": "Sagittarius", "status": "中性"},
|
|
}
|
|
},
|
|
}
|
|
res = _derive_wealth_promise_strength(modules)
|
|
assert res["primary_source"] == "dhana_yogas"
|
|
assert res["source_diversity"] == 1
|
|
assert res["supporting_sources"] == ["dhana"]
|
|
assert res["level"] == "strong"
|
|
assert res["yogi_support"] is None
|
|
|
|
|
|
def test_wealth_folding_adds_native_yogi_support_only_when_base_promise_exists() -> None:
|
|
modules = {
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "dhana", "strength": "moderate"}]
|
|
}
|
|
},
|
|
"chart": {
|
|
"ascendant": {"sign": "Aries", "degree_raw": 20.0},
|
|
"planets": {
|
|
"Sun": {"degree_raw": 140.0},
|
|
"Moon": {"degree_raw": 240.0},
|
|
"Venus": {"house": 11, "sign": "Aquarius", "status": "入友(Friendly Sign)"},
|
|
"Saturn": {"house": 6, "sign": "Virgo", "status": "中性"},
|
|
}
|
|
},
|
|
}
|
|
res = _derive_wealth_promise_strength(modules)
|
|
assert res["level"] == "moderate"
|
|
assert res["primary_source"] == "dhana_yogi_hooks"
|
|
assert res["source_diversity"] == 2
|
|
assert res["supporting_sources"] == ["dhana", "yogi"]
|
|
assert res["yogi_support"]["level"] == "strong"
|
|
assert res["yogi_support"]["wealth_lord_links"] == ["yogi_planet_is_2l"]
|
|
|
|
|
|
def test_wealth_folding_yogi_only_is_blocked_without_base_promise() -> None:
|
|
modules = {
|
|
"chart": {
|
|
"ascendant": {"sign": "Aries", "degree_raw": 20.0},
|
|
"planets": {
|
|
"Sun": {"degree_raw": 140.0},
|
|
"Moon": {"degree_raw": 240.0},
|
|
"Venus": {"house": 11, "sign": "Aquarius", "status": "入友(Friendly Sign)"},
|
|
"Saturn": {"house": 6, "sign": "Virgo", "status": "中性"},
|
|
}
|
|
},
|
|
}
|
|
assert _derive_wealth_promise_strength(modules) is None
|
|
|
|
|
|
def test_collect_strict_evidence_finance_adds_native_yogi_hook_without_external_truth() -> None:
|
|
result = {
|
|
"modules": {
|
|
"chart": {
|
|
"ascendant": {"sign": "Aries", "lord": "Mars", "degree_raw": 20.0},
|
|
"planets": {
|
|
"Venus": {
|
|
"sign": "Aquarius",
|
|
"house": 11,
|
|
"status": "入友(Friendly Sign)",
|
|
},
|
|
"Saturn": {"sign": "Virgo", "house": 6, "status": "中性"},
|
|
"Sun": {"degree_raw": 140.0},
|
|
"Moon": {"degree_raw": 240.0},
|
|
},
|
|
},
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "moderate"}],
|
|
"summary": "Dhana检测:共1个格局",
|
|
}
|
|
},
|
|
},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
assert strict["present_evidence"]["wealth_promise_strength"] == {
|
|
"level": "moderate",
|
|
"primary_source": "dhana_yogi_hooks",
|
|
"count": 1,
|
|
"source_diversity": 2,
|
|
"supporting_sources": ["dhana", "yogi"],
|
|
"yogi_support": {
|
|
"avayogi": "Saturn",
|
|
"duplicate_yogi": "Mars",
|
|
"lagna_yogi_distance_deg": 0.0,
|
|
"level": "strong",
|
|
"risk_flags": [],
|
|
"signals": [
|
|
"yogi_planet_in_wealth_house",
|
|
"yogi_planet_is_2l",
|
|
"lagna_yogi_tight_orb",
|
|
],
|
|
"source": "yogi_asc_tight_orb_wealth",
|
|
"tight_orb_hits": ["lagna_yogi_tight_orb"],
|
|
"wealth_lord_links": ["yogi_planet_is_2l"],
|
|
"yogi_planet": "Venus",
|
|
"yogi_point_house": 1,
|
|
"yogi_point_longitude": 20.0,
|
|
"yogi_point_nakshatra": "Bharani",
|
|
},
|
|
}
|
|
assert "yogi_active" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_keeps_native_yogi_quiet_when_support_is_weak() -> None:
|
|
result = {
|
|
"modules": {
|
|
"chart": {
|
|
"ascendant": {"sign": "Taurus", "lord": "Venus", "degree_raw": 45.0},
|
|
"planets": {
|
|
"Venus": {
|
|
"sign": "Cancer",
|
|
"house": 3,
|
|
"status": "中性",
|
|
},
|
|
"Saturn": {"sign": "Sagittarius", "house": 8, "status": "中性"},
|
|
"Sun": {"degree_raw": 20.0},
|
|
"Moon": {"degree_raw": 20.0},
|
|
},
|
|
},
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "moderate"}],
|
|
"summary": "Dhana检测:共1个格局",
|
|
}
|
|
},
|
|
},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
assert strict["present_evidence"]["wealth_promise_strength"] == {
|
|
"level": "moderate",
|
|
"primary_source": "dhana_yogas",
|
|
"count": 1,
|
|
"source_diversity": 1,
|
|
"supporting_sources": ["dhana"],
|
|
"yogi_support": None,
|
|
}
|
|
assert "yogi_active" not in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_adds_external_avayogi_risk_penalty() -> None:
|
|
result = {
|
|
"modules": {
|
|
"chart": {
|
|
"ascendant": {"sign": "Pisces", "lord": "Jupiter"},
|
|
"planets": {
|
|
"Saturn": {
|
|
"sign": "Aries",
|
|
"house": 11,
|
|
"status": "Debilitated",
|
|
}
|
|
},
|
|
},
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "moderate"}],
|
|
"summary": "Dhana检测:共1个格局",
|
|
}
|
|
},
|
|
},
|
|
"external_truth": {"avayogi_planet": "Saturn"},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
assert strict["present_evidence"]["avayogi_risk"] == {
|
|
"planet": "Saturn",
|
|
"house": 11,
|
|
"status": "Debilitated",
|
|
"source": "external_avayogi_planet",
|
|
"risk_level": "moderate",
|
|
"signals": ["avayogi_in_wealth_house"],
|
|
}
|
|
assert strict["event_judgement"]["score"] == 90
|
|
assert "avayogi_active" in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_keeps_external_avayogi_quiet_in_own_sign() -> None:
|
|
result = {
|
|
"modules": {
|
|
"chart": {
|
|
"ascendant": {"sign": "Pisces", "lord": "Jupiter"},
|
|
"planets": {
|
|
"Saturn": {
|
|
"sign": "Capricorn",
|
|
"house": 11,
|
|
"status": "Own Sign",
|
|
}
|
|
},
|
|
},
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "moderate"}],
|
|
"summary": "Dhana检测:共1个格局",
|
|
}
|
|
},
|
|
},
|
|
"external_truth": {"avayogi_planet": "Saturn"},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
assert strict["present_evidence"]["avayogi_risk"] is None
|
|
assert strict["event_judgement"]["score"] == 95
|
|
assert "avayogi_active" not in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_collect_strict_evidence_finance_does_not_add_avayogi_without_external_truth() -> None:
|
|
result = {
|
|
"modules": {
|
|
"chart": {
|
|
"ascendant": {"sign": "Pisces", "lord": "Jupiter"},
|
|
"planets": {
|
|
"Saturn": {
|
|
"sign": "Aries",
|
|
"house": 11,
|
|
"status": "Debilitated",
|
|
}
|
|
},
|
|
},
|
|
"varga_full": {"D2_Hora": {"summary": "ok"}, "D10_Dasamsa": {"summary": "ok"}},
|
|
"shadbala": {"planets": {"Venus": {"total_rupa": 8.2}}},
|
|
"ashtakavarga": {"house_scores": {"2": 31, "11": 36}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
"career_status": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"yogas_doshas": {
|
|
"dhana_yogas": {
|
|
"yogas": [{"type": "Dhana Yoga", "strength": "moderate"}],
|
|
"summary": "Dhana检测:共1个格局",
|
|
}
|
|
},
|
|
},
|
|
}
|
|
|
|
strict = _collect_strict_evidence("finance", result)
|
|
assert strict["present_evidence"].get("avayogi_risk") is None
|
|
assert strict["event_judgement"]["score"] == 95
|
|
assert "avayogi_active" not in strict["event_judgement"]["secondary_context"]
|
|
|
|
|
|
def test_finance_narrative_payload_forces_monthly_adjudication_layers_into_final_chinese_conclusion() -> None:
|
|
strict = _collect_strict_evidence(
|
|
"finance",
|
|
{
|
|
"modules": {
|
|
"source_priority": {"mode": "vedastro_official_primary"},
|
|
"varga_full": {
|
|
"D2_Hora": {"summary": "hora ready"},
|
|
"D10_Dasamsa": {"summary": "dasamsa ready"},
|
|
},
|
|
"shadbala": {
|
|
"planets": {
|
|
"Venus": {
|
|
"components": {
|
|
"sthana": 1,
|
|
"dig": 1,
|
|
"kala": 1,
|
|
"chesta": 1,
|
|
"naisargika": 1,
|
|
"drik": 1,
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"ashtakavarga": {"house_scores": {"2": {"sav_score": 33}, "11": {"sav_score": 35}}},
|
|
"dasha": {"current_dasha": {"mahadasha": "Venus", "antardasha": "Mercury"}},
|
|
"narayana_dasha": {"current_dasha": {"sign": "Taurus", "lord": "Venus"}},
|
|
"dasa_convergence": {
|
|
"domain_activations": {
|
|
"wealth_family": {"convergence_level": "L2", "probability": "35-50%"},
|
|
"gains_wishes": {"convergence_level": "L1", "probability": "+15-20%"},
|
|
}
|
|
},
|
|
"chart": {"ascendant": {"sign": "Leo"}},
|
|
"dhana_yogas": [{"name": "Dhana Yoga"}],
|
|
"lakshmi_yoga": {"present": True},
|
|
"vedastro_range_scan_result": {
|
|
"backend": "vedastro_service_adapter_candidate",
|
|
"status": "ok",
|
|
"operation": "range_scan",
|
|
"domain": "wealth",
|
|
"evidence_ledger": [],
|
|
"daily_windows": [
|
|
{
|
|
"date": "2026-10-04",
|
|
"domain": "wealth",
|
|
"score": 5,
|
|
"confidence": "high",
|
|
"event_count": 2,
|
|
"signal_families": ["wealth_trigger"],
|
|
"event_ids": ["GoodForBorrowingMoneyForBusiness", "GoodForLendingMoney"],
|
|
"top_signal_label": "Good for borrowing money for business",
|
|
}
|
|
],
|
|
"top_daily_window": {
|
|
"date": "2026-10-04",
|
|
"domain": "wealth",
|
|
"score": 5,
|
|
"confidence": "high",
|
|
"event_count": 2,
|
|
"signal_families": ["wealth_trigger"],
|
|
"event_ids": ["GoodForBorrowingMoneyForBusiness", "GoodForLendingMoney"],
|
|
"top_signal_label": "Good for borrowing money for business",
|
|
},
|
|
"source_metadata": {},
|
|
},
|
|
}
|
|
},
|
|
)
|
|
|
|
payload = jyotish_engine._build_finance_narrative_payload(strict)
|
|
|
|
assert "财富" in payload["headline"]
|
|
assert payload["monthly_frame"]["primary_state"]["value"]
|
|
assert payload["monthly_frame"]["manifestation_mode"]["value"]
|
|
assert payload["monthly_frame"]["friction_source"]["value"]
|
|
assert payload["monthly_frame"]["time_confidence"]["value"]
|
|
assert any("月度主状态" in item for item in payload["strengths"])
|
|
assert any("阻力来源" in item for item in payload["risks"])
|
|
assert "时间置信度" in payload["markdown"]
|