(1) Is it really a TypeGuard, or more of a TypeAssertion?
It's a query, not an assertion. The same concept is called type guard in TypeScript.
(2) Does this push too hard on "annotations only have one meaning"? If it has to imported from typing, then probably not, but I think that is worth adding to the PEP.
No. *This* particular annotation has a meaning for static type checkers. If you use annotations for something else, don't use it.
(3) Why can't the falsey case of an Optional String narrow to a set of literals {"", None} Are you worried that a subclass of str might have its own empty string, or just that you don't want to promise this? As written, it sounds like such a narrowing is forbidden.
A type checker could do this, but I don't see a reason why we should prescribe that type checkers *should* do that. Some type checkers (in particular, mypy) are reluctant to infer union types, and there are good reasons for this (but this margin isn't wide enough to explain it).
--