···355355 // Read from stream until this step's end event
356356 if wfLogger != nil {
357357 logger.Info("Reading logs for step", "stepID", idx)
358358- if err := e.readUntilStepEnd(stream, idx, w, wfLogger); err != nil {
358358+ if err := e.readUntilStepEnd(ctx, stream, idx, w, wfLogger); err != nil {
359359 logger.Error(err, "Failed to read step logs")
360360 // Clean up stream on error
361361 e.closeLogStream(wid)
···497497}
498498499499// readUntilStepEnd reads from the log stream until the end event for the specified step
500500-func (e *KubernetesEngine) readUntilStepEnd(stream *workflowLogStream, stepID int, workflow *models.Workflow, wfLogger *models.WorkflowLogger) error {
500500+func (e *KubernetesEngine) readUntilStepEnd(ctx context.Context, stream *workflowLogStream, stepID int, workflow *models.Workflow, wfLogger *models.WorkflowLogger) error {
501501 scanner := stream.scanner
502502503503 for scanner.Scan() {
···550550 }
551551552552 // Scanner ended without seeing step end event.
553553- // Check pod phase to determine if this is an error or expected behavior.
554554- if stream.podPhase == corev1.PodSucceeded {
555555- // Pod succeeded but we didn't find the control event - treat as success.
556556- // This can happen if logs were truncated or runner didn't emit events.
557557- return nil
553553+ // Re-check current pod status - it may have completed since we started streaming.
554554+ currentPod := &corev1.Pod{}
555555+ if err := e.client.Get(ctx, client.ObjectKey{Namespace: stream.pod.Namespace, Name: stream.pod.Name}, currentPod); err == nil {
556556+ if currentPod.Status.Phase == corev1.PodSucceeded {
557557+ // Pod succeeded - treat as success even without control event
558558+ return nil
559559+ }
560560+ if currentPod.Status.Phase == corev1.PodFailed {
561561+ return fmt.Errorf("pod failed before step %d completed", stepID)
562562+ }
558563 }
559564560560- if stream.podPhase == corev1.PodFailed {
561561- return fmt.Errorf("pod failed before step %d completed", stepID)
562562- }
563563-564564- // Pod was running when we started but stream ended unexpectedly
565565+ // Pod status unknown or still running but stream ended unexpectedly
565566 return fmt.Errorf("log stream ended before step %d completed", stepID)
566567}
567568