-
Notifications
You must be signed in to change notification settings - Fork 53
Revise decision process: champion vs FCP decisions #360
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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 | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||
| ## 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. | ||||||||||||||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.)
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
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.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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. | ||||||||||||||||||||||
| 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. | ||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Otherwise I don't think the last sentence is particularly meaningful.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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:
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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:
(Hertz v. Woodman, 218 U.S. 205, 1910.)
(Helving v. Hallock, 309 U.S. 106, 1940.)
(Payne v. Tennessee, 501 U.S. 808, 1991.)
(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.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
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.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
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.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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. | ||||||
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.