Skip to content

Commit f994911

Browse files
authored
Merge pull request #214 from QuantStrategyLab/codex/qrt-p4-shadow-diagnostics-20260813
fix: keep shadow diagnostics out of promotion triggers
2 parents 53334a7 + b0876ac commit f994911

2 files changed

Lines changed: 19 additions & 3 deletions

File tree

python/scripts/build_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ def _automation_policy_for_strategy(profile: str, strategy: dict) -> dict[str, o
359359
evidence_required = ["backtest", "shadow_or_regression", "rollback_plan"]
360360
elif lifecycle_stage == "live_candidate":
361361
lane = "promotion_review"
362-
triggers = ["evidence_package_ready", "shadow_outperformance"]
362+
triggers = ["evidence_package_ready"]
363363
max_autonomy = "human_review_required"
364364
approval_required = True
365365
evidence_required = ["live_candidate_evidence", "operator_approval"]

python/tests/test_runtime_settings.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,14 @@ def test_strategy_automation_registry_classifies_lanes(self):
390390
"can_switch_live": False,
391391
"features": {},
392392
},
393+
"shadow": {
394+
"label": "Shadow",
395+
"domain": "us_equity",
396+
"runtime_enabled": False,
397+
"lifecycle_stage": "shadow_candidate",
398+
"can_switch_live": False,
399+
"features": {},
400+
},
393401
"research": {
394402
"label": "Research",
395403
"domain": "crypto",
@@ -402,12 +410,20 @@ def test_strategy_automation_registry_classifies_lanes(self):
402410
}
403411
)
404412

405-
lanes = {item["profile"]: item["automation_lane"] for item in registry["profiles"]}
413+
profiles = {item["profile"]: item for item in registry["profiles"]}
414+
lanes = {profile: item["automation_lane"] for profile, item in profiles.items()}
406415
self.assertEqual(registry["schema_version"], "strategy_automation_registry.v1")
407416
self.assertEqual(lanes["live"], "live_equivalent_optimization")
408417
self.assertEqual(lanes["candidate"], "promotion_review")
418+
self.assertEqual(profiles["candidate"]["triggers"], ["evidence_package_ready"])
419+
self.assertTrue(profiles["candidate"]["approval_required"])
420+
self.assertFalse(profiles["candidate"]["can_switch_live"])
421+
self.assertEqual(lanes["shadow"], "shadow_research")
422+
self.assertEqual(profiles["shadow"]["evidence_required"], ["shadow_metrics", "risk_review"])
423+
self.assertTrue(profiles["shadow"]["approval_required"])
424+
self.assertFalse(profiles["shadow"]["can_switch_live"])
409425
self.assertEqual(lanes["research"], "research_backlog")
410-
self.assertTrue(next(item for item in registry["profiles"] if item["profile"] == "live")["position_control_sensitive"])
426+
self.assertTrue(profiles["live"]["position_control_sensitive"])
411427

412428
def test_automation_registry_cli_outputs_json(self):
413429
with (

0 commit comments

Comments
 (0)