code: func NewChain(signatures ...*Signature) (*Chain, error) {
  	// Auto generate task UUIDs if needed
  	for _, signature := range signatures {
  		if signature.UUID == "" {
  			signatureID := uuid.New().String()
  			signature.UUID = fmt.Sprintf("task_%v", signatureID)
  		}
  	}
  
  	for i := len(signatures) - 1; i > 0; i-- {
  		if i > 0 {
  			signatures[i-1].OnSuccess = []*Signature{signatures[i]}
  		}
  	}
  
  	chain := &Chain{Tasks: signatures}
  
  	return chain, nil
  }
docs: // NewChain creates a new chain of tasks to be processed one by one, passing
  // results unless task signatures are set to be immutable