Skip to content

Commit 6e97b1a

Browse files
committed
Update the RFC process with sub-teams, amongst other things.
The libs section was authored by @gankro, see #1213 and [this discuss thread](https://internals.rust-lang.org/t/the-life-and-death-of-an-api/2087) for previous discussion. We're currently missing guideline for the tools sub-team. I just didn't have anything to hand, hopefully we can remedy that in a followup PR.
1 parent 2604c80 commit 6e97b1a

File tree

4 files changed

+292
-75
lines changed

4 files changed

+292
-75
lines changed

README.md

Lines changed: 94 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ implemented and reviewed via the normal GitHub pull request workflow.
88

99
Some changes though are "substantial", and we ask that these be put
1010
through a bit of a design process and produce a consensus among the Rust
11-
community and the [core team].
11+
community and the [sub-team]s.
1212

1313
The "RFC" (request for comments) process is intended to provide a
1414
consistent and controlled path for new features to enter the language
@@ -75,19 +75,21 @@ the direction the language is evolving in.
7575
* [RFC Postponement]
7676
* [Help this is all too informal!]
7777

78+
7879
## When you need to follow this process
7980
[When you need to follow this process]: #when-you-need-to-follow-this-process
8081

81-
You need to follow this process if you intend to make "substantial"
82-
changes to Rust, Cargo, Crates.io, or the RFC process itself. What constitutes
83-
a "substantial" change is evolving based on community norms, but may include
84-
the following.
82+
You need to follow this process if you intend to make "substantial" changes to
83+
Rust, Cargo, Crates.io, or the RFC process itself. What constitutes a
84+
"substantial" change is evolving based on community norms and varies depending
85+
on what part of the ecosystem you are proposing to change, but may include the
86+
following.
8587

8688
- Any semantic or syntactic change to the language that is not a bugfix.
8789
- Removing language features, including those that are feature-gated.
88-
- Changes to the interface between the compiler and libraries,
89-
including lang items and intrinsics.
90-
- Additions to `std`
90+
- Changes to the interface between the compiler and libraries, including lang
91+
items and intrinsics.
92+
- Additions to `std`.
9193

9294
Some changes do not require an RFC:
9395

@@ -103,6 +105,15 @@ If you submit a pull request to implement a new feature without going
103105
through the RFC process, it may be closed with a polite request to
104106
submit an RFC first.
105107

