.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

 ..   http://www.apache.org/licenses/LICENSE-2.0

 .. Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

Committers and PMC members
==========================

Before reading this document, you should be familiar with `Contributors' guide <contributing-docs/README.rst>`__.
This document assumes that you are a bit familiar how Airflow's community work, but you would like to learn more
about the rules by which we add new members.

.. contents:: :local:

Committers vs. Maintainers
--------------------------

Often you can hear two different terms about people who have write access to the Airflow repository -
"committers" and "maintainers". This is because those two terms are used in different contexts.

* "Maintainers" is term used in GitHub documentation and configuration and is a generic term referring to
  people who have write access to the repository. They can merge PRs, push to the repository, etc.
* "Committers" is a term used in Apache Software Foundation (ASF) and is a term referring to people who have
  write access to the code repository and has a signed
  [Contributor License Agreement (CLA)](https://www.apache.org/licenses/#clas) on file.  They have an
  apache.org mail address. This is an official [role](https://www.apache.org/foundation/how-it-works/#roles)
  defined and governed by the Apache Software Foundation.

For all practical purposes, both terms are interchangeable because the Apache Software Foundation rule is
the only Committers can have write access to the repositories managed by the PMC (Project Management Committee)
and that all Committers get write access to the repository.

You will see both terms used in different documentation, therefore our goal is not to use one of the terms
only - it is unavoidable to see both terms anyway. As a rule, we are using "committer" term in the context
of the official rules concerning Apache Software Foundation and "maintainer" term in the context where
technical GitHub access and permissions to the project are important.

Guidelines to become an Airflow Committer
------------------------------------------

Committers are community members who have write access to the project's
repositories, i.e., they can modify the code, documentation, and website by themselves and also
accept other contributions. There is no strict protocol for becoming a committer. Candidates for new
committers are typically people that are active contributors and community members.

Some people might be active in several of those areas and while they might have not enough 'achievements' in any
single one of those, their combined contributions in several areas all count.

As a community, we appreciate contributions to the Airflow codebase, but we also place equal value
on those who help Airflow by improving the community in some way. It is entirely possible to become
a committer (and eventually a PMC member) without ever having to change a single line of code.


Prerequisites
^^^^^^^^^^^^^^

General prerequisites that we look for in all candidates:

1.  Consistent contribution over last few months
2.  Visibility on discussions on the dev mailing list, Slack channels or GitHub issues/discussions
3.  Contributions to community health and project's sustainability for the long-term
4.  Understands contributor/committer guidelines: `Contributors' Guide <contributing-docs/README.rst>`__


Code contribution
^^^^^^^^^^^^^^^^^^

1.  Makes high-quality commits (especially commit messages), and assess the impact of the changes, including
    upgrade paths or deprecation policies
2.  Testing Release Candidates to help the release cycle
3.  Proposed and led to completion Airflow Improvement Proposal(s)
4.  Demonstrates an understanding of one of the following areas or has displayed a holistic understanding
    of a particular part and made contributions towards a more strategic goal

    - Airflow Core
    - API
    - Docker Image
    - Helm Chart
    - Dev Tools (Breeze / CI)
    - Certain Providers

5.  Has made a significant improvement or added an integration with services/technologies important to the Airflow
    Ecosystem

6.  Actively participated in the security process, as a member of security team, discussing, assessing and
    fixing security issues.


Community contributions
^^^^^^^^^^^^^^^^^^^^^^^^

1.  Actively participates in `triaging issues <ISSUE_TRIAGE_PROCESS.rst>`_ showing their understanding
    of various areas of Airflow and willingness to help other community members.
2.  Improves documentation of Airflow in significant way
3.  Leads/implements changes and improvements introduction in the "community" processes and tools
4.  Actively spreads the word about Airflow, for example organising Airflow summit, workshops for
    community members, giving and recording talks, writing blogs
5.  Reporting bugs with detailed reproduction steps


Committer Responsibilities
^^^^^^^^^^^^^^^^^^^^^^^^^^

Committers are more than contributors. While it's important for committers to maintain standing by
committing code, their key role is to build and foster a healthy and active community.
This means that committers should:

* Review PRs in a timely and reliable fashion
* They should also help to actively whittle down the PR backlog
* Answer questions (i.e. on the dev list, in PRs, in GitHub Issues, slack, etc...)
* Take on core changes/bugs/feature requests
* Some changes are important enough that a committer needs to ensure it gets done. This is especially
  the case if no one from the community is taking it on.
* Improve processes and tooling
* Refactoring code


Guidelines for promoting Committers to Airflow PMC
---------------------------------------------------

To become a PMC member the committers should meet all **general prerequisites**.
Apart from that the person should demonstrate distinct **community involvement** or **code contributions**.

Guidelines from ASF are listed at
`ASF: New Candidates for Committership <http://community.apache.org/newcommitter.html#guidelines-for-assessing-new-candidates-for-committership>`__.

Prerequisites
^^^^^^^^^^^^^^

* Has been a committer for at least 3 months
* Is still active community member (Visible on mailing list or reviewing PRs at the minimum)

Community involvement
^^^^^^^^^^^^^^^^^^^^^^

* Visibility on discussions on the dev mailing list
* Spreading the word for "Airflow" either:

  * Talks at meetups, conferences, etc
  * Creating content like videos, blogs, etc

* Growing the community:

  * Mentors new members/contributors
  * Answers users/contributors via GitHub issues, dev list or slack

Code contribution
^^^^^^^^^^^^^^^^^^

* Consistent voting on RCs for at least past 3 releases lifecycles
* Engagement in Airflow Improvements Proposals either:

  * Has been actively voting on AIPs
  * Has been proposing and leading their implementation

* Actively involved in code contributions:

  * Code reviews
  * Merging pull requests
  * Fixing bugs and implementing improvements
  * Actively participating in the security process and significantly contributing to overall security of
    Airflow


Only a current PMC member can nominate a current committer to be part of PMC.

If the vote fails or PMC members needs more evidence, then one of the PMC Member (who is not the Proposer)
can become the Mentor and guide the proposed candidates on how they can become a PMC member.

1.  Candidate Proposer

    This is the person who launches the DISCUSS thread & makes the case for a PMC promotion

2.  Candidate Mentor

    If the committee does not have enough information, requires more time, or requires more evidence of
    candidate's eligibility, a mentor, who is not the proposer, is selected to help mentor the candidate
    The mentor should try to remain impartial -- their goal is to provide the missing evidence and to
    try to coach/mentor the candidate to success.

    In order to re-raise a candidate vote, both Proposer and Mentor must be in favor. Again,
    the mentor must try to remain impartial and cannot be the Proposer.


Inactive Committers
-------------------
If you know you are not going to be able to contribute for a long time
(for instance, due to a change of job or circumstances), you should inform the PMC and we will mark you
as "inactive". Inactive committers will be removed from the "roster" on ASF and will no longer have the power
of being a Committer (especially write access to the repos). As merit earned never expires, once you
become active again you can simply email the PMC and ask to be reinstated.

The PMC also can mark committers as inactive after they have not been involved in the community for
more than 12 months.

New Committer Onboarding Steps
------------------------------

To be able to merge PRs, committers have to integrate their GitHub ID with Apache systems. To do that follow steps:

1.  Verify you have a GitHub ID `enabled with 2FA <https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/>`__.
2.  Merge your Apache and GitHub accounts using `GitBox (Apache Account Linking utility) <https://gitbox.apache.org/setup/>`__. This also asks you to link your
    Github id to your Apache account. You should see 5 green checks in GitBox.
3.  Wait at least 30  minutes for an email inviting you to Apache GitHub Organization and accept invitation.
4.  After accepting the GitHub Invitation verify that you are a member of the `Airflow committers team on GitHub <https://github.com/orgs/apache/teams/airflow-committers>`__.
5.  Ask in ``#internal-airflow-ci-cd`` channel to be `configured in self-hosted runners <https://github.com/apache/airflow-ci-infra/blob/main/scripts/list_committers>`_
    by the CI team. Wait for confirmation that this is done and some helpful tips from the CI team
6.  After confirming that step 5 is done, open a PR to include your GitHub ID in:

    * ``dev/breeze/src/airflow_breeze/global_constants.py`` (COMMITTERS variable)
    * name and GitHub ID in `project.rst <https://github.com/apache/airflow/blob/main/docs/apache-airflow/project.rst>`__.
    * If you had been a collaborator role before getting committer, remove your Github ID from ``.asf.yaml``.
7.  Raise PR to airflow site with the following:
    * List your name in the committers list
    `Airflow-Site committers.json <https://github.com/apache/airflow-site/blob/main/landing-pages/site/data/committers.json>`__.
    * Post entry in `Announcements <https://github.com/apache/airflow-site/blob/main/landing-pages/site/content/en/announcements/_index.md>`__.
