diff --git a/docs/research/ashtakavarga_deep_support_weighting_v1_2026_06_28.md b/docs/research/ashtakavarga_deep_support_weighting_v1_2026_06_28.md new file mode 100644 index 00000000..2303ec67 --- /dev/null +++ b/docs/research/ashtakavarga_deep_support_weighting_v1_2026_06_28.md @@ -0,0 +1,43 @@ +# Ashtakavarga Deep Support Weighting v1 + +Date: 2026-06-28 + +## Scope + +This pass upgrades the newly bridged finance evidence layers from visibility-only into controlled low-weight score modifiers: + +- `PAV / Prastara AV` +- `Sodhita AV` +- `Kakshya` + +## Weighting + +The v1 weights are intentionally small: + +- `PAV supportive`: `+2` +- `Kakshya supportive`: `+2` +- `Sodhita obstructive`: `-2` +- `Kakshya obstructive`: `-2` + +## Boundary + +These weights are not allowed to directly mint or revoke: + +- `dominant_label` +- `payout_label` + +They only adjust the route score through the existing threshold system. + +## Why This Matters + +The project already computed these layers, but they were previously dead weight inside strict adjudication. + +This pass keeps the scoring conservative while letting deeper Ashtakavarga and degree-trigger signals actually influence finance ranking. + +## Still Open + +- calibrating whether `PAV` should distinguish contributor identity more sharply +- deciding whether `Sodhita` should also have a positive support path +- tying `Kakshya` more directly to transit timing instead of route-average usage +- validating the weights against external oracle cases before claiming mature timing precision + diff --git a/mcp_server.py b/mcp_server.py index 31c16d46..cbd1edae 100644 --- a/mcp_server.py +++ b/mcp_server.py @@ -969,6 +969,17 @@ def _derive_event_judgement(route: str, present: Dict[str, Any], missing: List[s score += 5 elif ashtakavarga_finance.get("level") == "obstructive": score -= 5 + pav_finance_support = present.get("pav_finance_support") or {} + if pav_finance_support.get("level") == "supportive": + score += 2 + sodhita_finance_support = present.get("sodhita_finance_support") or {} + if sodhita_finance_support.get("level") == "obstructive": + score -= 2 + kakshya_finance_support = present.get("kakshya_finance_support") or {} + if kakshya_finance_support.get("level") == "supportive": + score += 2 + elif kakshya_finance_support.get("level") == "obstructive": + score -= 2 score += 20 if wealth_promise_level == "strong" else 10 if wealth_promise_level == "moderate" else 0 score += 5 if wealth_promise_diversity >= 2 else 0 score += max( @@ -1026,13 +1037,10 @@ def _derive_event_judgement(route: str, present: Dict[str, Any], missing: List[s shadbala_component_audit = present.get("shadbala_component_audit") or {} if shadbala_component_audit.get("status") in {"blocked", "incomplete"}: secondary_context.append("shadbala_component_gap") - pav_finance_support = present.get("pav_finance_support") or {} if pav_finance_support.get("level") == "supportive": secondary_context.append("pav_finance_support") - sodhita_finance_support = present.get("sodhita_finance_support") or {} if sodhita_finance_support.get("level") == "obstructive": secondary_context.append("sodhita_wealth_friction") - kakshya_finance_support = present.get("kakshya_finance_support") or {} if kakshya_finance_support.get("level") == "supportive": secondary_context.append("kakshya_finance_support") elif kakshya_finance_support.get("level") == "obstructive": diff --git a/tests/test_mcp_strict_workflow_finance.py b/tests/test_mcp_strict_workflow_finance.py index 42ae7ac7..7aa9cf5e 100644 --- a/tests/test_mcp_strict_workflow_finance.py +++ b/tests/test_mcp_strict_workflow_finance.py @@ -144,6 +144,117 @@ def test_finance_source_diversity_adds_small_bump_without_changing_verdict_band( assert high_diversity["score"] == low_diversity["score"] + 5 +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": {