Title: Management and Voting
<a name="ManagementandVoting-Basicinfo"></a>
# Basic info

Apache has a few roles that relate to all Apache projects:

 - Contributors [http://www.apache.org/dev/contributors.html](http://www.apache.org/dev/contributors.html)
 - Committers [http://www.apache.org/dev/committers.html](http://www.apache.org/dev/committers.html)
 - PMC Members [http://www.apache.org/dev/pmc.html](http://www.apache.org/dev/pmc.html)

Despite there being various roles, we try extremely hard to keep the
project flat.  All feedback is welcome, all people matter.  Everyone should
feel very encouraged to participate regardless if they are new or old to
the project.  If you are new and want to participate, please speak up,
we'll always be happy to hear from you.

If anything there is a reverse hierarchy that is not unlike traffic laws;
pedestrians (users) always have the right of way, bikes (contributors)
yield to pedestrians, automobiles (committers) yield to bikes and
pedestrians.  Depending on what you're driving you have a greater
responsibility to those around you.  Be careful not to run anyone over.

<a name="ManagementandVoting-PMC"></a>
# PMC

We don't focus on the PMC in this project so many may not have a clear
concept of it.	Every project at Apache has a PMC which at minimum
represents Apache from a legal perspective.  The people on it are expected
to provide legal oversight, making sure that the legal entity that is
Apache has awareness enough to legally protect the code that leaves it's
doors, the users that use it, and the people who create it.  This means
making sure any contributions going into the project are clean and can be
legally projected and making sure any binaries going out meet the legal
requirements so they as well can be legally protected.	It's a lot of
watching all commits, keeping an eye on doc contributions, ensuring CLAs
are on file for anything of substantial size, screening release binaries
and source for headers, license files, making sure any binaries being
widely distributed have been voted on, etc., etc.  If you are on the PMC
and you vote on a release it means *you* have done all these things to the
best of your ability.  If you have not, you either should not be on the PMC
or should not vote +1.

Being on the PMC is a service, not an achievement.  Therefore if someone is
added to the PMC you should not say "congratulations", but simply "thank
you."  It does not mean anything more than they have the time to help us
function legally.  If someone is perpetually too busy to provide legal
oversight and steps down or goes emeritus, it does not mean they are
leaving, just that they are too busy for the extra legal responsibility.

Some projects go beyond that and use the PMC as the decision makers and
leaders of the project.  We do not.  We make all our decisions on the dev
list.  We don't even focus on who is a committer and who is not, which is a
major factor of our family-like community and general "everyone is welcome
and matters" spirit.  If someone doesn't feel like their input matters till
they are a committer, or any other status, we've done something wrong. 
Fortunately, this is one of our strongest attributes and part of the magic
that is this community.

<a name="ManagementandVoting-FAQ"></a>
# FAQ

<a name="ManagementandVoting-Q.Whosevotescount?"></a>
## Q. Whose votes count?

Apache requires a minimum of three +1 PMC votes which have legal
significance to Apache as a corporation.  That said, all votes from the
community are significant to the project and decision making and any -1 is
cause for pause and discussion.  We frequently encourage and welcome votes
from anyone in the community regardless of status.

## Q. Voting on people: Is it hard to vote -1 in public / Can someone get their feelings hurt ?

Yes and yes.  Voting in public requires greater care and sensitivity on
behalf of everyone; the vote proposer, the voters, and the votee.  Prior to
voting the proposer should create several opportunities for feedback,
hopefully positive and constructive.  Community members with concerns
should get involved early and actively mentor potential committers, taking
opportunities for feedback as queues to get involved, encourage, and work
through areas where they see said person needs more help.  The contributor
should actively solicit and welcome all help and feedback and encouragement
and feel welcome to give it in return.	Do not rush; all parties (proposer,
voters, and votee) have work to do in grooming contributors, etc., and that
work takes time.  Votes that result in one or more -1s should not be seen
as a failure of any one individual and instead be seen as an opportunity
for all parties (proposer, voters, and votee) to make improvements, be more
active, and give the process more time.
