|
| 1 | +.. _biap0: |
| 2 | + |
| 3 | +============================ |
| 4 | +BIAP 0 — Purpose and Process |
| 5 | +============================ |
| 6 | + |
| 7 | +:Author: Jarrod Millman < [email protected]> |
| 8 | +:Status: Draft |
| 9 | +:Type: Process |
| 10 | +:Created: 2020-06-25 |
| 11 | + |
| 12 | + |
| 13 | +What is a BIAP? |
| 14 | +--------------- |
| 15 | + |
| 16 | + |
| 17 | +BIAP stands for Nibabel Enhancement Proposal. BIAPs are the primary |
| 18 | +mechanisms for proposing major new features, for collecting community input on |
| 19 | +an issue, and for documenting the design decisions that have gone into |
| 20 | +Nibabel. A BIAP should provide a concise technical specification of the |
| 21 | +feature and a rationale for the feature. The BIAP author is responsible for |
| 22 | +building consensus within the community and documenting dissenting opinions. |
| 23 | + |
| 24 | +Because the BIAPs are maintained as text files in a versioned |
| 25 | +repository, their revision history is the historical record of the |
| 26 | +feature proposal [1]_. |
| 27 | + |
| 28 | + |
| 29 | +Types |
| 30 | +^^^^^ |
| 31 | + |
| 32 | +There are three kinds of BIAPs: |
| 33 | + |
| 34 | +1. A **Standards Track** BIAP describes a new feature or implementation |
| 35 | + for Nibabel. |
| 36 | + |
| 37 | +2. An **Informational** BIAP describes a Nibabel design issue, or provides |
| 38 | + general guidelines or information to the Python community, but does not |
| 39 | + propose a new feature. Informational BIAPs do not necessarily represent a |
| 40 | + Nibabel community consensus or recommendation, so users and implementers are |
| 41 | + free to ignore Informational BIAPs or follow their advice. |
| 42 | + |
| 43 | +3. A **Process** BIAP describes a process surrounding Nibabel, or |
| 44 | + proposes a change to (or an event in) a process. Process BIAPs are |
| 45 | + like Standards Track BIAPs but apply to areas other than the Nibabel |
| 46 | + language itself. They may propose an implementation, but not to |
| 47 | + Nibabel's codebase; they require community consensus. Examples include |
| 48 | + procedures, guidelines, changes to the decision-making process, and |
| 49 | + changes to the tools or environment used in Nibabel development. |
| 50 | + Any meta-BIAP is also considered a Process BIAP. |
| 51 | + |
| 52 | + |
| 53 | +BIAP Workflow |
| 54 | +------------- |
| 55 | + |
| 56 | +The BIAP process begins with a new idea for Nibabel. It is highly |
| 57 | +recommended that a single BIAP contain a single key proposal or new |
| 58 | +idea. Small enhancements or patches often don't need |
| 59 | +a BIAP and can be injected into the Nibabel development workflow with a |
| 60 | +pull request to the Nibabel `repo`_. The more focused the |
| 61 | +BIAP, the more successful it tends to be. |
| 62 | +If in doubt, split your BIAP into several well-focused ones. |
| 63 | + |
| 64 | +Each BIAP must have a champion---someone who writes the BIAP using the style |
| 65 | +and format described below, shepherds the discussions in the appropriate |
| 66 | +forums, and attempts to build community consensus around the idea. The BIAP |
| 67 | +champion (a.k.a. Author) should first attempt to ascertain whether the idea is |
| 68 | +suitable for a BIAP. Posting to the Nibabel discussion `mailing list`_ is the |
| 69 | +best way to go about doing this. |
| 70 | + |
| 71 | +The proposal should be submitted as a draft BIAP via a `GitHub pull request`_ |
| 72 | +to the ``doc/source/devel/biaps`` directory with the name ``biap_<n>.rst`` |
| 73 | +where ``<n>`` is an appropriately assigned four-digit number (e.g., |
| 74 | +``biap_0000.rst``). The draft must use the :doc:`biap_template` file. |
| 75 | + |
| 76 | +Once the PR for the BIAP is in place, a post should be made to the |
| 77 | +mailing list containing the sections up to "Backward compatibility", |
| 78 | +with the purpose of limiting discussion there to usage and impact. |
| 79 | +Discussion on the pull request will have a broader scope, also including |
| 80 | +details of implementation. |
| 81 | + |
| 82 | +At the earliest convenience, the PR should be merged (regardless of |
| 83 | +whether it is accepted during discussion). Additional PRs may be made |
| 84 | +by the Author to update or expand the BIAP, or by maintainers to set |
| 85 | +its status, discussion URL, etc. |
| 86 | + |
| 87 | +Standards Track BIAPs consist of two parts, a design document and a |
| 88 | +reference implementation. It is generally recommended that at least a |
| 89 | +prototype implementation be co-developed with the BIAP, as ideas that sound |
| 90 | +good in principle sometimes turn out to be impractical when subjected to the |
| 91 | +test of implementation. Often it makes sense for the prototype implementation |
| 92 | +to be made available as PR to the Nibabel repo (making sure to appropriately |
| 93 | +mark the PR as a WIP). |
| 94 | + |
| 95 | + |
| 96 | +Review and Resolution |
| 97 | +^^^^^^^^^^^^^^^^^^^^^ |
| 98 | + |
| 99 | +BIAPs are discussed on the mailing list. The possible paths of the |
| 100 | +status of BIAPs are as follows: |
| 101 | + |
| 102 | +.. image:: _static/biap_flowchart.png |
| 103 | + |
| 104 | +All BIAPs should be created with the ``Draft`` status. |
| 105 | + |
| 106 | +Eventually, after discussion, there may be a consensus that the BIAP |
| 107 | +should be accepted – see the next section for details. At this point |
| 108 | +the status becomes ``Accepted``. |
| 109 | + |
| 110 | +Once a BIAP has been ``Accepted``, the reference implementation must be |
| 111 | +completed. When the reference implementation is complete and incorporated |
| 112 | +into the main source code repository, the status will be changed to ``Final``. |
| 113 | + |
| 114 | +To allow gathering of additional design and interface feedback before |
| 115 | +committing to long term stability for a language feature or standard library |
| 116 | +API, a BIAP may also be marked as "Provisional". This is short for |
| 117 | +"Provisionally Accepted", and indicates that the proposal has been accepted for |
| 118 | +inclusion in the reference implementation, but additional user feedback is |
| 119 | +needed before the full design can be considered "Final". Unlike regular |
| 120 | +accepted BIAPs, provisionally accepted BIAPs may still be Rejected or Withdrawn |
| 121 | +even after the related changes have been included in a Python release. |
| 122 | + |
| 123 | +Wherever possible, it is considered preferable to reduce the scope of a |
| 124 | +proposal to avoid the need to rely on the "Provisional" status (e.g. by |
| 125 | +deferring some features to later BIAPs), as this status can lead to version |
| 126 | +compatibility challenges in the wider Nibabel ecosystem. |
| 127 | + |
| 128 | +A BIAP can also be assigned status ``Deferred``. The BIAP author or a |
| 129 | +core developer can assign the BIAP this status when no progress is being made |
| 130 | +on the BIAP. |
| 131 | + |
| 132 | +A BIAP can also be ``Rejected``. Perhaps after all is said and done it |
| 133 | +was not a good idea. It is still important to have a record of this |
| 134 | +fact. The ``Withdrawn`` status is similar---it means that the BIAP author |
| 135 | +themselves has decided that the BIAP is actually a bad idea, or has |
| 136 | +accepted that a competing proposal is a better alternative. |
| 137 | + |
| 138 | +When a BIAP is ``Accepted``, ``Rejected``, or ``Withdrawn``, the BIAP should be |
| 139 | +updated accordingly. In addition to updating the status field, at the very |
| 140 | +least the ``Resolution`` header should be added with a link to the relevant |
| 141 | +thread in the mailing list archives. |
| 142 | + |
| 143 | +BIAPs can also be ``Superseded`` by a different BIAP, rendering the |
| 144 | +original obsolete. The ``Replaced-By`` and ``Replaces`` headers |
| 145 | +should be added to the original and new BIAPs respectively. |
| 146 | + |
| 147 | +Process BIAPs may also have a status of ``Active`` if they are never |
| 148 | +meant to be completed, e.g. BIAP 0 (this BIAP). |
| 149 | + |
| 150 | + |
| 151 | +How a BIAP becomes Accepted |
| 152 | +^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| 153 | + |
| 154 | +A BIAP is ``Accepted`` by consensus of all interested contributors. We |
| 155 | +need a concrete way to tell whether consensus has been reached. When |
| 156 | +you think a BIAP is ready to accept, send an email to the |
| 157 | +Nibabel discussion mailing list with a subject like: |
| 158 | + |
| 159 | + Proposal to accept BIAP #<number>: <title> |
| 160 | + |
| 161 | +In the body of your email, you should: |
| 162 | + |
| 163 | +* link to the latest version of the BIAP, |
| 164 | + |
| 165 | +* briefly describe any major points of contention and how they were |
| 166 | + resolved, |
| 167 | + |
| 168 | +* include a sentence like: "If there are no substantive objections |
| 169 | + within 7 days from this email, then the BIAP will be accepted; see |
| 170 | + BIAP 0 for more details." |
| 171 | + |
| 172 | +After you send the email, you should make sure to link to the email |
| 173 | +thread from the ``Discussion`` section of the BIAP, so that people can |
| 174 | +find it later. |
| 175 | + |
| 176 | +Generally the BIAP author will be the one to send this email, but |
| 177 | +anyone can do it – the important thing is to make sure that everyone |
| 178 | +knows when a BIAP is on the verge of acceptance, and give them a final |
| 179 | +chance to respond. If there's some special reason to extend this final |
| 180 | +comment period beyond 7 days, then that's fine, just say so in the |
| 181 | +email. You shouldn't do less than 7 days, because sometimes people are |
| 182 | +travelling or similar and need some time to respond. |
| 183 | + |
| 184 | +In general, the goal is to make sure that the community has consensus, |
| 185 | +not provide a rigid policy for people to try to game. When in doubt, |
| 186 | +err on the side of asking for more feedback and looking for |
| 187 | +opportunities to compromise. |
| 188 | + |
| 189 | +If the final comment period passes without any substantive objections, |
| 190 | +then the BIAP can officially be marked ``Accepted``. You should send a |
| 191 | +followup email notifying the list (celebratory emoji optional but |
| 192 | +encouraged 🎉✨), and then update the BIAP by setting its ``:Status:`` |
| 193 | +to ``Accepted``, and its ``:Resolution:`` header to a link to your |
| 194 | +followup email. |
| 195 | + |
| 196 | +If there *are* substantive objections, then the BIAP remains in |
| 197 | +``Draft`` state, discussion continues as normal, and it can be |
| 198 | +proposed for acceptance again later once the objections are resolved. |
| 199 | + |
| 200 | +In unusual cases, disagreements about the direction or approach may |
| 201 | +require escalation to the Nibabel :ref:`steering_council` who |
| 202 | +then decide whether a controversial BIAP is ``Accepted``. |
| 203 | + |
| 204 | + |
| 205 | +Maintenance |
| 206 | +^^^^^^^^^^^ |
| 207 | + |
| 208 | +In general, Standards track BIAPs are no longer modified after they have |
| 209 | +reached the Final state as the code and project documentation are considered |
| 210 | +the ultimate reference for the implemented feature. |
| 211 | +However, finalized Standards track BIAPs may be updated as needed. |
| 212 | + |
| 213 | +Process BIAPs may be updated over time to reflect changes |
| 214 | +to development practices and other details. The precise process followed in |
| 215 | +these cases will depend on the nature and purpose of the BIAP being updated. |
| 216 | + |
| 217 | + |
| 218 | +Format and Template |
| 219 | +------------------- |
| 220 | + |
| 221 | +BIAPs are UTF-8 encoded text files using the reStructuredText_ format. Please |
| 222 | +see the :doc:`biap_template` file and the reStructuredTextPrimer_ for more |
| 223 | +information. We use Sphinx_ to convert BIAPs to HTML for viewing on the web |
| 224 | +[2]_. |
| 225 | + |
| 226 | + |
| 227 | +Header Preamble |
| 228 | +^^^^^^^^^^^^^^^ |
| 229 | + |
| 230 | +Each BIAP must begin with a header preamble. The headers |
| 231 | +must appear in the following order. Headers marked with ``*`` are |
| 232 | +optional. All other headers are required. :: |
| 233 | + |
| 234 | + :Author: <list of authors' real names and optionally, email addresses> |
| 235 | + :Status: <Draft | Active | Accepted | Deferred | Rejected | |
| 236 | + Withdrawn | Final | Superseded> |
| 237 | + :Type: <Standards Track | Process> |
| 238 | + :Created: <date created on, in dd-mmm-yyyy format> |
| 239 | + * :Requires: <BIAP numbers> |
| 240 | + * :Nibabel-Version: <version number> |
| 241 | + * :Replaces: <BIAP number> |
| 242 | + * :Replaced-By: <BIAP number> |
| 243 | + * :Resolution: <url> |
| 244 | + |
| 245 | +The Author header lists the names, and optionally the email addresses |
| 246 | +of all the authors of the BIAP. The format of the Author header |
| 247 | +value must be |
| 248 | + |
| 249 | + Random J. User < [email protected]> |
| 250 | + |
| 251 | +if the email address is included, and just |
| 252 | + |
| 253 | + Random J. User |
| 254 | + |
| 255 | +if the address is not given. If there are multiple authors, each should be on |
| 256 | +a separate line. |
| 257 | + |
| 258 | + |
| 259 | +References and Footnotes |
| 260 | +------------------------ |
| 261 | + |
| 262 | +.. [1] This historical record is available by the normal git commands |
| 263 | + for retrieving older revisions, and can also be browsed on |
| 264 | + `GitHub <https://github.com/nipy/nibabel/tree/master/doc/source/devel/biaps>`_. |
| 265 | +
|
| 266 | +.. [2] The URL for viewing BIAPs on the web is |
| 267 | + https://nipy.org/nibabel/devel/biaps/index.html |
| 268 | +
|
| 269 | +.. _repo: https://github.com/nipy/nibabel |
| 270 | + |
| 271 | +.. _mailing list: https://mail.python.org/mailman/listinfo/neuroimaging |
| 272 | + |
| 273 | +.. _issue tracker: https://github.com/nipy/nibabel/issues |
| 274 | + |
| 275 | +.. _`GitHub pull request`: https://github.com/nipy/nibabel/pulls |
| 276 | + |
| 277 | +.. _reStructuredText: http://docutils.sourceforge.net/rst.html |
| 278 | + |
| 279 | +.. _reStructuredTextPrimer: http://www.sphinx-doc.org/en/stable/rest.html |
| 280 | + |
| 281 | +.. _Sphinx: http://www.sphinx-doc.org/en/stable/ |
0 commit comments