[GH-ISSUE #1120] Proposed v2.0.1: BREAKING.ADDING.FIXING #1545

Open
opened 2026-04-16 10:57:22 -05:00 by GiteaMirror · 10 comments
Owner

Originally created by @Incognito on GitHub (May 19, 2025).
Original GitHub issue: https://github.com/semver/semver/issues/1120

There's a lot of misuse or misunderstanding of SemVer in the wild. Common example we all experience: people break the public API but do not increment MAJOR.

I think a big part of this is that yes of course people are not reading the documentation, but we could dig a pit of success for these people to fall into instead of trying to teach them all how to use it correctly. Presently, the names of the numbers is closer in semantics to importance assigned to a number instead of semantics related to the change itself.

I propose that we rename these numbers in the docs to something semantically aligned with what an increment in the number does instead of what position it holds in the sequence.

There's a lot of room for wishy washy interpretations of what "major" and "minor" mean (especially for people who don't read the spec in detail, or lack experience to learn from someone who understands it). There is much less room for ad-hoc interpretation when they have something like "Breaking.Adding.Fixing" instead.

"This is the number I increase when it breaks someone who updates the package version".
"This is the number I increase when it fixes a bug but doesn't add a feature or break the API".
Etc.

Perhaps you disagree with the specific words in my proposal, if so, do you disagree with the general concept of renaming the concept in the docs too?

This change should be fully backwards compatible with the package ecosystem and (as I see it) does not "add a new feature".

If agreed I can submit the change request. I think this would make a gentle nudge on the global package ecosystem towards a slightly better better state.

Originally created by @Incognito on GitHub (May 19, 2025). Original GitHub issue: https://github.com/semver/semver/issues/1120 There's a lot of misuse or misunderstanding of SemVer in the wild. Common example we all experience: people break the public API but do not increment MAJOR. I think a big part of this is that yes of course people are not reading the documentation, but we could dig a pit of success for these people to fall into instead of trying to teach them all how to use it correctly. Presently, the names of the numbers is closer in semantics to importance assigned to a number instead of semantics related to the change itself. I propose that we rename these numbers in the docs to something semantically aligned with what an increment in the number does instead of what position it holds in the sequence. There's a lot of room for wishy washy interpretations of what "major" and "minor" mean (especially for people who don't read the spec in detail, or lack experience to learn from someone who understands it). There is much less room for ad-hoc interpretation when they have something like "Breaking.Adding.Fixing" instead. "This is the number I increase when it breaks someone who updates the package version". "This is the number I increase when it fixes a bug but doesn't add a feature or break the API". Etc. Perhaps you disagree with the specific words in my proposal, if so, do you disagree with the general concept of renaming the concept in the docs too? This change should be fully backwards compatible with the package ecosystem and (as I see it) does not "add a new feature". If agreed I can submit the change request. I think this would make a gentle nudge on the global package ecosystem towards a slightly better better state.
Author
Owner

@dunyakirkali commented on GitHub (May 19, 2025):

I like this idea

<!-- gh-comment-id:2890681860 --> @dunyakirkali commented on GitHub (May 19, 2025): I like this idea
Author
Owner

@zafarkhaja commented on GitHub (May 19, 2025):

Sure, better names won't hurt and might go a long way, but I believe coming up with something comprehensive will prove to be the biggest challenge. I know the proposed naming is just an example but to highlight the issue, under this scheme how does one identify the number to increment, let's say, for "deprecating" changes?

Just as an idea, what if we approach this from the opposite side, meaning not in terms of API changes but in terms of changes to client code that the API changes will entail should you decide to upgrade the dependency?

<!-- gh-comment-id:2891059648 --> @zafarkhaja commented on GitHub (May 19, 2025): Sure, better names won't hurt and might go a long way, but I believe coming up with something comprehensive will prove to be the biggest challenge. I know the proposed naming is just an example but to highlight the issue, under this scheme how does one identify the number to increment, let's say, for "deprecating" changes? Just as an idea, what if we approach this from the opposite side, meaning not in terms of API changes but in terms of changes to client code that the API changes will entail should you decide to upgrade the dependency?
Author
Owner

@Incognito commented on GitHub (May 19, 2025):

@zafarkhaja That's a really cool direction. Something like "BREAKS_API.EXTENDS_API.API_PRESERVING_FIX" is clear to the consumer of a package and the vendor too. I think it covers your deprecation case.

Not sure how you handle it but I like the method of: release a add_stuff with new features and tag methods deprecated. next version breaks_stuff and removes deprecated code. I think some people prefer to directly break_stuff (based on their support needs).

<!-- gh-comment-id:2891191007 --> @Incognito commented on GitHub (May 19, 2025): @zafarkhaja That's a really cool direction. Something like "BREAKS_API.EXTENDS_API.API_PRESERVING_FIX" is clear to the consumer of a package and the vendor too. I think it covers your deprecation case. Not sure how you handle it but I like the method of: release a add_stuff with new features and tag methods deprecated. next version breaks_stuff and removes deprecated code. I think some people prefer to directly break_stuff (based on their support needs).
Author
Owner

@zafarkhaja commented on GitHub (May 19, 2025):

With regard to deprecations, as per the current version of SemVer (p.7) "deprecating" changes lead to increments of the minor version which you call EXTENDS_API. Of course, it's a common practice to offer a replacement for a deprecated method but it's not always the case. Like in my situation where I realized that providing such functionality was incorrect to begin with, so I just deprecated the method without a replacement. But even with a replacement, in my opinion, it's still debatable whether providing a better alternative to a deprecated method could be considered as extension of the API or its improvement.

