Based on discussions to create a Python Packaging Council, I have drafted a proposal to formalize the creation of a Python Packaging Council. I welcome comments from any Packaging stakeholder. This includes but is not limited to PyPA/non-PyPA tools.
Please share constructive feedback as this is my first time drafting a PEP.
PEP: 9999 Title: Python Packaging Governance Author: Shamika Mohanan Sponsor: Status: Draft Type: Process Topic: Governance Content-Type: text/x-rst Created: Abstract ======== This PEP describes the Python Packaging Governance for all tools that are included as part of the PyPA. The Packaging Council will govern all PyPA tools, represent the community that supports these tools and act as a representative of PyPA tools. From here on, this Packaging council will be called the Python Packaging Authority (PyPA). This PEP will supersede [PEP 609](https://peps.python.org/pep-0609/) and will cover all aspects of Python Packaging Governance. Rationale ========= One issue facing Python Packaging is that there is a lack of a comprehensive vision and strategy for Python Packaging tools. While `PEP 609 <https://peps.python.org/pep-0609/>`_ formalized the governance of tools included under the PyPA umbrella, this governance does not extend to setting long-term goals for PyPA tools. In order to ensure PyPA tools remain relevant in the future and cater to user requirements, it is important to set a vision and strategy for Python Packaging and PyPA tools. It is hoped that the council will focus on the Packaging ecosystem, define the vision and work with the community to develop the strategy. Attempts at defining the vision and strategy have failed so far. The main motivation for this PEP is to create a body with the necessary powers to define the short-term and long-term goals for Python Packaging and to support the community in setting the strategy to achieve the goals. This governing body will represent PyPA tools when working with any other tool or group. As such, the mission of the initial council will be- * Define the short-term and long-term vision and strategy for Python Packaging * Approve PEPs that support the Packaging strategy * Identify solutions to few (1-2) problems identified in the [Python Packaging survey](https://drive.google.com/file/d/1U5d5SiXLVkzDpS0i1dJIA4Hu5Qg704T9/view) and marshall resources to implement the solutions We can expect the initial council to pick up a few problems outside of this list that they feel is important to the community. With each council, this mission will change depending on pressing issues and how the vision and strategy has changed. The mandate and powers of the PyPA have been drawn up such that they are not too restrictive. Certain issues such as authority over maintenance and improvement of installers, build backends, Warehouse, and other PyPA software are not in the scope of the initial council. This could be added the future if all stakeholders agree to this change. It is expected that the mandate of powers of the council will grow as long as it can show that it is working in the best interest of the Packaging community. This council will be accountable to the Python Steering Council. Specification ============= Python Packaging Authority -------------------------- Composition ~~~~~~~~~~~ The packaging council will consist of 5 members. Mandate ~~~~~~~ The packaging council will- * Set vision and strategy for Python Packaging and PyPA tools (defined below) * Support, encourage and facilitate the maintenance and improvement of the quality of all PyPA tools * Represent PyPA tools as a group when working with non-PyPA tools, PSF, Python Steering Council and third-party entities such as operating system package managers. The council will start discussions and engage with stakeholders and the Packaging community and represent the PyPA interests. * Arbitrate on any packaging related issue brought to the council. This should be done as the final resort. * Improve diversity of the Packaging community. The council should work with the PSF to introduce programmes aimed at improving diversity of contributors. Powers ~~~~~~ Packaging Governance ++++++++++++++++++++ * Accept or reject PEPs within the scope delegated by the Python Steering Council * Delegate parts of their authority to other subcommittees or processes Packaging Assets ++++++++++++++++ * Authority over `packaging.python.org <https://packaging.python.org/en/latest/>`_ * Maintain advisory role for any issue related to packaging docs * Authority over PyPA GitHub org Stakeholder Management ++++++++++++++++++++++ * Act as a liaison with any packaging-related Python or non Python technical group when specific tool representation is not appropriate. For example, any group representing supply chain security. * Act as a liaison with the PSF and the Packaging Working Group to obtain funding and any other areas of shared interest * Act as liaison with the Python Steering Council Packaging ecosystem and community +++++++++++++++++++++++++++++++++ * Maintain ownership of PyPA tools. The council will not interfere with a project's day-to-day operations but rather govern the community that supports these tools. The PyPA can require projects to implement accepted PEP standards. In such a situation, the PyPA should liaise with project maintainers and the PSF to secure resources to implement accepted PEP standards when necessary. * Recommend projects for adoption into PyPA by vote. External projects can self-nominate to be included under the PyPA umbrella. * Expel PyPA project/individual Scope: It is expected that the Packaging council will consider the Python Packaging ecosystem holistically and improve all aspects of Python Packaging rather than just one project. This includes any tool and workflow related to the PyPA and PyPI. The council should work towards improving user experience of all packaging tools under its purview and this might include deprecating certain tools and developing new tools depending on requirements. While it does not have any authority over non-PyPA tools, it is expected that the council makes decisions that benefit the entire Python Packaging ecosystem. This scope includes all aspects of packaging and distribution. It is expected the council will work on long-term goals such as improving interoperability with non-PyPA packaging tools and improving packaging UX. 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 a strict majority of non-abstaining council members. Elections ~~~~~~~~~ Packaging Voting Body: The Packaging Voting Body (PVB) includes the following: * PyPA committers * Affiliate project voters PyPA committers can nominate either non-PyPA projects or individual contributors who do not contribute to a PyPA project to be added to the PVB. These voters will be called affiliate project voters. * Any voter nomination has to be seconded by another PyPA committer * External projects nominated by PyPA committers will get to appoint a representative for each ballot The initial seed of voters will include all committers for the existing non-archived public projects under the `pypa` organisation of GitHub. The PyPA has to maintain a list of eligible voters and their project affiliation. This list should contain the names of PyPA committers and affiliate project voters. This canonical list should be maintained by the PyPA with access available to all Packaging Voting Body members. This list should not share personal information publicly. It is the responsibility of all PyPA projects to ensure that the names of any new committers are added to the list of eligible voters and any communication spaces for the PyPA. For the initial election, this voter list will be maintained by the PSF. Adding any new voters and subsequent due diligence is the responsibility of PyPA committers. Once the new council has been elected, ownership of the Packaging Voting Body membership list and the PyPA-voters mailing list will be transferred to the PyPA. PyPA elections will be held in three phases * Phase 1: Packaging voting body members nominate affiliate project voters. Affiliate project voters are added to the list of eligible voters. * Phase 2: Candidates advertise their interest in serving. Candidates must be nominated by a PyPA voting body member. Self-nominations are allowed. Candidates need not be a PyPA committer. * Phase 3: Each PyPA voting body member can vote for zero or more 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. Each phase lasts one to two weeks, at the outgoing council’s discretion. For the initial election, all three phases will last two weeks. The election for all subsequent councils will start in the 12th month since the previous council election. The election process is managed by a returns officer nominated by the outgoing Packaging council. For the initial election, the returns officer will be nominated by the PSF Executive Director. The council should ideally reflect the diversity of Python Packaging contributors and users. PVB members are encouraged to vote accordingly. Term ~~~~ A new council is elected once every year. Each council’s term runs from when their election results are finalized until the next council’s term starts. There are no term limits. Generally, each council member’s term should last 12 months with one exception described below. Vacancies ~~~~~~~~~ Council members may resign their position at any time. There could also be situations that council members have been removed from the council via a vote of no confidence. 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. In such a situation, this council seat will be up for election at the next council election as long as the replacement has served 12 weeks or longer in the council. Therefore, the longest term for any council member will be 15 months before that seat is up for election. If a council member drops out of touch and cannot be contacted for a month or longer without prior notice, then the rest of the council may vote to replace them. Conflicts of interest ~~~~~~~~~~~~~~~~~~~~~ In order to avoid any appearance of conflict of interest, at most 2 members of the council can work for any single employer. 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. 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 described above. Ejecting PyPA committer ~~~~~~~~~~~~~~~~~~~~~~~ The Packaging Council or PyPA member may initiate a vote to eject a member from the PyPA committer body. A council member or PyPA committer can put forward a proposal and call for a vote on a public PyPA communication channel. A PyPA committer vote is triggered when a PyPA committer (not the proposer) seconds the proposal. The proposal will be put to a vote on the `PyPA-Committers <https://mail.python.org/mm3/mailman3/lists/pypa-committers.python.org/>`_ mailing list, over a 7-day period. Each PyPA committer and council member can vote once, and can choose one of +1 and -1. If at least two thirds of recorded votes are +1, then the vote succeeds. Ejecting PyPA project ~~~~~~~~~~~~~~~~~~~~~ The Packaging Council or PyPA member may initiate a vote to eject a project from the PyPA. A council member or PyPA member can put forward a proposal and call for a vote on a public PyPA communication channel. A PyPA committer vote is triggered when a PyPA committer (not the proposer) seconds the proposal. The proposal will be put to a vote over a 7-day period. Each PyPA committer and council member can vote once, and can choose one of +1 and -1. If at least two thirds of recorded votes are +1, then the vote succeeds. A project can also choose to leave the PyPA. If a project is leaving the PyPA or has been ejected from the PyPA, it is the responsibility of the council to support the transfer of the GitHub repository out of PyPA to a personal repository. Ejecting an affiliate project voter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Any Packaging Voting Body member or council member may initiate a vote to eject an affiliate voter from the Packaging Voting Body. A council member or PyPA committer can put forward a proposal and call for a vote on a public PyPA communication channel. A PyPA committer vote is triggered when a PyPA committer (not the proposer) seconds the proposal. The proposal will be put to a vote on the PyPA-voters mailing list, over a 7-day period. Each PyPA voting body member can vote once, and can choose one of +1 and -1. If at least two thirds of recorded votes are +1, then the vote succeeds. Vote of no confidence ~~~~~~~~~~~~~~~~~~~~~ Any PVB member or Packaging Council member can publicly call for one or more Packaging Council members to be removed from the Council via a vote of no confidence. The vote of no confidence should be called on a project communication channel and should be seconded by another PVB member. The vote lasts for two weeks. PVB members can vote for or against the removal. If at least two thirds of voters express a lack of confidence, then the vote succeeds. If the vote of no confidence is for a single member, the council member is removed from the council and the vacancy is filled as described above. If the vote is for the entire council, the council is dissolved and a new election is held. PyPA committer -------------- Role ~~~~ Similar to the Python core team, the PyPA committers is a group of volunteers who maintain and support PyPA tools. They have authority over the Python Packaging infrastructure, the Python Packaging GitHub organization and repositories, the bug tracker, the mailing lists, IRC channels, etc. Prerogatives ~~~~~~~~~~~~ PyPA committers may participate in formal votes, typically to nominate new PyPA projects, and to elect the Packaging council. Membership ~~~~~~~~~~ Any Packaging project can request PyPA membership. A PyPA member can put forward a proposal to add a project to the PyPA and call for a vote on a public PyPA communication channel. This proposal must not be opposed by the existing maintainers of the project. A PyPA committer vote is triggered when a PyPA committer (not the proposer) seconds the proposal. The proposal will be put to a vote on the PyPA-Committers mailing list, over a 7-day period. Each PyPA committer can vote once, and can choose one of +1 and -1. If at least two thirds of recorded votes are +1, then the vote succeeds. Once a project has been added to the PyPA organization, the project falls under the purview of the PyPA and will be required to meet the guidelines as set by the PyPA. As Packaging contribution requires support and time, it is the responsibility of the Packaging Council to ensure there are sufficient support mechanisms in the form of (but not limited to) mentorship, internship and fellowship to support and guide new PyPA contributors. The Packaging Council may work with the PSF to establish such programmes. Acknowledgements ================ This PEP is based on `PEP 13 <https://peps.python.org/pep-0013/>`_ which in turn is based on a Django governance document authored by Aymeric Augustin.
I am keen on hearing on hearing your thoughts around
- Whether the council will have the support of the community?
- Will non-PyPA tools work with such a council?
- Does the mandate go far enough to make meaningful changes in Python Packaging? Should the powers increase/decrease?
- Anything else you wish to share
I intend to close discussions the week of Sept 4 and then decide the next steps. Next steps could be re-drafting the proposal or submitting the PEP with changes suggested by the community.