[GH-ISSUE #734] The myth that releasing version 1.0.0 implies any type of long term support #2225

Open
opened 2026-04-20 10:14:31 -05:00 by GiteaMirror · 11 comments
Owner

Originally created by @fulldecent on GitHub (Jul 26, 2021).
Original GitHub issue: https://github.com/semver/semver/issues/734

In one widely-used project we are discussing whether to release version 1.0.0.

Some opposing viewpoints cite that version 1.0.0 has some implicit representation of quality or completeness. Or that making a major version release implies that there will be long term (permanent?) support for that release.

I think the 1.0.0 question of SemVer is one of the most important questions. So I love to hear any of your experience on these topics.

An instance of this kind of discussion: https://github.com/ethereum/solidity/issues/11690

To make this discussion into an implementable product change: if this is a frequent discussion point, can we make it part of the SemVer FAQ, ordered appropriately based on how frequent this question or sticking point is?

Originally created by @fulldecent on GitHub (Jul 26, 2021). Original GitHub issue: https://github.com/semver/semver/issues/734 In one widely-used project we are discussing whether to release version 1.0.0. Some opposing viewpoints cite that version 1.0.0 has some implicit representation of quality or completeness. Or that making a major version release implies that there will be long term (permanent?) support for that release. I think the 1.0.0 question of SemVer is one of the most important questions. So I love to hear any of your experience on these topics. An instance of this kind of discussion: https://github.com/ethereum/solidity/issues/11690 To make this discussion into an implementable product change: if this is a frequent discussion point, can we make it part of the SemVer FAQ, ordered appropriately based on how frequent this question or sticking point is?
Author
Owner

@axic commented on GitHub (Jul 26, 2021):

Some opposing viewpoints cite that version 1.0.0 has some implicit representation of quality or completeness.

In the referenced thread this is explained with a bit more nuance. The referenced compiler language project has made over 90 releases with major 0, but not making breaking changes unless bumping the minor version. As a result it had so far 8 breaking releases and over 80 non-breaking releases. With this background, a sudden change to major 1 does imply a lot more calcification, and in turn long term support.

Or that making a major version release implies that there will be long term (permanent?) support for that release.

Perhaps this just shows that SemVer is a bit tricky for programming language projects. I do think a major version release implies that the language remains fully compatible within that major and that major will be supported for a longer period of time.

<!-- gh-comment-id:886678026 --> @axic commented on GitHub (Jul 26, 2021): > Some opposing viewpoints cite that version 1.0.0 has some implicit representation of quality or completeness. In the referenced thread this is explained with a bit more nuance. The referenced compiler language project has made over 90 releases with `major` 0, but not making breaking changes unless bumping the `minor` version. As a result it had so far 8 breaking releases and over 80 non-breaking releases. With this background, a sudden change to `major` 1 does imply a lot more calcification, and in turn long term support. > Or that making a major version release implies that there will be long term (permanent?) support for that release. Perhaps this just shows that SemVer is a bit tricky for programming language projects. I do think a major version release implies that the language remains fully compatible within that major *and* that major will be supported for a longer period of time.
Author
Owner

@ljharb commented on GitHub (Jul 26, 2021):

No, it does not necessarily imply that. Numbers are numbers. 1.0 implies no more length of support than any other number.

<!-- gh-comment-id:886753678 --> @ljharb commented on GitHub (Jul 26, 2021): No, it does not necessarily imply that. Numbers are numbers. 1.0 implies no more length of support than any other number.
Author
Owner

@lucasgcb commented on GitHub (Aug 2, 2021):

In one widely-used project we are discussing whether to release version 1.0.0.

Some opposing viewpoints cite that version 1.0.0 has some implicit representation of quality or completeness. Or that making a major version release implies that there will be long term (permanent?) support for that release.

I think the 1.0.0 question of SemVer is one the most important questions. So I love to hear any of your experience on these topics.

An instance of this kind of discussion: ethereum/solidity#11690

According to semantic versioning, when going from 0.x to 1.0, it suggests that scripts under 0.x versions will be incompatible with 1.0 API, and vice-versa.

That is it.

It does not imply anything other than breaking changes. It is as much quality or long term support as any other version increase.

I find that the implicit representation of integers such as "1.0" or "2.0" (two-point-oh!) having the idea of largely superior quality is attributed to the liberal use of the Mark system in pop culture, where a scientist pulls out a robot saying "here's von neumann Mk II!" and it goes from being a just dust roomba to a demigod of cleaning.

Realistically, a major version can increase on a bugfix that may call for rework for everyone using the API; major bumps are largely meant to communicate a bad thing in general. New features that don't break anything in Semantic Versioning simply go up as minor versions.

<!-- gh-comment-id:891273018 --> @lucasgcb commented on GitHub (Aug 2, 2021): > In one widely-used project we are discussing whether to release version 1.0.0. > > Some opposing viewpoints cite that version 1.0.0 has some implicit representation of quality or completeness. Or that making a major version release implies that there will be long term (permanent?) support for that release. > > I think the 1.0.0 question of SemVer is one the most important questions. So I love to hear any of your experience on these topics. > > An instance of this kind of discussion: [ethereum/solidity#11690](https://github.com/ethereum/solidity/issues/11690) According to semantic versioning, when going from 0.x to 1.0, it suggests that scripts under 0.x versions will be incompatible with 1.0 API, and vice-versa. That is it. It does not imply anything other than breaking changes. It is as much quality or long term support as any other version increase. I find that the implicit representation of integers such as "1.0" or "2.0" (_two-point-oh!_) having the idea of largely superior quality is attributed to the liberal use of the [Mark system](https://en.wikipedia.org/wiki/Mark_(designation)) in pop culture, where a scientist pulls out a robot saying _"here's von neumann Mk II!"_ and it goes from being a just dust roomba to a demigod of cleaning. Realistically, a major version can increase on a bugfix that may call for rework for everyone using the API; major bumps are largely meant to communicate a bad thing in general. New features that don't break anything in Semantic Versioning simply go up as minor versions.
Author
Owner

@jwdonahue commented on GitHub (Aug 12, 2021):

For any sequence of 0.y.z versions, every single publication is potentially breaking. Any claimed adherence to bumping minor on breaking changes is ignored by all SemVer compliant tooling. The assumption is, the publisher is not willing to make any claims of backward compatibility for any point release, until they get to 1.0.0. All following, non-prerelease publications, MUST follow the full semantics of the standard wrt the version tripple.

This does not preclude immediately reverting to a very long procession of prerelease publications, including many breaking changes.

All prerelease versions, no matter their form (0.y.z or -pre), are potentially breaking changes. When you finally get to an X.y.z where X > 0, you are simply laying the ground-work for subsequent non-breaking changes. Until then, it is impossible to communicate any non-breaking change commitment via the SemVer semantics. Few, if any automation, recognizes any side-channel communications. So as long you are hiding behind 0.y.z versions, or any prerelease tags, it is not possible for standard tooling to automatically pick up any critical bug fixes you might wish to push into your ecosystem.

Using full SemVer semantics is considered a best practice. If you have the quality controls needed to predictably release non-breaking changes, then you should do so whenever possible. You just can't do that with either of the SemVer prerelease versions.

<!-- gh-comment-id:897892896 --> @jwdonahue commented on GitHub (Aug 12, 2021): For any sequence of `0.y.z` versions, every single publication is potentially breaking. Any claimed adherence to bumping minor on breaking changes is ignored by all SemVer compliant tooling. The assumption is, the publisher is not willing to make any claims of backward compatibility for any point release, until they get to 1.0.0. All following, non-prerelease publications, MUST follow the full semantics of the standard wrt the version tripple. This does not preclude immediately reverting to a very long procession of prerelease publications, including many breaking changes. **All prerelease versions, no matter their form (`0.y.z` or `-pre`), are potentially breaking changes**. When you finally get to an `X.y.z` where `X > 0`, you are simply laying the ground-work for subsequent non-breaking changes. Until then, it is impossible to communicate any non-breaking change commitment via the SemVer semantics. Few, if any automation, recognizes any side-channel communications. So as long you are hiding behind `0.y.z` versions, or any prerelease tags, it is not possible for standard tooling to automatically pick up any critical bug fixes you might wish to push into your ecosystem. Using full SemVer semantics is considered a best practice. If you have the quality controls needed to predictably release non-breaking changes, then you should do so whenever possible. You just can't do that with either of the SemVer prerelease versions.
Author
Owner

@ljharb commented on GitHub (Aug 12, 2021):

@jwdonahue the first part isn't entirely accurate; all of npm uses an older version of semver which says that in vX.Y.Z, v0.X.Y, and v0.0.X, the X is major, the Y minor, and the Z patch, and that's what the entire JS ecosystem uses.

<!-- gh-comment-id:897977081 --> @ljharb commented on GitHub (Aug 12, 2021): @jwdonahue the first part isn't entirely accurate; all of npm uses an older version of semver which says that in `vX.Y.Z`, `v0.X.Y`, and `v0.0.X`, the X is major, the Y minor, and the Z patch, and that's what the entire JS ecosystem uses.
Author
Owner

@jwdonahue commented on GitHub (Aug 13, 2021):

@ljharb What exactly about what I said isn't accurate? Does NPM do the major-shift-to-minor, non-SemVer thing for the 0.y.z prerelease forms? Or are you referring to the beta version of the spec that allowed the v prefix, which seems irrelevant to this conversation.

Addenda, I think I see it now. My zero looked like a capital O until I put it in code markup.

<!-- gh-comment-id:898169831 --> @jwdonahue commented on GitHub (Aug 13, 2021): @ljharb What exactly about what I said isn't accurate? Does NPM do the major-shift-to-minor, non-SemVer thing for the `0.y.z` prerelease forms? Or are you referring to the beta version of the spec that allowed the `v` prefix, which seems irrelevant to this conversation. Addenda, I think I see it now. My zero looked like a capital O until I put it in code markup.
Author
Owner

@ljharb commented on GitHub (Aug 13, 2021):

@jwdonahue im referring to 0.x non-prerelease versions; in the npm ecosystem and an earlier version of the semver spec, it is not “everything below v1 is always breaking”. Prereleases in the npm world thus work the same wrt their non-prerelease version pre-1.0 as post-1.0.

<!-- gh-comment-id:898171190 --> @ljharb commented on GitHub (Aug 13, 2021): @jwdonahue im referring to 0.x non-prerelease versions; in the npm ecosystem and an earlier version of the semver spec, it is *not* “everything below v1 is always breaking”. Prereleases in the npm world thus work the same wrt their non-prerelease version pre-1.0 as post-1.0.
Author
Owner

@jwdonahue commented on GitHub (Aug 13, 2021):

That's an NPM extension to SemVer. I don't think it was ever codified in a release version of the standard. If it was, a reference would be appreciated. In a SemVer compliant mode, NPM should treat all 0.y.z triples as indicating possibly breaking changes. I've never been a fan of NPM or Java, so I don't have much experience with it, but I do recall reading that NPM has a SemVer compliant mode. I for one, would never allow automation to accept any 0.y.z version bump without manual intervention.

<!-- gh-comment-id:898173983 --> @jwdonahue commented on GitHub (Aug 13, 2021): That's an NPM extension to SemVer. I don't think it was ever codified in a release version of the standard. If it was, a reference would be appreciated. In a SemVer compliant mode, NPM should treat all `0.y.z` triples as indicating possibly breaking changes. I've never been a fan of NPM or Java, so I don't have much experience with it, but I do recall reading that NPM has a SemVer compliant mode. I for one, would never allow automation to accept any `0.y.z` version bump without manual intervention.
Author
Owner

@ekpyron commented on GitHub (Aug 13, 2021):

For the record: historically, for whatever reason npm's semver implementation went for ea1b9e370e (from what I can tell contrary to anything the semver spec ever said and as a conscious choice towards ignoring the precise wording of the spec: https://github.com/npm/node-semver/pull/41#issuecomment-21354034) and then oscillated back and forth on that a few times to finally weaken it back to Many authors treat a `0.x` version as if the `x` were the major "breaking-change" indicator. (in d89ba57951). That's probably the source for the tendency of that ecosystem to not strictly comply to the semver spec in that regard.

<!-- gh-comment-id:898361998 --> @ekpyron commented on GitHub (Aug 13, 2021): For the record: historically, for whatever reason npm's semver implementation went for https://github.com/npm/node-semver/commit/ea1b9e370e5bfcfc2862ef90c583fab5004e21c8 (from what I can tell contrary to anything the semver spec ever said and as a conscious choice towards ignoring the precise wording of the spec: https://github.com/npm/node-semver/pull/41#issuecomment-21354034) and then oscillated back and forth on that a few times to finally weaken it back to ``Many authors treat a `0.x` version as if the `x` were the major "breaking-change" indicator.`` (in https://github.com/npm/node-semver/commit/d89ba579514765bdceb896c5232605e4b08827e4). That's probably the source for the tendency of that ecosystem to not strictly comply to the semver spec in that regard.
Author
Owner

@jwdonahue commented on GitHub (Nov 30, 2021):

All five published versions of the spec have the same wording:

Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable.

Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable.

Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable.

Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable.

Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable.

All prerelease versions should be treated by consumers as breaking changes. The fact that some tools apply other conventions to similar looking version strings, does not imply any relation to SemVer. There are many schemes that use version triples, and most have some form or other semantics around them, but they are not SemVer. If a publisher says their 0.a.b version string is SemVer, then it should be treated as a potentially breaking prerelease version.

<!-- gh-comment-id:982244249 --> @jwdonahue commented on GitHub (Nov 30, 2021): All five published versions of the spec have the same wording: - [1.0.0-beta #6](https://semver.org/spec/v1.0.0-beta.html#spec-item-6) > Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable. - [1.0.0 #6](https://semver.org/spec/v1.0.0.html#spec-item-6) > Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable. - [2.0.0-rc.1 #5](https://semver.org/spec/v2.0.0-rc.1.html#spec-item-5) > Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable. - [2.0.0-rc.2 #4](https://semver.org/spec/v2.0.0-rc.2.html#spec-item-4) > Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable. - [2.0.0 #4](https://semver.org/#spec-item-4) > Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable. All prerelease versions should be treated by consumers as breaking changes. The fact that some tools apply other conventions to similar looking version strings, does not imply any relation to SemVer. There are many schemes that use version triples, and most have some form or other _semantics_ around them, but they are not SemVer. If a publisher says their 0.a.b version string is SemVer, then it should be treated as a potentially breaking prerelease version.
Author
Owner

@IPMHERO commented on GitHub (Nov 25, 2022):

Cảm ơn

<!-- gh-comment-id:1327604881 --> @IPMHERO commented on GitHub (Nov 25, 2022): Cảm ơn
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/semver#2225