I think I would agree that your issue is more with punning. And, just to be clear, you said above that:
Thank you, that is helpful and precise definition of type piracy. Of course, there are cases (particularly any operators defined in Base or other packages you want to use) where you have no choice but to pirate.
which is still not true. Defining a Base method on your own type is perfectly fine and not type piracy at all. It cannot possibly affect the behavior of anyone’s code unless they are using your type, so there’s no piracy issue.
For example, this code does not exhibit type piracy:
struct Bar
end
Base.:+(b1::Bar, b2::Bar) = 10
because I’ve only changed the behavior of + for my own type. Anyone not using my new Bar type is guaranteed to be unaffected. And anyone who is using my Bar type has, by using my code, essentially opted in to the behaviors I’ve defined for my particular types.
On the other hand, you can certainly argue that my definition of + is nonsensical or a bad pun. And I would agree with you! But the issue is one of clear meaning and expectations, not one of type piracy.