Relationships
#2538 workflow run log output: a skipped plain step's line names only the job, not the step
Opened by hammz · 9/25/2026· Shipped 9/25/2026
Summary
In log mode, when a plain (non-forEach) step is skipped, workflow run prints a line labelled with the job name and no step name, for example:
main │ done deploy in 26ms
main │ skipped (dependency)With several steps in a job there is no way to tell from the log which step was skipped. Only the --json output (skipReason on the step) identifies it. The done and start lines for the same step do include the step name.
Cause
The step_skipped handler in src/presentation/renderers/workflow_run.ts passes getDisplayName(jobId, stepId, e) to PipeWriter.skippedLine. For a plain step getDisplayName returns the job id, and skippedLine in src/presentation/output/console_writer.ts renders only the label, the reason and the guard expression, so the step id is dropped. forEach iterations are unaffected because their label is template[index].
Steps to reproduce
A job with a step deploy running true and a plain step rollback with dependsOn on deploy with condition type failed. Run swamp workflow run: the rollback skip line reads main │ skipped (dependency).
Expected
The skip line names the step, as the done line does (for example main │ skipped rollback (dependency)).
Environment
swamp 20260925.163149.0-sha.bea803c9, Linux x86_64. Found while reproducing swamp-club#2537.
Shipped
Click a lifecycle step above to view its details.
hammz commented 9/25/2026, 5:15:09 PM
Related, same step_skipped handler in src/presentation/renderers/workflow_run.ts: a skipped forEach iteration never emits step_started (the execution service yields it after the guard block), so the renderer never calls pipe.updateWidth for its template[index] label. When every iteration of a forEach step is skipped, the skip lines overhang the gutter, which is sized from the job names. This already happens for guard-skipped iterations. Once swamp-club#2537 is fixed it also covers the common rollback-on-failure case, where every iteration of a failed-gated forEach step is skipped with reason dependency. The fix probably belongs in the same change: widen the pipe in step_skipped as step_started does.
Sign in to post a ripple.