////
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.
////
= Administration

== New Committers

When a candidate is identified by a PMC member as someone who might be a good official committer to TinkerPop, the
PMC member should open a DISCUSS thread on the private TinkerPop mailing list.  The thread should provide some
background and reasoning for why that member believes the candidate would be a good committer.  Given enough time for
feedback on the candidate and presuming there is still positive interest in doing so, a VOTE thread on the private
TinkerPop mailing list is started to get the official stance.  As per usual, the VOTE will be made open for no less
than 72 hours.

If the VOTE closes with a successful positive vote to make the candidate a committer, then send the following email
to the candidate and copy the private TinkerPop mailing list:

[source,text]
----
SUBJECT: Invitation to become TinkerPop committer: [candidate name]

Hello,

The TinkerPop Project Management Committee (PMC) hereby offers you committer
privileges to the project. These privileges are offered on the understanding
that you'll use them reasonably and with common sense. We like to work on
trust rather than unnecessary constraints.

Being a committer enables you to more easily make changes without needing to
go through the patch submission process.

Being a committer does not require you to participate any more than you already
do. It does tend to make one even more committed.  You will probably find that
you spend more time here.

Of course, you can decline and instead remain as a contributor, participating
as you do now.

A. This personal invitation is a chance for you to accept or decline in
private.  Either way, please let us know in reply to the
private@tinkerpop.apache.org address only.

B. If you are accepting, the next step is to register an iCLA with the Apache
Software Foundation:
  1. Details of the iCLA and the forms are found through this link:
     http://www.apache.org/licenses/#clas.

  2. The form (text or PDF version) provides instructions for its completion
     and return to the Secretary of the ASF at secretary@apache.org.

  3. When you complete iCLA ensure that you include "Apache TinkerPop" in the
     "notify project" project field and choose a preferred unique Apache id.
     Look to see if your preferred id is already taken at
     http://people.apache.org/committer-index.html. This will allow the
     Secretary to notify the PMC when your iCLA has been recorded.

When recording of your iCLA is noticed, you will receive a follow-up message
with the next steps for establishing you as a committer.
----

Assuming the iCLA included items from step 3, the secretary will handle account creation, otherwise it will be up to
the PMC chair to link:http://www.apache.org/dev/pmc.html#newcommitter[handle such things]. Once the account is
established the PMC chair will then need to:

. Validate that the iCLA is on file either through link:https://svn.apache.org/repos/private/foundation/officers/[svn]
or through link:http://people.apache.org/committer-index.html[people.apache.org].
. Request that the account be created. The PMC Chair may do this through the link:https://whimsy.apache.org/officers/acreq[Account Request Form].
. Once verified, provide the new committer access to the repository, which is most easily done through
link:https://whimsy.apache.org/roster/committee/[Whimsy].
. Send an announcement email to the developer and user mailing lists with the template below.
. Update JIRA to include this person in the "committers" group.

[source,text]
----
SUBJECT: New Committer: [committer name]

The Project Management Committee (PMC) for Apache TinkerPop has asked
[committer name] to become a committer and we are pleased to announce their
acceptance.

