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

== This guide is for the Incubator Chair and IPMC

This page is guidance for the Incubator Chair and IPMC. Guidance for podlings is at link:/guides/ppmc.html[Podling Guide].

== Adding Incubator PMC Members

For a new PMC member being voted in, follow the link:http://www.apache.org/dev/pmc.html#newpmc[standard procedure].

For an ASF Member exercising their prerogative to join the IPMC by request, the only change in procedure is to alter the text of the NOTICE sent to the Board:

[literal]
--
To: board at apache.org
CC: private at incubator.apache.org
Subject: [NOTICE] *Jane Doe* for Incubator PMC
Body:

Apache Member *Jane Doe* has requested to join the Incubator PMC.
--

After the NOTICE period expires, send a welcome message to the new IPMC member.

[literal]
--
Welcome to the Apache Incubator Project.

Here is some information to get you started as an IPMC member.

Please subscribe to the incubator email lists:
- general-subscribe at incubator.apache.org
- private-subscribe at incubator.apache.org
- cvs-subscribe at incubator.apache.org

You may find it useful to use https://whimsy.apache.org/committers/subscribe to manage your subscriptions.

- the base incubator SVN URL is https://svn.apache.org/repos/asf/incubator.

- all public information, rules and policies about the
Apache Incubator is in https://github.com/apache/incubator,
and is published on https://incubator.apache.org/.

- https://home.apache.org/phonebook.html?ctte=incubator
lists all IPMC members.

- We maintain and publish the Incubator website according to the
instructions at http://incubator.apache.org/guides/website.html.

- All committers on all incubating projects have access to
the 'incubator/public' repository, so they can
participate in the general Incubator Project as committers.

- Please read our work documents; we publish them at https://incubator.apache.org/policy/incubation.html

Thanks for helping us!
--

== Board Report

The Incubator PMC link:http://www.apache.org/foundation/board/reporting[reports] monthly to the Apache link:http://www.apache.org/foundation/board[Board of Directors]. The report itself is the collaborative effort of many Incubator contributors, but the Chair is ultimately responsible for submitting it on time.

The Board appreciates receiving the IPMC report:
- on time
- in a consistent format
- as an accurate summary of the state of the reporting podlings
- with multiple Mentor signoffs on each report

The "runbook" for managing preparation of the report is a script which prints out documentation, instructions, literal commands, due dates, etc. in link:https://svn.apache.org/repos/asf/incubator/public/trunk/report_runbook.py[report_runbook.py].

Either the Chair or a delegated Report Manager can run many of the tasks documented in the runbook. However, the Chair is accountable for overseeing the process.

Work on the report draft on the link:https://cwiki.apache.org/confluence/display/INCUBATOR/Reports[Incubator wiki]. 

Incubator board reports are organised by year and month. To create a new report, copy the MonthYear template and correctly rename it. Add and link the new report to the list of reports on the front page.
Currently, members of the IPMC and Podling PMCs have permission to edit pages in the Reports section of the wiki. We need to update the permissions for that section when we add or retire podlings. 
When submitting a final report to the board, make sure to mark the report as read-only and mark it as submitted at the top of the page, so that future accidental edits do not change the submitted report.
The draft reports may vary a little from the final Board report. The published Incubator Board reports can be found here.
