I think picking "semi-stable" would be giving in to the OCD nerd in all of us. :-) While perhaps technically less precise, "unstable" is the catchy name with the right association. (And yes, we should keep it stable within bugfix releases, but the name doesn't need to reflect that detail.) The "internal API" isn't an API at all (except for CPython core developers and contributors). The "unstable API" would definitely be an *API* for users outside the core.
So let's please go with "unstable".
While I've advocated for semi-stable in previous threads, I now agree the pragmatic arguments for "unstable" hold up well enough to make the simpler term the better choice:
* no question around using a hyphen or not
* "unstable public C API" is sufficient to distinguish the new tier from Py_BUILD_CORE's completely unstable internal API
The risks of misinterpretation are also low:
* external users that need one of these APIs will presumably be invested enough to actually check the stability expectations in the docs
* core devs will have regression tests to remind us that the published unstable APIs aren't allowed to change after beta 1