|
| 1 | +.. _slep_000: |
| 2 | + |
| 3 | +============================== |
| 4 | +SLEP000: SLEP and its workflow |
| 5 | +============================== |
| 6 | + |
| 7 | +:Author: Adrin Jalali |
| 8 | +:Status: Draft |
| 9 | +:Type: Process |
| 10 | +:Created: 2020-02-13 |
| 11 | + |
| 12 | +Abstract |
| 13 | +######## |
| 14 | + |
| 15 | +This SLEP specifies details related to SLEP submission, review, and acceptance |
| 16 | +process. |
| 17 | + |
| 18 | +Motivation |
| 19 | +########## |
| 20 | + |
| 21 | +Without a predefined workflow, the discussions around a SLEP can be long and |
| 22 | +consume a lot of energy for both the author(s) and the reviewers. The lack of a |
| 23 | +known workflow also results in the SLEPs to take months (if not years) before |
| 24 | +it is merged as ``Under Review``. The purpose of this SLEP is to lubricate and |
| 25 | +ease the process of working on a SLEP, and make it a more enjoyable and |
| 26 | +productive experience. This SLEP borrows the process used in PEPs and NEPs |
| 27 | +which means there will be no ``Under Review`` status. |
| 28 | + |
| 29 | + |
| 30 | +What is a SLEP? |
| 31 | +############### |
| 32 | + |
| 33 | +SLEP stands for Scikit-Learn Enhancement Proposal, inspired from Python PEPs or |
| 34 | +Numpy NEPs. A SLEP is a design document providing information to the |
| 35 | +scikit-learn community, or describing a new feature for scikit-learn or its |
| 36 | +processes or environment. The SLEP should provide a concise technical |
| 37 | +specification of the proposed solution, and a rationale for the feature. |
| 38 | + |
| 39 | +We intend SLEPs to be the primary mechanisms for proposing major new features, |
| 40 | +for collecting community input on an issue, and for documenting the design |
| 41 | +decisions that have gone into scikit-learn. The SLEP author is responsible for |
| 42 | +building consensus within the community and documenting dissenting opinions. |
| 43 | + |
| 44 | +Because the SLEPs are maintained as text files in a versioned repository, their |
| 45 | +revision history is the historical record of the feature proposal. |
| 46 | + |
| 47 | +SLEP Audience |
| 48 | +############# |
| 49 | + |
| 50 | +The typical primary audience for SLEPs are the core developers of |
| 51 | +``scikit-learn`` and technical committee, as well as contributors to the |
| 52 | +project. However, these documents also serve the purpose of documenting the |
| 53 | +changes and decisions to help users understand the changes and why they are |
| 54 | +made. The SLEPs are available under `Scikit-learn enhancement proposals |
| 55 | +<https://scikit-learn-enhancement-proposals.readthedocs.io/en/latest/>`_. |
| 56 | + |
| 57 | +SLEP Types |
| 58 | +########## |
| 59 | + |
| 60 | +There are three kinds of SLEPs: |
| 61 | + |
| 62 | +1. A Standards Track SLEP describes a new feature or implementation for |
| 63 | +scikit-learn. |
| 64 | + |
| 65 | +2. An Informational SLEP describes a scikit-learn design issue, or provides |
| 66 | +general guidelines or information to the scikit-learn community, but does not |
| 67 | +propose a new feature. Informational SLEPs do not necessarily represent a |
| 68 | +scikit-learn community consensus or recommendation, so users and implementers |
| 69 | +are free to ignore Informational SLEPs or follow their advice. For instance, an |
| 70 | +informational SLEP could be one explaining how people can write a third party |
| 71 | +estimator, one to explain the usual process of adding a package to the contrib |
| 72 | +org, or what our inclusion criteria are for scikit-learn and |
| 73 | +scikit-learn-extra. |
| 74 | + |
| 75 | +3. A Process SLEP describes a process surrounding scikit-learn, or proposes a |
| 76 | +change to (or an event in) a process. Process SLEPs are like Standards Track |
| 77 | +SLEPs but apply to areas other than the scikit-learn library itself. They may |
| 78 | +propose an implementation, but not to scikit-learn’s codebase; they require |
| 79 | +community consensus. Examples include procedures, guidelines, changes to the |
| 80 | +decision-making process and the governance document, and changes to the tools |
| 81 | +or environment used in scikit-learn development. Any meta-SLEP is also |
| 82 | +considered a Process SLEP. |
| 83 | + |
| 84 | + |
| 85 | +SLEP Workflow |
| 86 | +############# |
| 87 | + |
| 88 | +A SLEP starts with an idea, which usually is discussed in an issue or a pull |
| 89 | +request on the main repo before submitting a SLEP. It is generally a good idea |
| 90 | +for the author of the SLEP to gauge the viability and the interest of the |
| 91 | +community before working on a SLEP, mostly to save author's time. |
| 92 | + |
| 93 | +A SLEP must have one or more champions: people who write the SLEP following the |
| 94 | +SLEP template, shepherd the discussions around it, and seek consensus in the |
| 95 | +community. |
| 96 | + |
| 97 | +The proposal should be submitted as a draft SLEP via a GitHub pull request to a |
| 98 | +``slepXXX`` directory with the name ``proposal.rst`` where ``XXX`` is an |
| 99 | +appropriately assigned three-digit number (e.g., ``slep000/proposal.rst``). The |
| 100 | +draft must use the `SLEP — Template and Instructions |
| 101 | +<https://github.com/scikit-learn/enhancement_proposals/blob/master/slep_template.rst>`_ |
| 102 | +file. |
| 103 | + |
| 104 | +Once the PR for the SLEP is created, a post should be made to the mailing list |
| 105 | +containing the sections up to “Backward compatibility”, with the purpose of |
| 106 | +limiting discussion there to usage and impact. Discussion on the pull request |
| 107 | +will have a broader scope, also including details of implementation. |
| 108 | + |
| 109 | +The first draft of the SLEP needs to be approved by at least one core developer |
| 110 | +before being merged. Merging the draft does not mean it is accepted or is ready |
| 111 | +for the vote. To this end, the SLEP draft is reviewed for structure, |
| 112 | +formatting, and other errors. Approval criteria are: |
| 113 | + |
| 114 | +- The draft is sound and complete. The ideas must make technical sense. |
| 115 | +- The initial PR reviewer(s) should not consider whether the SLEP seems likely |
| 116 | + to be accepted. |
| 117 | +- The title of the SLEP draft accurately describes its content. |
| 118 | + |
| 119 | +Reviewers are generally quite lenient about this initial review, expecting that |
| 120 | +problems will be corrected by the further reviewing process. **Note**: Approval |
| 121 | +of the SLEP draft is no guarantee that there are no embarrassing mistakes! |
| 122 | +Ideally they're avoided, but they can also be fixed later in separate PRs. Once |
| 123 | +approved by at least one core developer, the SLEP draft can be merged. |
| 124 | +Additional PRs may be made by the champions to update or expand the SLEP, or by |
| 125 | +maintainers to set its status, discussion URL, etc. |
| 126 | + |
| 127 | +Standards Track SLEPs (see bellow) consist of two parts, a design document and |
| 128 | +a reference implementation. It is generally recommended that at least a |
| 129 | +prototype implementation be co-developed with the SLEP, as ideas that sound |
| 130 | +good in principle sometimes turn out to be impractical when subjected to the |
| 131 | +test of implementation. Often it makes sense for the prototype implementation |
| 132 | +to be made available as PR to the scikit-learn repo (making sure to |
| 133 | +appropriately mark the PR as a WIP). |
| 134 | + |
| 135 | +Review and Resolution |
| 136 | +--------------------- |
| 137 | + |
| 138 | +SLEPs are discussed on the mailing list or the PRs modifying the SLEP. The |
| 139 | +possible paths of the status of SLEPs are as follows: |
| 140 | + |
| 141 | +.. image:: pep-0001-process_flow.png |
| 142 | + :alt: SLEP process flow diagram |
| 143 | + |
| 144 | +All SLEPs should be created with the ``Draft`` status. |
| 145 | + |
| 146 | +Eventually, after discussion, there may be a consensus that the SLEP should be |
| 147 | +accepted – see the next section for details. At this point the status becomes |
| 148 | +``Accepted``. |
| 149 | + |
| 150 | +Once a SLEP has been ``Accepted``, the reference implementation must be |
| 151 | +completed. When the reference implementation is complete and incorporated into |
| 152 | +the main source code repository, the status will be changed to ``Final``. Since |
| 153 | +most SLEPs deal with a part of scikit-learn's API, another way of viewing a |
| 154 | +SLEP as ``Final`` is when its corresponding API interface is considered stable. |
| 155 | + |
| 156 | +To allow gathering of additional design and interface feedback before |
| 157 | +committing to long term stability for a feature or API, a SLEP may also be |
| 158 | +marked as ``Provisional``. This is short for "Provisionally Accepted", and |
| 159 | +indicates that the proposal has been accepted for inclusion in the reference |
| 160 | +implementation, but additional user feedback is needed before the full design |
| 161 | +can be considered ``Final``. Unlike regular accepted SLEPs, provisionally |
| 162 | +accepted SLEPs may still be ``Rejected`` or ``Withdrawn`` even after the |
| 163 | +related changes have been included in a scikit-learn release. |
| 164 | + |
| 165 | +Wherever possible, it is considered preferable to reduce the scope of a |
| 166 | +proposal to avoid the need to rely on the ``Provisional`` status (e.g. by |
| 167 | +deferring some features to later SLEPs), as this status can lead to version |
| 168 | +compatibility challenges in the wider scikit-learn ecosystem. |
| 169 | + |
| 170 | +A SLEP can also be assigned status ``Deferred``. The SLEP author or a core |
| 171 | +developer can assign the SLEP this status when no progress is being made on the |
| 172 | +SLEP. |
| 173 | + |
| 174 | +A SLEP can also be ``Rejected``. Perhaps after all is said and done it was not |
| 175 | +a good idea. It is still important to have a record of this fact. The |
| 176 | +``Withdrawn`` status is similar; it means that the SLEP author themselves has |
| 177 | +decided that the SLEP is actually a bad idea, or has accepted that a competing |
| 178 | +proposal is a better alternative. |
| 179 | + |
| 180 | +When a SLEP is ``Accepted``, ``Rejected``, or ``Withdrawn``, the SLEP should be |
| 181 | +updated accordingly. In addition to updating the status field, at the very |
| 182 | +least the ``Resolution`` header should be added with a link to the relevant |
| 183 | +thread in the mailing list archives or where the discussion happened. |
| 184 | + |
| 185 | +SLEPs can also be ``Superseded`` by a different SLEP, rendering the original |
| 186 | +obsolete. The ``Replaced-By`` and ``Replaces`` headers should be added to the |
| 187 | +original and new SLEPs respectively. |
| 188 | + |
| 189 | +``Process`` SLEPs may also have a status of ``Active`` if they are never meant |
| 190 | +to be completed, e.g. SLEP 1 (this SLEP). |
| 191 | + |
| 192 | +How a SLEP becomes Accepted |
| 193 | +--------------------------- |
| 194 | + |
| 195 | +A SLEP is ``Accepted`` by the voting mechanism defined in the `governance model |
| 196 | +<https://scikit-learn.org/stable/governance.html?highlight=governance>`_. We |
| 197 | +need a concrete way to tell whether consensus has been reached. When you think |
| 198 | +a SLEP is ready to accept, create a PR changing the status of the SLEP to |
| 199 | +``Accepted``, then send an email to the scikit-learn mailing list with a |
| 200 | +subject like: |
| 201 | + |
| 202 | + [VOTE] Proposal to accept SLEP #<number>: <title> |
| 203 | + |
| 204 | +In the body of your email, you should: |
| 205 | + |
| 206 | +- link to the latest version of the SLEP, and a link to the PR accepting the |
| 207 | + SLEP. |
| 208 | + |
| 209 | +- briefly describe any major points of contention and how they were resolved, |
| 210 | + |
| 211 | +- include a sentence like: “The vote will be closed in a month i.e. on |
| 212 | + <the_date>.” |
| 213 | + |
| 214 | +Generally the SLEP author will be the one to send this email, but anyone can do |
| 215 | +it; the important thing is to make sure that everyone knows when a SLEP is on |
| 216 | +the verge of acceptance, and give them a final chance to respond. |
| 217 | + |
| 218 | +In general, the goal is to make sure that the community has consensus, not |
| 219 | +provide a rigid policy for people to try to game. When in doubt, err on the |
| 220 | +side of asking for more feedback and looking for opportunities to compromise. |
| 221 | + |
| 222 | +If the final comment and voting period passes with the required majority, then |
| 223 | +the SLEP can officially be marked ``Accepted``. The ``Resolution`` header |
| 224 | +should link to the PR accepting the SLEP. |
| 225 | + |
| 226 | +If the vote does not achieve a required majority, then the SLEP remains in |
| 227 | +``Draft`` state, discussion continues as normal, and it can be proposed for |
| 228 | +acceptance again later once the objections are resolved. |
| 229 | + |
| 230 | +In unusual cases, with the request of the author, the scikit-learn technical |
| 231 | +committee may be asked to decide whether a controversial SLEP is ``Accepted``, |
| 232 | +put back to ``Draft`` with additional recommendation to try again to reach |
| 233 | +consensus or definitely ``Rejected``. Please refer to the governance doc for |
| 234 | +more details. |
| 235 | + |
| 236 | +Maintenance |
| 237 | +----------- |
| 238 | + |
| 239 | +In general, Standards track SLEPs are no longer modified after they have |
| 240 | +reached the ``Final`` state as the code and project documentation are |
| 241 | +considered the ultimate reference for the implemented feature. However, |
| 242 | +finalized Standards track SLEPs may be updated as needed. |
| 243 | + |
| 244 | +Process SLEPs may be updated over time to reflect changes to development |
| 245 | +practices and other details. The precise process followed in these cases will |
| 246 | +depend on the nature and purpose of the SLEP being updated. |
| 247 | + |
| 248 | +Format and Template |
| 249 | +------------------- |
| 250 | + |
| 251 | +SLEPs are UTF-8 encoded text files using the `reStructuredText |
| 252 | +<http://docutils.sourceforge.net/rst.html>`_ format. Please see the `SLEP — |
| 253 | +Template and Instructions |
| 254 | +<https://github.com/scikit-learn/enhancement_proposals/blob/master/slep_template.rst>`_ |
| 255 | +file and the `reStructuredTextPrimer |
| 256 | +<https://www.sphinx-doc.org/en/stable/rest.html>`_ for more information. We use |
| 257 | +`Sphinx <https://www.sphinx-doc.org/en/stable/>`_ to convert SLEPs to HTML for |
| 258 | +viewing on the web. |
| 259 | + |
| 260 | +Header Preamble |
| 261 | +--------------- |
| 262 | + |
| 263 | +Each SLEP must begin with a header preamble. The headers must appear in the |
| 264 | +following order. Headers marked with * are optional. All other headers are |
| 265 | +required:: |
| 266 | + |
| 267 | + :Author: <list of authors' real names and optionally, email addresses> |
| 268 | + :Status: <Draft | Active | Accepted | Deferred | Rejected | |
| 269 | + Withdrawn | Final | Superseded> |
| 270 | + :Type: <Standards Track | Informational | Process> |
| 271 | + :Created: <date created on, in yyyy-mm-dd format> |
| 272 | + * :Requires: <slep numbers> |
| 273 | + * :scikit-learn-Version: <version number> |
| 274 | + * :Replaces: <slep number> |
| 275 | + * :Replaced-By: <slep number> |
| 276 | + * :Resolution: <url> |
| 277 | + |
| 278 | +The Author header lists the names, and optionally the email addresses of all |
| 279 | +the authors of the SLEP. The format of the Author header value must be |
| 280 | + |
| 281 | + Random J. User < [email protected]> |
| 282 | + |
| 283 | +if the email address is included, and just |
| 284 | + |
| 285 | + Random J. User |
| 286 | + |
| 287 | +if the address is not given. If there are multiple authors, each should be on a |
| 288 | +separate line. |
| 289 | + |
| 290 | +Copyright |
| 291 | +--------- |
| 292 | + |
| 293 | +This document has been placed in the public domain [1]_. |
| 294 | + |
| 295 | +References and Footnotes |
| 296 | +------------------------ |
| 297 | + |
| 298 | +.. [1] _Open Publication License: https://www.opencontent.org/openpub/ |
0 commit comments