Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions book.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,6 @@ command = "mdbook-mermaid"
"/initiatives/process/stages.html" = "how_to/propose.html"
"/initiatives/process.html" = "how_to/propose.html"
"/initiatives/stable.html" = "how_to/propose.html"
"./decision_process.md" = "decision-making.md"
"./decision_process/examples.md" = "decision-making.md"
"./decision_process/reference.md" = "decision-making.md"
6 changes: 3 additions & 3 deletions src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
- [Propose or extend a new lint?](./how_to/new_lint.md)
- [Add an experimental feature gate](./how_to/experiment.md)
- [Stabilize a feature](./how_to/stabilize.md)
- [Decision process and principles](./decision_process.md)
- [Decision process examples](./decision_process/examples.md)
- [Decision process reference](./decision_process/reference.md)
- [Decision making](./decision-making.md)
- [Champion decisions](./champion-decisions.md)
- [FCP decisions](./fcp-decisions.md)
- [Becoming and being a lang-team member](./membership.md)
- [Lang-team leads](./leads.md)
- [Chat platform](./chat_platform.md)
Expand Down
41 changes: 41 additions & 0 deletions src/champion-decisions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Champion decisions

Champion decisions do not represent team consensus. Rather, they indicate that *somebody* on the team is willing to champion an idea. We use them to begin experiments and for other decisions where we want to move quickly and iterate.

## When to use champion decisions

* Starting a [lang-team experiment](./how_to/experiment.md)
* Closing an RFC or issue that is clearly not going to be accepted
* Other lightweight decisions that don't make a durable commitment
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* Other lightweight decisions that don't make a durable commitment
* Significantly changing an existing experiment's scope or goals
* Other lightweight decisions that the team needs to be aware of, but that don't make a durable commitment


Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Note that many decisions made over the course of an experiment do not require a formal champion decision. Here are examples of decisions that do **not** require nomination:
* Removing or sunsetting an experiment for reasons outside the lang team's direct control
* Cutting scope or focusing on a particular sub-problem
* Pursuing a particular direction in line with the original experiment's goals
* New constraints you've learned as part of exploring the design space
Note that all of these should still appear in a champion's regular updates to the team so that concerns can be surfaced.

## Process

### For the champion (lang team member or advisor)

1. Write up your proposal on a GitHub issue or PR, explaining the decision and context.
2. [Nominate](./how_to/nominate.md) it for discussion at a lang-team triage meeting.
3. At the triage meeting, the team will discuss and raise any concerns.
4. If no one requests FCP escalation, you can proceed.

### Handling concerns

When people raise concerns:

* **Treasure dissent.** Engage with them and make sure you understand the concern.
* Note concerns on the tracking issue as "unresolved questions" or things to explore—they shouldn't be forgotten.
* Concerns don't *block* you from proceeding, but they may give you pause, particularly if they are shared by multiple team members.

### FCP escalation

Any team member can request FCP escalation at any time—during the triage meeting or later. This converts the decision to an [FCP decision](./fcp-decisions.md), which follows the full FCP process.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is an example (hypothetical or not) of this being used in the way you intend?

Alternative framing: If we didn't have this, what could go wrong?

(I have some thoughts, but am curious to hear yours first.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is an example (hypothetical or not) of this being used in the way you intend?

I was imagining that there might be a feature that somebody simply feels absolutely should not be added -- not a matter of "experiment and let's see", but like 'there is no shape of this feature that I like'. I imagined they would say "let's FCP it". I imagined they would raise a concern, but they may or may not have that concern resolved. If it is, then that's that, we can stop arguing about it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a view that the lang team generally shouldn't stop experimentation as long as there's clear communication about the risks of continuing.

I can see that happening in exceptional circumstances, and maybe this is useful as a way to control the maintenance burden on the compiler. With the resolution process I don't see it being an insurmountable issue – but it could be a momentum killer if misapplied.

I'm still on the fence about whether it's worth it. If this simplifies the process and makes it more uniform, or makes people more willing to accept that certain decisions are champion decisions, then sure.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see that point. I agree that I'm loath to block experimentation. The compiler's maintenance burden isn't, I don't think, our problem :) they can have their own process for reviewing.


Once a champion decision has been escalated and FCP'd, it becomes durable: reversing it would require another FCP.

No justification is required to request escalation. The request itself signals "I think this matters enough to need the full FCP process."

## For other team members

* Your approval is not required for champion decisions.
* If you disagree with the decision or think it's a bad idea, say so (constructively)!
* For experiments, ask yourself: What are the "weak spots" that the experiment ought to probe? What information can we gather?
* If you feel strongly that this should not proceed without team consensus, request FCP escalation.
35 changes: 35 additions & 0 deletions src/decision-making.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Decision making

This page documents our decision making process.

## Our goal

We want the ability to make designs that feel fresh, bold, and innovative. We do not want Rust to feel like it has been "designed by committee", with all the interesting bits smoothed down.

