-
Notifications
You must be signed in to change notification settings - Fork 54
new decision process #326
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?
new decision process #326
Changes from all commits
5399719
87568db
f667fe8
4d10ca4
e9a380b
102b661
ebc2776
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,30 @@ | ||
# Reversible decisions | ||
|
||
Reversible decisions do not represent team consensus. | ||
Rather, they indicate that *somebody* on the team is in favor of the idea. | ||
We use them to begin experiments and do other small things. | ||
We never use them for decisions that impact stable code, such as stabilizing a feature. | ||
|
||
## Examples where this process is appropriate | ||
|
||
* Championing a lang-team experiment | ||
* Closing an RFC -- | ||
* Technically reversible (you can always re-open the PR), but particularly when external contributors are involved it's best to discuss this with the team beforehand. It's very confusing for people to have their PR closed and re-opened and can lead to burned bridges. | ||
Comment on lines
+11
to
+12
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. (See the note below about wanting to distinguish "FCPed decision" and "consensus decision", as that may be relevant here.) At the point it's discussed with the team, it tends to just be a consensus decision. Here's how I might frame it instead. It's within the power of a single member to close an RFC or other issue or PR when the member estimates with some confidence that would be the consensus of the team, or at least that it's unlikely that the team would form an affirmative consensus to accept the RFC or otherwise do what is asked in the issue or PR. That's, I think, in general the role of member decisions, is to predict the behavior of the group and save everyone some time when that can be confidently estimated. Because, at the end of the day, whatever our policy says, when one of us does something like this, it will be read as a reflection on the group and our beliefs. For design issues, e.g. when guiding along a lang experiment, that doesn't necessarily mean only making decisions we're sure the group will accept -- that would be too constraining, and one never really knows until it all comes together and the full case can be made -- but it does mean steering people away from directions that we can say with some confidence will not be accepted. |
||
|
||
## Process | ||
|
||
### Decision maker (lang team member or lang team advisor) | ||
|
||
* Write a comment on the Github issue or PR that | ||
* Explains decision and context | ||
* Labels the issue with `T-lang` (`@rustbot labels +T-lang`) | ||
* Starts a `@rfcbot poll` -- typically the issue should *only* have `T-lang` to avoid excessive pings | ||
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. The part of this that I like is trying to find ways to push things forward asynchronously and maybe up our out-of-meeting tempo. But conversely, the part that gives me pause here is this creating a rather ambiguous signal and uncertainty around what can go forward. I suspect we'd end up with a lot of polls without a lot of boxes checked, and a lot of questions around what that means in terms of what can go forward and when. We can say, "oh, well, it's reversible, it can go forward with just the one box checked," but that I think sends a weird signal too. I mean, we thought to ask the group. Shouldn't we wait for an answer? But now it's a month later, with no change. Etc. We can say that, "oh, well, people on the team should do their jobs," but there are a lot of things to keep up with, and I could understand people finding it uncomfortable to check a box on some detailed question on a experiment on which one has temporarily lost context, and therefore wanting to look into it first, but that becoming unbounded in time. I also wonder how this interacts with the last section. If in closing a clearly-doomed RFC, the idea is that a poll should first be started, I suppose I wonder why I wouldn't just FCP close it at that point. Starting a poll feels like the worst of both worlds. It lacks the speed of just closing it. It doesn't save anyone time, since it still asks everyone to have a look. And since one is signaling one's unilateral authority to close the issue, it in some ways makes it seem more rather than less pressing than a proposed FCP. That's true of just closing it, also, but at least then one buys something in exchange for taking that risk. |
||
* If people raise concerns, particularly Rust team members: | ||
* Remember to **treasure dissent**. Engage with them and make sure you understand it. Note all the concerns raised on the tracking issue as "unresolved questions" or things to explore so they don't get forgotten. | ||
* Concerns don't *block* you from going forward, but they may give you pause, particularly if they are shared by many on the team. | ||
|
||
### Other team members | ||
|
||
* Since this action is reversible, your approval is not required. However, please check your box to indicate you reviewed the issue, it's useful feedback. | ||
* If you disagree with the decision, or think the experiment is a bad idea, say so (constructively)! | ||
* For experiments, ask youself: What are the "weak spots" that the experiment ought to probe? What information can we gather? |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,85 @@ | ||||||
# Consensus decisions | ||||||
|
||||||
Consensus decisions represent the official opinion of the team. They require that a majority of the team is in favor and that nobody has raised a concern that achieved [strong enough support](#threshold-to-resolve-a-concern-without-consent) to block the decision. | ||||||
|
||||||
They are used for for decisions that cannot be reversed (e.g., stabilization decisions or decisions that affect language semantics). They are also used for RFC approvals because, while the designs described there can be reversed before stabilization, we do not wish to do so lightly. | ||||||
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. (See the note below about wanting to distinguish "FCPed decision" and "consensus decision", as that may be relevant here.) Probably I'd make this language a bit more encompassing or, alternatively, clarify that we're speaking to what must necessarily be decided by consensus rather than just what consensus decisions are "used for" by us. We signal consensus for many things which are technically reversible, and i think that's good and valuable. People build up a model of us over time, and these signals are part of how people build this model. |
||||||
|
||||||
## Definitions | ||||||
|
||||||
The decision making process distinguishes the following roles | ||||||
|
||||||
* **Lang team**: The [Language Design Team](https://github.com/rust-lang/team/blob/master/teams/lang.toml). | ||||||
* **Lang team member**: A member of the Lang team. Lang team members are the ones who have to [approve the final decision](#the-process). | ||||||
* **Advisor**: A member of the [lang team advisors](https://github.com/rust-lang/team/blob/master/teams/lang-advisors.toml). Advisors can propose a decision and can raise [formal concerns](#raising-concerns) but their approval is not required. | ||||||
* **Decision document**: The RFC, issue text, or other document describing the decision being made. | ||||||
* **Document author**: The person who authored the decision document. They ultimately decide what changes they wish to make to the text in response to concerns. They often do this in close consultation with a member of the lang team, but that is not required. | ||||||
|
||||||
## The process | ||||||
|
||||||
Consensus decisions are done using rfcbot. They always begin with a decision document authored by the [document author](#definitions). The document author can be anyone, they do not have to be a member of a Rust team. | ||||||
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. Given this definition, probably I want to just call these "FCPed decisions" or something rather than "consensus" ones. A decision that we've FCPed represents the strongest form of our consensus, but it's not the only one. |
||||||
|
||||||
To make a decision, a [lang team member or advisor](#definitions) should issue `@rfcbot fcp merge`. This will create checkboxes. Once [2/3 of the boxes have been checked](#doing-the-math), the decision will enter final-comment-period. During that period the team should review any comments raised — assuming no concerns are raised (see below), the decision is finalized once the FCP has expired. | ||||||
|
||||||
*Note:* Before finalizing the decision, the team should engage with **new** points raised on the thread (particularly if they are made by people not able to raise formal concerns). | ||||||
|
||||||
## Raising concerns | ||||||
|
||||||
[Lang team members or advisors](#definitions) are entitled to raise a **formal concern** during the discussion process. This can be done with `@rfcbot concern concern-name`. The decision cannot be finalized until the concern is resolved, either because the person who raised the concern is satisfied and [resolves](#resolving-a-concern) it themselves, or because the team decides to [challenge it](#challenging-a-concern). | ||||||
|
||||||
### Expectations on raising a concern | ||||||
|
||||||
The [lang team member or advisor](#definitions) who raises a concern is expected to | ||||||
|
||||||
* write a constructive comment explaining the concern; | ||||||
* make themselves available for discussion in a reasonable fashion; | ||||||
* be prepared to write a document summarizing their concern for the lang-team if requested. | ||||||
|
||||||
### When a concern is raised | ||||||
|
||||||
When a concern is raised, the team will review the concern in the triage meeting. Based on that discussion, the [document author](#definitions) can decide whether they wish to make changes to mitigate or resolve the concern. | ||||||
|
||||||
## Resolving a concern | ||||||
|
||||||
If the person who raised the concern is satisfied, either because of changes made or because they don't wish to continue blocking progress, they should resolve the concern themselves with `@rfcbot resolve`. This is the desired outcome. | ||||||
|
||||||
If the concern has still not been resolved, there will typically be a period of deeper discussion. The goal is to [find common ground](./making_decisions.md#design-axioms), either by mitigating it directly or by side-stepping it via a subset of the design that still achieves the major goals. | ||||||
|
||||||
### Challenging a concern | ||||||
|
||||||
If deeper discussion does not reach a solution, a [lang team member](#definitions) can challenge a concern. This indicates that they feel they understand the concern and do not agree it is a problem. | ||||||
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
I think anyone who can champion should be able to challenge a concern. 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. In a parliamentary sense, I think this challenge is equivalent to making a motion, and so I'd say it should be anyone who can propose FCP, which is currently only team members. |
||||||
|
||||||
Challenging a concern is done by scheduling a meeting in which the lang team reads and discusses a summary of the concern and the subsequent discussion. At the end of this meeting, the concern will either be *sustained* (meaning that progress is still blocked) or *resolved* (meaning that final-comment-period can continue, assuming there aren't other concerns to be resolved). | ||||||
|
||||||
Sustaining a concern requires [1/4 of the lang team](#doing-the-math) to agree to sustain; this number includes the person who raised the concern, if they are a member of the lang team and not an advisor. Members can agree to sustain either because they agree with the concern *or* because they feel more time is needed for discussion. | ||||||
|
||||||
*Note:* The document to be read during the meeting will ideally be prepared by both the person raising the concern and the people challenging it so that it fairly represents both points of view. The document should include a | ||||||
|
||||||
1. summary of the concern and discussion; | ||||||
2. coverage of possible mitigations, changes, or subsets that were considered and their pros/cons | ||||||
|
||||||
|
||||||
## Doing the math | ||||||
|
||||||
|
||||||
Given a team of N>=4 members, the actual threshold `R` for approving a decision is `R = floor(N * 2 / 3)`. The threshold `S` for sustaining a concern is `round(N / 3)`. So e.g... | ||||||
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. Unless I'm missing a subtlety here,
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. The rule for sustaining I'd probably expect, for teams of healthy size, would be 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. The other way to frame this would be to turn it around and to state a supermajority threshold for "calling the question". That is, rather than asking for seconds to the objection, we treat overriding the objection as a separate act of the group, we state that people should be more careful about checking that box -- that it represents something more than just agreeing with the outcome -- and we set a somewhat higher fractional threshold for it. Probably I actually do like this framing better. It's the more ordinary one. And it feels somehow more... appealingly active. 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. Another reason for treating this actively is that, when taking an act, one of the things we're signing off on is that process has been followed. Doing this actively provides for a good place -- a good moment -- for signing off on this. It's less clear where that moment or that sign off is when doing it the other way around. 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. The problem I have with framing it as an override is that it removes agency from the party outside the lang team who is blocked by an objection. Convincing the team to override the objection of another team member connotates a much higher social cost than convincing them not to sustain an objection. This applies within the team as well. People within the team know each other quite well, and I expect that they will (and should be willing to) sustain one another's concerns if they think the discussion isn't over yet. Conversely, overriding another's concern is an affirmative action that comes with a high social cost, which implies any concern defaults to blocking. That would leave us much more frequently in the failure mode we see today, where a blocking concern leaves a proposal in limbo for an indeterminate amount of time, without any pressure to move the discussion forward. The main value in this proposal to me is giving more agency to people outside the team, so I think preserving the "sustaining" framing is important. 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'm suggesting, I think, is that it is an active act regardless -- that there's no getting away from that -- and so we'd be better off to accept it for what it is so we're prepared, if needed, to take it head on. 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. There is an active component, but in this process it's the challenge to the concern which leads to a meeting. Importantly, it is not final; the outcome of the meeting could be anything. Requiring an affirmative act with finality that comes with social costs from 2/3 of membership raises the bar too high. 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 don't know. It feels better to me, socially and personally, from both sides for this to be explicitly active.
To me, if I were Bob in that, I'd feel pretty heard, and I'd feel the system made sure of that. And if I were Alice or Charlie, I don't really feel put out by having to say that I want to do it anyway. Conversely, in the passive framing, it's possible that Bob get crickets, and that I don't think would feel great socially or personally to anyone. Doing this actively I think gives people a better sense of closure. |
||||||
|
||||||
| N | R | S | | ||||||
| --- | --- | --- | | ||||||
| 20 | 13 | 6 | | ||||||
| ... | ... | ... | | ||||||
| 12 | 8 | 4 | | ||||||
| ... | ... | ... | | ||||||
| 9 | 6 | 3 |53 | ||||||
| 8 | 5 | 3 | | ||||||
| 7 | 4 | 2 | | ||||||
| 6 | 4 | 2 | | ||||||
| 5 | 3 | 2 | | ||||||
|
||||||
For 4 or less: | ||||||
|
||||||
| N | R | S | | ||||||
| --- | --- | --- | | ||||||
| 4 | 3 | 1 | | ||||||
| 3 | 3 | 1 | | ||||||
| 2 | 2 | 1 | | ||||||
| 1 | 1 | 1 | |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# Decision making | ||
|
||
This page documents our decision making process. | ||
|
||
## Our goal | ||
|
||
We want the ability to make designs that feel fresh, bold, and innotative. 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 reliabile, 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 process 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 have 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 the tradition and precedent set by other languages. Sometimes it means taking a socially uncomfortable stance (but always with respect). | ||
- **Find common ground**. It's good to break up designs into small pieces and proceed step by step. 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. | ||
|
||
## Processes | ||
|
||
We divide decisions into two categories: | ||
|
||
* [Reversible decisions (aka, 2-way door)](./2-way-door.md), used for [starting experiments](./how_to/experiment.md) and other decisions that don't make a promise to our end users. Reversible decisions follow a "champion" rule, which means that just one person on the team has to be in favor for the decision to go through; others on the team present concerns as a way to help make sure the champion is aware of them. | ||
* [Consensus decisions (aka, 1-way door)](./consensus.md), used for [stabilization decisions](./how_to/stabilize.md) and for RFC approvals. Consensus decisions require everyone on the team to sign off. The decision cannot be finalized if there is a blocking concern backed by 2 or more team members. |
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.
(See also the note below about wanting to distinguish "FCPed decision" and "consensus decision", as that may be relevant here.)
Perhaps another name would be better. The problem with "reversible decisions" is that we do make certain reversible decisions by consensus. The fact that a decision is reversible is necessary for it to not be a decision requiring consensus, but calling decisions not made by consensus reversible feels like affirming the consequent.
Maybe we could call these "member decisions".