Documentation Style
===================

Each document should begin with a brief single sentence to describe what this
file contains: in this case a description of the style to write documentation
in.

Format
------

Documentation is written in Commonmark markdown.

Sections
--------

Markdown supports headings through the `#` prefix on text. Please avoid heavily
nested titles (h6, or 6 `#` characters) and instead re-evaluate the document structure.

Correct capitalisation for long section names
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Headings should be in `sentence case <https://apastyle.apa.org/style-grammar-guidelines/capitalization/sentence-case>`,
as represented by this document.

TODOs
-----

Any file in this repository might make it onto the matrix.org site, and as such
we do not want ``TODO`` markers visible there. For internal comments, notes, TODOs,
etc please use standard markdown comments (`<!-- TODO TravisR: Fix this -->`). Please
include your name in the TODO comment so we know who to ask about it in the future.

Line widths
-----------

We use 80 characters for line widths. This is a guideline and can be ignored IF
AND ONLY IF it makes reading more legible. Use common sense.

For proposals, please use 120 characters as a guide.

Stylistic notes
---------------

General
~~~~~~~

* Try to write clearly and unambiguously. Remember that many readers will not
  have English as their first language.

* Prefer British English (colour, -ise) to American English.

* The word "homeserver" is spelt thus (rather than "home server", "Homeserver",
  or (argh) "Home Server"). However, an identity server is two words.

* An "identity server" (spelt thus) implements the Identity Service API (also spelt
  thus). However, "Application Services" (spelt thus) implement the Application Service
  API. Application Services should not be called "appservices" in documentation.

  .. Rationale: "homeserver" distinguishes from a "home server" which is a server
     you have at home. "identity server" is clear, whereas "identityserver" is
     horrible.

* Lists should:

  * Be introduced with a colon.
  * Be used where they provide clarity.
  * Contain entries which start with a capital and end with a full stop.

* When talking about properties in JSON objects, prefer the word "property" to "field",
  "member", or various other alternatives. For example: "this property will be set to
  X if ...". Also avoid the term "key" unless you are specifically talking about the
  *name* of a property - and be mindful of the scope for confusion with cryptographic
  keys.

* "i.e." (*id est*) is an abbreviation and hence is written with two full
  stops. Prefer full sentences where possible without loss of clarity.

* Prefer "for example" over "e.g.". If you *must* use "e.g.", remember it too
  is an abbreviation (*exempli gratia*).

Changes between spec versions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Sections should reference the Matrix spec version they were added/changed in. This
is often a guess at what the next version will be - please use the currently released
version with a minor version bump as the referenced version. For example, if the
current version is `v1.1` then annotate your changes with `v1.2`.

"Added/changed in" tags can be documented as the following:

* `{{% added-in v="1.2" %}}` or `{{% changed-in v="1.2" %}}` within Markdown documents.
* `x-addedInMatrixVersion` and `x-changedInMatrixVersion` within OpenAPI.

**Tip**: If you're trying to inline the Markdown version and getting unexpected results,
try replacing the `%` symbols with `<` and `>`, changing how Hugo renders the shortcode.

OpenAPI
~~~~~~~

When writing OpenAPI specifications for the API endpoints, follow these rules:

* ``summary``: a phrase summarising what this API does. Start with a capital,
  end with a full stop. Examples: "Sends an event."; "Searches the directory."

* ``description``: a longer description of the behaviour of this API, written
  in complete sentences. Use multiple paragraphs if necessary.

  Example:

      This API sends an event to the room. The server must ensure that the user
      has permission to post events to this room.

* ``operationId``: a camelCased unique identifier for this endpoint. This will
  be used to automatically generate bindings for the endpoint.

* Parameter and property ``description``\s: a phrase summarising the behaviour
  of this parameter or property, optionally followed by sentences giving more
  detailed explanations. Start with a capital, end with a full stop.

  The description is also the place to define default values for optional
  properties. Use the wording "Defaults to X [if unspecified]."

  Some descriptions start with the word "Optional" to explicitly mark optional
  properties and parameters. This is redundant. Instead, use the ``required``
  property to mark those that are required.

Room versions
~~~~~~~~~~~~~

Room versions are fully specified to cover the entirety of their composition for
client and server implementations to reference. As such, they have a relatively
strict format that must be followed, described below.

These rules do not affect MSCs.

The introduction must cover:

* The version the new room version builds on, if any.
* A brief (one or two line) description of what the room version is expected to
  consist of. For example, "..., adding new redaction rules to cover memberships".

The next section must then be "Client considerations" to help client developers avoid
the naturally complex "Server implementation components" later on. This section must:

* Clearly describe any and all changes which affect users of the Client-Server API.
* Clearly make reference to the redaction rules. A copy/paste example of this is in
  Room Version 3: "Though unchanged in this room version, clients which implement the
  redaction algorithm locally should refer to the [redactions] section below for a full
  overview."

The next section must then be "Server implementation components". This section must:

* Start with the copy/pasted warning that clients should skip or ignore the section.
* Repeat the introduction using server-focused language. This includes repeating which
  room version, if any, the room version builds upon.
* Clearly describe any and all changes which affect server implementations. This
  includes a "Redactions" section, even if covered by the client considerations section.
  See Room Version 9 for an example.

Finally, the last section must then be an "Unchanged since vX" section, where ``vX``
is the room version the version builds upon. If the room version doesn't build upon
another room version, this section is excluded.

In each of the client, server, and unchanged sections the subheadings must be in the
following order:

* Redactions
* Handling redactions (if applicable)
* Event IDs (if applicable)
* Event format
* Authorization rules
* State resolution
* Canonical JSON
* Signing key validity period (if applicable)

Within a given room version, these subheadings must appear at least once. Applicability
of the headings depends on the room version a new version builds upon: if the underlying
room version contains the subheading, the new room version must also contain the subheading.

The subheadings which are always deemed as client-affecting are:

* Redactions

When a new subheading is added, it must be referenced and ordered in this document.

Describing grammar
~~~~~~~~~~~~~~~~~~

Use  `RFC5234-style ABNF <https://datatracker.ietf.org/doc/html/rfc5234>`_ when describing
the grammar for something in the spec, such as user IDs or server names. Use lowercase
and underscore-delimited element names (`user_id`, not `UserID` or `user-id`).
