Skip to content

Commit 7fc338e

Browse files
committed
Merge branch 'master' of github.com:rust-lang/rfcs
1 parent d8321d8 commit 7fc338e

5 files changed

+313
-91
lines changed

README.md

+96-75
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
@@ -80,19 +80,21 @@ the direction the language is evolving in.
8080
* [RFC Postponement]
8181
* [Help this is all too informal!]
8282

83+
8384
## When you need to follow this process
8485
[When you need to follow this process]: #when-you-need-to-follow-this-process
8586

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

9193
- Any semantic or syntactic change to the language that is not a bugfix.
9294
- Removing language features, including those that are feature-gated.
93-
- Changes to the interface between the compiler and libraries,
94-
including lang items and intrinsics.
95-
- Additions to `std`
95+
- Changes to the interface between the compiler and libraries, including lang
96+
items and intrinsics.
97+
- Additions to `std`.
9698

9799
Some changes do not require an RFC:
98100

@@ -108,6 +110,15 @@ If you submit a pull request to implement a new feature without going
108110
through the RFC process, it may be closed with a polite request to
109111
submit an RFC first.
110112

113+
For more details on when an RFC is required, please see the following specific
114+
guidelines, these correspond with some of the Rust community's
115+
[sub-teams](http://www.rust-lang.org/team.html):
116+
117+
* [language changes](lang_changes.md),
118+
* [library changes](libs_changes.md),
119+
* [compiler changes](compiler_changes.md).
120+
121+
111122
## Before creating an RFC
112123
[Before creating an RFC]: #before-creating-an-rfc
113124

@@ -130,12 +141,12 @@ on the [RFC issue tracker][issues], and occasionally posting
130141
review.
131142

132143
As a rule of thumb, receiving encouraging feedback from long-standing
133-
project developers, and particularly members of the [core team][core]
144+
project developers, and particularly members of the relevant [sub-team]
134145
is a good indication that the RFC is worth pursuing.
135146

136147
[issues]: https://github.com/rust-lang/rfcs/issues
137148
[discuss]: http://discuss.rust-lang.org/
138-
[core]: https://github.com/rust-lang/rust/wiki/Note-core-team
149+
139150

140151
## What the process is
141152
[What the process is]: #what-the-process-is
@@ -146,49 +157,57 @@ is 'active' and may be implemented with the goal of eventual inclusion
146157
into Rust.
147158

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

180195
## The role of the shepherd
181196
[The role of the shepherd]: #the-role-of-the-shepherd
182197

183-
During triage, every RFC will either be closed or assigned a shepherd.
184-
The role of the shepherd is to move the RFC through the process. This
185-
starts with simply reading the RFC in detail and providing initial
186-
feedback. The shepherd should also solicit feedback from people who
187-
are likely to have strong opinions about the RFC. Finally, when this
188-
feedback has been incorporated and the RFC seems to be in a steady
189-
state, the shepherd will bring it to the meeting. In general, the idea
190-
here is to "front-load" as much of the feedback as possible before the
191-
point where we actually reach a decision.
198+
During triage, every RFC will either be closed or assigned a shepherd from the
199+
relevant sub-team. The role of the shepherd is to move the RFC through the
200+
process. This starts with simply reading the RFC in detail and providing initial
201+
feedback. The shepherd should also solicit feedback from people who are likely
202+
to have strong opinions about the RFC. When this feedback has been incorporated
203+
and the RFC seems to be in a steady state, the shepherd and/or sub-team leader
204+
will announce an FCP. In general, the idea here is to "front-load" as much of
205+
the feedback as possible before the point where we actually reach a decision -
206+
by the end of the FCP, the decision on whether or not to accept the RFC should
207+
usually be obvious from the RFC discussion thread. On occasion, there may not be
208+
consensus but discussion has stalled. In this case, the relevant team will make
209+
a decision.
210+
192211

193212
## The RFC life-cycle
194213
[The RFC life-cycle]: #the-rfc-life-cycle
@@ -210,35 +229,36 @@ through to completion: authors should not expect that other project
210229
developers will take on responsibility for implementing their accepted
211230
feature.
212231

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

221-
An RFC that makes it through the entire process to implementation is
222-
considered 'complete' and is moved to the 'complete' folder; an RFC
223-
that fails after becoming active is 'inactive' and moves to the
224-
'inactive' folder.
225245

226246
## Reviewing RFC's
227247
[Reviewing RFC's]: #reviewing-rfcs
228248

229249
While the RFC PR is up, the shepherd may schedule meetings with the
230250
author and/or relevant stakeholders to discuss the issues in greater
231-
detail, and in some cases the topic may be discussed at the larger
232-
[weekly meeting]. In either case a summary from the meeting will be
251+
detail, and in some cases the topic may be discussed at a sub-team
252+
meeting. In either case a summary from the meeting will be
233253
posted back to the RFC pull request.
234254

235-
The core team makes final decisions about RFCs after the benefits and
236-
drawbacks are well understood. These decisions can be made at any
237-
time, but the core team will regularly issue decisions on at least a
238-
weekly basis. When a decision is made, the RFC PR will either be
239-
merged or closed, in either case with a comment describing the
240-
rationale for the decision. The comment should largely be a summary of
241-
discussion already on the comment thread.
255+
A sub-team makes final decisions about RFCs after the benefits and drawbacks are
256+
well understood. These decisions can be made at any time, but the sub-team will
257+
regularly issue decisions. When a decision is made, the RFC PR will either be
258+
merged or closed. In either case, if the reasoning is not clear from the
259+
discussion in thread, the sub-team will add a comment describing the rationale
260+
for the decision.
261+
242262

243263
## Implementing an RFC
244264
[Implementing an RFC]: #implementing-an-rfc
@@ -248,7 +268,7 @@ implemented right away. Other accepted RFC's can represent features
248268
that can wait until some arbitrary developer feels like doing the
249269
work. Every accepted RFC has an associated issue tracking its
250270
implementation in the Rust repository; thus that associated issue can
251-
be assigned a priority via the [triage process] that the team uses for
271+
be assigned a priority via the triage process that the team uses for
252272
all issues in the Rust repository.
253273

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

282+
262283
## RFC Postponement
263284
[RFC Postponement]: #rfc-postponement
264285

265-
Some RFC pull requests are tagged with the 'postponed' label when they
266-
are closed (as part of the rejection process). An RFC closed with
267-
“postponed” is marked as such because we want neither to think about
268-
evaluating the proposal nor about implementing the described feature
269-
until after the next major release, and we believe that we can afford
270-
to wait until then to do so.
286+
Some RFC pull requests are tagged with the 'postponed' label when they are
287+
closed (as part of the rejection process). An RFC closed with “postponed” is
288+
marked as such because we want neither to think about evaluating the proposal
289+
nor about implementing the described feature until some time in the future, and
290+
we believe that we can afford to wait until then to do so. Historically,
291+
"postponed" was used to postpone features until after 1.0. Postponed PRs may be
292+
re-opened when the time is right. We don't have any formal process for that, you
293+
should ask members of the relevant sub-team.
271294

272295
Usually an RFC pull request marked as “postponed” has already passed
273296
an informal first round of evaluation, namely the round of “do we
@@ -285,6 +308,4 @@ present circumstances. As usual, we are trying to let the process be
285308
driven by consensus and community norms, not impose more structure than
286309
necessary.
287310

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

compiler_changes.md

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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. There is obviously some room for interpretation
30+
about what consitutes a "significant" change and how much detail the
31+
implementation RFC needs. For guidance, [associated items](text/0195-associated-items.md)
32+
and [UFCS](text/0132-ufcs.md) would clearly need an implementation RFC,
33+
[type ascription](text/0803-type-ascription.md) and
34+
[lifetime elision](text/0141-lifetime-elision.md) would not.
35+
* Any other change which causes backwards incompatible changes to stable
36+
behaviour of the compiler, language, or libraries
37+
38+
39+
## Changes which don't need an RFC
40+
41+
* Bug fixes, improved error messages, etc.
42+
* Minor refactoring/tidying up
43+
* Implmenting language features which have an accepted RFC, where the
44+
implementation does not significantly change the compiler or require
45+
significant new design work
46+
* Adding unstable API for tools (note that all compiler API is currently unstable)
47+
* Adding, removing, or changing an unstable compiler flag (if the compiler flag
48+
is widely used there should be at least some discussion on discuss, or an RFC
49+
in some cases)
50+
51+
If in doubt it is probably best to just announce the change you want to make to
52+
the compiler subteam on discuss or IRC, and see if anyone feels it needs an RFC.

lang_changes.md

+36
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)