From f8019eba84082689eaef81be50ede1fd8d559797 Mon Sep 17 00:00:00 2001 From: Manfred Riem <15701806+mnriem@users.noreply.github.com> Date: Thu, 21 May 2026 09:36:36 -0500 Subject: [PATCH] address review: skip copy-back on paused/failed iterations Move the status check before the copy-back so that partial results from paused or failed nested steps (e.g., a gate awaiting input) do not overwrite the unprefixed key. This preserves correct resume behavior. --- src/specify_cli/workflows/engine.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/specify_cli/workflows/engine.py b/src/specify_cli/workflows/engine.py index 2feaaef70..facbbc708 100644 --- a/src/specify_cli/workflows/engine.py +++ b/src/specify_cli/workflows/engine.py @@ -695,18 +695,21 @@ class WorkflowEngine: iter_steps, context, state, registry, step_offset=-1, ) - # Copy namespaced results back to unprefixed - # keys so loop conditions see updated values. - for namespaced, orig in original_ids.items(): - if namespaced in context.steps: - context.steps[orig] = context.steps[namespaced] - state.step_results[orig] = context.steps[namespaced] if state.status in ( RunStatus.PAUSED, RunStatus.FAILED, RunStatus.ABORTED, ): return + # Copy namespaced results back to unprefixed + # keys so loop conditions see updated values. + # Only after a fully completed iteration — + # partial results from paused/failed steps + # must not overwrite the unprefixed key. + for namespaced, orig in original_ids.items(): + if namespaced in context.steps: + context.steps[orig] = context.steps[namespaced] + state.step_results[orig] = context.steps[namespaced] # Fan-out: execute nested step template per item with unique IDs if step_type == "fan-out":