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.