The Carbon project aims to provide consistent and clear governance and language evolution over time. We want to provide a reasonably broad representation for the community contributing to Carbon, including their diverse backgrounds and expertise. The governance also needs to remain scalable and effective. It is essential to be able to make even controversial decisions in a reasonable and bounded timeframe.
Our governance structure supports consensus decision-making:
Any substantive change to Carbon (whether the language, project, infrastructure, or otherwise) must be made through a process designed to both engage with the broader community and come to reasonable decisions in a timely fashion. We have guidelines for when to follow the evolution process.
The process is:
We use several tools to coordinate changes to Carbon:
Review managers exist to help ensure proposals are reviewed in a timely fashion, regardless of whether it came from a long-time contributor or someone new to the community. They are expected to set aside personal opinions when ensuring a proposal is correctly reviewed, including abstaining from managing their own proposals. Proposal authors can always contact review managers if they're not sure what to do with a proposal.
The number of review managers isn't tightly restricted. Community members may volunteer their assistance as a way of contributing to Carbon, although the Core team will still review participation.
Our current review managers are:
The core team is responsible for setting Carbon's roadmap and managing evolution. This team should broadly understand both the users of Carbon and the project itself in order to factor different needs, concerns, and pressures into a consensus decision-making process.
The team is expected to remain relatively small for efficiency, although members may be added when necessary to expand representation.
Our current core team members are:
TODO: We want this team to eventually include non-Googlers for a broader set of perspectives.
As Carbon grows, the core team may decide to form subteams that provide leadership for specific areas. These subteams are expected to largely organize in a similar fashion to the core team, with a more narrow focus and scope. The escalation path for subteams goes first to the core team and then to the arbiters.
There may be issues where the core team cannot reach consensus even after careful discussion. In some cases, this simply means that the status quo must hold until a more compelling case for change has been made. However, to avoid important issues being unable to progress, any member of the community may request that an issue which failed to gain consensus be considered by the arbiters.
When acting as arbiters, the arbiters are only empowered to select between different options among which none achieved consensus, including maintaining status quo. All options must first be deliberated by the core team.
It is even more important that arbiters set aside any personal perspectives to the extent possible and make decisions in the interest of the project. They should typically bias towards maintaining the status quo and letting the proposal come back with more information rather than overriding it. It is expected to be relatively rare that the arbiters need to take on this role.
Arbiters may make a decision with a majority (two-to-one) vote. If they cannot reach a majority vote, e.g. due to an arbiter being unavailable, the decision returns to the core team.
There should always be three arbiters.
Our current arbiters are:
Whenever possible, we want Carbon to make syntax and other decisions based on understanding its users, data, and the underlying goals of the language. However, there will be times when those don't provide a clear cut rationale for any particular decision -- all of the options are fine/good and someone simply needs to choose which color to paint the bikeshed. The goal of the painter role is to have a simple way to quickly decide these points.
Any team may defer a decision to the painter if there is a consensus that it is merely a bikeshed in need of paint. The team may also open an issue to revisit the color with data and/or user studies of some kind. This allows progress to be unblocked while also ensuring we return to issues later and attempt to find more definite rationale.
The painter is a single person in order to keep decisions around taste or aesthetics reasonably consistent.
The current painter is:
Any member of Carbon governance may step down or be replaced when they are no longer able to contribute effectively. The core team can nominate and decide on adding, removing, or replacing members using the usual evolution processes.
Any substantive change to Carbon (whether the language, project, infrastructure, or otherwise) should follow the evolution process. The meaning of "substantive" is subjective, but will generally include:
Changes which generally will not require this process are:
If you're not sure whether to follow the process, please err on the side of following it. A team can always ask for a change to be made directly if they believe it doesn't need review. Conversely, a reviewer might also ask that a pull request instead go through the full evolution process.
We encourage proposal authors to discuss problems they're trying to solve and their ideas for addressing it with the community early using any of our coordination tools. The goal should be to get a feel for any prior work, as well as other ideas or perspectives on both the problem and ways of approaching it.
These discussions can also help socialize both the problem and ideas with the community, making subsequent discussions around a concrete proposal more efficient.
Evolution > Ideas forum topic to discuss the issue
before writing the proposal.The first part of making a proposal is to write up a Google Doc explaining, roughly in the following order:
We use a template for proposals to make it easier for readers to recognize the style and structure. If you already have a non-templated Doc, create a Doc using the template and copy content over (without the original formatting) so that things like the license header are present.
Also create the initial GitHub tracking issue. Don't worry about whether the proposal will go anywhere; issues are cheap. GitHub issues are expected to be used as an index of different in-flight proposals, and may be helpful when trying to find others with similar ideas.
When writing a proposal, try to keep it brief and focused to maximize the community's engagement in it. Beyond the above structure, try to use Inverted Pyramid or BLUF writing style to help readers rapidly skim the material.
Where parts of a proposal may have several ways to address them, feel free to list options and mark them as "open questions". When describing an open question, it is a good idea to describe a proposed solution as well as other options, compare their advantages, disadvantages, and non-trivial consequences. These may be resolved during discussion, or be left for decision by the reviewing team.
Where the proposal makes a decision between multiple options, move them to the "alternatives" section so that it's clear why a given choice was made.
WIP.Authors may continue to use the Evolution > Ideas forum topic to advertise the
proposal and elicit early, high-level feedback. Community commenters should
favor the forum topic (vs Doc comments) for high-level discussion.
Evolution > Ideas forum topic
to advertise the proposal and elicit early, high-level feedback.
Once authors feel the proposal is in good shape for wider evaluation from the
relevant reviewing team (the core team, at present), they begin the more formal
process of evaluation by creating an Evolution > Proposal Reviews forum topic
for technical review of the proposal.
The topic should start off with a brief summary of the proposal and any prior discussion, as well as links to prior discussion topics.
RFC.Evolution > RFC forum topic.Anyone in the community is welcome to respond on an RFC. The reviewing team is expected to participate at least enough to provide any relevant feedback.
Proposal authors should actively engage in the discussion and incorporate changes to reflect feedback. Work to improve the proposal through incorporating feedback. Authors should explicitly mention when they believe a comment has been addressed, and commenters should be clear and explicit about whether they believe more changes are needed.
When significant alternatives are pointed out, include them in the proposal regardless of whether they're adopted. The "alternatives" section should be used to document rejected alternatives as well as the original approach when an alternative is adopted, with pros and cons either way. New "open questions" may also be added where the author isn't confident about the best approach.
Significant changes to the proposal may become necessary as a result of the
discussion. At that point, the authors should clearly state that they are
planning a revision and the issue should be marked as WIP again. At this
point, the community should prioritize giving the authors time and space to work
on the revision rather than sending more feedback.
The author should treat this as going back to the draft phase. When a new revision is ready, the authors start a new request for comments with an updated summary of the discussion points thus far (with links to those prior topics).
WIP.Once discussion settles down and all comments have been resolved, the author
should request a review manager by creating a
Evolution > Review manager requests topic. A review manager should respond
within a day or two. This may not be needed if a review manager has already
taken ownership.
The review manager is responsible for validating that the proposal is ready for the reviewing team to make a decision. They will ensure that at least a couple members of the reviewing team have reviewed the document before it leaves RFC.
If the proposal is ready, the review manager will put out a last call for community comments on the main discussion topic. If nothing significant arises, the reviewing team will be asked to start making a decision after a day.
Evolution > Review manager requests topic asking for a review
manager, providing a link to the proposal's Doc and GitHub issue.Evolution > RFC topic with a last call for comments.Going into a decision, it's expected that no more significant changes will be made. The review manager should ask the proposal author to transfer ownership of the proposal's Doc to the review manager. The review manager should then change all "edit" access to "comment".
For the rest of the review, the review manager should reject all non-typo suggestions to the proposal. Although the author should continue to respond to reviewing team comments, if any significant changes need to be made, the decision should be cancelled and the proposal should be returned to the author for major revision.
The review manager should ask the reviewing team for a decision by creating an
Evolution > Proposal decisions forum topic asking for consensus. The proposal
should also be added as a topic to the team's meeting agenda one week in advance
(or four working days, if longer). The agenda item gives a deadline for a
decision if no consensus can be reached on the Discourse Forum, and can be
removed if a decision is made before the meeting.
Team members should familiarize themselves with the proposal and related discussion. Try to respond to the Discourse Forum topic promptly with:
Evolution > RFC topic, and providing links helps write the decision.The review manager should monitor the forum topic for consensus. If a decision is made before the meeting, the item should be removed from the meeting agenda. If no decision can be reached before the meeting, the meeting will be used to make decisions.
needs decision.needs decisionEvolution > Proposal decisions topic for pre-meeting discussion.If the reviewing team fails to reach consensus before the meeting, the weekly meeting should be used to reach consensus. The review manager is encouraged to volunteer as the note taker for the meeting, and should help ensure there's a moderator. The author and other community members may attend, but should behave as observers unless explicitly called on to answer a question by the core team.
The reviewing team is responsible for producing a decision at the end of the meeting, even if it is to defer the proposal. The review manager should verify they understand the decision, because they will be responsible for publishing it.
Once a decision has been reached, the review manager will draft a
formal decision based on
Discourse Forums discussion and (if relevant) the meeting notes. They should
prepare a pull request with a PDF of the proposal for reference of what was
approved. They will post the draft decision to the Evolution > Announcements
forum within two working days. The post will start the proposal decision comment
period.
In some cases, the proposal may end up going back to the author for additional changes. In these cases, the review manager should grant edit access to the author again. It's not necessary to switch ownership back.
WIP.<decision>.<decision>.Evolution > Announcements forum topic with the decision and a
summary of the rationale.When the proposal decision is published, it enters a comment period. The comment period lasts two weeks, ensuring at least five working days. During this period, the decision is in effect, although dependent changes should be made only if they are easy to roll back.
When commenting on the decision, the community should keep in mind that the goal of the decision is to continue to evolve Carbon in a positive direction. Constructive criticism can improve the framing of the decision. The comment period should not be used to continue to debate decisions unless raising specific new information. When commenting, some questions you might want to address are:
If the decision is to approve the change, the author may start making changes described in the proposal which are easy to roll back before the decision review ends. If the author starts making changes, they must agree to help roll back changes if the decision is rolled back. This does not mean that the decision is final; however, we prefer to maintain velocity and roll back when needed. The reviewing team may additionally decide that some changes must wait until the decision review is complete, e.g. if members are concerned that rollback costs are non-obvious.
If important new information is provided, the reviewing team will engage and, if necessary, rollback their decision. Any reviewing team member may start this by stating their new position on the reviewing team's decision topic, although this should be exceptional.
Evolution > Decisions forum topic.When the comment period ends without objections from the reviewing team, the review manager should finalize the decision (approved, rejected, deferred, etc.). The review manager should commit the proposal PDF for archival purposes.
If the decision is to approve the change, the author may make the changes described in the proposal. There may still be review comments, but those should exclusively deal with the document (formatting, structure, links, etc.), and not the proposal. The issue should not be re-argued on the pull request or other code reviews.
That does not mean that all decisions are final! Everyone involved in a decision is human and we all make mistakes. However, once there is a clear decision, reversing or reconsidering it should take the form of a new proposal and follow the process of a new proposal. It may be substantially shorter to write up, but often it will be important to clearly and carefully explain the reason to revisit the decision.
Evolution > Announcements forum topic with the final decision.Our governance and evolution process is influenced by the Rust, Swift, and C++ processes. Many thanks to these communities for providing a basis.