Skip to content

Avoid minor releases or redefine minor release to relax SemVer restrictions #2019

Closed
@tedepstein

Description

@tedepstein

Discussed on the TSC call, Sep. 26, 2019.

Here's a summary:

  • I found it difficult to think through certain design challenges with JSON Schema alignment, especially w.r.t. nullable, because there was an apparent conflict between the need for a 3.1 release with this change vs. adhering strictly to Semantic Versioning.
  • In our discussion, it came to light that this is a recurring problem with Semantic Versioning, and it has been criticized for these reasons:
    • It tends to take up time and energy with discussions and problem-solving that are often not the most important things for a team to focus on.
    • The rigid requirement of backward compatibility doesn't work well for language specifications in particular, where the intent of a minor release is to introduce minor, additive, or evolutionary changes. A minor release can be consistent with that intent, without adhering strictly to SemVer's backward compatibility requirement.
    • Where these changes might risk breakage, even for a very small group of users or implementations, even if those breakages are easily detected and repaired, Semantic Versioning forces a no-win situation, where you have to make it a major release, or defer the change to the next major release, or consciously make an exception to the semantic versioning policy (knowingly breaking a promise that you've made, and hoping the consequences won't be too bad).
    • To user communities who are especially sensitive to stability and vendor support, calling the release 3.1 vs. 4.0 can have a significant impact on the perception of that specification version, and willingness to adopt. Marketing understands this, and needs to weigh in the versioning decision -- whether to call it a major or a minor release -- so they can effectively manage the positioning and communication around the release. But these considerations can come in conflict with the rigid backward compatibility requirements of SemVer.
  • Clarifications of the current specification are a tricky grey area. If the TSC meant for the specification to say one thing, but the specification clearly says something else, SemVer says we have to treat the correction as a breaking change, therefore put it into a major version release. If the specification itself is ambiguous or unclear, then it's more a matter of judgment as to whether the correction can go into a patch, minor or major release.
  • We noted that this is the first minor release of the OpenAPI Specification since adopting Semantic Versioning in OAS 3.0. For this group, working on this specification, SemVer is still an experiment.

We discussed a few possible paths forward:

  • Keep SemVer in the spec as the official policy, but don't worry so much about breaking changes, where we think the breakage only affects edge cases. Interpret SemVer as "best-effort SemVer." We promise to try not to break things in minor releases, and we promise to keep the impact of breakages as low as possible, to the best of our judgment.
  • Ditch SemVer entirely, and write our own versioning policy, or find an alternative versioning policy that works well for our purposes.
  • Avoid doing minor releases of the OpenAPI spec, at least most of the time. Make each significant specification release a new major version. Exercise reasonable precaution in making breaking changes, call out breaking changes explicitly, and try to get the user community used to the idea that a major release isn't something to be afraid of, it's just how we roll.

I'll add a fourth idea:

  • Keep a modified version of SemVer in the spec. Say we adhere to Semantic Versioning, but minor releases may include breaking changes that are expected to have minor impact. With each minor release, explicitly call out the breaking changes in the spec itself (e.g. in a version history appendix) or in a supplementary document.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions