Process

Requests for Discussion (RFDs) capture ideas early enough to shape them through written discussion and preserve the reasoning behind decisions. An RFD is not authoritative merely because it exists; its state says how it should be read.

Writing an RFD

Reserve the next unused four-digit number and, on a branch, create rfd/NNNN/README.adoc and its implementation checklist, rfd/NNNN/IMPLEMENTATION.adoc. Both are AsciiDoc. Cross-link the two documents. Write for someone who was not in the room: lead with the conclusion, keep paragraphs short, and use plain words.

Use prediscussion while writing, or ideation for a topic placeholder. When the document is ready for review, open a pull request, set the state to discussion, and add that pull request as the discussion URL. Every pull request gets a preview of the site, linked from the pull request.

Before merging a proposal that represents project direction, move it to published. Once the described work is entirely implemented, update it to committed. Material changes to a published or committed RFD use a new pull request and retain the original discussion link unless the RFD documents a replacement.

Source format

Each RFD lives at rfd/NNNN/README.adoc, where NNNN is a four-digit number. The document starts with canonical AsciiDoc attributes and an unpadded title:

:authors: Name <[email protected]>
:state: prediscussion
:discussion:
:labels: project, software, process

= RFD 7 Example title

authors contains semicolon-separated owners. discussion contains the RFD’s pull-request URL once discussion starts. labels is a comma-separated set of searchable topics, starting with the project the RFD belongs to. The document is the single source of truth for this metadata; the site reads it from the attributes, so RFDs have no front matter.

An RFD is private when it belongs to a private source project or sets :visibility: private. A private RFD’s page and its place in the lists appear only to members of the chaba-dev GitHub organization who have signed in. Private projects themselves are also left out of the project filter until the reader signs in.

Implementation progress lives separately in the checklist, so the design and decision record stay stable while tasks are checked off. It starts with = RFD NNNN implementation checklist, links back with RFD N: Title, and lists one task per change that can land on its own, as AsciiDoc checklist items such as * [ ] Task and * [x] Done. The site shows the share of checked tasks as the RFD’s implementation progress.

Cross-references

Every mention of another RFD is an AsciiDoc cross-reference to it:

The protocol is defined in xref:../0002/README.adoc[RFD 2], and replay in
xref:../0002/README.adoc#_replay[RFD 2's replay rules].

The link resolves both on GitHub and on the site, where it points to that RFD’s page. A fragment names a section by Asciidoctor’s default ID: followed by the lowercased title with between words. Name each RFD separately: write "RFD 1 through RFD 4" with a link on each, not "RFDs 1 through 4".

States

  • prediscussion: actively being written and not ready for broad review.

  • ideation: a narrowly scoped topic or scratchpad without active revision.

  • discussion: under active review in the linked pull request.

  • published: discussion has converged and the RFD expresses project direction.

  • committed: the proposal is fully implemented and describes current behavior.

  • abandoned: deliberately not proceeding or retained only for history.

The usual path is prediscussion or ideation to discussion, then published, and eventually committed. abandoned is an off-ramp at any stage. Checklist progress does not determine an RFD’s state.