code: func NewGroup(signatures ...*Signature) (*Group, error) {
  	// Generate a group UUID
  	groupUUID := uuid.New().String()
  	groupID := fmt.Sprintf("group_%v", groupUUID)
  
  	// Auto generate task UUIDs if needed, group tasks by common group UUID
  	for _, signature := range signatures {
  		if signature.UUID == "" {
  			signatureID := uuid.New().String()
  			signature.UUID = fmt.Sprintf("task_%v", signatureID)
  		}
  		signature.GroupUUID = groupID
  		signature.GroupTaskCount = len(signatures)
  	}
  
  	return &Group{
  		GroupUUID: groupID,
  		Tasks:     signatures,
  	}, nil
  }
docs: // NewGroup creates a new group of tasks to be processed in parallel