Title:
Notice:    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.

# May 2017 Board report
- Apache Aries delivers a set of pluggable Java components enabling an
enterprise OSGi application programming model.

- The PMC apologises for missing the April 2017 board report deadline and
offers this report to cover the period between the April board meeting
and now in addition to the months of the previous reporting period (mid
Jan to mid Apr).

## Issues:

- One issue for the Board to consider is how to add new committers when
the PMC lead is not available, see below in committer base changes.

## Activity:

- As a community we made 12 releases this quarter.
- Raymond Augé and Tom de Wolf have been voted in as new committers.

## Health report:

- The PMC were requested by the board to consider if there are any
potential PMC candidates among the current committers. The PMC have
invited Dominik Przybysz and will continue to consider new PMC members.
- A new contribution of CDI integration has been donated by Raymond Augé.
- The dev@ list traffic is increasing, user@ traffic has been quite low.
- The dev@ mailing list seems to be the channel most people communicate
over.

## PMC changes:

- Currently 37 PMC members.
- No new PMC members added in the last 3 months
- Last PMC addition was Christian Schneider on Fri Apr 10 2015
- Dominik Przybysz has accepted an invitation and is in the process of
being added

## Committer base changes:

- Currently 55 committers.
- New commmitters:
- Grzegorz Grzybek was added as a committer on Tue Feb 28 2017
- Raymond Augé was added as a committer on Mon Apr 24 2017
- Tom De Wolf was added as a committer on Wed May 03 2017
- We voted Raymond Augé and Tom de Wolf in as committers, but it took
*some time* for Raymond (already a committer) to be added to the
committer group and for Tom's ID to be created while the PMC chair was
unavailable for 4 weeks.

  In retrospect, https://www.apache.org/dev/pmc.html#newcommitter
indicates Tom could have had his ID created in the absence of the Chair:

  "...ASF member can use the same form in his/her stead. .... If the ICLA
included the PMC name, normally the account will already have been set up
in the correct LDAP group that will grant access to the project source
repository."

  But Raymond, who already has an Apache ID, couldn't be added to the
aries unix group without an action by the Chair:

  "To grant or deny access to directories in SVN, the PMC chair needs to
update the appropriate [group] entry."

  This seems like an anomaly and we'll start a discussion to see what we
can do to resolve.

## Releases:

- Aries JPA (jpa) 2.6.1 - 3-Apr-2017
- Aries Proxy API (proxy-api) 1.1.0 - 24-Mar-2017
- Aries Proxy (proxy) 1.1.0 - 24-Mar-2017
- Aries Blueprint Core (blueprint-core) 1.8.0 - 24-Mar-2017
- Aries Blueprint CM (blueprint-cm) 1.1.0 - 24-Mar-2017
- Aries ESA Maven Plugin (esa-maven-plugin) 1.0.2 - 15-Mar-2017
- Aries JPA (jpa) 2.6.0 - 27-Feb-2017
- Aries Blueprint Maven Plugin Annotations
(blueprint-maven-plugin-annotation) 1.1.0 - 27-Feb-2017
- Aries Blueprint Maven Plugin (blueprint-maven-plugin) 1.6.0 -
27-Feb-2017
- Aries Remote Service Admin 1.10.0 (aries-rsa) 27-Feb-2017
- Aries Blueprint Spring (blueprint-spring) 0.3.0 - 7-Feb-2017
- Aries Aries Blueprint Spring Extender Support
(blueprint-spring-extender) 0.3.0 - 1-Feb-2017

## Mailing list activity:

- dev@aries.apache.org:
  - 137 subscribers (up 2 in the last 3 months):
  - 539 emails sent to list (398 in previous quarter)

- user@aries.apache.org:
  - 237 subscribers (up 0 in the last 3 months):
  - 30 emails sent to list (99 in previous quarter)

## JIRA activity:

- 40 JIRA tickets created in the last 3 months
- 47 JIRA tickets closed/resolved in the last 3 months
