The point of major releases is to update the set of common packages we all use. That is, to specify which packages and which versions (corresponding to APIs). The target is to have major releases every 6 months.

The point of minor releases is to support a major release across a range of operating systems over time and respond to bugs that are discovered in a library or tool subsequent to their release. The target is to have 2-3 minor releases after major releases at intervals on the order of 4-6 weeks.

Examples

2010.1.0, 2010.1.1, ... testing pre-releases for the first major release of the year

2010.2.0: first major release in 2010.

2010.2.1: minor bug fix release, compatible with 2010.2.0

2010.3.0, 2010.3.1, ... testing pre-releases for the second major release

2010.4.0: second major release in 2010.

2010.4.1: minor bug fix release, compatible with 2010.4.0

The general scheme

$year . $major-release . $minor-version

Together, the $year and $major-release identify the major version.

When the $major-release is even, it's a stable release. Minor releases within a stable release are compatible. That is, programs that worked with 2010.2.0 or 2010.2.1 will still work with 2010.2.2. (Note, we have not decided if programs that work with later minor releases should also work with earlier ones, ie can minor releases add new APIs. This policy question has to be resolved by the libraries list.)

When the $major-release is odd, it's a testing pre-release. Minor releases are fresh testing snapshots. There is no API compatability guarantee.

Rationale

We need to be able to distinguish major from minor releases. So we cannot simply use the date.

We need to give version numbers to pre-releases because we need to get wide testing from developers/users, so being able to track and identify pre-releases is important.

Alternatives

One alternative that fits the requirements is a monitonically increasing major version number, like 20.x for a major release and 20.0, 20.1, etc for minor releases. This is what GNOME uses.

FAQ

Q: Are pre-releases API compatible with the final release?

A: No, there is no such guarantee for testing pre-releases. Only minor stable releases are guaranteed to be API compatible with the previous minor releases in the same major release series. In practice we expect there to be an API freese some weeks before the major release, so that testers have time to check the whole thing works without there being constant API churn.

Q: Should the pre-release for 2010.2.0 be called 2010.1.x even if it's still 2009?

A: Yes, the current date does not matter. It's the target release date that matters. It should be called 2010.1.x, not something like 2009.5.x.

Q: Why not use a monitonically increasing major version number? Why use the year?

A: Because it makes it clear that it is a never a finished project, and that we do time-based rather than feature based releases. It also tells you slightly more information (e.g. you can quickly tell how out-of-date your distro's support is).