@@ -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