Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

Software version numbers work only when users can rely on what they mean. A number might signal compatibility, release date, upgrade effort or simply a product milestone; it might also apply to one component or to an entire suite. These are separate choices, and confusion follows when a project leaves them unstated or changes their meaning without warning.

A durable versioning policy defines the promise first, then chooses numbering and release coordination that the team can actually maintain. That is the central argument of Mikhail Polivakha’s 2026 essay on software versioning, written from his perspective as technical lead of the open-source Axelix project.

What makes software versioning a public contract?

A version number is a message from the people who ship software to the people who install, integrate, upgrade or support it. A user may read a new number as evidence that a release is safer, newer, more compatible or more disruptive. Those interpretations are useful only if the project has defined what the number promises and follows that policy consistently.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The contract is not the digits by themselves. It is the documented relationship between a version change and a user-visible consequence. If users cannot tell whether a release may break their code, which component versions work together, or how long they can delay an upgrade, the numbering system has not answered the questions they need answered.

What is semantic versioning, and what does it promise?

Semantic Versioning (SemVer) is a compatibility scheme for software with a declared public API. Its familiar MAJOR.MINOR.PATCH format is not enough on its own: the project must define what counts as public API and honor the rules for changes to it. The SemVer specification page states, “Software using Semantic Versioning MUST declare a public API.” The page is labeled 2.0.0-rc.1; it is cited here for the rules it presents, not as evidence of a newer final specification.

  • PATCH: increment for backward-compatible bug fixes to the public API.
  • MINOR: increment for backward-compatible public API additions or deprecations.
  • MAJOR: increment for backward-incompatible public API changes.

These promises apply to the declared API, not automatically to every behavior users might observe. A project therefore needs to say which interfaces and behaviors it supports. Without that boundary, users may reasonably—but incorrectly—treat an internal detail as a compatibility guarantee.

Should a project use SemVer, CalVer or marketing version numbers?

These approaches answer different questions. SemVer is intended to communicate compatibility changes; Calendar Versioning (CalVer) encodes release timing; a marketing number makes a release or product generation easier to recognize. None is universally best, and none removes the need to explain upgrade expectations.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Approach What the number communicates What it does not promise by itself
SemVer Compatibility-related changes to a defined public API, through MAJOR, MINOR and PATCH increments. Compatibility for interfaces the project has not declared part of its public API, or adherence to SemVer when the project does not follow the rules.
CalVer Release timing in a calendar-based form; this can help users of a desktop application judge recency. Backward compatibility or the amount of upgrade work.
Marketing versioning A memorable product generation or high-profile release milestone. A precise compatibility guarantee or a predictable estimate of upgrade effort.

A team may keep a familiar MAJOR.MINOR.PATCH shape but use it to signal likely upgrade effort rather than strict SemVer compatibility. Spring Boot’s team explains that its project cannot practically follow strict SemVer: “It’s not really possible for Spring Boot to use semantic versioning since every release would have to be a major.” It says instead: “Instead we try to use the version number as an indicator of the amount of pain that an upgrade will cause.” Those are Spring Boot’s stated conventions, not a universal redefinition of SemVer. See Spring Boot’s versioning practices.

How should multiple components be versioned?

Number semantics and component coordination are separate decisions. A project can use SemVer or CalVer whether each component has its own version or all components share one. The choice is about how a user identifies a supported product combination versus how much coordination a release team is willing to do.

Model How it works Main benefit Main cost
Independent versioning Each separately released component advances on its own schedule. Maintainers can publish only the components that changed, avoiding unnecessary releases of unchanged artifacts. Users need current compatibility guidance to identify which component combinations are supported.
Lockstep versioning Related components share a product version and are released as a coordinated set. The visible product combination is easier to understand and communicate. A change to one component can require coordinated release work for the whole set, even when other components did not change.

Choose independent versions when components are meaningfully separate and the team can keep a compatibility matrix accurate. Choose lockstep when users experience the components as one product and a single shared version makes the supported combination substantially clearer. Account for deployment reality, too: even if components ship together, users may not be able to install or upgrade them all at once.

What is a compatibility matrix, and what is a compatibility window?

A compatibility matrix lists supported combinations—for example, which versions of one component work with particular versions of another. It is most useful when components advance independently and support depends on specific pairings.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A compatibility window describes a moving range of versions that can coexist during a gradual rollout. Rather than documenting each pairing as a standalone combination, the project sets limits on how far apart related components may be. A window gives users time to upgrade in stages, but supporting a wider range means testing and maintaining more old combinations. A narrower window reduces that burden at the expense of user flexibility.

Polivakha’s essay reports that Axelix supported four minor release lines at the time the essay was published on September 21, 2026. That is an author-reported, dated project example, not a general recommendation or an independently verified current Axelix policy. A project choosing its own window should specify which versions it covers, whether the range moves with each release, and which upgrade order is supported.

How Kubernetes documents version skew

Kubernetes illustrates why distributed systems need explicit compatibility limits rather than a vague claim that components are “compatible.” Its version-skew policy specifies version relationships and upgrade order for components such as kubelet and kube-apiserver. The published policy, accessed in 2026, says kubelet must not be newer than kube-apiserver and, for applicable current versions, may be up to three minor versions older.

For Kubernetes 1.37, the policy’s example lists kubelet versions 1.37, 1.36, 1.35 and 1.34 against kube-apiserver 1.37. That example is bounded by the policy’s qualifications: older Kubernetes versions have different rules, skew among API servers affects what is allowed, and deployment tools may enforce stricter limits. Follow the live policy for the cluster and tool versions in use; these Kubernetes values are not a template for unrelated systems.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

How to choose a versioning strategy your team can sustain

  1. Identify the user’s decision. Decide whether users most need to know compatibility, release recency, likely upgrade effort or which product generation they have. Select a numbering convention that communicates that information without implying a different guarantee.
  2. Define the boundary. For a library or framework, document the public API before promising SemVer behavior. If strict SemVer is not feasible, explain what each increment usually signals and avoid presenting the number as a mathematical compatibility guarantee.
  3. Map component ownership and release reality. For related components, weigh the clarity of one shared product version against the release work of coordinating every component. If versions advance independently, plan to maintain a compatibility matrix rather than leaving users to infer working combinations.
  4. Specify rollout tolerance. For distributed components or staged deployments, write down the tested compatibility window and upgrade order. A wider window offers more time to upgrade but increases the combinations the project must test and support; a narrower one reduces that maintenance load but leaves users less flexibility.
  5. Publish and keep the policy current. State what the version means, what is supported, what users should upgrade first, and where compatibility information lives. Revisit the policy when architecture, release cadence or user deployment patterns change, and do not silently change the meaning of established version increments.

For a consumer application, a calendar or milestone-oriented number may serve users better if their main question is how recent the release is. For a library whose consumers depend on APIs, compatibility semantics may matter more. For multi-component systems, the right answer additionally depends on how users deploy those parts and whether the team can sustain the coordination or compatibility documentation its chosen model requires.

Why versioning fails—and how to avoid the failure

The failure is rarely that a project picked the wrong fashionable format. It is that the number suggests a promise the team never made, cannot keep, or does not explain. Strict SemVer without a defined public API invites disputes over what counts as breaking. Independent component releases without maintained compatibility guidance shift the release team’s coordination problem onto users. Lockstep releases can simplify the user-facing model but create unnecessary coordination when parts change at different times. A compatibility window that omits order or version limits can leave staged upgrades unsafe.

Make the version policy a product decision: define the promise, the component relationships and the upgrade path together. Then choose the syntax and release cadence that communicate that policy clearly—and document the exceptions before users discover them during an upgrade.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.