//Licensed 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
Apache Incubator PMC
2002-10-16
:jbake-type: guide
:jbake-status: published
:idprefix:
:toc:
:imagesdir: ../images/

The link:/policy/incubation.html#Committers[Roles and Responsibilities] document describes the general role of a committer on an incubating project. This page provides links to more information to help new committers get started.

== Mailing Lists
Everything inside the Apache world needs to occur asynchronously and be archived. Email is currently the best platform for this. As some people say, 'If it isn't on the mailing list, it didn't happen.' Decisions only get made on public Apache email lists, not anywhere offlist such as IRC, IM, a Slack channel or private emails. If a PMC or Apache committee makes decisions elsewhere, they need to bring the decision back to the appropriate email list.

Each project has a set of public lists, which are typically called dev@*project*, user@*project* (or users@*project*), issues@*project* and commits@*project*. A few link:http://www.apache.org/foundation/mailinglists.html[Apache-wide lists] cross all boundaries, including:

- *community*: where all Apache committers can discuss things that are about Apache
- *infrastructure*: where the Infrastructure team (Infra) discuss and work on the Apache infrastructure needs
- *legal-discuss*: where Apache committers can ask questions that have a legal aspect
- *builds*: discussions about the Apache continuous integration infrastructure

Email lists are archived and searchable at server places, including link:https://lists.apache.org[Apache Pony Mail].

=== Action items for committers include:

- Become familiar with Apache developer link:http://www.apache.org/dev/contrib-email-tips.html[tips for email contributors].
- Subscribe to the user, dev, issues and commits lists for your project.
- Become aware of what else is going on in the Incubator by subscribing to the Incubator's general list.
- Become aware of what else is going on at the ASF by subscribing to the link:http://www.apache.org/foundation/mailinglists.html#foundation-community[community], link:http://www.apache.org/foundation/mailinglists.html#foundation-infrastructure[infrastructure], and link:http://www.apache.org/foundation/mailinglists.html#foundation-legal[legal-discuss] Apache-wide lists.

Apache also has private lists. For example, your project will probably have a private email list named private@*project*.apache.org, which your Podling PMC will use for sensitive discussions. Never
mix public and private email lists in the same post -- see the section entitled link:http://www.apache.org/foundation/how-it-works.html#management[Balancing confidentiality and public discussion] in link:http://www.apache.org/foundation/how-it-works.html[How it Works]. For example, never include both your dev and private lists in the same post. Posting to the dev list is sufficient because each member of your Podling PMC will also be on that list.

== Project Web Site
The Incubator link:sites.html[Podling Websites] documents how to get your project web site going.

== Committer Resources

- The link:https://infra.apache.org/new-committers-guide.html[Guide for New Committers] is a great place to start and points to additional committer-only resources.
- Browse the pages at link:http://www.apache.org/dev[http://www.apache.org/dev/] often.
- Subscribe to the link:http://www.apache.org/foundation/mailinglists.html#foundation-infrastructure[infrastructure] list, then raise awareness on your project about what goes on behind the scenes.

Be proactive about responding to infrastructure issues on your project email lists. Does the webserver seem to be down? Is Jira or Git down? Check the link:http://status.apache.org/[ASF status page] and explain the reason to your project list (as you can see, no need to alert the ASF infrastructure people).


== Podling PMC (PPMC)
If you are a member of your PPMC, become familiar with the link:/policy/incubation.html[Incubation Policy] and see the link:ppmc.html[Podling PMC Guide].

== Orienting New Committers: Understanding Apache

When a committer is elected by a Top Level Project (TLP), the nominator and other PMC members educate the new committer about Apache. In the Incubator, Mentors provide this education. This process is one of the most important for the long-term health of a project.

Apache works on the principle that discussions should happen on the most open forum available. Unless the matter is sensitive (such as security or personal issues), it should be raised on an open email list. Typically this will be the podling dev list or the incubator general list. Reserve the private incubator list for sensitive topics only.

Mentors need to take care. During the initial bootstrapping a habit may develop of emailing the private@ list. It is important to break this habit as soon as the public email lists are available.

Netiquette about the correct use of sending copies of emails may also be difficult to impart effectively. During the bootstrap process, there are a number of occasions when *cc*s are required. The typical usage is to copy in a private listing to indicate that the action has the lazy permission of the committee. The commercial world often use *cc*s to create inefficient ad-hoc email lists. Except for a small number of defined processes, we frown on *cc*s at Apache. Mentors need to encourage people to ask questions first  on the public lists of the project, then raise them (if necessary) to the general incubator list.

== Questions?
If you have any questions, ask on the Incubator's general email list. Don't forget to check the information at:
- link:http://www.apache.org/dev[http://www.apache.org/dev/]

