Skip to content

Commit 34e75ea

Browse files
Pigbibicodex
andcommitted
fix: fail closed benchmark guard consumption
Co-Authored-By: Codex <noreply@openai.com>
1 parent 796620a commit 34e75ea

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

src/quant_strategy_plugins/market_regime_control_plugin.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,15 @@ def build_market_regime_control_signal(
432432
final_route = ROUTE_BLOCKED
433433
suggested_action = ACTION_BLOCKED
434434
route_source = COMPONENT_BENCHMARK_GUARD
435+
# The generic guard owns a hard fail-closed data contract. Keep this
436+
# output shadow-only, but expose zero scalars and a defense requirement
437+
# so a separately approved strategy consumer cannot accidentally treat
438+
# absent/stale benchmark data as permission to retain risk.
439+
risk_budget_scalar = 0.0
440+
leverage_scalar = 0.0
441+
risk_asset_scalar = 0.0
442+
crisis_defense_required = True
443+
blocked_actions = ("increase_leverage", "increase_risk", "taco_rebound_veto", "panic_reversal_veto")
435444
reason_codes.extend(
436445
f"benchmark_guard:{code}"
437446
for code in _reason_codes(benchmark_guard) or ("blocked",)

tests/test_benchmark_drawdown_guard.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,30 @@ def test_unified_market_regime_requires_an_explicit_policy_to_mount_the_guard()
114114
assert payload["position_control"]["risk_asset_scalar"] == 0.5
115115
with pytest.raises(ValueError, match="explicit frozen policy"):
116116
_build_market_regime_control_payload(_prices([100.0] * 30), {"benchmark_drawdown_guard_enabled": True})
117+
118+
119+
def test_unified_market_regime_preserves_fail_closed_scalars_when_guard_data_is_unavailable() -> None:
120+
config = {
121+
"crisis_enabled": False,
122+
"macro_enabled": False,
123+
"taco_enabled": False,
124+
"panic_reversal_enabled": False,
125+
"benchmark_drawdown_guard_enabled": True,
126+
"benchmark_guard_benchmark_symbol": "QQQ",
127+
"benchmark_guard_drawdown_lookback_sessions": 20,
128+
"benchmark_guard_soft_drawdown_threshold": -0.05,
129+
"benchmark_guard_hard_drawdown_threshold": -0.10,
130+
"benchmark_guard_soft_risk_asset_scalar": 0.50,
131+
"benchmark_guard_hard_risk_asset_scalar": 0.0,
132+
"benchmark_guard_max_price_age_days": 3,
133+
"as_of": "2026-02-12",
134+
}
135+
136+
payload = _build_market_regime_control_payload(pd.DataFrame(), config)
137+
138+
assert payload["canonical_route"] == ROUTE_BLOCKED
139+
assert payload["position_control"]["risk_budget_scalar"] == 0.0
140+
assert payload["position_control"]["leverage_scalar"] == 0.0
141+
assert payload["position_control"]["risk_asset_scalar"] == 0.0
142+
assert payload["position_control"]["crisis_defense_required"] is True
143+
assert payload["execution_controls"]["broker_order_allowed"] is False

0 commit comments

Comments
 (0)