-
Notifications
You must be signed in to change notification settings - Fork 67
Triage team and how-to docs #1106
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
TimMonko
wants to merge
4
commits into
napari:main
Choose a base branch
from
TimMonko:doc/triage
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,17 @@ | ||
| # About the project and team | ||
|
|
||
| napari is a consensus-based community project. Anyone with an interest in the project can join the community, contribute to the project design, and participate in the decision making process. You can learn more about how the project is run by reading our [governance model](napari-governance). This page lists our current and emeritus [core team members](governance.md#core-team-members). Core team members are community members that have demonstrated a sustained commitment to the project through ongoing contributions and that they can maintain napari with care. We also list our current and emeritus steering council members. Finally, the project currently has a number of paid team members in various roles supported by grants. They are listed below under the [Team Roles](#team-roles) section | ||
| napari is a consensus-based community project. | ||
| Anyone with an interest in the project can join the community, | ||
| contribute to the project design, and participate in the decision making process. | ||
| You can learn more about how the project is run by reading our | ||
| [governance model](napari-governance). This page lists our current and emeritus | ||
| [core team members](governance.md#core-team-members). Core team members are | ||
| community members that have demonstrated a sustained commitment to the project | ||
| through ongoing contributions and that they can maintain napari with care. | ||
| We also list our current and emeritus steering council members and our current | ||
| triage team members. Finally, the project currently has a number of paid team | ||
| members in various roles supported by grants. They are listed below under the | ||
| [Team Roles](#team-roles) section. | ||
|
|
||
| ## Current Core Team Members | ||
|
|
||
|
|
@@ -49,6 +60,11 @@ napari is a consensus-based community project. Anyone with an interest in the pr | |
| - [Nicholas Sofroniew](https://github.com/napari/napari/commits?author=sofroniewn) - [@sofroniewn](https://github.com/sofroniewn) | ||
| - [Talley Lambert](https://github.com/napari/napari/commits?author=tlambert03) - [@tlambert03](https://github.com/tlambert03) | ||
|
|
||
| ## Current Triage Team Members | ||
|
|
||
| - [Aniket Singh Yadav](https://github.com/napari/napari/commits?author=Aniketsy) - [@Aniketsy](https://github.com/Aniketsy) | ||
| - [Jacopo Abramo](https://github.com/napari/napari/commits?author=jacopoabramo) - [@jacopoabramo](https://github.com/jacopoabramo) | ||
|
Comment on lines
+65
to
+66
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ❤️ |
||
|
|
||
| # Team Roles | ||
|
|
||
| To best serve napari's development, operations, and community, several team roles are contracted. Currently contracted roles are listed below: | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,230 @@ | ||
| (napari-triage)= | ||
|
|
||
| # Triage | ||
|
|
||
| This guide describes how napari curates its issue trackers and pull requests. | ||
| A healthy tracker makes the project easier to use and to contribute to: issues | ||
| are clearly described, duplicates are linked, and maintainers can focus on | ||
| issues and pull requests that are ready for their attention. | ||
|
|
||
| Triaging does not require any particular expertise in napari's internals and | ||
| is extremely valuable to the project. We welcome anyone to participate in | ||
| issue triage! When in doubt, always refer back to our | ||
| [mission and values](mission-and-values). | ||
|
|
||
| ## Anyone can help triage | ||
|
|
||
| Triaging starts with commenting. Community members and contributors who are | ||
| not part of the [napari organization](https://github.com/napari) do not have | ||
| permissions to change labels, add milestones, or close issues, but they can | ||
| still be enormously helpful by: | ||
|
|
||
| - documenting issues that are missing elements needed to reproduce a problem, | ||
| such as code samples; | ||
| - suggesting better use of code formatting (e.g. triple backticks in markdown); | ||
| - suggesting a clearer title or description; | ||
| - linking to related issues or pull requests and briefly describing how they | ||
| are related, for instance "see also #xyz"; | ||
| - verifying that an issue is reproducible; | ||
| - classifying an issue as a feature request, a long-standing bug, or a | ||
| regression. | ||
|
|
||
| If you do not have enough GitHub permissions to do something, leave a comment | ||
| with your recommendation. Triagers and core team members will see it. | ||
|
|
||
| ## The triage team | ||
|
|
||
| The triage team is a group of community members who have demonstrated that | ||
| they can help maintain napari with care. Being invited to the triage team is a | ||
| mark of trust: the core team believes you can represent napari's values and | ||
| help maintain the project with care. There is no | ||
| expected time commitment or quota of work. It is also a *promise from us*: we | ||
| will mentor and shepherd you as you grow into the role. | ||
|
|
||
| For some, the triage team is a stepping stone toward core team membership. For | ||
| others, it is simply a rewarding place to make a lasting contribution. Both | ||
| are entirely fine — the role is a valued destination in its own right, and | ||
| there is **no expectation** that you continue beyond it. | ||
|
|
||
| Triage team members are part of the `@napari/triage` GitHub team and can | ||
| exercise the [triage role](#permissions-and-non-permissions) on the public | ||
| repositories in the napari organization. | ||
|
|
||
| ## Permissions and non-permissions | ||
|
|
||
| Members of the triage team **can**: | ||
|
|
||
| - apply labels to issues and pull requests; | ||
| - edit issue titles and descriptions; | ||
| - assign issues and add them to milestones; | ||
| - close and reopen issues and pull requests | ||
|
|
||
| Members of the triage team **cannot**: | ||
|
|
||
| - push commits or merge pull requests; | ||
| - set a pull request to draft or ready for review; | ||
| - re-run or approve workflow runs; | ||
| - edit repository or branch protection settings. | ||
|
|
||
| When closing a pull request, generally consult a core team member first so | ||
| that the author receives careful consideration of their work. Triagers may | ||
| close a pull request on their own when it is clearly not going to be merged, | ||
| for example a change to deprecated functionality or a fix for a bug that can | ||
| no longer be reproduced. When in doubt, ask a core team member. | ||
|
|
||
| ## What to focus on | ||
|
|
||
| Your fresh eyes are most valuable on *recently arrived* issues and pull | ||
| requests, which need less accumulated context to understand. Digging into old | ||
| or complex issues is entirely optional — please do it if you are curious, but | ||
| never feel pressured. When in doubt, ask a core team member. | ||
|
|
||
| ## Triage workflow | ||
|
|
||
| The following workflow is a good way to approach issue triage: | ||
|
|
||
| 1. **Thank the reporter** for opening an issue. The issue tracker is many | ||
| people's first interaction with the napari project, and we want it to be a | ||
| welcoming, pleasant experience. | ||
| 2. **Is this a usage or support question?** If so, close it with a polite | ||
| message pointing the reporter to the | ||
| [#napari tag on the image.sc forum](https://forum.image.sc/tag/napari) or | ||
| the [napari Zulip](https://napari.zulipchat.com/). | ||
| 3. **Is the necessary information provided?** If crucial information is | ||
| missing (napari version, Python version, operating system, Qt backend), | ||
| politely ask the reporter to provide it, `napari --info` is especially | ||
| helpful context. | ||
| 4. **Is the issue minimal and reproducible?** For bug reports, we ask for a | ||
| minimal reproducible example. If you cannot reproduce the issue, report | ||
| that along with your operating system, Python, and napari versions. If we | ||
| need more information, label the issue with `triage:need to reproduce`. | ||
| 5. **Is this a regression?** Regressions are the highest priority. Try to | ||
| determine when the regression happened by running the reproduction code | ||
| against older versions of napari or by using `git bisect`. Milestone | ||
| confirmed regressions for the next bug fix release. | ||
| 6. **Is this a duplicate?** If a new issue seems to be a duplicate, point to | ||
| the original issue. If it is a clear duplicate, close it with | ||
| `triage:duplicate` and encourage the reporter to chime in on the original | ||
| issue. If the new issue provides relevant information, add it to the | ||
| original issue. | ||
| 7. **Make sure the title accurately reflects the issue.** If it is not clear, | ||
| edit it yourself. | ||
| 8. **Add relevant labels** and | ||
| consider tagging `contribute:good first issue` when appropriate. | ||
|
|
||
| ## Closing issues | ||
|
|
||
| When uncertain whether an issue should be closed, strive for consensus with | ||
| the original poster and possibly seek relevant expertise from core team | ||
| members. In general: | ||
|
|
||
| - usage and support questions are closed with a pointer to the forum; | ||
| - clear duplicates are closed with a pointer to the original issue; | ||
| - issues that cannot be reproduced are closed after leaving time (at least a | ||
| week) for the reporter to add extra information; | ||
| - issues that have been resolved in the current version of napari are closed. | ||
|
|
||
| If you have any doubt about whether to close an issue, ask a core team member | ||
| or in the `#triage` channel before taking action. Always treat every | ||
| contributor kindly and with respect, and follow our | ||
| [code of conduct](napari-coc). | ||
|
|
||
| ## Good first issues | ||
|
|
||
| If an issue is clearly defined, the fix is relatively straightforward, and | ||
| there is consensus on the solution, label it as `contribute:good first issue` | ||
| and consider adding a hint as to where in the code base to look to get | ||
| started. Good first issues are intended to onboard newcomers with a genuine | ||
| interest in improving napari, so the heavy use of AI tools to resolve them is | ||
| discouraged. All contributions must comply with our | ||
| [AI policy](ai-contributions). | ||
|
|
||
| ## Communication and escalation | ||
|
|
||
| Triage coordination happens in the `#triage` channel on | ||
| [napari Zulip](https://napari.zulipchat.com/), which is open to everyone. | ||
| Triage team members participate in the existing public community channels and | ||
| [community meetings](meeting-schedule) like any community member. | ||
| Prefer asynchronous communication — issues and Zulip threads — where possible, | ||
| as it is easier for a global community to consume. | ||
|
|
||
| If an issue or pull request needs a maintainer's attention, mention the | ||
| relevant core team members or bring it up in the `#triage` channel. | ||
|
|
||
| ## The pull request triage board | ||
|
|
||
| The [napari pull request triage board](https://github.com/orgs/napari/projects/35) | ||
| is an org-level GitHub project board that automatically tracks every open pull | ||
| request across the napari organization. It is populated by the | ||
| [pr-triage-board-bot](https://github.com/jupyter/pr-triage-board-bot), a tool | ||
| designed to "scale maintainer intuition" — the thinking behind it is described | ||
| in [this blog post](https://medium.com/@yuvipanda/scaling-maintainer-intuition-with-pull-request-triage-boards-779f2387498b). | ||
|
|
||
| For each open pull request, the bot computes a set of fields so you can see at | ||
| a glance where a pull request is in its lifecycle: | ||
|
|
||
| | Field | Values it can take | | ||
| |---|---| | ||
| | Author Kind | Bot, Maintainer, First Time Contributor, Early Contributor, Seasoned Contributor | | ||
| | Opened At | Date the pull request was opened | | ||
| | Total Lines Changed | Size of the change | | ||
| | Maintainer Engagement | No / Single / Multiple Maintainer Engagement | | ||
| | CI Status | Tests Passing, Tests Failing | | ||
| | Merge Conflicts | No Merge Conflicts, Merge Conflicts | | ||
| | Approval Status | Changes Requested, Maintainer Approved | | ||
|
|
||
| `Author Kind` is determined by the author's history in the organization: an | ||
| author with write access or above is marked as a Maintainer, while others are | ||
| classified by their number of merged pull requests (first time, early, or | ||
| seasoned contributor). This is a helpful prioritization signal — pull requests | ||
| from first-time and early contributors are often where triagers' and | ||
| maintainers' attention is most valuable, while bot pull requests (for example | ||
| from dependabot or pre-commit) can be handled in batches. | ||
|
|
||
| The bot maintains the board's fields and their values: it recomputes them | ||
| deterministically on a schedule and reverts manual edits, and it removes pull | ||
| requests from the board once they are merged or closed. The *views* (tabs) on | ||
| the board, however, are yours to customize — triagers can create their own | ||
| views and filters to match how they like to work. If a pull request on the | ||
| board looks like it needs attention (failing tests, a merge conflict, or no | ||
| maintainer engagement), that is exactly the kind of thing to bring up in the | ||
| `#triage` channel or to flag for a core team member. | ||
|
|
||
| ## Joining the triage team | ||
|
|
||
| New triage team members are onboarded as follows: | ||
|
|
||
| 1. A contributor consistently triages issues and pull requests, demonstrating | ||
| good judgment and our community values. | ||
| 2. A core team member or steering council member nominates them, first | ||
| approaching the prospective member privately to gauge their interest and | ||
| availability. | ||
| 3. The nomination is announced to the core team and accepted by lazy | ||
| consensus (no objections within a reasonable timeframe, typically one | ||
| week). | ||
| 4. An organization owner adds the nominee to the `@napari/triage` GitHub team, | ||
| first inviting them as an organization member if needed. | ||
| 5. The new triager is paired with a core team mentor who reviews their early | ||
| triage actions and answers questions until they are comfortable working | ||
| independently. | ||
| 6. Their arrival is welcomed publicly in the community channels. | ||
|
|
||
| ## Stepping down and inactivity | ||
|
|
||
| Triage team members can step down at any time, for any reason, by asking a | ||
| team maintainer or organization owner to be removed — no forms or notice | ||
| period. Being a triager is not a lifetime appointment. Once a year, alongside | ||
| the January membership tidy-up, a maintainer reviews the triage team roster | ||
| and gently reaches out to members who have been inactive, giving them the | ||
| choice to stay or step down. This is not punitive and carries no stigma. | ||
| Returning to the team is easy: a former triager can be re-added by a core team | ||
| member with lazy consensus, without re-running the full nomination process. | ||
|
|
||
| ## For core team members | ||
|
|
||
| Core team members do triage too, and shepherd triagers as they grow into the | ||
| role. When you review a pull request, make sure labels and milestones are set | ||
| as described in the [core team member guide](core-dev-guide). When you notice | ||
| a contributor consistently helping with triage, consider nominating them for | ||
| the triage team (see [joining the triage team](#joining-the-triage-team) | ||
| above). |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would maybe clarify that these are not a choice of the project, but a reflection of the limitations of the GitHub tool/permissions system - in the sense that we don't get to pick exactly what we allow and what we don't, we're using the contribution categories "imposed" by GitHub (can you tell this is a pet peeve of mine? lol). Also, unfortunately, this means that they can't re-trigger CI runs (which is surprising for a lot of people!)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah the lack of re-trigger is pretty annoying :/