In order for our customers to have a FRAME machine which they can rely on, the FRAME needs to be shipped with software which our customers can rely on. We will ship software in two ways:
For either software delivery mechanism, the software should be:
This DN describes our process for planning and managing and executing new releases of all of our software so that we can deliver stable software releases to:
All software is version-controlled using Git, so that any version of our source code is identified with a Git commit hash. We will make certain commits easier to identify by giving them human-readable (developer-facing) technical version identifiers, i.e. technical version numbers. These version identifiers should communicate some information about the significance of the version, e.g. whether it’s a version which a customer should use or whether it’s only for internal testing.
Any software binary we provide to the customers (e.g. flashed SD cards, SD card images, Docker container images, firmware binaries) must be fully traceable back to a particular Git commit of our source code, so that we can determine the source code of whatever software is running in a customer machine. This means that we should try to minimize changes to binary which aren’t captured as changes to source code in a Git repository. For any such changes which we must make (e.g. as customer-specific or machine-specific config files, config variables in flash memoryo and/or EEPROM, etc.), we must be especially careful about recording exactly what changes we make. Being disciplined about recording that information is necessary in order to maintain the traceability and reproducibility of what we deliver to our customers.
openUC2 OS is a combination of many individual software components; some components (such as ImSwitch) are written, maintained, and distributed by openUC2, while other components (such as the Cockpit administration dashboard and the system file browser) are written, maintained, and distributed by other open-source software projects. Each component has its own release schedule and version numbering system; the specific combination of releases and versions of all these components will change over time as these components change, and we represent each total combination of all software components in a particular release of openUC2 OS by a single version number assigned to that release.
For releases of openUC2 OS, we use a calendar-based version numbering system with three numeric components and an optional pre-release suffix. Specifically:
v(year).(notable).(hotfix), where the year, notable, and hotfix components are each non-negative integers. For example, v26.0.0 and v27.2.1 could both be valid version strings for releases, while v26-0-0 and v26.0 and v26 would not be valid version strings for releases.
hotfix is incremented by 1 for a new release which consists only of small but important bug fixes (which we call “hotfixes”).
For example, if there were some small bugs in v26.0.0 (where hotfix is 0) which we wanted to patch urgently, then we could publish those patches as a v26.0.1 hotfix release (where hotfix is now 1).notable is incremented by 1 for a new release which includes any notable changes larger than hotfixes; such changes may be backwards-compatible or backwards-incompatible.
For example, if our first notable release was v26.0.0 (where notable is 0) and then we wanted to make a second notable release in 2026 which added a new feature (without any backwards-incompatible changes), that second release would be v26.1.0 (where notable is 1). If we then wanted to make a third notable release in 2026 which made a backwards-incompatible API change, then its version number would be v26.2.0 (where notable is 2).year is a number representing number of years (in the Gregorian calendar) after 2000 in which the notable release is (or will be) published. In the terminology of Calendar Versioning, this number is a YY-formatted year.
For example, version v26.0.0 (where year is 26) represents the first notable release to be published in 2026 and v26.1.0 represents the second notable release to be published in 2026, while version v27.0.0 (where year is 2027) represents the first notable release to be published in 2027. Version v101.0.0 would represent the first notable release to be published in 2126.
We use YY format instead of YYYY format because YYYY format makes version strings difficult to say out loud. Also, it’s easier to switch from YY-formatted CalVer strings to SemVer strings because the major component of the resulting version numbers won’t look like a year in the future.hotfix must be reset to 0 when notable is incremented.
For example, v26.1.1 → v26.2.0 is an allowed sequence of version numbers for successive releases, while v26.1.1 → v26.2.1 is not allowed.hotfix and notable must be reset to 0 when year is incremented.
For example, v26.2.1 → v27.0.0 is an allowed sequence of version numbers for successive releases, while v26.2.1 → v27.2.0 and v26.2.1 → v27.0.1 both are not allowed.year should not be changed for hotfix releases published the year after the notable release which they were based on.
For example, if v27.2.0 were published in December 2027 and then we wanted to publish a hotfix for it in January 2028, then we would call it v27.2.1, not v28.0.0.year must be changed for notable releases published the year after the previous notable release.
For example, if v27.2.0 were published in December 2027 and then we wanted to publish a notable release based on it in March 2028, then we would call it v28.0.0, not v27.3.0.v(year).(notable).(hotfix)-(modifier), where v(year).(notable).(hotfix) represents the planned stable release which the pre-release is intended for, and modifier is an additional string included to identify the type of pre-release.
modifier has the format of either alpha.(index) or beta.(index), where index is a non-negative integer with no leading zeroes.
For example, the first "alpha" pre-release for v26.0.0 was v26.0.0-alpha.0, the second "alpha" pre-release was v26.0.0-alpha.1, and the first "beta" pre-release will be v26.0.0-beta.0.alpha to beta, index must be reset to 0.
For example, v26.0.0-alpha.1 → v26.0.0-beta.0 is an allowed sequence of version numbers for successive pre-releases, while v26.0.0-alpha.1 → v26.0.0-beta.0 is not allowed.major, minor, patch) in Semantic Versioning’s version numbers versus the three numeric components (year, notable, hotfix) in openUC2 OS’s version numbers.
minor component) and backwards-incompatible changes (with its major component), our versioning scheme does not make such distinctions. Any notable release of openUC2 OS (i.e. any release which increments our year or notable components) should be considered as being like a “major release” in the terminology of Semantic Versioning. Even a hotfix release might include a backwards-incompatible change (though we should do our best to avoid including backwards-incompatible changes in hotfix releases).