@JsonIgnore
  public Map<String, StepRuntimeState> decodeStepOverview(Map<String, StepTransition> runtimeDag) {
    AtomicLong ordinal = new AtomicLong(0);
    Map<Long, String> ordinalStepMap =
        runtimeDag.keySet().stream()
            .collect(Collectors.toMap(s -> ordinal.incrementAndGet(), Function.identity()));
    Map<String, StepRuntimeState> states = new LinkedHashMap<>();
    stepOverview.forEach(
        (status, summary) -> {
          if (summary.getSteps() != null) {
            summary
                .getSteps()
                .forEach(
                    stepInfo -> {
                      String stepId =
                          Checks.notNull(
                              ordinalStepMap.remove(stepInfo.get(0)),
                              "cannot find step id for stepInfo [%s]",
                              stepInfo);
                      StepRuntimeState state = new StepRuntimeState();
                      state.setStatus(status);
                      state.setStartTime(stepInfo.get(1));
                      state.setEndTime(stepInfo.get(2));
                      states.put(stepId, state);
                    });
          }
        });
    return states;
  }
@Test
  public void testDecodeStepOverview() throws Exception {
    WorkflowRuntimeOverview overview =
        loadObject(
            "fixtures/instances/sample-workflow-runtime-overview.json",
            WorkflowRuntimeOverview.class);
    assertFalse(overview.existsNotCreatedStep());

    WorkflowInstance instance =
        loadObject(
            "fixtures/instances/sample-workflow-instance-created.json", WorkflowInstance.class);

    Map<String, StepRuntimeState> actual = overview.decodeStepOverview(instance.getRuntimeDag());
    assertEquals(1, overview.decodeStepOverview(instance.getRuntimeDag()).size());
    assertEquals(StepInstance.Status.RUNNING, actual.get("job3").getStatus());
    assertEquals(1647977244273L, actual.get("job3").getStartTime().longValue());
  }