[describe the nature of the committer's work in the community]

Being a committer enables easier contribution to the project since there is no
need to work via the patch submission process. This should enable better
productivity.
----

Finally, new committers should be sent an email that covers some of the administrative elements of their new role.
Generally speaking the email can largely just point them to the <<initial-setup,Initial Setup>> section of this
documentation.

== New PMC Members

The process for bringing on new PMC members is not so different from the one for new committers. The process begins
with a DISCUSS thread to the private mailing list for building consensus followed by a VOTE thread to confirm.
Presuming the new PMC member is a committer already (which is mostly likely for TinkerPop), there should be no need for
any additional paperwork. On successful vote however, a NOTICE should be sent to the board@apache.org (copying
private@tinkerpop.apache.org):

[source,text]
----
Subject [NOTICE] [name of PMC new member] for Apache TinkerPop PMC

Apache TinkerPop proposes to invite [name of PMC new member] ([ApacheId]) to join the PMC.

The vote result is available here:

[include the link to the vote result thread from private]
----

If the candidate does not (yet) have an Apache account, then please note that fact in the notification email. Provide
the board 72 hours to respond with objection before extending the invite to the new PMC member. Once that time has
elapsed, the invite may be sent to the new PMC member. The following template may be used for the invitation (be sure
to copy private@ when sending the email):

[source,text]
----
Subject Invitation to join the Apache TinkerPop PMC: [name of PMC new member]

In recognition of your contributions to Apache TinkerPop, the TinkerPop PMC has voted to make you a PMC member. If you are unfamiliar with what the PMC does, please see this link to be sure you are comfortable with the responsibilities:

https://www.apache.org/dev/pmc.html

As you have already signed an ICLA and have an Apache account no additional paperwork is required by you other than replying to this email (ensuring to include private@ which is CC'd) to say if you accept or reject the invitation. Obviously there is no requirement to accept - you maybe simply choose to continue working in the capacity of a committer as you are now. We're happy to answer any questions you might have.

Thank you for your efforts on the project.
----

If they accept, then the PMC chair should refer to the
link:http://www.apache.org/dev/pmc.html#newpmc[How to Add a New PMC Member] section in the Apache docs for how to
complete the process. Use link:https://whimsy.apache.org/roster/committee/[Whimsy] to update PMC membership.

== Board Reports

The PMC Chair is responsible for submitting a link:http://www.apache.org/foundation/board/reporting[report to the board]
on a quarterly basis. TinkerPop reports on the following months: January, April, July, October. The report has the
following format:

[source,text]
----
## Description:
 Apache TinkerPop is a graph computing framework for both graph databases
 (OLTP) and graph analytic systems (OLAP).

## Activity:
 <discuss general project health, project direction, community growth/activity, etc.>

## Issues:
 There are no issues requiring board attention at this time.

## Releases:
 - x.y.z (<month> <day>, <year>)
 - x.y.z (<month> <day>, <year>)

## PMC/Committer:

 - Last PMC addition was <name> - <month> <year>
 - Last committer addition was <name> - <month> <year>

## Links

[1] <hyperlink to external reference, if a reference was made in the report>
----

A draft of the report should be sent to the TinkerPop developer mailing list for review at least three days prior to
submitting to the board. The final report should be sent in plain-text format to `board@apache.org` and should be
committed to the appropriate meeting agenda in SVN at:

[source,text]
https://svn.apache.org/repos/private/foundation/board

[[contributor-listing]]
== Contributor Listing

Contributions can come in <<ways-to-contribute,many forms>> and extend well beyond code contributions. TinkerPop
strives to ensure that contributions are honestly and accurately recognized for the benefit of the individuals who
help make TinkerPop possible.

One of the ways in which this recognition is supported is by way of the
link:https://tinkerpop.apache.org/#contributors[Contributor Listing] on the TinkerPop home page, which list those who
have contributed to the project in some way. It lists both committers and PMC members and provides a short "bio"
(i.e. a description of their contributions) as well as an indication of whether they are currently participating in
the project or not, i.e. active or inactive.  The bios have a slightly different form depending on that status:

* An _active_ bio should be reflective of current contributions, roughly representing the past six months and the
following six months of the update.
* An _inactive_ bio for those not currently contributing to the project, should reflect the full scope of all
contributions made by that individual during their active periods.

IMPORTANT: Irrespective of being active or inactive, the contributor's name and tenure accomplishments remain present
on the front page of the web site. Being "inactive" does *not* affect the contributors status as an Apache committer or
PMC member - that remains unchanged. Should a contributor become "inactive" at some point, there is no special process
to become "active" again - they simply update their bio to do so.

Committers and PMC members can keep this information up to date themselves as they have direct access to the Git
repository. Reminders to update this information will be sent to the dev list on each release as part of code freeze
week. Those who have not shown an update to their bio in git in the past year or have otherwise not replied to the dev
list email to indicate their status in that time will be assumed "inactive" for the purpose of the listing.

The following is a template for the "Bio Update" email:

[source,text]
----
Subject: Apache TinkerPop Bio Update

To Committers/PMC Members,

As an Apache TinkerPop committer and/or PMC member, your name is listed on the TinkerPop home page in the Contributor List[1] with your "bio". If you are active on the project, your "bio" reflects what you have been working on and what you expect to be working on with respect to TinkerPop for recent times (i.e. for the previous six months and the following six months). If you are currently inactive on the project, your "bio" reflects the full scope of all your contributions throughout your active periods. You can refer to the contributor listing policy[2] for full details.

Please take a moment to update your bio directly in Git[3] or, if you would prefer, please reply to this email with your bio update and it will be added for you. If no changes are required, please reply to this email to confirm that this is the case.

[1] https://tinkerpop.apache.org/#contributors
[2] https://tinkerpop.apache.org/docs/current/dev/developer/#contributor-listing
[3] https://github.com/apache/tinkerpop/blob/master/docs/site/home/index.html
----