The point I was trying to make is that from the dependency's point of view the version numbers can be incremented for various reasons, sometimes unrelated to the API it provides. For instance, in the case of the minor version, the change could be a new API method, or it can be some sort of internal improvement like refactoring or performance optimization, or maybe even a major improvement to the API documentation which is shipped with the dependency (such as Javadoc). All this variety of reasons complicates the naming, as it's hard to find a descriptive name capable of exhaustively covering all possibilities.

On the other hand, from the dependent's point of view the possibilities are limited, you either will have to adjust your code or you won't. In the case of the latter possibility, the decision to upgrade is based on the preferability of the changes. So I was thinking that this limitedness of possibilities might simplify the naming.

<!-- gh-comment-id:2891614523 --> @zafarkhaja commented on GitHub (May 19, 2025): With regard to deprecations, as per the current version of SemVer (p.7) "deprecating" changes lead to increments of the minor version which you call EXTENDS_API. Of course, it's a common practice to offer a replacement for a deprecated method but it's not always the case. Like in my [situation](https://github.com/zafarkhaja/jsemver/blob/v0.10.2/src/main/java/com/github/zafarkhaja/semver/Version.java#L1673) where I realized that providing such functionality was incorrect to begin with, so I just deprecated the method without a replacement. But even with a replacement, in my opinion, it's still debatable whether providing a better alternative to a deprecated method could be considered as extension of the API or its improvement. The point I was trying to make is that from the dependency's point of view the version numbers can be incremented for various reasons, sometimes unrelated to the API it provides. For instance, in the case of the minor version, the change could be a new API method, or it can be some sort of internal improvement like refactoring or performance optimization, or maybe even a major improvement to the API documentation which is shipped with the dependency (such as Javadoc). All this variety of reasons complicates the naming, as it's hard to find a descriptive name capable of exhaustively covering all possibilities. On the other hand, from the dependent's point of view the possibilities are limited, you either will have to adjust your code or you won't. In the case of the latter possibility, the decision to upgrade is based on the preferability of the changes. So I was thinking that this limitedness of possibilities might simplify the naming.
Author
Owner

@tanadedtk-eng commented on GitHub (Aug 26, 2025):

Ok

<!-- gh-comment-id:3225948356 --> @tanadedtk-eng commented on GitHub (Aug 26, 2025): Ok
Author
Owner

@horvathmilcsi commented on GitHub (Sep 25, 2025):

Very important proposal! "Major" and "Minor" simply not clear terms enough. Naming should be self explanatory. Thumbs up!

<!-- gh-comment-id:3335947551 --> @horvathmilcsi commented on GitHub (Sep 25, 2025): Very important proposal! "Major" and "Minor" simply not clear terms enough. Naming should be self explanatory. Thumbs up!
Author
Owner
<!-- gh-comment-id:3699889587 --> @ghost commented on GitHub (Dec 30, 2025): https://github.com/semver/semver/issues/1120#issuecomment-3335947551
Author
Owner

@jwdonahue commented on GitHub (Mar 13, 2026):

This has come up in the past:

  • Rename "Major" to Breaking and "Minor" to Feature #411
  • The terms MAJOR.MINOR.PATCH are not semantic #625

Here's what the original author had to say on the topic:

https://github.com/semver/semver/issues/411#issuecomment-347050750

The MAJOR.MINOR.PATCH nomenclature, dates back to at least the 90's, probably earlier. It was a well known pattern, by the time @mojombo created the SemVer spec. There is nothing in the spec that says MAJOR is only for breaking changes. Likewise for MINOR and feature additions. You are free to bump any of them as you see fit.

<!-- gh-comment-id:4052590632 --> @jwdonahue commented on GitHub (Mar 13, 2026): This has come up in the past: - Rename "Major" to Breaking and "Minor" to Feature #411 - The terms MAJOR.MINOR.PATCH are not semantic #625 Here's what the original author had to say on the topic: https://github.com/semver/semver/issues/411#issuecomment-347050750 The MAJOR.MINOR.PATCH nomenclature, dates back to at least the 90's, probably earlier. It was a well known pattern, by the time @mojombo created the SemVer spec. There is nothing in the spec that says MAJOR is only for breaking changes. Likewise for MINOR and feature additions. You are free to bump any of them as you see fit.
Author
Owner

@jwdonahue commented on GitHub (Mar 13, 2026):

Well it seems I also had something to say on this topic in the past:

https://github.com/semver/semver/issues/625#issuecomment-913860491

<!-- gh-comment-id:4052651378 --> @jwdonahue commented on GitHub (Mar 13, 2026): Well it seems I also had something to say on this topic in the past: https://github.com/semver/semver/issues/625#issuecomment-913860491
Author
Owner

@jwdonahue commented on GitHub (Mar 13, 2026):

I also propsed HR.MR.LR for field labels, here, where:

HR == High Risk
MR == Medium Risk
LR == Low Risk

See the linked discussion.

<!-- gh-comment-id:4052697106 --> @jwdonahue commented on GitHub (Mar 13, 2026): I also propsed HR.MR.LR for field labels, [here](https://github.com/semver/semver/issues/625#issuecomment-913901711), where: HR == High Risk MR == Medium Risk LR == Low Risk See the linked discussion.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/semver#1545