docs: def validate_process_types(queryset=None):
      """Perform process type validation.
  
      :param queryset: Optional process queryset to validate
      :return: A list of validation error strings
      """
      if not queryset:
          from .process import Process
          queryset = Process.objects.all()
  
      processes = {}
      for process in queryset:
          dict_dot(
              processes,
              process.type.replace(':', '.') + '__schema__',
              process.output_schema
          )
  
      errors = []
      for path, key, value in iterate_dict(processes, exclude=lambda key, value: key == '__schema__'):
          if '__schema__' not in value:
              continue
  
          # Validate with any parent types.
          for length in range(len(path), 0, -1):
              parent_type = '.'.join(path[:length] + ['__schema__'])
              try:
                  parent_schema = dict_dot(processes, parent_type)
              except KeyError:
                  continue
  
              errors += validate_process_subtype(
                  supertype_name=':'.join(path[:length]),
                  supertype=parent_schema,
                  subtype_name=':'.join(path + [key]),
                  subtype=value['__schema__']
              )
  
      return errors