diff --git a/peps/pep-0772.rst b/peps/pep-0772.rst index 1dd3e9b6586..46be7b25a76 100644 --- a/peps/pep-0772.rst +++ b/peps/pep-0772.rst @@ -1,5 +1,5 @@ PEP: 772 -Title: Packaging governance process +Title: Packaging Council governance process Author: Barry Warsaw , Deb Nicholson , Pradyun Gedam @@ -43,7 +43,7 @@ the PyPA and the tooling maintained by the PyPA became the baseline tooling for Python packaging, with additional package ecosystems using and building on top of the tools and interoperability standards maintained by the PyPA. -:pep:`609` formalised PyPA's authority over the existing packaging tools, the +:pep:`609` formalized the PyPA's authority over the existing packaging tools, the interoperability standards and their operation as a group of independent projects under the same umbrella that aim to be interoperable. It also stated that PyPA should be expected to provide opinions, insight and experience when @@ -111,13 +111,15 @@ offer more tactical work, longer term strategic vision, and fundraising support to all parts of this ecosystem. Some expectations around the formation of a Packaging Council are that they -will facilitate: +will: * Work with PSF staff and the newly formed `User Success Workgroup`_ toward improving the user experience around packaging. -* A more stable packaging ecosystem that is more responsive to community input. -* Increased transparency and clearer shared goals for the packaging ecosystem. -* Increased tactical and fundraising support from the PSF, to increase capacity +* Pronounce on and promote APIs, protocols, interfaces, and other interoperable standards relevant + to Python packaging. +* Facilitate a more stable packaging ecosystem that is more responsive to community input. +* Increase transparency and clearly share the goals for the packaging ecosystem. +* Facilitate tactical and fundraising support from the PSF, to increase capacity and funding available to packaging tools. ============= @@ -136,8 +138,8 @@ Mandate The council shall work to: * Maintain the quality and stability of the Python packaging standards. -* Formalise and maintain the relationship with the core team as well as the - PSF. +* Formalize and maintain the working relationships with the Python core team as well as the + Python Software Foundation. * Establish appropriate decision-making processes. * Improve Python packaging's user experience. * Make contributing as accessible, inclusive, and sustainable as possible. @@ -157,22 +159,25 @@ The council shall: * Look for ways to use their direct authority as little as possible - seeking consensus and consent over voting. -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. +To use its powers, the Packaging 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, which requires a quorum of 3 +non-abstaining members. If the Packaging Council cannot (e.g., by lack of quorum) or wishes not to +come to a decision on its own, it can also refer the matter to the Steering Council, whose decision +on the matter will be binding. -Whenever possible, the council is expected to share its decisions and processes +Whenever possible, the Packaging Council is expected to share its decisions and processes publicly in a timely fashion. Delegations ----------- The Packaging Council gains its authority over packaging matters via delegation from the Python -Steering Council. Upon acceptance of this PEP, the Steering Council will formally issue a standing -delegation to the Packaging Council for PEPs related to Python packaging. The bodies would work -together on issues that intersect the packaging domain and language stewardship (including the -CPython implementation, standard library, and distribution). +Steering Council. Upon acceptance of this PEP, the Steering Council is expected to formally issue a +standing delegation to the Packaging Council for PEPs related to Python packaging, superseding the +existing individual standing delegations. The bodies would work together on issues that intersect +the packaging domain and language stewardship (including the CPython implementation, standard +library, and distribution). The PSF Board is encouraged to formally deactivate the Packaging Workgroup and the Packaging Council would take on the responsibilities of the PSF's Packaging @@ -184,201 +189,175 @@ making process that governs the technical projects under the PyPA umbrella. Processes ========= -Election of the council ------------------------ +Election of the Packaging Council +--------------------------------- + +A Packaging Council election consists of the following phases: + +* **Phase 1**: Packaging Council Electors are determined by opt-in self-selection of the `PSF voting + members `_. The PSF voting membership is informed that Packaging Council ballots + are available, and any PSF voting member can request the ballot. The PSF may choose to solicit + participation for both the PSF Board elections and Packaging Council elections at the same time. + Packaging Council Electors retain their voting rights for the entire year, and may exercise such + rights for other community-wide votes that may occur during that year. + +* **Phase 2**: Packaging Council Electors may nominate any individual for the Council election, including + themselves. Nominees do not need to be PSF members, but nominations must include information + about the nominee's relevant affiliations. -A council election consists of two phases: +* **Phase 3**: Each Elector uses their ballot to cast their vote for the Council. They can + assign zero to five stars to each candidate. Voting is performed anonymously. The outcome of the vote is + determined using the `STAR voting system`_, modified to use the `Multi-winner Bloc STAR`_ approach. + If a tie occurs, it may be resolved by mutual agreement among the candidates, or else the winner will be + chosen at random. -* Phase 1: A :ref:`voting member ` can nominate any individual for the council - elections, including themselves. Nominations must include information about the nominee's - relevant affiliations. Nominees for the Packaging Council do not need to be voting members. -* Phase 2: Each voting member can assign zero to five stars to each candidate. - Voting is performed anonymously. The outcome of the vote is determined using - the `STAR voting system`_, modified to use the `Multi-winner Bloc STAR`_ - approach. If a tie occurs, it may be resolved by mutual agreement among the - candidates, or else the winner will be chosen at random. +Each phase will last two weeks. -Each phase should last two weeks. +The Packaging Council election process is managed by a returns officer nominated by the Python +Steering Council. The PSF shall maintain records of the elections as well as run the annual +election for the Packaging Council. The Steering Council must certify the results of the election +and may work with the returns officer in whatever capacity is necessary to validate the integrity of +the election. Election transparency being of paramount importance for trust in the process, full +vote totals *before* any exclusions, while maintaining anonymity, should be made public when +technically possible. -The election process is managed by one Returning Officer nominated by the -outgoing Packaging Council. For the initial election, the Returning Officer -will be nominated by the PSF Executive Director. +Quorum for Packaging Council votes (either cohort election or votes of no confidence) is 50% of +Electors. -The PSF shall maintain records of the elections as well as run the annual -election for the council. Term ---- -There shall be two cohorts of council members: Cohort A composed of two members +There shall be two cohorts of Council members: Cohort A composed of two members and Cohort B composed of three members. -Each council member shall be elected for a two-year term, unless they are -replacing a council member that resigned, was removed, or otherwise becomes +Each Council member shall be elected for a two-year term, unless they are +replacing a Council member that resigned, was removed, or otherwise becomes vacant, in which case such replacement members shall be elected to a term sufficient to complete a two-year term as measured from the term of the original cohort. -Each council member's term will be two years, from when their elections are -finalised until the next elections for their cohort are finalised. +Each Council member's term will be two years, from when their elections are +finalized until the next elections for their cohort are finalized. -Only for elections involving the entire council (like the initial council -election), the two candidates receiving the highest number of votes shall be -designated Cohort A with a two year term, and the three candidates receiving -the highest number of votes after shall be designated Cohort B with a one year -term. +.. _whole-council: -There are no term limits for individual council members. +Only for elections involving the entire Packaging Council (such as the initial Council election), the two +candidates receiving the highest number of votes shall be designated Cohort A with a two year term, and the +three candidates receiving the next highest number of votes shall be designated Cohort B with a one year term. + +There are no term limits for individual Council members. + +.. _vacancy: Vacancies --------- -Council members may resign their position at any time. +Packaging Council members may resign their position at any time. -Whenever there is a vacancy during the regular council term, the council may +Whenever there is a vacancy during the regular Packaging Council term, the Council may vote to appoint a replacement to serve out the rest of the term. -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 (with a simple +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 (with a simple majority vote, where the missing member is recorded as an abstention). +If a full Packaging Council cannot be seated by this process, the Python Steering Council can appoint new +Packaging Council members to fill the vacancies, or call for new Packaging Council elections. + Conflicts of interest --------------------- -No more than two Packaging Council members should be employed by or -significantly affiliated with the same entity. An entity is a company, a -company and its subsidiaries, or another incorporated entity such as a -non-profit or educational institution with its own mission and goals. PSF -members are explicitly exempt from this restriction, but *not* PSF directors -or officers. +No more than two Packaging Council members may be employed by or have decision-making power over the +same entity. An entity is a company and its subsidiaries, or another incorporated entity such as a +non-profit or educational institution with its own mission and goals. For this purpose, "employed +by" includes other forms of receiving compensation for current work regardless of workforce +classification, and having "decision-making power over" an entity includes holding officer/director +roles and 25% or more ownership stake. -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. +While we expect and trust Packaging Council members to act in the best interests of Python rather than +themselves or their affiliations, the mere appearance of any one such organization dominating Python +packaging development could itself be harmful and erode trust. -PSF staff members are not permitted to be members of the Packaging Council. +PSF staff members are not permitted to serve as members of the Packaging Council. -In a council election, if more than two of the top five 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. +Currently serving Steering Council members are not permitted to concurrently serve as members of the Packaging +Council. -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. +In a Council election, if more than two of the top five vote-getters work for the same employer, then only the +top two such vote-getters are elected and the others are disqualified, with the remaining vote-getters +elevated in the vote rank. This process is repeated until a valid Packaging Council is formed. If after this +process a full Council cannot be formed, disqualified vote-getters are re-qualified in the rank order of their +vote tally until a full Council can be formed. -.. _voting-member: +During a Packaging 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 `_. --------------- -Voting members --------------- +.. _electors: -Responsibility -============== +========================== +Packaging Council Electors +========================== -Voting members participate in formal votes to elect the Packaging Council. +---------------- +Responsibilities +---------------- + +Packaging Council Electors participate in formal votes to elect the Packaging Council. + +The eligibility of Packaging Council Electors is equivalent to the Article IV, section 4.2 voting +membership defined in the `PSF Bylaws `_. Should those bylaws +change in the future, the eligibility of Packaging Council Electors will similarly change to match. +As with PSF voting membership, Packaging Council Electors must affirm their intention to vote in +Packaging Council elections every year. .. _process: Processes ========= -Initial membership ------------------- - -Initial set of voting members will include anyone who has taken the time to -formalise their participation in the packaging community. This includes: - -* PyPA members: Anyone with the triage bit or commit bit, or at least one - project in the PyPA organisation. -* Packaging workgroup members: Anyone who is listed on the Packaging WG charter - who is willing to participate is welcome. -* Interested core team members: Any Python core team member who is willing to - participate is welcome. -* Wider community members: An initial set of for-profit companies, nonprofit - organizations, academic or educational institutions and smaller unaffiliated - projects would be invited to nominate three individuals to represent them. - See :ref:`the initial set of community voting members `. - -Adding a new member -------------------- - -New voting members are added by a simple majority vote by the current -membership. Quorum for adding new members is 50%. - -A vote to add a new member is triggered when a voting member calls for one -publicly on an appropriate communication channel, and another voting member -seconds the call within two weeks. - -The vote lasts for one week. Each member can vote for or against. - -Removal of a member -------------------- - -In order to maintain a reasonable expectation of quorum, failure to participate -in Packaging Council elections for two consecutive council elections -automatically removes a person from the list of voting members, until they -re-submit their intention to resume their participation to the Packaging -Council in writing. - -In exceptional circumstances, it may be necessary to remove someone from the -voting members against their will (for example: egregious and ongoing code of -conduct violations). A voting member may be removed by a two-thirds majority -vote by the Packaging Council (in practice: 4:1 for a council with five -members). - -If the relevant voting member is also on the Packaging Council, then they can -participate in the vote. They are removed from the Packaging Council if the -vote removes them as a voting member. The vacancy is filled as per the process -for filling vacancies in the Packaging Council. - Vote of no confidence --------------------- -In exceptional circumstances, the voting members may remove a sitting council -member, or the entire council, via a vote of no confidence. +In exceptional circumstances, a vote of no confidence may be called to remove a sitting Packaging +Council member, or the entire council. The Python Steering Council may call such votes of no +confidence, with no second being necessary. Anyone may request such a vote of no confidence from +the Steering Council regardless of the requester's membership or affiliation, and the Steering +Council has full discretion to call for the vote or not. -A no-confidence vote is triggered when a voting member calls for one publicly -on an appropriate public communication channel, and another voting member -seconds the call within one week. +The vote of no confidence lasts for two weeks. Each Elector votes for or against. If at least two +thirds of Electors express a lack of confidence, then the vote succeeds. -The vote lasts for two weeks. Each voting member votes for or against. If at -least two thirds of voters express a lack of confidence, then the vote -succeeds. Quorum for a vote of no confidence is 50%. - -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. +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 by the +`normal process `_. If a whole-Council vote succeeds, the Council is dissolved and a new Council +election is triggered immediately, using the rules for `whole Council `_ elections. ----------------------- Changing the governance ----------------------- -Changes to this governance model, once it is accepted, will require at least a -two-thirds majority of votes cast in a vote, which should be open for two -weeks. +Changes proposed to this governance model must be approved by the Python Steering Council. ============== Rejected Ideas ============== ---------------------------------------- -Annual elections for all council members +Annual elections for all Council members ---------------------------------------- -An annual term for council members is the approach taken for the Python +An annual term for Council members is the approach taken for the Python Steering Council's elections. This PEP uses a cohort-based model, derived from the PSF Board's elections which enables continuity of members across a changing -council. +Council. -There is a trade-off between continuity of the council and reshuffles. This PEP +There is a trade-off between continuity of the Council and full reshuffles. This PEP takes the position that continuity will be more valuable for the Python -Packaging space, especially combined with the vote of no confidence, automatic -removal of inactive voters and regular elections. +Packaging domain, especially combined with the vote of no confidence, automatic +removal of inactive voters, and regular elections. ------------------------------- Term limits for council members @@ -388,28 +367,42 @@ While this is viewed as valuable for boards in general, this was rejected because of the size of the pool of interested and qualified people who might serve. +------------------- +Elector eligibility +------------------- + +Previous iterations of this PEP's draft proposed different membership rules for identifying the +Packaging Council Electors. After extensive discussion among stakeholders, and after seeking the +widest possible feedback, the PEP authors agreed that aligning Packaging Council Electors with PSF +Board voting membership was both the most workable arrangement and the most equitable approach to +include all parts of the Python packaging community. + +PSF membership is used here because it is open to the broadest possible Python community. In +particular, most people doing Python packaging work do such work in public, including contributing +to PyPA or non-PyPA projects, and are likely to be eligible for PSF "Contributing Membership" based +on that work without paying any membership fee. + ------------------------------- Approval voting in the election ------------------------------- -An earlier non-public draft of this PEP used an approval voting process, which -aligned with what :pep:`13` stated at the time of writing. The Python core team -has changed their governance to use Bloc STAR and this PEP was updated to align -with that for the same reasons as the core team's move to Bloc STAR: it better -captures voter intention in the results. +An earlier non-public draft of this PEP used an approval voting process, which aligned with what :pep:`13` +stated at the time of writing. The Python core team has changed their governance to use Bloc STAR and this PEP +was updated to align with that for the same reasons as the core team's move to Bloc STAR: it better captures +voter intention in the results. It is also expected that the same election machinery can be used for both +elections. ------------------------------------------------------------------ -Disallow multiple people from the same organisation on the council +Disallow multiple people from the same organization on the council ------------------------------------------------------------------ This PEP currently mirrors the Python Steering Council's limit, that at most -two individuals related to a single organisation can be on the council. +two individuals related to a single organization can be on the council. -Limiting it to one is workable; although it hasn't come up in the SC, people do -move around, and we wouldn't want good candidates to either make employment -decisions based on PC membership, or have to resign based on an employment -change. Limiting it to a maximum of two, plus votes of no confidence is -probably sufficient safety from any undue employer influence. +Limiting it to one is workable; although it hasn't come up in the Steering Council, people do move around, and +we wouldn't want good candidates to either make employment decisions based on Packaging Council membership, or +have to resign based on an employment change. Limiting it to a maximum of two, plus votes of no confidence is +likely sufficient to avoid any undue employer influence. --------------------------------------------------------------------------- Establishing specific processes for Packaging Council and PyPA relationship @@ -417,7 +410,7 @@ Establishing specific processes for Packaging Council and PyPA relationship As noted in the abstract, the focus of this PEP is on providing a minimal-but-solid foundation for further governance decisions. The specifics of -this relationship would be figured out by the inaugural council. +this relationship would be figured out by the inaugural Council. .. _appendix_a: @@ -439,7 +432,7 @@ To that end, the process for approval for this PEP will be: .. _appendix_b: =================================================== -Appendix B: Operational suggestions for the council +Appendix B: Operational suggestions for the Council =================================================== This section is based on what the PEP's authors view as things that would be @@ -448,7 +441,7 @@ These are non-binding yet strongly encouraged. The PSF will designate a staff person to be the Packaging Council's official liaison who will regularly attend meetings, since it is expected that the -Packaging Council will meet on a regular basis (twice a month). +Packaging Council will meet on a regular basis (e.g. twice a month). * Coordinate with the Steering Council on PEPs that need input from both groups. @@ -467,14 +460,16 @@ Packaging Council will meet on a regular basis (twice a month). * Provide casual real-time opportunities for people to bring topics that are not PEPs, like office hours, a forum channel, or panels at Python events. -.. _appendix_c: - -==================================================== -Appendix C: Initial list of community voting members -==================================================== +=============== +Acknowledgments +=============== -This appendix will list the initial set of community voting members once the :ref:`process of -selecting ` those community members has been completed. +The language and spirit of this PEP is the work of many committed and passionate contributors across +the entire Python packaging ecosystem. The PEP authors wish to thank everyone who has participated +and provided input, and we sincerely believe that this PEP and its intended outcomes are much better +because of that participation. This PEP is just one (albeit important) step, and we encourage and +celebrate the ongoing contributions of all Python packaging stakeholders toward an ever-improving +packaging user experience. .. _Python Packaging Authority (PyPA): https://packaging.python.org/en/latest/glossary/#term-Python-Packaging-Authority-PyPA