PEP: 772
Title: Packaging Council governance process
Author: Barry Warsaw <barry@python.org>,
        Deb Nicholson <deb@python.org>,
        Pradyun Gedam <pradyunsg@gmail.com>
Discussions-To: https://discuss.python.org/t/pep-772-packaging-council-governance-process-round-3/100181
Status: Accepted
Type: Process
Topic: Governance, Packaging
Created: 21-Jan-2025
Post-History:
  `06-Feb-2025 <https://discuss.python.org/t/pep-772-packaging-governance-process/79724/1>`__,
  `30-May-2025 <https://discuss.python.org/t/pep-772-packaging-council-governance-process-round-2/93904>`__,
  `25-Jul-2025 <https://discuss.python.org/t/pep-772-packaging-council-governance-process-round-3/100181>`__,
  `23-Mar-2026 <https://discuss.python.org/t/pep-772-packaging-council-governance-process-round-3/100181/108>`__,
  `14-Apr-2026 <https://discuss.python.org/t/pep-772-packaging-council-governance-process-round-3/100181/117>`__,
Replaces: 609
Resolution: `16-Apr-2026 <https://discuss.python.org/t/pep-772-packaging-council-governance-process-round-3/100181/118>`__


========
Abstract
========

This PEP proposes a Python Packaging Council with broad authority over
packaging standards, tools, and implementations. Like the Python Steering
Council, the Packaging Council seeks to exercise this authority as rarely as
possible; instead, they use this power to establish standard processes.

Like :pep:`8016`, instead of trying to do everything in one PEP, this PEP
focuses on providing a minimal-but-solid foundation for further governance
decisions.

========================
Motivation and Rationale
========================

As Python packaging has matured, several interrelated problems with the current
way of managing the technical development, decision making and processes have
become apparent.

----
PyPA
----

