|
| 1 | +# Pycord Release Schedule |
| 2 | + |
| 3 | +Status: Draft |
| 4 | + |
| 5 | +Authors: <Paillat-dev paillat@pycord.dev> |
| 6 | + |
| 7 | +## Purpose & Prior Precedent |
| 8 | + |
| 9 | +This document aims at describing the release schedule of Pycord, and its versioning. |
| 10 | + |
| 11 | +Prior to this proposal, the Pycord release schedule was non-standard, and therefore |
| 12 | +highly dependent on maintainer feedback and emotion towards a release. |
| 13 | + |
| 14 | +While this approach has been deemed flexible, it has also made it complicated for users |
| 15 | +to plan their projects around Pycord's updates, and has ultimately led to significantly |
| 16 | +undesirable gaps between minor releases (e.g. 1y+ between v2.6.1 and v2.7.0, and between |
| 17 | +v2.4.1 and v2.5.0). |
| 18 | + |
| 19 | +## Release Guarantees |
| 20 | + |
| 21 | +> [!NOTE] For an up to date list of Pycord's release guarantees, please visit |
| 22 | +> https://docs.pycord.dev/en/stable/version_guarantees.html. |
| 23 | +
|
| 24 | +The library follows the [semantic versioning principle](https://semver.org/) which means |
| 25 | +that the major version is updated every time there is an incompatible API change. |
| 26 | +However, due to the lack of guarantees on the Discord side when it comes to breaking |
| 27 | +changes along with the fairly dynamic nature of Python it can be hard to discern what |
| 28 | +can be considered a breaking change and what isn't. |
| 29 | + |
| 30 | +The first thing to keep in mind is that breaking changes only apply to **publicly |
| 31 | +documented functions and classes**. If it's not listed in the documentation here then it |
| 32 | +is not part of the public API and is thus bound to change. This includes attributes that |
| 33 | +start with an underscore or functions without an underscore that are not documented. |
| 34 | + |
| 35 | +## Release Schedule |
| 36 | + |
| 37 | +This document dictates that Pycord will have the following releases every year: |
| 38 | + |
| 39 | +- Up to three minor releases per year. |
| 40 | +- At least three patch releases per year. |
| 41 | +- At least one release candidate preceding each minor release by at least one month, |
| 42 | + with an optional second release candidate no later than two weeks before the minor |
| 43 | + release. |
| 44 | +- At least one patch release one month after each minor release. |
| 45 | + |
| 46 | +The content of releases follows semantic versioning. The release schedule follows a |
| 47 | +quadrimestrial cycle. |
| 48 | + |
| 49 | +At the beginning of each quadrimester, if new features are ready for release, the |
| 50 | +**Minor Quadrimester Plan** is followed. Otherwise, the **Patch Quadrimester Plan** is |
| 51 | +followed. |
| 52 | + |
| 53 | +### Minor Quadrimester Plan: |
| 54 | + |
| 55 | +- Month 0: n/a |
| 56 | +- Month 1: Release Candidate |
| 57 | +- Month 2: Minor release |
| 58 | +- Month 3: Patch release |
| 59 | + |
| 60 | +A second release candidate may be released no longer than two weeks before the minor |
| 61 | +release if needed. |
| 62 | + |
| 63 | +### Patch Quadrimester Plan: |
| 64 | + |
| 65 | +- Month 0: n/a |
| 66 | +- Month 1: Patch release |
| 67 | +- Month 2: n/a |
| 68 | +- Month 3: Patch release |
| 69 | + |
| 70 | +The release schedule is followed as planned. Releases include, at minimum, dependency |
| 71 | +updates or minor fixes. |
| 72 | + |
| 73 | +In the rare case that there are no substantial changes (no dependency updates, no fixes, |
| 74 | +no changes), the release is **skipped**. |
| 75 | + |
| 76 | +In case of an emergency, such as a security issue, a **patch release** is made as soon |
| 77 | +as possible. It counts as the planned patch release if it occurs during a month where a |
| 78 | +patch is already scheduled; otherwise it is ignored. |
| 79 | + |
| 80 | +### Feature Freeze |
| 81 | + |
| 82 | +- **Minor releases**: Features must be merged at least one week before the release |
| 83 | + candidate. Fixes can be merged up to three days before the respective Minor release. A |
| 84 | + second release candidate may be released no later than two weeks before the minor |
| 85 | + release. |
| 86 | +- **Patch releases**: Fixes must be merged at least three days before release. |
| 87 | + |
| 88 | +## Release Tracking |
| 89 | + |
| 90 | +### GitHub Milestones |
| 91 | + |
| 92 | +GitHub milestones must be maintained for all upcoming releases in the current |
| 93 | +quadrimestrial cycle. |
| 94 | + |
| 95 | +- All milestones are created at the start of each quadrimester with target dates based |
| 96 | + on the chosen plan |
| 97 | +- Pull requests and issues intended for a release must be assigned to the corresponding |
| 98 | + milestone |
| 99 | +- Milestones are closed when the release is published |
| 100 | +- If a release is skipped, its milestone is closed without a release |
| 101 | +- All milestones include a target release date |
| 102 | + |
| 103 | +## Release Cycle Start Date |
| 104 | + |
| 105 | +This release cycle officially begins in **Q1 2026 (February - May)**, with quadrimesters |
| 106 | +aligned as follows: |
| 107 | + |
| 108 | +- Q1: February - May |
| 109 | +- Q2: June - September |
| 110 | +- Q3: October - January |
| 111 | + |
| 112 | +The current cycle (Q3 2025: November 2025 - February 2026) is already following the |
| 113 | +Minor Quadrimester Plan: |
| 114 | + |
| 115 | +- November 2025 (Month 1): v2.7.0-rc2 |
| 116 | +- December 2025 (Month 2): v2.7.0 |
| 117 | +- January 2026 (Month 3): v2.7.1 |
| 118 | +- February 2026 (Month 0): n/a |
| 119 | + |
| 120 | +Starting **February 2026 (Q1 2026)**, all quadrimesters follow the standard 4-month |
| 121 | +cycle as described in this document. |
| 122 | + |
| 123 | +## Roles and Responsibilities |
| 124 | + |
| 125 | +### Pycord Maintainers |
| 126 | + |
| 127 | +At the start of each quadrimester, Maintainers assess together available features and |
| 128 | +decide on the quadrimestrial plan within the first week. Once the plan is decided, it is |
| 129 | +announced and pinned in the `#discussion` channel of the `Pycord` Discord server. |
| 130 | + |
| 131 | +Pycord Maintainers are responsible for deciding unanimously on the release schedule and |
| 132 | +for the release process. In case of conflicts, the decision may be escalated to the |
| 133 | +release managers. |
| 134 | + |
| 135 | +Once a release is ready, Maintainers inform the current Release Managers. |
| 136 | + |
| 137 | +### Release Managers |
| 138 | + |
| 139 | +The Release Managers consist of Pycord Project Managers and Project Leads. They are |
| 140 | +responsible for the release process. This consists of: |
| 141 | + |
| 142 | +- Managing the release workflow |
| 143 | +- Ensuring workflow completeness |
| 144 | +- Ensuring Announcements are made |
| 145 | + |
| 146 | +## Release Schedule Flowchart |
| 147 | + |
| 148 | +```mermaid |
| 149 | +flowchart TD |
| 150 | + Start(["Start of Quadrimester"]) --> Month0Start["Month 0"] |
| 151 | + Month0Start --> Assess{"Maintainers assess:<br>Features ready?"} |
| 152 | + Assess -- Yes --> MinorDecision["Minor Quadrimester"] |
| 153 | + Assess -- No --> PatchDecision["Patch Quadrimester"] |
| 154 | + MinorDecision --> Announce["Maintainers:<br>Announce in #discussion<br>Pin message"] |
| 155 | + PatchDecision --> Announce |
| 156 | + Announce --> CreateMilestones{"Maintainers:<br>Create milestones"} |
| 157 | + CreateMilestones -- Minor --> M_Milestones["Milestones:<br>RC, Minor, Patch"] |
| 158 | + CreateMilestones -- Patch --> P_Milestones["Milestones:<br>2 Patches"] |
| 159 | + M_Milestones --> M_Month1["Month 1:<br>Feature Freeze<br>Release RC<br>Close milestone"] |
| 160 | + P_Milestones --> P_Month1["Month 1:<br>Release Patch<br>Close milestone"] |
| 161 | + M_Month1 --> M_Month2["Month 2:<br>Release Minor<br>Close milestone"] |
| 162 | + P_Month1 --> P_Month2["Month 2:<br>n/a"] |
| 163 | + M_Month2 --> Month3["Month 3:<br>Release Patch<br>Close milestone"] |
| 164 | + P_Month2 --> Month3 |
| 165 | + Month3 --> End(["End of Quadrimester"]) |
| 166 | + style Start fill:#e1f5e1,color:#000 |
| 167 | + style Assess fill:#fff4e1,color:#000 |
| 168 | + style CreateMilestones fill:#fff4e1,color:#000 |
| 169 | + style M_Month1 fill:#ffe1e1,color:#000 |
| 170 | + style End fill:#ffe1e1,color:#000 |
| 171 | +``` |
0 commit comments