Automation needs a compact status summary so a failed step can be retried deliberately.

Program

Play the script to choose whether a pipeline step needs a retry.

failed_step
pipeline_status.R
Replay: real traced execution (multi-file project)
failed_step <- 0
steps <- c("extract", "transform", "load")
status <- rep("ok", length(steps))
if (failed_step > 0) {
    status[failed_step] <- "retry"
}
ready <- all(status == "ok")
label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
cat(label, "\n", sep = "")
failed_step <- 2
steps <- c("extract", "transform", "load")
status <- rep("ok", length(steps))
if (failed_step > 0) {
    status[failed_step] <- "retry"
}
ready <- all(status == "ok")
label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
cat(label, "\n", sep = "")
failed_step <- 3
steps <- c("extract", "transform", "load")
status <- rep("ok", length(steps))
if (failed_step > 0) {
    status[failed_step] <- "retry"
}
ready <- all(status == "ok")
label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
cat(label, "\n", sep = "")
  1. failed_step ← 0

    1failed_step <- 02steps <- c("extract", "transform", "load")
    values this step0failed_step
  2. steps ← extract, transform, load

    1failed_step <- 02steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))
    values this stepextract, transform, loadsteps
  3. status ← ok, ok, ok

    2steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))4if (failed_step > 0) {
    values this stepok, ok, okstatus3 stepssteps
  4. branch ← skip retry

    3status <- rep("ok", length(steps))4if (failed_step > 0) {5    status[failed_step] <- "retry"
    values this stepskip retrybranch0failed_step
  5. ready ← TRUE

    6}7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
    values this stepTRUEreadyok, ok, okstatus
  6. label ← ready:ok/ok/ok

    7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")
    values this stepready:ok/ok/oklabelTRUEreadyok, ok, okstatus
  7. cat(label, " ", sep = "")

    8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")
    outputready:ok/ok/ok
    values this stepready:ok/ok/oklabel
  1. failed_step ← 2

    1failed_step <- 22steps <- c("extract", "transform", "load")
    values this step2failed_step
  2. steps ← extract, transform, load

    1failed_step <- 22steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))
    values this stepextract, transform, loadsteps
  3. status ← ok, ok, ok

    2steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))4if (failed_step > 0) {
    values this stepok, ok, okstatus3 stepssteps
  4. branch ← retry step 2

    3status <- rep("ok", length(steps))4if (failed_step > 0) {5    status[failed_step] <- "retry"
    values this stepretry step 2branch2failed_step
  5. status ← ok, retry, ok

    4if (failed_step > 0) {5    status[failed_step] <- "retry"6}
    values this stepok, retry, okstatus2failed_step
  6. ready ← FALSE

    6}7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
    values this stepFALSEreadyok, retry, okstatus
  7. label ← blocked:ok/retry/ok

    7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")
    values this stepblocked:ok/retry/oklabelFALSEreadyok, retry, okstatus
  8. cat(label, " ", sep = "")

    8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")
    outputblocked:ok/retry/ok
    values this stepblocked:ok/retry/oklabel
  1. failed_step ← 3

    1failed_step <- 32steps <- c("extract", "transform", "load")
    values this step3failed_step
  2. steps ← extract, transform, load

    1failed_step <- 32steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))
    values this stepextract, transform, loadsteps
  3. status ← ok, ok, ok

    2steps <- c("extract", "transform", "load")3status <- rep("ok", length(steps))4if (failed_step > 0) {
    values this stepok, ok, okstatus3 stepssteps
  4. branch ← retry step 3

    3status <- rep("ok", length(steps))4if (failed_step > 0) {5    status[failed_step] <- "retry"
    values this stepretry step 3branch3failed_step
  5. status ← ok, ok, retry

    4if (failed_step > 0) {5    status[failed_step] <- "retry"6}
    values this stepok, ok, retrystatus3failed_step
  6. ready ← FALSE

    6}7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")
    values this stepFALSEreadyok, ok, retrystatus
  7. label ← blocked:ok/ok/retry

    7ready <- all(status == "ok")8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")
    values this stepblocked:ok/ok/retrylabelFALSEreadyok, ok, retrystatus
  8. cat(label, " ", sep = "")

    8label <- paste(ifelse(ready, "ready", "blocked"), paste(status, collapse = "/"), sep = ":")9cat(label, "\n", sep = "")
    outputblocked:ok/ok/retry
    values this stepblocked:ok/ok/retrylabel
status vector A status vector records one state per workflow step.
retry flag Changing one position to `retry` marks the step that needs attention.
ready check `all(status == "ok")` turns step states into one pipeline decision.