@@ -530,13 +530,18 @@ def _execute_steps(
530530
531531 result : StepResult = step_impl .execute (step_config , context )
532532
533- # Record step results in context
533+ # Record step results — prefer resolved values from step output
534534 step_data = {
535- "integration" : step_config .get ("integration" )
535+ "integration" : result .output .get ("integration" )
536+ or step_config .get ("integration" )
536537 or context .default_integration ,
537- "model" : step_config .get ("model" ) or context .default_model ,
538- "options" : step_config .get ("options" , {}),
539- "input" : step_config .get ("input" , {}),
538+ "model" : result .output .get ("model" )
539+ or step_config .get ("model" )
540+ or context .default_model ,
541+ "options" : result .output .get ("options" )
542+ or step_config .get ("options" , {}),
543+ "input" : result .output .get ("input" )
544+ or step_config .get ("input" , {}),
540545 "output" : result .output ,
541546 "status" : result .status .value ,
542547 }
@@ -609,9 +614,10 @@ def _execute_steps(
609614 return
610615
611616 # Fan-out: execute nested step template per item with unique IDs
612- if step_type == "fan-out" and result .output .get ("items" ):
617+ if step_type == "fan-out" :
618+ items = result .output .get ("items" , [])
613619 template = result .output .get ("step_template" , {})
614- if template :
620+ if template and items :
615621 fan_out_results = []
616622 for item_idx , item_val in enumerate (result .output ["items" ]):
617623 context .item = item_val
@@ -646,6 +652,11 @@ def _execute_steps(
646652 RunStatus .ABORTED ,
647653 ):
648654 return
655+ else :
656+ # Empty items or no template — normalize output
657+ result .output ["results" ] = []
658+ context .steps [step_id ]["output" ] = result .output
659+ state .step_results [step_id ]["output" ] = result .output
649660
650661 def _resolve_inputs (
651662 self ,
0 commit comments