The `Python Packaging Authority (PyPA)`_ was created to take over the
maintenance of `pip`_ and `virtualenv`_ from Ian Bicking, led by Brian Rosner,
Carl Meyer and Jannis Leidel. Over the years, additional projects got added to
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` 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
ecosystem-wide changes are being proposed. In particular, the work to support
existing projects and maintain a user guide has been excellent.

At the time of writing, PyPA does not have a community elected body and
individuals within the group meet ad hoc, rather than on a regular cadence. The
PyPA itself is defined by a group of projects rather than as a group of
individuals, with no direct oversight over its individuals.

------------
Packaging-WG
------------

The PSF's `Packaging Workgroup`_ was created to support the larger efforts of
improving and maintaining the packaging ecosystem in Python through fundraising
and disbursement of raised funds. It was expected to largely focus on efforts
such as Python Package Index (PyPI), pip, packaging.python.org, Setuptools, and
cross-project efforts.

The group made very good progress here in the past, but the scope and scale of
supporting Python's packaging ecosystem has grown considerably in the last few
years. There is both more work to be done and more stakeholders than ever
before. The Packaging Workgroup is also not a community elected body and does
not have a regular mechanism for changing, adding or removing members.

--------------------------
Interoperability Standards
--------------------------

The PyPA is responsible for creating and maintaining the interoperability
standards for Python packaging tools. The decision making for updating these
standards involves a standing delegation from the Python Steering Council to
specific individuals based on specific topics, and these individuals have the
ability to further delegate the decision making on the changes to other
individuals.

We know that this process is not sustainable and there has been a desire
expressed by many to have a designated body to make these decisions (including
the individuals with the standing delegations).

-----------------------
Python Steering Council
-----------------------

While there is overlap between the PyPA, Packaging-WG, and the Python core
team, the Steering Council is not well-placed to make decisions over Python
packaging matters directly. Packaging only tangentially intersects with Python
language evolution, packaging requires specialised expertise and deep domain
knowledge (much like typing or the C API), and there is a different cohort of
potential electors for a Packaging Council than the Steering Council.

------------
Expectations
------------

An elected Packaging Council would have authority over the interoperability
standards, would guide the packaging tooling provided with CPython, and have
the mandate to coordinate Python packaging efforts. This would provide a
better, more consistent experience to packagers, package consumers, tool
developers, PyPI, and other index maintainers. With greater transparency and
clearer goals via an elected Packaging Council, the PSF will also be able to
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:

* Work with PSF staff and the newly formed `User Success Workgroup`_ toward
  improving the user experience around packaging.
* 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.

=============
Specification
=============

-----------------
Packaging Council
-----------------

The Packaging Council will be composed of five individuals.

Mandate
=======

The council shall work to:

* Maintain the quality and stability of the Python packaging standards.
* 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.
* Strive to seek consensus among contributors before acting in a formal
  capacity.

Responsibilities
================

The council shall:

* Have broad authority over the Python packaging standards and Python Packaging
  User Guide, that are maintained on https://packaging.python.org.
* Establish processes for making binding decisions regarding packaging
  standards, tools and implementations as well as for considering
  ecosystem-wide changes.
* Look for ways to use their direct authority as little as possible - seeking
  consensus and consent over voting.

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 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 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
Workgroup.

The PyPA is expected to work with the Packaging Council to establish a decision
making process that governs the technical projects under the PyPA umbrella.

Processes
=========

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 will be
  available, and any PSF voting member can request a 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 must themselves be PSF voting members, and nominations must include information
  about the nominee's relevant affiliations.

* **Phase 3**: Each Elector receives a ballot consisting of all eligible nominees, which Electors
  use to cast their vote for the Packaging Council.  The mechanics of the election (i.e. the
  software used to conduct the election, the algorithm used to determine the outcome of the vote,
  etc.) are conducted by the PSF, in accordance with the `PSF bylaws`_ and its regular Board
  election procedures.  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.

The Packaging Council election process is managed by a returns officer nominated by the PSF Board.
The PSF shall maintain records of the elections as well as run the annual election for the Packaging
Council.  The PSF Board 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.

Quorum for Packaging Council votes (either cohort election or votes of no confidence) is 50% of
Electors.


Term
----

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
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
finalized until the next elections for their cohort are finalized.

As Packaging Council elections will generally align with the timing of PSF Board elections, any
members elected in an "off cycle" Council election (such as the initial Council election) will
similarly serve until the next regular election for their cohort.

.. _whole-council:

Only for elections of 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
---------

Packaging Council members may resign their position at any time.

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
majority vote, where the missing member is recorded as an abstention).

If a full Packaging Council cannot be seated by this process, the PSF Board, in consultation with
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 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 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 serve as members of the Packaging Council.

Serving Steering Council members are not permitted to concurrently 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 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.

If fewer than five members are to be elected, an analogous procedure is applied in order to
guarantee that no more than two members of the entire Packaging Council work for the same employer.

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 :ref:`normal <vacancy>`.

The Python Steering Council is the final arbiter for technical conflicts of interest, and the Python
Software Foundation Board is the final arbiter for conflicts of interest related to governance for
the Packaging Council.

Code of Conduct
---------------

All Packaging Council Electors and Packaging Council members are subject to, and must abide by the
PSF `Code of Conduct`_, its enforcement procedures, and its remedies for adjudicated violations.

The Packaging Council will moderate its spaces and support PSF Code of Conduct enforcement as
appropriate in the area.

.. _electors:

==========================
Packaging Council Electors
==========================

----------------
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.  Packaging Council Electors must
affirm their intention to vote in Packaging Council elections in a manner and process similar to PSF
Board voting membership affirmations.

PSF voting members may opt-out (annually or indefinitely) from Packaging Council elections
independently of their choice to vote in PSF Board elections.

The process for ensuring elector eligibility to vote in Packaging Council elections will be
documented in the `Python Packaging User Guide <https://packaging.python.org/en/latest/>`_ before
the inaugural election, and reviewed by the returns officer prior to every subsequent election.

.. _process:

Processes
=========

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 discretion to call for the vote or not.  The PSF Board may overrule the Steering Council
to initiate a vote of no confidence.

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.

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
:ref:`normal process <vacancy>`. If a whole-Council vote succeeds, the Council is dissolved and a new Council
election is triggered immediately, using the rules for :ref:`whole Council <whole-council>` elections.

-----------------------
Changing the governance
-----------------------

Changes proposed to this governance model must be approved by the Python Steering Council.

==============
Rejected Ideas
==============

