Semantic Versioning is better than most Versioning systems today, but because it means different things to different people, it remains more of a Social Versioning system than a semantic one.
I propose a new Versioning Scheme named Mark Versioning, which aims to separate and preserve both social and semantic aspects of versioning.
A Mark is a specific version of a software. This number is decided by social consensus, and represents major iterations / changes to a software. It starts at 0 and is incremented by 1 whenever appropriate.
A Revision is similar to a Mark, but it represents a strict change in API. This may be a breaking or a no breaking change. Reversions start at 0 for each mark, and are incremented by one whenever an API change is detected. This should be done automatically by package management software.
A Hash is the particular SHA-3 hash (in hex form, truncated to 8 characters) of a the source code of a software version. A Revision may have multiple different hashes. Alternatively, one can start from 0 with each Revision and automatically increment by 1 with each change. This should be done automatically.
Mark Versioning can be written out in two forms: long and short.
Mark <X> Revision <Y> Hash <zzzzzzzz>
Here are some examples:
Mark 3 Revision 16 Hash ae473ff6
Same in short form:
Optionally, one can leave off Hash or Hash and Revision (if Hash is present, Revision must be present):
Mark 0 Mark 0 Revision 0 Mark 0 Revision 0 Hash 0 m0 m0r0 m0r0#0