What if we versioned the whole spec?
parent
4ee990e26f
commit
5f8b7167a5
@ -0,0 +1,101 @@
|
||||
# MSC2844: Using a global version number for the entire specification
|
||||
|
||||
Currently we have 4 kinds of versions, all of which have slightly different use cases and semantics
|
||||
which apply:
|
||||
|
||||
1. The individual API spec document versions, tracked as revisions (`r0.6.1`, for example).
|
||||
2. Individual endpoint versioning underneath an API spec document version (`/v1/`, `/v2/`, etc). Note
|
||||
that the client-server API currently ties the major version of its spec document version to the
|
||||
endpoint, thus making most endpoints under it as `/r0/` (currently).
|
||||
3. Room versions to freezing a set of behaviour and algorithms on a per-room basis. These are well
|
||||
defined in the spec and are not covered here: https://matrix.org/docs/spec/#room-versions
|
||||
4. An overarching "Matrix" version, largely for marketing purposes. So far we've only cut Matrix 1.0
|
||||
back when we finalized the initial versions of the spec documents, but have not cut another one
|
||||
since.
|
||||
|
||||
This current system is slightly confusing, but has some drawbacks for being able to compile builds of
|
||||
the spec documents (published on matrix.org) and generally try and communicate what supported versions
|
||||
an implementation might have. For example, Synapse currently supports 4 different APIs, all of which
|
||||
have their own versions, and all of which would need to be considered and compared when validating
|
||||
another implementation of Matrix such as a client or push gateway. Instead, Synapse could say it
|
||||
supports "Matrix 1.1", making compatibility much easier to determine - this is what this proposal aims
|
||||
to define.
|
||||
|
||||
**Note**: This proposal does nothing to room versions and are thus not included beyond this line.
|
||||
|
||||
## Proposal
|
||||
|
||||
Instead of having per-API versions (`r0.6.1`, etc), we have a version that spans the entire specification.
|
||||
This version represents versioning for the index (which has quite a bit of unversioned specification on
|
||||
it currently), the APIs, and the appendices (which are also currently unversioned). This effectively
|
||||
makes the marketing version previously mentioned an actual version.
|
||||
|
||||
Doing this has the benefits previously alluded to:
|
||||
|
||||
* Implementations of Matrix can now easily compare their supported versions using a single identifier
|
||||
without having to (potentially) indicate which API they built support for.
|
||||
* Publishing the specification is less likely to contain broken or outdated links due to API versions
|
||||
not matching up properly. This is currently an issue where if we want to release a new version of
|
||||
the server-server specification then we must also either rebuild or manually fix the blob of HTML
|
||||
known as the client-server API to account for the new version - we often forget this step, sometimes
|
||||
because it's just too difficult.
|
||||
* Explaining to people what version Matrix or any of the documents is at becomes incredibly simplified.
|
||||
No longer will we have to explain most of what the introduction to this proposal covers to every new
|
||||
person who asks.
|
||||
|
||||
Structurally, the API documents remain mostly unchanged. We'll still have a client-server API, server-server
|
||||
API, etc, but won't have versions associated with those particular documents. This also means they would
|
||||
lose their individual changelogs in favour of a more general changelog.
|
||||
|
||||
The more general changelog would likely have sections for each API that had changes (client-server,
|
||||
server-server, etc), likely indicating if a particular API had no changes between the release for
|
||||
completeness - things like the push gateway API are only updated every couple years at best.
|
||||
|
||||
For the endpoints which are currently individually versioned, specifically everything except the client-server
|
||||
API's endpoints, there are no changes. The most this MSC does is formalize that endpoints can have
|
||||
per-endpoint versions to them, though this MSC does not attempt to define when/how those versions work.
|
||||
|
||||
For the client-server API in particular, some changes are needed. For backwards compatibility reasons,
|
||||
servers which support the `rN` (`r0.6.1`, etc) series of versions still advertise them as normal. To
|
||||
support the new Matrix versions, a server would add the version number of Matrix to the `/versions`
|
||||
endpoint: `{"versions":["r0.5.0", "r0.6.0", "v1.1.0"]}`. Servers do not need to advertise every
|
||||
patch version as there should not be any significant changes in patch versions. If a server supports
|
||||
`v1.1.0`, it also supports `v1.1.7`, for example.
|
||||
|
||||
The endpoints themselves in the client-server API also get converted to per-endpoint versions, where
|
||||
all the `/r0/` endpoints now become `/v1/`.
|
||||
|
||||
For grammar, the Matrix version follows semantic versioning. Semantic versioning is typically used for
|
||||
software and not specification though, so here's how it translates:
|
||||
|
||||
* Major versions indicate that a breaking change happened *somewhere* in the specification. Because we'd
|
||||
be under a global version, a breaking change in the push gateway (for example) would mean a breaking
|
||||
change for all of Matrix. We will want to avoid incrementing this number as much as humanly possible.
|
||||
The endpoints are also versioned invidually, so typically a format change in an endpoint would actually
|
||||
be a minor version increase for Matrix.
|
||||
* Minor versions indicate new features, endpoints, or other enhancements which are backwards compatible
|
||||
in nature. This is the number we strive to increase most often.
|
||||
* Patch versions are when the changes are solely aesthetic, such as clarifications to the specification,
|
||||
spelling error fixes, styling/organizational changes, etc.
|
||||
|
||||
If accepted, this MSC will declare the spec as it is at the time as Matrix v1.1.0.
|
||||
|
||||
## Potential issues / alternatives
|
||||
|
||||
To be completed.
|
||||
|
||||
## Alternatives
|
||||
|
||||
To be completed.
|
||||
|
||||
## Security considerations
|
||||
|
||||
None relevant - if we need to make a security release for Matrix then we simply make a release and
|
||||
advertise accordingly.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
It's not recommended by this MSC to implement this proposal before it lands in the specification, however
|
||||
if an implementation wishes to do so then it can advertise `org.matrix.msc2844` in the `unstable_features`
|
||||
section of `/versions`, and use `/_matrix/client/unstable/org.matrix.msc2844` in place of
|
||||
`/_matrix/client/r0`.
|
Loading…
Reference in New Issue