well there are different amounts of arguments for each of the new ones
Yes, but imho is much better and simple add optional args to standard G, E, P, O rather than adding new W, Z, X, Y.
However I notice another thing in do_socket function:
stralloc_printf( &item->socket, "%s", capitalize( arg ).c_str( ) );
I don't know if it is wanted but in this case if I have a rune called "Test" and a player digits "socked tes" the socket assume "Tes" name and not "Test". Isn't better use rune->name?