docs: def task_add(self, description, tags=None, **kw):
          """ Add a new task.
  
          Takes any of the keywords allowed by taskwarrior like proj or prior.
          """
          task = self._stub_task(description, tags, **kw)
  
          # Check if there are annotations, if so remove them from the
          # task and add them after we've added the task.
          annotations = self._extract_annotations_from_task(task)
  
          # With older versions of taskwarrior, you can specify whatever uuid you
          # want when adding a task.
          if self.get_version() < LooseVersion('2.4'):
              task['uuid'] = str(uuid.uuid4())
          elif 'uuid' in task:
              del task['uuid']
  
          if self._marshal:
              args = taskw.utils.encode_task_experimental(task.serialized())
          else:
              args = taskw.utils.encode_task_experimental(task)
  
          stdout, stderr = self._execute('add', *args)
  
          # However, in 2.4 and later, you cannot specify whatever uuid you want
          # when adding a task.  Instead, you have to specify rc.verbose=new-uuid
          # and then parse the assigned uuid out from stdout.
          if self.get_version() >= LooseVersion('2.4'):
              task['uuid'] = stdout.strip().split()[-1].strip('.')
  
          id, added_task = self.get_task(uuid=task['uuid'])
  
          # Check if 'uuid' is in the task we just added.
          if not 'uuid' in added_task:
              raise KeyError(
                  'Error encountered while creating task;'
                  'STDOUT: %s; STDERR: %s' % (
                      stdout,
                      stderr,
                  )
              )
  
          if annotations and 'uuid' in added_task:
              for annotation in annotations:
                  self.task_annotate(added_task, annotation)
  
          id, added_task = self.get_task(uuid=added_task[six.u('uuid')])
          return added_task