We also want designs that meet Rust users' needs and live up to Rust's ethos of reliable, performant, accessible code.

These two goals can be in tension. The former pushes us to empower individuals. The latter pushes us to validate designs broadly. We use this decision making process to guide us in balancing those tensions.

## Design axioms

Our decision making axioms are rules that we follow to help us achieve our goal. We try to satisfy them all, but if they come into tension, we prefer items that appear first in the list.

* **No new rationale**. We make decisions only after the rationale has been presented publicly and all relevant stakeholders have had a chance to present counterarguments.
* **Not afraid to do the right thing**. At the end of the day, we have to do what we feel is *right*. Sometimes this means breaking with tradition and precedent set by other languages. Sometimes it means taking a socially uncomfortable stance (but always with respect).
* **Find common ground**. When there is disagreement, look for solutions that address everyone's concerns. Break up designs into smaller pieces if needed. But be sure that each piece solves an end-to-end problem on its own.
* **Trust each other**. Lang team members are expected to have demonstrated sharp instincts, humility, and the ability to hear and understand others. Sometimes you have to put your doubts aside and trust the others on the team.
* **Treasure dissent**. When someone raises a concern, we take it as an opportunity to improve the design, not an obstacle to be overcome. We invite people to elaborate and make sure we understand what's motivating them before we decide how to respond.

## Two kinds of decisions

We divide decisions into two categories:

* **[Champion decisions](./champion-decisions.md)** are the preferred default. They are used for [starting experiments](./how_to/experiment.md) and other decisions where we want to move quickly. A single lang-team member or advisor can champion a decision; others can raise concerns, but cannot block. A champion decision does *not* represent team consensus—it represents only the champion's point of view. Any team member can request FCP escalation at any point—during the initial triage meeting or later—which converts it to an FCP decision. Once a champion decision has been escalated and FCP'd, it becomes durable in the same way as any other FCP decision.

* **[FCP decisions](./fcp-decisions.md)** represent a significant commitment from the team. They are used for [stabilization](./how_to/stabilize.md), RFC approval, and other cases where we are making a promise to our users or taking a position we don't want to reverse lightly. FCP decisions require broader team sign-off and follow a formal process for resolving concerns.

**When to use which:** Prefer champion decisions when possible—they have lower overhead and enable faster iteration. Use FCP decisions when the decision is significant enough that reversing it should require another FCP. The expectation is that an FCP'd decision cannot be reversed without some change in circumstances: new experience, new information, or a reasoned change of mind.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
**When to use which:** Prefer champion decisions when possible—they have lower overhead and enable faster iteration. Use FCP decisions when the decision is significant enough that reversing it should require another FCP. The expectation is that an FCP'd decision cannot be reversed without some change in circumstances: new experience, new information, or a reasoned change of mind.
**When to use which:** Prefer champion decisions when possible—they have lower overhead and enable faster iteration. Use FCP decisions when the decision is significant enough that reversing it should require another FCP. The expectation is that an FCP'd decision cannot be reversed without some change in circumstances: new experience or new information leading to a reasoned change of mind.

Otherwise I don't think the last sentence is particularly meaningful.

Copy link
Contributor

@traviscross traviscross Dec 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, I like Niko's version. This is stare decisis. The original decision is precedential, but it's not invulnerable. We could simply realize that we were wrong, even on the basis of the same information that was before us previously. Maybe we misunderstood it and later realize that. Maybe we failed to understand the gravity of something. Maybe we didn't fully grasp all the interactions even though these were pointed out to us. Maybe we were so focused on one part of a decision that we didn't carefully review another part and made an obvious error. Such things fall within a reasoned change of mind.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What I actually want is a way to give past decisions special weight within the team, even when that team is making a new FCP decision. My worry with this is that, for example, in deciding a stabilization we start to re-litigate decisions made in the RFC, and give those equal weight to other decisions that have to be made as part of the stabilization, all bundled up into one FCP.

I think the notion that the lang team can change its mind at any point of the process – it's never really "bound" by the decisions it makes until we get to stabilization – makes the whole thing unpredictable and exhausting to outsiders.

An example of a process that would accomplish this is if anytime this happened we had to back up, file a new issue proposing to reverse the original decision, and FCP that by itself. Then someone could file a concern on the original FCP blocking on resolution of the new one. That introduces a fair amount of friction and the need to give our reasoning.

To make this practical we should probably only do this when someone on the team/advisors requests it, just like escalating a champion decision to an FCP in this proposal.

I also favor the idea unimplemented RFCs expiring after a few years so we know when things will get re-evaluated. That can plausibly be managed as a norm within a process like this, but it's again difficult for outsiders who won't know when precedent applies and when it doesn't.


By the way, most of that page just treats stare decisis to mean "respect the previous decision". But maybe you mean to emphasize this part, the comparison to originalism:

