diff --git a/mcp_server.py b/mcp_server.py index dd588c79..ef879784 100644 --- a/mcp_server.py +++ b/mcp_server.py @@ -1342,7 +1342,10 @@ def _build_life_event_graph(route: str, strict: Dict[str, Any]) -> Dict[str, Any nodes.append( { "kind": "external_window", - "label": event.get("event_id"), + "label": event.get("signal_label") or event.get("event_id"), + "event_id": event.get("event_id"), + "signal_key": event.get("signal_key"), + "signal_family": event.get("signal_family"), "score": event.get("score"), "start": event.get("start"), "end": event.get("end"), diff --git a/scripts/jyotish_engine.py b/scripts/jyotish_engine.py index 781b81ce..284fc098 100644 --- a/scripts/jyotish_engine.py +++ b/scripts/jyotish_engine.py @@ -900,7 +900,11 @@ def _build_technique_audit_table(functional_layer, oracle_progress, modules): 'technique': 'Functional Benefic/Malefic', 'status': functional_layer.get('status', 'blocked'), 'source': 'scripts/yoga_engine.py::YogaContext', - 'note': functional_layer.get('effect_on_confidence', '高严谨模式缺少功能性吉凶星判定。'), + 'note': ( + f"关键功能吉星={functional_layer.get('functional_benefics', [])}; " + f"关键功能凶星={functional_layer.get('functional_malefics', [])}; " + f"{functional_layer.get('effect_on_confidence', '高严谨模式缺少功能性吉凶星判定。')}" + ), }, { 'technique': 'External Oracle Progress', diff --git a/scripts/vedastro_service_adapter.py b/scripts/vedastro_service_adapter.py index 582719fb..291142df 100644 --- a/scripts/vedastro_service_adapter.py +++ b/scripts/vedastro_service_adapter.py @@ -90,6 +90,79 @@ RANGE_SCAN_EVENT_ALLOWLIST = { "tags": {"career", "profession", "work", "transit"}, }, } +RANGE_SCAN_SIGNAL_METADATA = { + "marriage": { + "GocharJupiterIn7th": { + "signal_key": "gochar_jupiter_7th_marriage", + "signal_label": "Jupiter in 7th marriage window", + "signal_family": "marriage_trigger", + }, + "GocharJupiterAspect7th": { + "signal_key": "gochar_jupiter_aspect_7th_marriage", + "signal_label": "Jupiter aspecting 7th marriage window", + "signal_family": "marriage_trigger", + }, + "GocharSaturnAspect7th": { + "signal_key": "gochar_saturn_aspect_7th_relationship_pressure", + "signal_label": "Saturn aspecting 7th relationship window", + "signal_family": "relationship_pressure", + }, + "JupiterSupportsMarriageAxis": { + "signal_key": "jupiter_supports_marriage_axis", + "signal_label": "Jupiter supports marriage axis", + "signal_family": "marriage_trigger", + }, + }, + "wealth": { + "GocharJupiterIn2nd": { + "signal_key": "gochar_jupiter_2nd_wealth", + "signal_label": "Jupiter in 2nd wealth window", + "signal_family": "wealth_trigger", + }, + "GocharJupiterIn11th": { + "signal_key": "gochar_jupiter_11th_gains", + "signal_label": "Jupiter in 11th gains window", + "signal_family": "gains_trigger", + }, + "GocharJupiterAspect2nd": { + "signal_key": "gochar_jupiter_aspect_2nd_wealth", + "signal_label": "Jupiter aspecting 2nd wealth window", + "signal_family": "wealth_trigger", + }, + "GocharJupiterAspect11th": { + "signal_key": "gochar_jupiter_aspect_11th_gains", + "signal_label": "Jupiter aspecting 11th gains window", + "signal_family": "gains_trigger", + }, + "WealthExpansionWindow": { + "signal_key": "wealth_expansion_window", + "signal_label": "Wealth expansion window", + "signal_family": "wealth_trigger", + }, + }, + "career": { + "GocharJupiterIn10th": { + "signal_key": "gochar_jupiter_10th_career", + "signal_label": "Jupiter in 10th career window", + "signal_family": "career_trigger", + }, + "GocharSaturnIn10th": { + "signal_key": "gochar_saturn_10th_career", + "signal_label": "Saturn in 10th career window", + "signal_family": "career_pressure", + }, + "GocharJupiterAspect10th": { + "signal_key": "gochar_jupiter_aspect_10th_career", + "signal_label": "Jupiter aspecting 10th career window", + "signal_family": "career_trigger", + }, + "CareerExpansionWindow": { + "signal_key": "career_expansion_window", + "signal_label": "Career expansion window", + "signal_family": "career_trigger", + }, + }, +} DEFAULT_TIMEOUT_SECONDS = 8 TIMEOUT_ENV = "VEDASTRO_TIMEOUT_SECONDS" RETRY_POLICY = { @@ -276,12 +349,16 @@ def _normalize_range_scan_success( tag_set = {str(tag) for tag in tags} if event_id not in allowed_ids and tag_set.isdisjoint(allowed_tags): continue + signal_metadata = RANGE_SCAN_SIGNAL_METADATA.get(domain, {}).get(event_id, {}) evidence_ledger.append( { "source": "vedastro_service_adapter_candidate", "operation": "range_scan", "domain": domain, "event_id": event_id, + "signal_key": signal_metadata.get("signal_key"), + "signal_label": signal_metadata.get("signal_label") or event.get("name") or event_id, + "signal_family": signal_metadata.get("signal_family"), "start": event.get("start") or event.get("start_time") or event.get("start_date"), "end": event.get("end") or event.get("end_time") or event.get("end_date"), "score": event.get("score") if event.get("score") is not None else event.get("strength"), @@ -298,6 +375,9 @@ def _normalize_range_scan_success( ) top_event = { "event_id": top.get("event_id"), + "signal_key": top.get("signal_key"), + "signal_label": top.get("signal_label"), + "signal_family": top.get("signal_family"), "score": top.get("score"), "start": top.get("start"), "end": top.get("end"), diff --git a/tests/test_cli_smoke.py b/tests/test_cli_smoke.py index a5f0e437..e8f36fde 100644 --- a/tests/test_cli_smoke.py +++ b/tests/test_cli_smoke.py @@ -283,6 +283,8 @@ def test_full_reading_reports_ayanamsa_metadata_and_ai_prompt_pack() -> None: assert functional_rows assert functional_rows[0]["status"] == "used" assert "高严谨" in functional_rows[0]["note"] + assert "关键功能吉星=" in functional_rows[0]["note"] + assert "关键功能凶星=" in functional_rows[0]["note"] dasha_rows = [row for row in audit_table if row["technique"] == "Vimshottari + Narayana Cross-check"] assert dasha_rows assert dasha_rows[0]["status"] == "used" diff --git a/tests/test_life_event_graph_v1.py b/tests/test_life_event_graph_v1.py index 13aedcea..38be9ddb 100644 --- a/tests/test_life_event_graph_v1.py +++ b/tests/test_life_event_graph_v1.py @@ -39,7 +39,10 @@ def test_life_event_graph_folds_strict_evidence_and_vedastro_top_event() -> None "signals": ["vedastro_range_scan"], "events": [ { - "event_id": "jupiter_7h_window", + "event_id": "GocharJupiterIn7th", + "signal_key": "gochar_jupiter_7th_marriage", + "signal_label": "Jupiter in 7th marriage window", + "signal_family": "marriage_trigger", "score": 72, "start": "2026-05-01", "end": "2026-06-01", @@ -86,7 +89,10 @@ def test_life_event_graph_folds_strict_evidence_and_vedastro_top_event() -> None } assert graph["event_nodes"][4] == { "kind": "external_window", - "label": "jupiter_7h_window", + "label": "Jupiter in 7th marriage window", + "event_id": "GocharJupiterIn7th", + "signal_key": "gochar_jupiter_7th_marriage", + "signal_family": "marriage_trigger", "score": 72, "start": "2026-05-01", "end": "2026-06-01", @@ -118,7 +124,10 @@ def test_life_event_graph_is_returned_from_strict_relationship_evidence() -> Non "source": "vedastro_service_adapter_candidate", "operation": "range_scan", "domain": "marriage", - "event_id": "jupiter_7h_window", + "event_id": "GocharJupiterIn7th", + "signal_key": "gochar_jupiter_7th_marriage", + "signal_label": "Jupiter in 7th marriage window", + "signal_family": "marriage_trigger", "score": 72, "start": "2026-05-01", "end": "2026-06-01", diff --git a/tests/test_vedastro_service_adapter_executor.py b/tests/test_vedastro_service_adapter_executor.py index acf486d2..16f5c0d5 100644 --- a/tests/test_vedastro_service_adapter_executor.py +++ b/tests/test_vedastro_service_adapter_executor.py @@ -220,7 +220,7 @@ def test_vedastro_service_adapter_can_normalize_mock_range_scan_response() -> No response = { "events": [ { - "id": "jupiter_7h_window", + "id": "GocharJupiterIn7th", "name": "Jupiter supports marriage axis", "start": "2026-05-01", "end": "2026-06-01", @@ -284,13 +284,19 @@ def test_vedastro_service_adapter_can_normalize_mock_range_scan_response() -> No assert report["domain"] == "marriage" assert report["event_count"] == 1 assert report["top_event"] == { - "event_id": "jupiter_7h_window", + "event_id": "GocharJupiterIn7th", + "signal_key": "gochar_jupiter_7th_marriage", + "signal_label": "Jupiter in 7th marriage window", + "signal_family": "marriage_trigger", "score": 72, "start": "2026-05-01", "end": "2026-06-01", "tags": ["marriage", "transit"], } - assert report["evidence_ledger"][0]["event_id"] == "jupiter_7h_window" + assert report["evidence_ledger"][0]["event_id"] == "GocharJupiterIn7th" + assert report["evidence_ledger"][0]["signal_key"] == "gochar_jupiter_7th_marriage" + assert report["evidence_ledger"][0]["signal_label"] == "Jupiter in 7th marriage window" + assert report["evidence_ledger"][0]["signal_family"] == "marriage_trigger" assert report["evidence_ledger"][0]["domain"] == "marriage" assert report["evidence_ledger"][0]["score"] == 72 assert report["evidence_ledger"][0]["raw"]["name"] == "Jupiter supports marriage axis"