anchor.diff:  -spec monitor_workflow_execution(test_ctx()) -> ok | no_return().
   monitor_workflow_execution(TestCtx0) ->
       receive {ReplyTo, StepMockCallReport} ->
  +        TestCtx1 = TestCtx0#test_ctx{test_hung_probes_left = ?TEST_HUNG_MAX_PROBES_NUM},
           {StepPhaseSelector, StepMockSpec} = get_step_mock_spec(StepMockCallReport, TestCtx0),
   
           StepPhase = #step_phase{
  
positive.code:             reply_to = ReplyTo
          },
  
          case should_defer_step_execution(StepMockSpec, TestCtx0) of
              true ->
                  monitor_workflow_execution(TestCtx0#test_ctx{deferred_step_phases = maps:update_with(
                      StepMockSpec#atm_step_mock_spec.defer_after,
                      fun(RestDeferredStepPhases) -> [StepPhase | RestDeferredStepPhases] end,
                      [StepPhase],
                      TestCtx0#test_ctx.deferred_step_phases
                  )});
              false ->
                  monitor_workflow_execution(begin_step_phase_execution(StepPhase, TestCtx0))
          end
      after ?PARALLEL_STEP_EXECUTIONS ->  %% TODO handle test hunging
  %%        ct:pal("ERROR: Atm workflow execution hung"),
  %%        ?assertEqual(success, failure)
  
          TestCtx1 = assert_expectations_if_changed(TestCtx0),
          TestCtx2 = end_pending_step_phase_executions(TestCtx1),
  
          case has_workflow_ended(TestCtx2) of
              true ->
                  ok;
              false ->
                  TestCtx3 = begin_deferred_step_phase_executions_if_possible(TestCtx2),
                  monitor_workflow_execution(TestCtx3)
          end
      end.
  
  
negative.code:         current_run_num = 1,
          ongoing_incarnations = Incarnations,
          workflow_execution_exp_state = ExpState,
          workflow_execution_exp_state_changed = false,
          test_hung_probes_left = ?TEST_HUNG_MAX_PROBES_NUM
      }).
  
  
  