I wrote a post, and then realized it was wrong from top to bottom (my bad)!
The problem is that you're trying to RPC to puppets from the server, while the server's version of the updated node is a puppet too. So the server ends up sending a message to itself (and all other puppets, but the point is, this is a reflexive call).
From the documentation:

In your game, the SERVER is the master of most things, except for players, which are "puppets" on the server. When you RPC from a puppet to a "puppet" function, you get an error, because you're sending a message to yourself.
Instead, what you want to use is either remote (to update the node on all nodes except the current one), or, if you really do want to include the server in the RPC call, you can use remotesync.
.
.
.
.
Old Post (Most of this is wrong):
Is this function in a client-owned node? If update_puppets is in the client-owned player node, you can't call RPCs on it from the server (WRONG! Shame on me). Godot has pretty strict ownership based on what nodes can call RPC functions. I think this is so different peers can't get desynchronized due to clients with conflicting claims.
To send signals to clients, you have to call an update_puppets function from a server-owned node (that assumably also exists in the clients). That function will then make calls on the client's puppets. Something like this (THIS WORKS, BUT IS ALSO COMPLETELY ROUNDABOUT AND UNNECESSARY):
# In server-owned node:
remotesync func update_puppet(path_to_puppet, puppet_data, puppet_data_rotation):
get_node(path_to_puppet).update(puppet_data, puppet_data_rotation)