108+
For more details on when an RFC is required, please see the following specific
109+
guidelines, these correspond with some of the Rust community's
110+
[sub-teams](http://www.rust-lang.org/team.html):
111+
112+
* [language changes](lang_changes.md),
113+
* [library changes](libs_changes.md),
114+
* [compiler changes](compiler_changes.md).
115+
116+
106117
## Before creating an RFC
107118
[Before creating an RFC]: #before-creating-an-rfc
108119

@@ -125,12 +136,12 @@ on the [RFC issue tracker][issues], and occasionally posting
125136
review.
126137

127138
As a rule of thumb, receiving encouraging feedback from long-standing
128-
project developers, and particularly members of the [core team][core]
139+
project developers, and particularly members of the relevant [sub-team]
129140
is a good indication that the RFC is worth pursuing.
130141

131142
[issues]: https://github.com/rust-lang/rfcs/issues
132143
[discuss]: http://discuss.rust-lang.org/
133-
[core]: https://github.com/rust-lang/rust/wiki/Note-core-team
144+
134145

135146
## What the process is
136147
[What the process is]: #what-the-process-is
@@ -141,49 +152,55 @@ is 'active' and may be implemented with the goal of eventual inclusion
141152
into Rust.
142153

143154
* Fork the RFC repo http://github.com/rust-lang/rfcs
144-
* Copy `0000-template.md` to `text/0000-my-feature.md` (where
145-
'my-feature' is descriptive. don't assign an RFC number yet).
146-
* Fill in the RFC. Put care into the details: RFCs that do not
147-
present convincing motivation, demonstrate understanding of the
148-
impact of the design, or are disingenuous about the drawbacks or
149-
alternatives tend to be poorly-received.
150-
* Submit a pull request. As a pull request the RFC will receive design
151-
feedback from the larger community, and the author should be prepared
152-
to revise it in response.
153-
* During Rust triage, the pull request will either be closed (for RFCs
154-
that clearly will not be accepted) or assigned a *shepherd*. The
155-
shepherd is a trusted developer who is familiar with the process, who
156-
will help to move the RFC forward, and ensure that the right people
157-
see and review it.
158-
* Build consensus and integrate feedback. RFCs that have broad support
159-
are much more likely to make progress than those that don't receive
160-
any comments. The shepherd assigned to your RFC should help you get
161-
feedback from Rust developers as well.
155+
* Copy `0000-template.md` to `text/0000-my-feature.md` (where 'my-feature' is
156+
descriptive. don't assign an RFC number yet).
157+
* Fill in the RFC. Put care into the details: RFCs that do not present
158+
convincing motivation, demonstrate understanding of the impact of the design, or
159+
are disingenuous about the drawbacks or alternatives tend to be poorly-received.
160+
* Submit a pull request. As a pull request the RFC will receive design feedback
161+
from the larger community, and the author should be prepared to revise it in
162+
response.
163+
* Each pull request will be labeled with the most relevant [sub-team].
164+
* Each sub-team triages its RFC PRs. The sub-team will will either close the PR
165+
(for RFCs that clearly will not be accepted) or assign it a *shepherd*. The
166+
shepherd is a trusted developer who is familiar with the RFC process, who will
167+
help to move the RFC forward, and ensure that the right people see and review
168+
it.
169+
* Build consensus and integrate feedback. RFCs that have broad support are much
170+
more likely to make progress than those that don't receive any comments. The
171+
shepherd assigned to your RFC should help you get feedback from Rust developers
172+
as well.
162173
* The shepherd may schedule meetings with the author and/or relevant
163-
stakeholders to discuss the issues in greater detail, and in some
164-
cases the topic may be discussed at the larger [weekly meeting]. In
165-
either case a summary from the meeting will be posted back to the RFC
166-
pull request.
167-
* Once both proponents and opponents have clarified and defended
168-
positions and the conversation has settled, the shepherd will take it
169-
to the [core team] for a final decision.
170-
* Eventually, someone from the [core team] will either accept the RFC
171-
by merging the pull request, assigning the RFC a number (corresponding
172-
to the pull request number), at which point the RFC is 'active', or
173-
reject it by closing the pull request.
174+
stakeholders to discuss the issues in greater detail.
175+
* The sub-team will discuss the RFC PR, as much as possible in the comment
176+
thread of the PR itself. Offline discussion will be summarized on the PR comment
177+
thread.
178+
* Once both proponents and opponents have clarified and defended positions and
179+
the conversation has settled, the RFC will enter its *final comment period*
180+
(FCP). This is a final opportunity for the community to comment on the PR and is
181+
a reminder for all members of the sub-team to be aware of the RFC.
182+
* The FCP lasts one week. It may be extended if consensus between sub-team
183+
members cannot be reached. At the end of the FCP, the [sub-team] will either
184+
accept the RFC by merging the pull request, assigning the RFC a number
185+
(corresponding to the pull request number), at which point the RFC is 'active',
186+
or reject it by closing the pull request. How exactly the sub-team decide on an
187+
RFC is up to the sub-team.
188+
174189

175190
## The role of the shepherd
176191
[The role of the shepherd]: #the-role-of-the-shepherd
177192

178-
During triage, every RFC will either be closed or assigned a shepherd.
179-
The role of the shepherd is to move the RFC through the process. This
180-
starts with simply reading the RFC in detail and providing initial
181-
feedback. The shepherd should also solicit feedback from people who
182-
are likely to have strong opinions about the RFC. Finally, when this
183-
feedback has been incorporated and the RFC seems to be in a steady
184-
state, the shepherd will bring it to the meeting. In general, the idea
185-
here is to "front-load" as much of the feedback as possible before the
186-
point where we actually reach a decision.
193+
During triage, every RFC will either be closed or assigned a shepherd from the
194+
relevant sub-team. The role of the shepherd is to move the RFC through the
195+
process. This starts with simply reading the RFC in detail and providing initial
196+
feedback. The shepherd should also solicit feedback from people who are likely
197+
to have strong opinions about the RFC. When this feedback has been incorporated
198+
and the RFC seems to be in a steady state, the shepherd and/or sub-team leader
199+
will announce an FCP. In general, the idea here is to "front-load" as much of
200+
the feedback as possible before the point where we actually reach a decision -
201+
by the end of the FCP, the decision on whether or not to accept the RFC should
202+
be obvious from the RFC discussion thread.
203+
187204

188205
## The RFC life-cycle
189206
[The RFC life-cycle]: #the-rfc-life-cycle
@@ -205,35 +222,36 @@ through to completion: authors should not expect that other project
205222
developers will take on responsibility for implementing their accepted
206223
feature.
207224

208-
Modifications to active RFC's can be done in followup PR's. We strive
225+
Modifications to active RFC's can be done in follow-up PR's. We strive
209226
to write each RFC in a manner that it will reflect the final design of
210227
the feature; but the nature of the process means that we cannot expect
211228
every merged RFC to actually reflect what the end result will be at
212-
the time of the next major release; therefore we try to keep each RFC
213-
document somewhat in sync with the language feature as planned,
214-
tracking such changes via followup pull requests to the document.
229+
the time of the next major release.
230+
231+
In general, once accepted, RFCs should not be substantially changed. Only very
232+
minor changes should be submitted as amendments. More substantial changes should
233+
be new RFCs, with a note added to the original RFC. Exactly what counts as a
234+
"very minor change" is up to the sub-team to decide. There are some more
235+
specific guidelines in the sub-team RFC guidelines for the [language](lang_changes.md),
236+
[libraries](libs_changes.md), and [compiler](compiler_changes.md).
215237

216-
An RFC that makes it through the entire process to implementation is
217-
considered 'complete' and is moved to the 'complete' folder; an RFC
218-
that fails after becoming active is 'inactive' and moves to the
219-
'inactive' folder.
220238

221239
## Reviewing RFC's
222240
[Reviewing RFC's]: #reviewing-rfcs
223241

224242
While the RFC PR is up, the shepherd may schedule meetings with the
225243
author and/or relevant stakeholders to discuss the issues in greater
226-
detail, and in some cases the topic may be discussed at the larger
227-
[weekly meeting]. In either case a summary from the meeting will be
244+
detail, and in some cases the topic may be discussed at a sub-team
245+
meeting. In either case a summary from the meeting will be
228246
posted back to the RFC pull request.
229247

230-
The core team makes final decisions about RFCs after the benefits and
231-
drawbacks are well understood. These decisions can be made at any
232-
time, but the core team will regularly issue decisions on at least a
233-
weekly basis. When a decision is made, the RFC PR will either be
234-
merged or closed, in either case with a comment describing the
235-
rationale for the decision. The comment should largely be a summary of
236-
discussion already on the comment thread.
248+
A sub-team makes final decisions about RFCs after the benefits and drawbacks are
249+
well understood. These decisions can be made at any time, but the sub-team will
250+
regularly issue decisions. When a decision is made, the RFC PR will either be
251+
merged or closed, in either case with a comment describing the rationale for the
252+
decision. The comment should largely be a summary of discussion already on the
253+
comment thread.
254+
237255

238256
## Implementing an RFC
239257
[Implementing an RFC]: #implementing-an-rfc
@@ -243,7 +261,7 @@ implemented right away. Other accepted RFC's can represent features
243261
that can wait until some arbitrary developer feels like doing the
244262
work. Every accepted RFC has an associated issue tracking its
245263
implementation in the Rust repository; thus that associated issue can
246-
be assigned a priority via the [triage process] that the team uses for
264+
be assigned a priority via the triage process that the team uses for
247265
all issues in the Rust repository.
248266

249267
The author of an RFC is not obligated to implement it. Of course, the
@@ -254,15 +272,18 @@ If you are interested in working on the implementation for an 'active'
254272
RFC, but cannot determine if someone else is already working on it,
255273
feel free to ask (e.g. by leaving a comment on the associated issue).
256274

275+
257276
## RFC Postponement
258277
[RFC Postponement]: #rfc-postponement
259278

260-
Some RFC pull requests are tagged with the 'postponed' label when they
261-
are closed (as part of the rejection process). An RFC closed with
262-
“postponed” is marked as such because we want neither to think about
263-
evaluating the proposal nor about implementing the described feature
264-
until after the next major release, and we believe that we can afford
265-
to wait until then to do so.
279+
Some RFC pull requests are tagged with the 'postponed' label when they are
280+
closed (as part of the rejection process). An RFC closed with “postponed” is
281+
marked as such because we want neither to think about evaluating the proposal
282+
nor about implementing the described feature until some time in the future, and
283+
we believe that we can afford to wait until then to do so. Historically,
284+
"postponed" was used to postpone features until after 1.0. Postponed PRs may be
285+
re-opened when the time is right. We don't have any formal process for that, you
286+
should ask members of the relevant sub-team.
266287

267288
Usually an RFC pull request marked as “postponed” has already passed
268289
an informal first round of evaluation, namely the round of “do we
@@ -280,6 +301,4 @@ present circumstances. As usual, we are trying to let the process be
280301
driven by consensus and community norms, not impose more structure than
281302
necessary.
282303

283-
[core team]: https://github.com/mozilla/rust/wiki/Note-core-team
284-
[triage process]: https://github.com/rust-lang/rust/wiki/Note-development-policy#milestone-and-priority-nomination-and-triage
285-
[weekly meeting]: https://github.com/rust-lang/meeting-minutes
304+
[sub-team]: http://www.rust-lang.org/team.html

compiler_changes.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# RFC policy - the compiler
2+
3+
We have not previously had an RFC system for compiler changes, so policy here is
4+
likely to change as we get the hang of things. We don't want to slow down most
5+
compiler development, but on the other hand we do want to do more design work
6+
ahead of time on large additions and refactorings.
7+
8+
Compiler RFCs will be managed by the compiler sub-team, and tagged `T-compiler`.
9+
The compiler sub-team will do an initial triage of new PRs within a week of
10+
submission. The result of triage will either be that the PR is assigned to a
11+
member of the sub-team for shepherding, the PR is closed because the sub-team
12+
believe it should be done without an RFC, or closed because the sub-team feel it
13+
should clearly not be done and further discussion is not necessary. We'll follow
14+
the standard procedure for shepherding, final comment period, etc.
15+
16+
Where there is significant design work for the implementation of a language
17+
feature, the preferred workflow is to submit two RFCs - one for the language
18+
design and one for the implementation design. The implementation RFC may be
19+
submitted later if there is scope for large changes to the language RFC.
20+
21+
22+
## Changes which need an RFC
23+
24+
* Large refactorings or redesigns of the compiler
25+
* Changing the API presented to syntax extensions or other compiler plugins in
26+
non-trivial ways
27+
* Adding, removing, or changing a stable compiler flag
28+
* The implementation of new language features where there is significant change
29+
or addition to the compiler
30+
* Any other change which causes backwards incompatible changes to stable
31+
behaviour of the compiler, language, or libraries
32+
33+
34+
## Changes which don't need an RFC
35+
36+
* Bug fixes, improved error messages, etc.
37+
* Minor refactoring/tidying up
38+
* Implmenting language features which have an accepted RFC, where the
39+
implementation does not significantly change the compiler or require
40+
significant new design work
41+
* Adding unstable API for tools (note that all compiler API is currently unstable)
42+
* Adding, removing, or changing an unstable compiler flag (if the compiler flag
43+
is widely used there should be at least some discussion on discuss, or an RFC
44+
in some cases)
45+
46+
If in doubt it is probably best to just announce the change you want to make to
47+
the compiler subteam on discuss or IRC, and see if anyone feels it needs an RFC.

lang_changes.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# RFC policy - language design
2+
3+
Pretty much every change to the language needs an RFC.
4+
5+
Language RFCs are managed by the language sub-team, and tagged `T-lang`. The
6+
language sub-team will do an initial triage of new PRs within a week of
7+
submission. The result of triage will either be that the PR is assigned to a
8+
member of the sub-team for shepherding, the PR is closed as postponed because
9+
the subteam believe it might be a good idea, but is not currently aligned with
10+
Rust's priorities, or the PR is closed because the sub-team feel it should
11+
clearly not be done and further discussion is not necessary. In the latter two
12+
cases, the sub-team will give a detailed explanation. We'll follow the standard
13+
procedure for shepherding, final comment period, etc.
14+
15+
16+
## Amendments
17+
18+
Sometimes in the implementation of an RFC, changes are required. In general
19+
these don't require an RFC as long as they are very minor and in the spirit of
20+
the accepted RFC (essentially bug fixes). In this case implementers should
21+
submit an RFC PR which amends the accepted RFC with the new details. Although
22+
the RFC repository is not intended as a reference manual, it is preferred that
23+
RFCs do reflect what was actually implemented. Amendment RFCs will go through
24+
the same process as regular RFCs, but should be less controversial and thus
25+
should move more quickly.
26+
27+
When a change is more dramatic, it is better to create a new RFC. The RFC should
28+
be standalone and reference the original, rather than modifying the existing
29+
RFC. You should add a comment to the original RFC with referencing the new RFC
30+
as part of the PR.
31+
32+
Obviously there is some scope for judgment here. As a guideline, if a change
33+
affects more than one part of the RFC (i.e., is a non-local change), affects the
34+
applicability of the RFC to its motivating use cases, or there are multiple
35+
possible new solutions, then the feature is probably not 'minor' and should get
36+
a new RFC.

0 commit comments

Comments
 (0)