Well, the way I'm planning to assign versions is as following:
0.minor.buildtype.buildnumber
minor - I increment minor version every time there are major changes.
buildtype - it's "a" for alpha builds, "b" for beta builds, "rc" for release candidate builds, "r" for release builds
buildnumber - it's just a sequential number since label has been applied
Once we're happy with the client (which I think is never gonna happen
![Smile :) :)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
) we'll assign a major version 1, and will move on.
Buildnumber is set during the build, all the rest is a tag in source control.
So current alpha builds have versions 0.4.a.XX, once we'll start public beta testing, it will be 0.4.b.XX, once client is more or less stable and most of major bugs are fixed we'll move on to 0.4.rc.XX, and eventually to 0.4.r.XX (if by that time the won't be another batch of major changes, otherwise the cycle will start all over with 0.5 version family).
UPDATE:
On a second thought, maybe we should just ditch a major version alltogether and use version like 4.a.XX... Hmmm... What do you think of that?