|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- title: PEP 8016 -- The Steering Council Model
- url: https://www.python.org/dev/peps/pep-8016/#rationale
- hash_url: 468a5d6b78e3cd13a45d0f248cfe6346
-
- <div class="section" id="abstract">
- <h1><a class="toc-backref" href="#id2">Abstract</a></h1>
- <p>This PEP proposes a model of Python governance based around a steering
- council. The council has broad authority, which they seek to exercise
- as rarely as possible; instead, they use this power to establish
- standard processes, like those proposed in the other 801x-series PEPs.
- This follows the general philosophy that it's better to split up large
- changes into a series of small changes that can be reviewed
- independently: instead of trying to do everything in one PEP, we focus
- on providing a minimal-but-solid foundation for further governance
- decisions.</p>
- </div>
- <div class="section" id="pep-acceptance">
- <h1><a class="toc-backref" href="#id3">PEP Acceptance</a></h1>
- <p><a class="reference external" href="/dev/peps/pep-8016">PEP 8016</a> was accepted <a class="reference external" href="https://discuss.python.org/t/python-governance-vote-december-2018-results/546/">by a core developer vote</a>
- described in <a class="reference external" href="/dev/peps/pep-8001">PEP 8001</a> on Monday, December 17, 2018.</p>
- </div>
- <div class="section" id="rationale">
- <h1><a class="toc-backref" href="#id4">Rationale</a></h1>
- <p>The main goals of this proposal are:</p>
- <ul class="simple">
- <li>Be <strong>boring</strong>: We're not experts in governance, and we don't think
- Python is a good place to experiment with new and untried governance
- models. So this proposal sticks to mature, well-known, previously
- tested processes as much as possible. The high-level approach of a
- mostly-hands-off council is arguably the most common across large
- successful F/OSS projects, and low-level details are derived
- directly from Django's governance.</li>
- <li>Be <strong>simple</strong>: We've attempted to pare things down to the minimum
- needed to make this workable: the council, the core team (who elect
- the council), and the process for changing the document. The goal is
- Minimum Viable Governance.</li>
- <li>Be <strong>comprehensive</strong>: But for the things we need to define, we've
- tried to make sure to cover all the bases, because we don't want to
- go through this kind of crisis again. Having a clear and unambiguous
- set of rules also helps minimize confusion and resentment.</li>
- <li>Be <strong>flexible and light-weight</strong>: We know that it will take time and
- experimentation to find the best processes for working together. By
- keeping this document as minimal as possible, we keep maximal
- flexibility for adjusting things later, while minimizing the need
- for heavy-weight and anxiety-provoking processes like whole-project
- votes.</li>
- </ul>
- <p>A number of details were discussed in <a class="reference external" href="https://discuss.python.org/t/working-discussion-for-pep-8016-the-boringest-possible-steering-council-model/333/">this Discourse thread</a>,
- and then <a class="reference external" href="https://discuss.python.org/t/pep-8016-the-steering-council-model/394">this thread has further discussion</a>. These
- may be useful to anyone trying to understand the rationale for various
- minor decisions.</p>
- </div>
- <div class="section" id="specification">
- <h1><a class="toc-backref" href="#id5">Specification</a></h1>
- <div class="section" id="the-steering-council">
- <h2><a class="toc-backref" href="#id6">The steering council</a></h2>
- <div class="section" id="composition">
- <h3><a class="toc-backref" href="#id7">Composition</a></h3>
- <p>The steering council is a 5-person committee.</p>
- </div>
- <div class="section" id="mandate">
- <h3><a class="toc-backref" href="#id8">Mandate</a></h3>
- <p>The steering council shall work to:</p>
- <ul class="simple">
- <li>Maintain the quality and stability of the Python language and
- CPython interpreter,</li>
- <li>Make contributing as accessible, inclusive, and sustainable as
- possible,</li>
- <li>Formalize and maintain the relationship between the core team and
- the PSF,</li>
- <li>Establish appropriate decision-making processes for PEPs,</li>
- <li>Seek consensus among contributors and the core team before acting in
- a formal capacity,</li>
- <li>Act as a "court of final appeal" for decisions where all other
- methods have failed.</li>
- </ul>
- </div>
- <div class="section" id="powers">
- <h3><a class="toc-backref" href="#id9">Powers</a></h3>
- <p>The council has broad authority to make decisions about the project.
- For example, they can:</p>
- <ul class="simple">
- <li>Accept or reject PEPs</li>
- <li>Enforce or update the project's code of conduct</li>
- <li>Work with the PSF to manage any project assets</li>
- <li>Delegate parts of their authority to other subcommittees or
- processes</li>
- </ul>
- <p>However, they cannot modify this PEP, or affect the membership of the
- core team, except via the mechanisms specified in this PEP.</p>
- <p>The council should look for ways to use these powers as little as
- possible. Instead of voting, it's better to seek consensus. Instead of
- ruling on individual PEPs, it's better to define a standard process
- for PEP decision making (for example, by accepting one of the other
- 801x series of PEPs). It's better to establish a Code of Conduct
- committee than to rule on individual cases. And so on.</p>
- <p>To use its powers, the council votes. Every council member must either
- vote or explicitly abstain. Members with conflicts of interest on a
- particular vote must abstain. Passing requires support from a majority
- of non-abstaining council members.</p>
- <p>Whenever possible, the council's deliberations and votes shall be held
- in public.</p>
- </div>
- <div class="section" id="electing-the-council">
- <h3><a class="toc-backref" href="#id10">Electing the council</a></h3>
- <p>A council election consists of two phases:</p>
- <ul class="simple">
- <li>Phase 1: Candidates advertise their interest in serving. Candidates
- must be nominated by a core team member. Self-nominations are
- allowed.</li>
- <li>Phase 2: Each core team member can vote for zero to five of the
- candidates. Voting is performed anonymously. Candidates are ranked
- by the total number of votes they receive. If a tie occurs, it may
- be resolved by mutual agreement among the candidates, or else the
- winner will be chosen at random.</li>
- </ul>
- <p>Each phase lasts one to two weeks, at the outgoing council's discretion.
- For the initial election, both phases will last two weeks.</p>
- <p>The election process is managed by a returns officer nominated by the
- outgoing steering council. For the initial election, the returns
- officer will be nominated by the PSF Executive Director.</p>
- <p>The council should ideally reflect the diversity of Python
- contributors and users, and core team members are encouraged to vote
- accordingly.</p>
- </div>
- <div class="section" id="term">
- <h3><a class="toc-backref" href="#id11">Term</a></h3>
- <p>A new council is elected after each feature release. Each council's
- term runs from when their election results are finalized until the
- next council's term starts. There are no term limits.</p>
- </div>
- <div class="section" id="vacancies">
- <h3><a class="toc-backref" href="#id12">Vacancies</a></h3>
- <p>Council members may resign their position at any time.</p>
- <p>Whenever there is a vacancy during the regular council term, the
- council may vote to appoint a replacement to serve out the rest of the
- term.</p>
- <p>If a council member drops out of touch and cannot be contacted for a
- month or longer, then the rest of the council may vote to replace
- them.</p>
- </div>
- <div class="section" id="conflicts-of-interest">
- <h3><a class="toc-backref" href="#id13">Conflicts of interest</a></h3>
- <p>While we trust council members to act in the best interests of Python
- rather than themselves or their employers, the mere appearance of any
- one company dominating Python development could itself be harmful and
- erode trust. In order to avoid any appearance of conflict of interest,
- at most 2 members of the council can work for any single employer.</p>
- <p>In a council election, if 3 of the top 5 vote-getters work for the
- same employer, then whichever of them ranked lowest is disqualified
- and the 6th-ranking candidate moves up into 5th place; this is
- repeated until a valid council is formed.</p>
- <p>During a council term, if changing circumstances cause this rule to be
- broken (for instance, due to a council member changing employment),
- then one or more council members must resign to remedy the issue, and
- the resulting vacancies can then be filled as normal.</p>
- </div>
- <div class="section" id="ejecting-core-team-members">
- <h3><a class="toc-backref" href="#id14">Ejecting core team members</a></h3>
- <p>In exceptional circumstances, it may be necessary to remove someone
- from the core team against their will. (For example: egregious and
- ongoing code of conduct violations.) This can be accomplished by a
- steering council vote, but unlike other steering council votes, this
- requires at least a two-thirds majority. With 5 members voting, this
- means that a 3:2 vote is insufficient; 4:1 in favor is the minimum
- required for such a vote to succeed. In addition, this is the one
- power of the steering council which cannot be delegated, and this
- power cannot be used while a vote of no confidence is in process.</p>
- <p>If the ejected core team member is also on the steering council, then
- they are removed from the steering council as well.</p>
- </div>
- <div class="section" id="vote-of-no-confidence">
- <h3><a class="toc-backref" href="#id15">Vote of no confidence</a></h3>
- <p>In exceptional circumstances, the core team may remove a sitting
- council member, or the entire council, via a vote of no confidence.</p>
- <p>A no-confidence vote is triggered when a core team member calls for
- one publically on an appropriate project communication channel, and
- another core team member seconds the proposal.</p>
- <p>The vote lasts for two weeks. Core team members vote for or against.
- If at least two thirds of voters express a lack of confidence, then
- the vote succeeds.</p>
- <p>There are two forms of no-confidence votes: those targeting a single
- member, and those targeting the council as a whole. The initial call
- for a no-confidence vote must specify which type is intended. If a
- single-member vote succeeds, then that member is removed from the
- council and the resulting vacancy can be handled in the usual way. If
- a whole-council vote succeeds, the council is dissolved and a new
- council election is triggered immediately.</p>
- </div>
- </div>
- <div class="section" id="the-core-team">
- <h2><a class="toc-backref" href="#id16">The core team</a></h2>
- <div class="section" id="role">
- <h3><a class="toc-backref" href="#id17">Role</a></h3>
- <p>The core team is the group of trusted volunteers who manage Python.
- They assume many roles required to achieve the project's goals,
- especially those that require a high level of trust. They make the
- decisions that shape the future of the project.</p>
- <p>Core team members are expected to act as role models for the community
- and custodians of the project, on behalf of the community and all
- those who rely on Python.</p>
- <p>They will intervene, where necessary, in online discussions or at
- official Python events on the rare occasions that a situation arises
- that requires intervention.</p>
- <p>They have authority over the Python Project infrastructure, including
- the Python Project website itself, the Python GitHub organization and
- repositories, the bug tracker, the mailing lists, IRC channels, etc.</p>
- </div>
- <div class="section" id="prerogatives">
- <h3><a class="toc-backref" href="#id18">Prerogatives</a></h3>
- <p>Core team members may participate in formal votes, typically to nominate new
- team members and to elect the steering council.</p>
- </div>
- <div class="section" id="membership">
- <h3><a class="toc-backref" href="#id19">Membership</a></h3>
- <p>Python core team members demonstrate:</p>
- <ul class="simple">
- <li>a good grasp of the philosophy of the Python Project</li>
- <li>a solid track record of being constructive and helpful</li>
- <li>significant contributions to the project's goals, in any form</li>
- <li>willingness to dedicate some time to improving Python</li>
- </ul>
- <p>As the project matures, contributions go beyond code. Here's an
- incomplete list of areas where contributions may be considered for
- joining the core team, in no particular order:</p>
- <ul class="simple">
- <li>Working on community management and outreach</li>
- <li>Providing support on the mailing lists and on IRC</li>
- <li>Triaging tickets</li>
- <li>Writing patches (code, docs, or tests)</li>
- <li>Reviewing patches (code, docs, or tests)</li>
- <li>Participating in design decisions</li>
- <li>Providing expertise in a particular domain (security, i18n, etc.)</li>
- <li>Managing the continuous integration infrastructure</li>
- <li>Managing the servers (website, tracker, documentation, etc.)</li>
- <li>Maintaining related projects (alternative interpreters, core
- infrastructure like packaging, etc.)</li>
- <li>Creating visual designs</li>
- </ul>
- <p>Core team membership acknowledges sustained and valuable efforts that
- align well with the philosophy and the goals of the Python project.</p>
- <p>It is granted by receiving at least two-thirds positive votes in a
- core team vote and no veto by the steering council.</p>
- <p>Core team members are always looking for promising contributors,
- teaching them how the project is managed, and submitting their names
- to the core team's vote when they're ready.</p>
- <p>There's no time limit on core team membership. However, in order to
- provide the general public with a reasonable idea of how many people
- maintain Python, core team members who have stopped contributing are
- encouraged to declare themselves as "inactive". Those who haven't made
- any non-trivial contribution in two years may be asked to move
- themselves to this category, and moved there if they don't respond. To
- record and honor their contributions, inactive team members will
- continue to be listed alongside active core team members; and, if they
- later resume contributing, they can switch back to active status at
- will. While someone is in inactive status, though, they lose their
- active privileges like voting or nominating for the steering council,
- and commit access.</p>
- <p>The initial active core team members will consist of everyone
- currently listed in the <a class="reference external" href="https://github.com/orgs/python/teams/python-core/members">"Python core" team on Github</a>, and the
- initial inactive members will consist of everyone else who has been a
- committer in the past.</p>
- </div>
- </div>
|