PEP 8016 – 指導委員會模式
- 作者:
- Nathaniel J. Smith, Donald Stufft
- 狀態:
- 已接受
- 類型:
- 資訊類
- 主題:
- 治理
- 建立日期:
- 2018 年 11 月 01 日
附註
本 PEP 僅供歷史參考,目前的官方治理文件為 PEP 13。
摘要
本 PEP 提出了一種基於指導委員會(Steering Council)的 Python 治理模式。委員會擁有廣泛的權力,但他們會盡可能少地行使這些權力;相反地,他們利用這些權力建立標準流程,例如其他 801x 系列 PEP 中所提議的那些流程。這遵循了一種普遍的哲學:將重大變更拆分為一系列可獨立審查的小型變更是較好的做法;我們不嘗試在一個 PEP 中解決所有問題,而是專注於為進一步的治理決策提供一個極簡但紮實的基礎。
PEP 採納情形
PEP 8016 已於 2018 年 12 月 17 日星期一,透過 PEP 8001 所述的 核心開發者投票 獲得採納。
原理
本提案的主要目標為:
- 保持平庸(Boring):我們並非治理方面的專家,也不認為 Python 是實驗未經證實之新穎治理模式的好地方。因此,本提案盡可能遵循成熟、廣為人知且經過驗證的流程。這種委員會採取「大多不插手」的高層級方針,可說是大型成功開源專案中最常見的做法,其細節則直接衍生自 Django 的治理模式。
- 保持簡單(Simple):我們嘗試將內容縮減至使運作可行所需的最低限度:委員會、核心團隊(負責選舉委員會)以及修改本文件的流程。目標是「最小可行性治理」(Minimum Viable Governance)。
- 保持全面(Comprehensive):但對於需要定義的事項,我們致力於確保涵蓋所有面向,因為我們不希望再次經歷這類危機。擁有一套清晰明確的規則也有助於將困惑與怨懟降至最低。
- 保持靈活且輕量(Flexible and light-weight):我們知道需要時間和實驗來找到協作的最佳流程。透過將本文件保持在最低限度,我們能在未來保留最大的調整空間,同時將全專案投票這類沈重且令人焦慮的流程需求降至最低。
許多細節已在 此 Discourse 討論串 中討論過,且 此討論串 亦有進一步討論。對於任何試圖理解各種微小決策背後邏輯的人來說,這些可能有參考價值。
規範
指導委員會
組成
指導委員會是一個 5 人的委員會。
授權範圍
指導委員會應致力於:
- 維護 Python 語言與 CPython 解釋器的品質與穩定性,
- 使貢獻流程盡可能地平易近人、具包容性且可持續,
- 制度化並維護核心團隊與 Python 軟體基金會(PSF)之間的關係,
- 為 PEP 建立適當的決策流程,
- 在採取正式行動前,尋求貢獻者與核心團隊之間的共識,
- 擔任在所有其他方法皆失效時的「最終上訴法院」。
職權
委員會擁有對專案決策的廣泛權力。例如,他們可以:
- 接受或拒絕 PEP
- 執行或更新專案的行為準則(Code of Conduct)
- 與 PSF 合作管理專案的任何資產
- 將部分權力下放給其他小組或流程
然而,他們不能修改本 PEP,也不能影響核心團隊的成員資格,除非透過本 PEP 規定的機制進行。
委員會應設法盡量少用這些權力。與其投票,不如尋求共識;與其裁定單一 PEP,不如為 PEP 決策定義標準流程(例如,採納其他 801x 系列 PEP 中的一個);與其處理個別案例,不如建立一個行為準則委員會,依此類推。
為行使權力,委員會需進行投票。每位委員會成員必須投票或明確棄權。對特定投票有利益衝突的成員必須棄權。提案通過需要過半數非棄權委員會成員的支持。
委員會的審議與投票應盡可能公開進行。
委員會選舉
委員會選舉包含兩個階段:
- 第一階段:候選人宣佈其服務意願。候選人必須由核心團隊成員提名。允許自我提名。
- 第二階段:每位核心團隊成員可投票給零至五名候選人。投票採匿名方式。候選人依獲得票數排序。若出現平手,可由候選人之間達成共識解決,否則由隨機抽選決定勝出者。
每個階段持續一至兩週,由即將卸任的委員會酌情決定。對於首次選舉,兩階段各持續兩週。
選舉流程由即將卸任的指導委員會所提名的一名選舉官(Returns officer)管理。對於首次選舉,選舉官由 PSF 執行董事提名。
委員會理應反映 Python 貢獻者與使用者的多元性,並鼓勵核心團隊成員據此投票。
任期
每當發布功能版本後,即選舉新一屆委員會。委員會任期自選舉結果定案起,至下一屆委員會任期開始為止。任期無限制。
職缺
委員會成員可隨時辭職。
若在正規任期內出現職位空缺,委員會可投票任命遞補人選完成剩餘任期。
若委員會成員失聯且一個月或更久無法聯繫,其餘委員會成員可投票將其替換。
利益衝突
雖然我們信任委員會成員會以 Python 的最大利益而非自身或雇主的利益行事,但單一公司主導 Python 開發的表象本身就可能有害並侵蝕信任。為避免任何利益衝突的疑慮,委員會中受雇於同一雇主的成員不得超過 2 名。
在委員會選舉中,若前 5 名得票者中有 3 人來自同一雇主,則其中排名最低者將失去資格,並由第 6 名候選人遞補進入前 5 名;此過程重複進行直到形成合法的委員會為止。
在委員會任期內,若因情況變更導致違反此規則(例如,委員會成員更換工作),則必須有一名或多名成員辭職以解決問題,隨後產生的空缺可按正常程序填補。
核心團隊成員除名
在特殊情況下,可能有必要違背核心團隊成員的意願將其除名(例如:嚴重且持續的行為準則違規)。這可透過指導委員會投票完成,但與其他指導委員會投票不同,此舉需要至少三分之二的多數決。在 5 名成員投票的情況下,3:2 的投票結果不足以通過;必須至少 4:1 支持才能使該投票生效。此外,這是指導委員會唯一不可下放的權力,且在不信任投票進行期間不得使用此權力。
若被除名的核心團隊成員同時也是指導委員會成員,則他們同時被撤銷指導委員會資格。
不信任投票
在特殊情況下,核心團隊可透過不信任投票移除現任委員會成員或整個委員會。
不信任投票由一名核心團隊成員在適當的專案通訊管道公開提出,並由另一位核心團隊成員附議後發起。
投票持續兩週。核心團隊成員進行贊成或反對投票。若至少三分之二的投票者表達不信任,則投票通過。
不信任投票分為兩種形式:針對單一成員,以及針對整個委員會。發起不信任投票時必須指定類型。若單一成員投票通過,該成員將被移除委員會,其產生的空缺按常規處理。若全體委員會投票通過,委員會將解散,並立即觸發新的委員會選舉。
核心團隊
角色
核心團隊是一群管理 Python 的受信任志工。他們承擔實現專案目標所需的許多角色,特別是那些需要高度信任的角色。他們做出形塑專案未來的決策。
核心團隊成員被期望成為社群的榜樣以及專案的監護人,代表社群及所有依賴 Python 的人。
在罕見且需要干預的情況下,他們會在線上討論或官方 Python 活動中進行介入。
他們對 Python 專案基礎設施擁有權限,包括 Python 專案網站本身、Python GitHub 組織與儲存庫、Bug 追蹤系統、郵件列表、IRC 頻道等。
特權
核心團隊成員可參與正式投票,通常用於提名新團隊成員及選舉指導委員會。
成員資格
Python 核心團隊成員應展現出:
- 對 Python 專案哲學有良好的掌握
- 具有建設性與樂於助人的良好紀錄
- 對專案目標有顯著的貢獻(任何形式皆可)
- 投入時間改進 Python 的意願
隨著專案成熟,貢獻已超越程式碼本身。以下是可能被考慮加入核心團隊的貢獻領域列表(非詳盡列表,無特定先後順序):
- 社群管理與推廣
- 在郵件列表與 IRC 提供支援
- 票務分類(Triaging tickets)
- 撰寫補丁(程式碼、文件或測試)
- 審查補丁(程式碼、文件或測試)
- 參與設計決策
- 在特定領域提供專業知識(安全性、國際化等)
- 管理持續整合(CI)基礎設施
- 管理伺服器(網站、追蹤系統、文件等)
- 維護相關專案(替代解釋器、包裝等核心基礎設施)
- 視覺設計創作
核心團隊成員資格認可了與 Python 專案哲學及目標高度一致的持續且有價值的努力。
該資格需透過核心團隊投票獲得至少三分之二的贊成票,且指導委員會無否決權方可授予。
核心團隊成員會持續尋找有前途的貢獻者,教導他們專案的管理方式,並在他們準備好時將其姓名提交至核心團隊投票。
核心團隊成員資格沒有時間限制。然而,為了讓大眾能合理了解維護 Python 的人數,鼓勵停止貢獻的核心團隊成員宣佈自己為「不活躍」。對於兩年內未做出任何實質貢獻者,可能會被要求將自己歸類為該狀態;若無回應則將被轉移至該類別。為記錄並紀念他們的貢獻,不活躍成員仍會與活躍核心團隊成員列在一起;若他們日後恢復貢獻,可隨時切換回活躍狀態。然而,在不活躍狀態期間,他們會失去投票、提名指導委員會以及 Commit 權限等活躍成員權利。
初始活躍核心團隊成員由目前 GitHub 上「Python core」團隊 的所有成員組成;初始不活躍成員則由過去曾擔任過維護者(committer)的所有其他人組成。
修改本文件
變更本文件需要核心團隊投票中至少三分之二的贊成票。
待辦事項
- 許多人提供了有益的建議與回饋;我們應該確認他們是否願意被列為共同作者。
- 看起來 Aymeric Augustin 撰寫了整個 Django 文件,因此推測他擁有著作權;或許我們應該詢問他是否願意將其釋出到公有領域,以便我們下方的著作權聲明能更簡潔。
致謝
大量文本無保留地複製自 Django 專案的治理文件。
版權
複製自 Django 的文字依據 其授權條款 使用。本文件其餘部分已置於公有領域。
來源:https://github.com/python/peps/blob/main/peps/pep-8016.rst