The two approaches look at different sets of underlying facts that may or may not point in the same direction—stare decisis gives most weight to the newest understanding of a legal text, while originalism gives most weight to the oldest.

Copy link
Contributor

@traviscross traviscross Dec 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regarding stare decisis, I linked to the WP page only for general context. I mean something more along the lines of:

The rule of stare decisis, though one tending to consistency and uniformity of decision, is not inflexible. Whether it shall be followed or departed from is a question entirely within the discretion of the court.

(Hertz v. Woodman, 218 U.S. 205, 1910.)

We recognize that stare decisis embodies an important social policy. It represents an element of continuity in law, and is rooted in the psychologic need to satisfy reasonable expectations. But stare decisis is a principle of policy and not a mechanical formula of adherence to the latest decision, however recent and questionable, when such adherence involves collision with a prior doctrine more embracing in its scope, intrinsically sounder, and verified by experience.

(Helving v. Hallock, 309 U.S. 106, 1940.)

Although adherence to the doctrine of stare decisis is usually the best policy, the doctrine is not an inexorable command. This Court has never felt constrained to follow precedent when governing decisions are unworkable or badly reasoned.

(Payne v. Tennessee, 501 U.S. 808, 1991.)

The doctrine of stare decisis is essential to the respect accorded to the judgments of the Court and to the stability of the law. It is not, however, an inexorable command.

(Lawrence v. Texas, 539 U.S. 558, 2003.)

That is, it's a best practice, but ultimately the court has discretion. It's something that has to be considered. The more that a decision has become relied upon, in terms of other settled law building on top of it, the more weight this has. On the other hand, if not much has built on it -- if it's become an outlier or it was avoided due to continued reservations about it -- then this doesn't have a lot of weight. Whatever its weight, it's balanced against other things, such as the degree to which it is "unworkable or badly reasoned".

This has always reminded me of how we work and how we treat earlier language decisions.

Copy link
Contributor

@traviscross traviscross Dec 12, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What I actually want is a way to give past decisions special weight within the team, even when that team is making a new FCP decision. My worry with this is that, for example, in deciding a stabilization we start to re-litigate decisions made in the RFC, and give those equal weight to other decisions that have to be made as part of the stabilization, all bundled up into one FCP.

Yes. To draw from legal terms again, we want the elements decided at the RFC step to enjoy presumption at the time of stabilization. Specifically, I'd suggest these are and should be rebuttable presumptions -- someone challenging them bears the burden of rebutting them successfully. I.e., the default is what we decided before.

Another way to look at this is as our standard of review at the stabilization step. A de novo review would be one that gave no deference to the RFC decision. But probably we do want to defer unless some burden has been met.

This is, I suspect, how we mean to operate, at least with respect to the big-picture items in an RFC (see below on that). Generally I think it's how we do operate. It'd be good to write this down to help us keep in mind who bears the burden when. There will though, I'd suspect, always be some discretion required on this. And, of course, RFCs that live too long unstabilized do start to die.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An example of a process that would accomplish this is if anytime this happened we had to back up, file a new issue proposing to reverse the original decision, and FCP that by itself. Then someone could file a concern on the original FCP blocking on resolution of the new one. That introduces a fair amount of friction and the need to give our reasoning.

To make this practical we should probably only do this when someone on the team/advisors requests it, just like escalating a champion decision to an FCP in this proposal.

This sounds reasonable -- in fact, I feel this is what we might be inclined to do today if something this particular came up. We have been increasingly breaking out separable decisions into individual issues.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is worth noting too that the stricter the presumption we give to the elements in the RFC, the more challenging it would be to get an RFC accepted. Sometimes, I feel, we do let through RFCs without giving every single detail the kind of exacting review that the details will encounter during stabilization. We do this, I think, because we expect the fine details are likely to change post-RFC -- we don't want to hold up the RFC unnecessarily when we agree on the big picture -- and we expect we can review these details (de novo) on stabilization.

If these details were to enjoy presumption (in a way they tend not to today), then we'd either have to be as exacting at the RFC step as we are at the stabilization step today or we'd have to ensure all of these details were removed from the RFC or put in non-normative sections.

There may be merit to that. I'd personally like to see Reference language as early as the RFC. And pushing RFCs to be accepted later, after experimentation, does allow more details to be settled confidently. Still, it's a consideration.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(After talking it through, I can see there's a way to get what I want without changing the text. I'll leave this open for Niko to review anyway.)

Regarding RFCs, the bit that I would say is presumptive today, to use your term, is the end-user look and feel of the feature. The detailed semantics are usually subject to change.


## Team size

The lang team operates as a "two-pizza team" of 4-8 members. This keeps the team small enough for high-bandwidth communication and trust, while large enough for diverse perspectives.
53 changes: 0 additions & 53 deletions src/decision_process.md

This file was deleted.

Loading