Now, there are actual backwards-incompatible changes that aren't made after at least two versions of deprecation, but those tend to be low level and subtle.
[1] https://docs.python.org/3.4/library/asyncio.html
[2] https://docs.python.org/3.5/library/asyncio.html
More on provisional API:
https://docs.python.org/3.8/glossary.html#term-provisional-a...
> A provisional API is one which has been deliberately excluded from the standard library’s backwards compatibility guarantees. While major changes to such interfaces are not expected, as long as they are marked provisional, backwards incompatible changes (up to and including removal of the interface) may occur if deemed necessary by core developers. Such changes will not be made gratuitously – they will occur only if serious fundamental flaws are uncovered that were missed prior to the inclusion of the API.
So maybe you were using "async" as a variable name, or as a function name in your code, and suddenly that wouldn't work anymore. It definitely is a backwards-incompatible change, and that has nothing to do with provisional APIs.
Since I have never use "async" as an identifier in my own code, I have no idea if warnings were issued, though probably?
gp specifically links to a SO question discussing asyncio.async breakage, which would be considered API breaking except it was specifically provisional.
It is because Python 3.7 makes "async" a reserved word, which was a valid identifier name before.