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: 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. 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 public unless it sets :visibility: private. A private RFD’s page,
and its place in the lists, appear only to members of the ryusen-sys GitHub
organization who have signed 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.