SemVer was based on the UNIX shared library mechanics, I think. It works well for shared libraries; less well for applications, and pretty awfully for protocols.

In practice, projects I've run have used a mixture of SemVer, PrideVer, and IncentiVer - the latter being "I'll bump the major version when I really want to shame you into upgrading because I don't really want to support the older versions".