docs: def get_step_output(section, default_output):
      '''determine step output'''
      step_output: sos_targets = sos_targets()
      #
      if 'provides' in section.options and default_output:
          step_output = default_output
  
      # look for input statement.
      output_idx = find_statement(section, 'output')
      if output_idx is None:
          return step_output
  
      # output statement
      value = section.statements[output_idx][2]
      # output, depends, and process can be processed multiple times
      try:
          svars = ['output_from', 'named_output', 'sos_step', 'sos_variable']
          old_values = {
              x: env.sos_dict.dict()[x]
              for x in svars
              if x in env.sos_dict.dict()
          }
          env.sos_dict.quick_update({
              'output_from': no_output_from,
              'named_output': no_named_output,
              'sos_step': no_sos_step,
              'sos_variable': no_sos_variable,
          })
          args, kwargs = SoS_eval(
              f'__null_func__({value})', extra_dict=env.sos_dict.dict())
          if not any(isinstance(x, (dynamic, remote)) for x in args):
              step_output = sos_targets(
                  *args, **{
                      x: y
                      for x, y in kwargs.items()
                      if x not in SOS_TARGETS_OPTIONS
                  })
      except SyntaxError:
          raise
      except Exception as e:
          if 'STEP' in env.config['SOS_DEBUG'] or 'ALL' in env.config['SOS_DEBUG']:
              env.log_to_file('STEP', f"Args {value} cannot be determined: {e}")
      finally:
          [env.sos_dict.dict().pop(x) for x in svars]
          env.sos_dict.quick_update(old_values)
  
      if 'provides' in section.options and default_output is not None and step_output.valid(
      ):
          for out in default_output:
              # 981
              if not isinstance(out, sos_step) and out not in step_output:
                  raise ValueError(
                      f'Defined output fail to produce expected output: {step_output} generated, {default_output} expected.'
                  )
      return step_output