----------------------------------------
Annual elections for all Council members
----------------------------------------

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.

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 ecosystem.

-------------------------------
Term limits for council members
-------------------------------

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 temporarily changed to use the same mechanism.  However, since Packaging
Council elections will now be concurrent with PSF Board elections, with the same voting constituency
(i.e. PSF voting membership), and administered by the same returns officer, this PEP was updated to
align Packaging Council elections with PSF Board elections.

------------------------------------------------------------------
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 organization can be on the council.

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
---------------------------------------------------------------------------

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.

.. _appendix_a:

================================
Appendix A: PEP approval process
================================

This PEP requires an atypical approval process, given the parties that must agree.  To that end, the
authors will submit this PEP

#. for a vote with the PSF Board, which must approve the linking of Packaging Council Electors to
   the PSF Membership, and the deactivation of the Packaging Workgroup.

   - **RESOLVED** that the Python Software Foundation authorises the creation of a Packaging Council
     as described in the draft of PEP 772 as published on 25 July 2025, conditional on the PEP
     authors adding language to PEP 772 that explicitly gives the Packaging Council the authority to
     enforce the PSF Code of Conduct, in addition to enforcement mechanisms otherwise approved by
     the Foundation.
   - Requested language added in `PR 4550 <https://github.com/python/peps/pull/4550/files>`_.
   - Resolution from `PSF Board 2025-08-13 minutes
     <https://www.python.org/psf/records/board/minutes/2025-08-13/#new-business>`__.
   - **Resolved** that the Python Software Foundation authorizes the creation of a Packaging Council
     as described in the draft of PEP 772 as published on 12 December 2025 with the following
     clarification: The Python Steering Council (PSC) is the final arbiter for technical conflicts
     of interest, and the PSF Board is the final arbiter for conflicts of interest related to
     governance for the Packaging Council.  Approved, 10-0-0.
   - Requested language added in `PR 4872 <https://github.com/python/peps/pull/4872/files>`__.
   - Resolution link TBD; resolution provided via email at time of writing.

#. for a vote on the pypa-committers mailing list, in accordance with the process outlined in
   :pep:`609`

   - This was voted on, as "endorsing the acceptance of PEP 772", with all 30 votes cast being
     in favor. Closing message on the `pypa-committers vote thread
     <https://mail.python.org/archives/list/pypa-committers@python.org/message/5M7YQXJPSMMKLNZCYXX5HCOJV2LPWABW/>`__.

#. for formal approval by the Python Steering Council

We will reconcile and update the PEP as necessary based on recommendations, comments, and feedback,
and iterate until we gain all necessary approvals.

.. _appendix_b:

===================================================
Appendix B: Operational suggestions for the Council
===================================================

This section is based on what the PEP's authors view as things that would be
beneficial for the Packaging Council to establish operational processes for.
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 (e.g. twice a month).

* Coordinate with the Steering Council on PEPs that need input from both
  groups.
* Coordinate with PyPA on their ongoing work to support individual projects.
* Delegate to domain experts or working groups in the packaging community, for
  initiatives/PEPs with a niche focus (analogous to how the Steering Council
  sends certain PEPs to the C API working group).
* Scope out work that might best be done by hiring someone and then work with
  PSF to establish outcomes and a reasonable budget.
* The Packaging Council (similar to the Steering Council) is encouraged to
  communicate with and when necessary seek advice from the PSF's Conduct
  Working Group.
* Regularly synchronize with the Steering Council on a mutually agreed cadence,
  with a recommended frequency of no less than once per quarter.
* Publish public agendas and minutes in a timely fashion.
* 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.

===============
Acknowledgments
===============

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
.. _pip: https://packaging.python.org/en/latest/key_projects/#pip
.. _virtualenv: https://packaging.python.org/en/latest/key_projects/#virtualenv
.. _Packaging Workgroup: https://wiki.python.org/psf/PackagingWG
.. _User Success Workgroup: https://github.com/psf/user-success-wg/
.. _PSF bylaws: https://www.python.org/psf/bylaws/
.. _Code of Conduct: https://policies.python.org/python.org/code-of-conduct/
.. _PSF voting members: https://www.python.org/psf/membership/
